/* FTP Directory Functions
$Revision: 1.4 $
$Date: 2003/03/10 22:31:27 $
*/
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include "ftp.h"
#include "quftp.h"
char *ftp_pwd(struct ftpconnection *connection) {
char line[MAX_LINE_SIZE];
char *temp, *temp2;
int length, response;
if (!ftp_check_ready(connection, 1)) return NULL;
ftp_sendline(connection, "PWD\r\n");
response = ftp_getrc(connection, line, MAX_LINE_SIZE, 0);
switch (response) {
case 257 : break;
case 500 : log(LOG_ALERT, "Server doesn't understand PWD\n");
return NULL;
break;
case 501 : log(LOG_ALERT, "Server doesn't understand PWD parameters\n");
return NULL;
break;
case 502 : log(LOG_ALERT, "Server doesn't understand PWD\n");
return NULL;
break;
case 421 : log(LOG_ALERT, "Service unavailable\n");
ftp_disconnect(connection);
return NULL;
break;
case 550 : log(LOG_ALERT, "Directory information unavailable: %d\n", response);
return NULL;
break;
default : log(LOG_ALERT, "Unknown response to PWD: %d\n", response);
return NULL;
break;
}
temp = strstr(line, "\"");
temp++;
temp2 = strstr(temp, "\"");
length = temp2-temp;
strncpy(connection->remotedir, temp, length);
connection->remotedir[length] = 0;
return connection->remotedir;
}
int ftp_cwd(struct ftpconnection *connection, char *path) {
char line[MAX_LINE_SIZE];
int response;
if (!ftp_check_ready(connection, 1)) return 0;
if (strcmp(path, connection->remotedir) == 0) return 1;
sprintf(line, "CWD %s\r\n", path);
ftp_sendline(connection, line);
response = ftp_getrc(connection, NULL, 0, 0);
switch (response) {
case 250 : ftp_pwd(connection);
log(LOG_NOTICE, "Changed directory on %s to %s\n",
connection->hostname, connection->remotedir);
return 1;
break;
case 530 : log(LOG_ALERT, "Not logged in\n");
return 0;
break;
case 500 : log(LOG_ALERT, "Server doesn't understand CWD\n");
return 0;
break;
case 501 : log(LOG_ALERT, "Server doesn't understand CWD parameters\n");
return 0;
break;
case 502 : log(LOG_ALERT, "Server doesn't understand CWD\n");
return 0;
break;
case 421 : log(LOG_ALERT, "Service unavailable\n");
ftp_disconnect(connection);
return 0;
break;
case 550 : log(LOG_ALERT, "Directory \"%s\" does not exist\n", path);
return 0;
break;
default : log(LOG_ALERT, "Unknown response to CWD: %d\n", response);
return 0;
break;
}
return 0;
}
int ftp_mkd(struct ftpconnection *connection, char *path) {
char line[MAX_LINE_SIZE];
int response;
if (!ftp_check_ready(connection, 1)) return 0;
sprintf(line, "MKD %s\r\n", path);
ftp_sendline(connection, line);
response = ftp_getrc(connection, NULL, 0, 0);
switch (response) {
case 257 : log(LOG_INFO, "Created %s on %s",
path, connection->remotedir);
return 1;
break;
case 530 : log(LOG_ALERT, "Not logged in\n");
return 0;
break;
case 500 : log(LOG_ALERT, "Server doesn't understand \"MKD %s\"\n", path);
return 0;
break;
case 501 : log(LOG_ALERT, "Server doesn't understand MKD parameters\n");
return 0;
break;
case 502 : log(LOG_ALERT, "Server doesn't understand MKD\n");
return 0;
break;
case 421 : log(LOG_ALERT, "Service unavailable\n");
ftp_disconnect(connection);
return 0;
break;
case 550 : log(LOG_ALERT, "Not allowed to create directory %s\n", path);
return 0;
break;
default : log(LOG_ALERT, "Unknown response to MKD: %d\n", response);
return 0;
break;
}
return 0;
}
int ftp_rmd(struct ftpconnection *connection, char *path) {
char line[MAX_LINE_SIZE];
int response;
if (!ftp_check_ready(connection, 1)) return 0;
sprintf(line, "RMD %s\r\n", path);
ftp_sendline(connection, line);
response = ftp_getrc(connection, NULL, 0, 0);
switch (response) {
case 250 : log(LOG_NOTICE, "Removed %s in %s\n",
path, connection->remotedir);
return 1;
break;
case 530 : log(LOG_ALERT, "Not logged in\n");
return 0;
break;
case 500 : log(LOG_ALERT, "Server doesn't understand \"RMD %s\"\n", path);
return 0;
break;
case 501 : log(LOG_ALERT, "Server doesn't understand RMD parameters\n");
return 0;
break;
case 502 : log(LOG_ALERT, "Server doesn't understand RMD\n");
return 0;
break;
case 421 : log(LOG_ALERT, "Service unavailable\n");
ftp_disconnect(connection);
return 0;
break;
case 550 : log(LOG_ALERT, "Not allowed to remove directory %s\n", path);
return 0;
break;
default : log(LOG_ALERT, "Unknown response to RMD: %d\n", response);
return 0;
break;
}
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1