⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 204.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 4 页
字号:
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 + -