📄 204.htm
字号:
return; <br>
}; <br>
}; <br>
outs("local: %s remote: %s", p2, p1); <br>
if ((f = fopen(p2, "a")) == NULL || stat(p2, &s) == -1) { <br>
Error(p2); <br>
} else { <br>
file_rest = s.st_size; <br>
if (PreConnection() == -1) return; <br>
ftpouts("RETR %s", p1); <br>
DataConnection(0, transfer_type, f); <br>
}; <br>
free(p1); <br>
free(p2); <br>
}; <br>
void Put(char *param) <br>
{ <br>
FILE *f; <br>
char *p1, *p2, *p3, *p4; <br>
explode(param, &p3, &p4); <br>
if (p3 != NULL) { <br>
p1 = strdup(p3); <br>
if (p4 == NULL) p2 = strdup(p1); else p2 = strdup(p4); <br>
} else { <br>
p1 = readline("(local-file) "); <br>
if (p1 == NULL) { <br>
outs("usage: put local-file [ remote-file ]"); <br>
return; <br>
}; <br>
p2 = readline("(remote-file) "); <br>
if (p2 == NULL) { <br>
outs("usage: put local-file [ remote-file ]"); <br>
free(p1); <br>
return; <br>
}; <br>
}; <br>
outs("local: %s remote: %s", p1, p2); <br>
if ((f = fopen(p1, "r")) == NULL) { <br>
Error(p1); <br>
} else { <br>
if (PreConnection() == -1) return; <br>
ftpouts("STOR %s", p2); <br>
DataConnection(1, transfer_type, f); <br>
}; <br>
free(p1); <br>
free(p2); <br>
}; <br>
void Append(char *param) <br>
{ <br>
FILE *f; <br>
char *p1, *p2, *p3, *p4; <br>
explode(param, &p3, &p4); <br>
if (p3 != NULL) { <br>
p1 = strdup(p3); <br>
if (p4 == NULL) p2 = strdup(p1); else p2 = strdup(p4); <br>
} else { <br>
p1 = readline("(local-file) "); <br>
if (p1 == NULL) { <br>
outs("usage: append local-file [ remote-file ]"); <br>
return; <br>
}; <br>
p2 = readline("(remote-file) "); <br>
if (p2 == NULL) { <br>
outs("usage: append local-file [ remote-file ]"); <br>
free(p1); <br>
return; <br>
}; <br>
}; <br>
outs("local: %s remote: %s", p1, p2); <br>
if ((f = fopen(p1, "r")) == NULL) { <br>
Error(p1); <br>
} else { <br>
if (PreConnection() == -1) return; <br>
ftpouts("APPE %s", p2); <br>
DataConnection(1, transfer_type, f); <br>
}; <br>
free(p1); <br>
free(p2); <br>
}; <br>
void Newer(char *param) <br>
{ <br>
struct stat s; <br>
struct tm *tms; <br>
static char buf[80]; <br>
char *p1, *p2, *p3, *p4; <br>
explode(param, &p3, &p4); <br>
if (p3 != NULL) { <br>
p1 = strdup(p3); <br>
if (p4 == NULL) p2 = strdup(p1); else p2 = strdup(p4); <br>
} else { <br>
p1 = readline("(remote-file) "); <br>
if (p1 == NULL) { <br>
outs("usage: reget remote-file [ local-file ]"); <br>
return; <br>
}; <br>
p2 = readline("(local-file) "); <br>
if (p2 == NULL) { <br>
outs("usage: reget remote-file [ local-file ]"); <br>
free(p1); <br>
return; <br>
}; <br>
}; <br>
outs("local: %s remote: %s", p2, p1); <br>
if (stat(p2, &s) == -1) { <br>
Error(p2); <br>
} else { <br>
tms = localtime((const time_t *)&s.st_mtime); <br>
sprintf(buf, "%4d%2d%2d%2d%2d%2d", tms->tm_year, tms->tm_mon, tms->tm_mday, <br>
tms->tm_hour, tms->tm_min, tms->tm_sec); <br>
ftpcmd("MDTM %s", p1); <br>
outs("Local file \"%s\" is %s than remote file \"%s\"", p2, (strcmp(buf, &ge <br>
nbuf[4]) >= 0)?"newer":"older", p1); <br>
}; <br>
free(p1); <br>
free(p2); <br>
}; <br>
void Restart(char *param) <br>
{ <br>
if (!param) { <br>
if (!param) { <br>
outs("restart: offset not specified"); <br>
return; <br>
}; <br>
file_rest = atoi(param); <br>
outs("restarting at %d. execute get, put or append to initiate transfer", fi <br>
le_rest); <br>
}; <br>
void Rename(char *param) <br>
{ <br>
char tmp[PATH_MAX]; <br>
char *p1, *p2, *p3, *p4; <br>
p1 = p2 = p3 = p4 = NULL; <br>
explode(param, &p3, &p4); <br>
if (p3) p1 = strdup(p3); <br>
if (p4) p2 = strdup(p4); <br>
if (!p1) p1 = readline("(from-name)"); <br>
if (!p2) p2 = readline("(to-name)"); <br>
if (!p1 || !p2) { <br>
outs("rename from-name to-name"); <br>
} else { <br>
if (ftpcmd("RNFR %s", p1) == 220) ftpcmd("RNTO %s", p2); <br>
} <br>
} <br>
free(p1); <br>
free(p2); <br>
}; <br>
void Pasv(char *param) <br>
{ <br>
pasv_mode = 1 - pasv_mode; <br>
outs("passive mode %s.", (pasv_mode)?"on":"off"); <br>
}; <br>
void System(char *param) <br>
{ <br>
char *p1, *p2; <br>
if (ftpcmd("SYST") != 215) return; <br>
explode(&genbuf[4], &p1, &p2); <br>
outs("Remote system type is %s.", p1); <br>
outs("Using %s mode to transfer files.", (transfer_type == 'i')?"binary":"AS <br>
CII"); <br>
}; <br>
void User(char *param) <br>
{ <br>
char *p; <br>
char *p1; <br>
if (!param) { <br>
if (!param) { <br>
p1 = readline("(username) "); <br>
} else p1 = strdup(param); <br>
if (ftpcmd("USER %s", p1) != 331) { <br>
outs("Login failed."); <br>
return; <br>
}; <br>
p = readline("Password:"); <br>
if (ftpcmd("PASS %s", p) != 230) { <br>
outs("Login failed."); <br>
return; <br>
}; <br>
System(""); <br>
free(p1); <br>
free(p); <br>
}; <br>
void Open(char *param) <br>
{ <br>
struct sockaddr_in sa; <br>
struct hostent *h; <br>
char *tmp = NULL, *p1, *p2; <br>
char *luser; <br>
int i = 1; <br>
int i = 1; <br>
if (connected) { <br>
outs("Already connected to %s, use close first.", hostname); <br>
return; <br>
}; <br>
if (!param) { <br>
tmp = readline("(to)"); <br>
if (strcmp(tmp, "") == 0) { <br>
outs("usage: open host-name [port]"); <br>
return; <br>
}; <br>
} else tmp = strdup(param); <br>
explode(tmp, &p1, &p2); <br>
strcpy(hostname, p1); <br>
if (p2) port = atoi(p2); else port = 21; <br>
free(tmp); <br>
/* init network */ <br>
if ((h = gethostbyname(hostname)) == NULL) { <br>
outs("gethostbyname error..."); <br>
return; <br>
}; <br>
memset(&sa, 0, sizeof(sa)); <br>
sa.sin_family = AF_INET; <br>
memcpy(&sa.sin_addr, h->h_addr, sizeof(int)); <br>
sa.sin_port = htons(port); <br>
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 || setsockopt(sockfd, S <br>
OL_SOCKET, SO_REUSEADDR, (const char *)&i, sizeof(int)) == -1) <br>
{ <br>
perror("Pacific FTP:"); <br>
return; <br>
}; <br>
if (connect(sockfd, (struct sockaddr *)&sa, sizeof(sa)) == -1) { <br>
perror("Pacific FTP:"); <br>
return; <br>
}; <br>
i = sizeof(sa); <br>
if (getsockname(sockfd, (struct sockaddr *)&sa, &i) == -1) { <br>
perror("Pacific FTP:"); <br>
return; <br>
}; <br>
local_port.host = sa.sin_addr.s_addr; <br>
connected = 1; <br>
cin = fdopen(sockfd, "r"); <br>
cout = fdopen(sockfd, "w"); <br>
setbuf(cin, (char *)0); <br>
setbuf(cout, (char *)0); <br>
tmp = inet_ntoa(sa.sin_addr); <br>
outs("Connected to %s", (h->h_name)?h->h_name:hostname); <br>
ftpgets(); <br>
/* input name */ <br>
luser = NULL; <br>
while (luser == NULL) { <br>
char *myname = getlogin(); <br>
if (myname == NULL) { <br>
struct passwd *pp = getpwuid(getuid()); <br>
if (pp != NULL) <br>
myname = pp->pw_name; <br>
} <br>
if (myname) <br>
sprintf(genbuf, "Name (%s:%s): ", hostname, myname); <br>
else <br>
sprintf(genbuf, "Name (%s): ", hostname); <br>
tmp = readline(genbuf); <br>
if (tmp[0] == '\0') <br>
luser = myname; <br>
else <br>
luser = tmp; <br>
luser = tmp; <br>
} <br>
User(luser); <br>
free(tmp); <br>
}; <br>
void Shell(char *param) <br>
{ <br>
if (!param || strcmp(param, "") == 0) { <br>
system("/bin/bash"); <br>
} else { <br>
system(param); <br>
}; <br>
}; <br>
void Close(char *param) <br>
{ <br>
if (connected) { <br>
ftpcmd("QUIT"); <br>
close(sockfd); <br>
connected = 0; <br>
if (cin) fclose(cin); <br>
if (cout) fclose(cout); <br>
cin = NULL; <br>
cout = NULL; <br>
cout = NULL; <br>
close(sockfd); <br>
}; <br>
}; <br>
void Quit(char *param) <br>
{ <br>
Close(param); <br>
exit(0); <br>
}; <br>
struct _cmd_list cmd_list[] = { <br>
{"!", NULL, Shell }, <br>
{"?", NULL, Help }, <br>
{"open", NULL, Open }, <br>
{"help", NULL, Help }, <br>
{"user", NULL, User }, <br>
{"lcd", NULL, Lcd }, <br>
{"reget", NULL, Reget }, <br>
{"rename", NULL, Rename }, <br>
{"passive", NULL, Pasv }, <br>
{"restart", NULL, Restart }, <br>
{"newer", NULL, Newer }, <br>
{"close", NULL, Close }, <br>
{"disconnect", NULL, Close }, <br>
{"quit", NULL, Quit }, <br>
{"exit", NULL, Quit }, <br>
{"bye", NULL, Quit }, <br>
{"put", NULL, Put }, <br>
{"send", NULL, Put }, <br>
{"get", NULL, Get }, <br>
{"recv", NULL, Get }, <br>
{"append", NULL, Append }, <br>
{"nlist", NULL, Nlist }, <br>
{"ls", NULL, List }, <br>
{"dir", NULL, List }, <br>
{"ascii", NULL, Ascii }, <br>
{"binary", NULL, Binary }, <br>
{"system", NULL, System }, <br>
{"rhelp", "HELP", NULL }, <br>
{"cdup", "CDUP", NULL }, <br>
{"pwd", "PWD", NULL }, <br>
{"idle", "SITE IDLE", NULL }, <br>
{"rstatus", "STAT", NULL }, <br>
{"cd", "CWD", NULL, "(remote-directory) "}, <br>
{"chdir", "CWD", NULL, "(remote-directory) "}, <br>
{"rmdir", "RMD", NULL, "(directory-name) "}, <br>
{"mkdir", "MKD", NULL, "(directory-name) "}, <br>
{"delete", "DELE", NULL, "(remote-file) " }, <br>
{"size", "SIZE", NULL, "(filename) " }, <br>
{"chmod", "SITE CHMOD", NULL, "(mode) ", "(file-name) " }, <br>
{"modtime", "MDTM", NULL, "(filename) " }, <br>
{"site", "SITE", NULL, "(arguments to SITE command) " }, <br>
{"quote", "", NULL, "(command line to send) " }, <br>
{""} <br>
}; <br>
void do_term() <br>
{ <br>
exit(0); <br>
}; <br>
void do_quit() <br>
{ <br>
Quit(""); <br>
}; <br>
int Init() <br>
{ <br>
if (getcwd(path, PATH_MAX) == NULL) { <br>
outs("Can not get work directory!"); <br>
return -1; <br>
return -1; <br>
}; <br>
/* register the signal handler */ <br>
signal(SIGTERM, do_term); <br>
// signal(SIGQUIT, do_quit); <br>
signal(SIGPIPE, SIG_IGN); <br>
}; <br>
int main(int argc, char **argv) <br>
{ <br>
int len, cur, ret; <br>
int okay=1, i; <br>
char *cmd, *param, *p1, *p2, *p3, *p4; <br>
char *inbuf = NULL; <br>
char tmp[PATH_MAX]; <br>
struct _cmd_list *ptr; <br>
if (Init() == -1) return -1; <br>
if (argc>1) { <br>
sprintf(tmp, "%s %s", argv[1], (argv[2])?argv[2]:""); <br>
Open(tmp); <br>
}; <br>
/* main loop */ <br>
while ((inbuf = readline(prompt)) != NULL) <br>
{ <br>
{ <br>
if (inbuf[0] == '!') { <br>
Shell(&inbuf[1]); <br>
free(inbuf); <br>
continue; <br>
}; <br>
explode(inbuf, &cmd, ?m); <br>
if (strcmp(cmd, "") == 0) { <br>
free(inbuf); <br>
continue; <br>
}; <br>
cur = 0; <br>
okay = 0; <br>
ptr = NULL; <br>
while (strcmp(cmd_list[cur].cmd, "") != 0) <br>
{ <br>
if (strncasecmp(cmd_list[cur].cmd, cmd, strlen(cmd)) == 0) { <br>
if (ptr == NULL) { <br>
okay = 1; <br>
ptr = &cmd_list[cur]; <br>
} else okay = 0; <br>
}; <br>
cur++; <br>
cur++; <br>
}; <br>
if (ptr == NULL || !okay) outs("?Invalid command"); <br>
else { <br>
if (ptr->func == NULL) { <br>
sprintf(tmp, "%s", ptr->ftpcmd); <br>
explode(param, &p1, &p2); <br>
if (ptr->param1 != NULL) { <br>
if (tmp[0] != 0) strcat(tmp, " "); <br>
if (p1) strcat(tmp, p1); <br>
else { <br>
p3 = readline(ptr->param1); <br>
if (strcmp(p3, "") == 0) { <br>
outs(ptr->usage); <br>
free(p3); <br>
continue; <br>
}; <br>
strcat(tmp, p3); <br>
free(p3); <br>
}; <br>
}; <br>
if (ptr->param2 != NULL) { <br>
strcat(tmp, " "); <br>
if (p2) strcat(tmp, p2); <br>
else { <br>
p3 = readline(ptr->param2); <br>
if (strcmp(p3, "") == 0) { <br>
outs(ptr->usage); <br>
free(p3); <br>
continue; <br>
}; <br>
strcat(tmp, p3); <br>
free(p3); <br>
}; <br>
}; <br>
ret = ftpcmd(tmp); <br>
if (genbuf[3] == '-') { <br>
while (ftpgets() != ret); <br>
}; <br>
} else (*ptr->func)(param); <br>
}; <br>
free(inbuf); <br>
}; <br>
} <br>
<br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="185.htm">上一层</a>][<a href="205.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -