📄 211.htm
字号:
current = tmp ; <br>
continue; <br>
} <br>
gotoneitem(level0,0,0,name); <br>
} <br>
fclose(fout); <br>
current = dirhd; <br>
while ( current != NULL ) <br>
{ <br>
tmpdir = current->dirname; <br>
gotoneitem(level0,1,1,tmpdir); <br>
if ( cd( tmpdir ) == 0 ) <br>
{ <br>
recurseftpdir(current->dirname,level0+1); <br>
if ( cd("..") ) <br>
{ <br>
fprintf(stderr,"Can't goto parent directory,exit.\n"); <br>
exit(-1); <br>
} <br>
} <br>
gotoneitem(level0,1,0,tmpdir); <br>
<br>
dirhd = current->nextdir; <br>
free(current); <br>
current = dirhd; <br>
} <br>
} <br>
<br>
void finish_recurse(void) <br>
{ <br>
fprintf(stdout,"\nFinish recursing ftp directory\n\n"); <br>
verbose=1; <br>
command("QUIT"); <br>
} <br>
<br>
int command(const char *fmt,...) <br>
{ <br>
va_list ap; <br>
int r; <br>
<br>
va_start(ap, fmt); <br>
vfprintf(cout, fmt, ap); <br>
va_end(ap); <br>
fprintf(cout, "\r\n"); <br>
(void) fflush(cout); <br>
<br>
r=getreply( !strcmp(fmt, "QUIT") ); <br>
<br>
return r; <br>
} <br>
<br>
int getreply(int expecteof) <br>
{ <br>
register int c, n; <br>
register int dig; <br>
int originalcode = 0, continuation = 0; <br>
char reply_string[BUFSIZ]; <br>
char *cp; <br>
<br>
cp = reply_string; <br>
for (;;) <br>
{ <br>
dig = n = code = 0; <br>
while ( ( c = getc( cin ) ) != '\n') <br>
{ <br>
dig++; <br>
if ( c == EOF ) <br>
{ <br>
if (expecteof) <br>
{ <br>
code = 221; <br>
return (0); <br>
} <br>
fprintf(stderr,"ftp server closed abnormally,exit.\n"); <br>
exit(-1); <br>
} <br>
<br>
if ( verbose && c != '\r' ) <br>
(void) putchar(c); <br>
<br>
if ( dig < 4 && isdigit(c) ) <br>
code = code * 10 + (c - '0'); <br>
<br>
if ( dig == 4 && c == '-' ) <br>
{ <br>
if (continuation) <br>
code = 0; <br>
continuation++; <br>
} <br>
} <br>
<br>
if ( cp < &reply_string[sizeof(reply_string)-1] ) <br>
*cp++=c; <br>
<br>
if (n == 0) <br>
n = c; <br>
}/*end while*/ <br>
<br>
if ( verbose ) <br>
(void) putchar(c); <br>
(void) fflush (stdout); <br>
<br>
<br>
if ( continuation && code != originalcode ) <br>
{ <br>
if (originalcode == 0) <br>
originalcode = code; <br>
continue; <br>
} <br>
*cp='\0'; <br>
return (n - '0'); <br>
}/*end for*/ <br>
} <br>
<br>
int recvrequest(const char *cmd,char *remote) <br>
{ <br>
int c,d,bytes=0,result; <br>
char buf[1024]; <br>
<br>
if ( initconn() ) <br>
{ <br>
code=-1; <br>
return(-1); <br>
} <br>
<br>
if (remote) <br>
result = command("%s %s", cmd, remote); <br>
else <br>
result = command("%s", cmd); <br>
if ( result != PRELIM ) <br>
return -1 ; <br>
<br>
if ( ( din = dataconn("r") )== NULL ) <br>
{ <br>
{ <br>
fprintf(stderr,"\nData connection failed,exit.\n"); <br>
exit(-1); <br>
} <br>
<br>
loopin: <br>
while ( ( c = getc(din) ) != EOF ) <br>
{ <br>
while ( c == '\r' ) <br>
{ <br>
bytes++; <br>
if ( ( c = getc(din) ) != '\n' ) <br>
{ <br>
if ( ferror(fout) ) <br>
goto loopout; <br>
(void) putc('\r', fout); <br>
if (c == '\0') <br>
{ <br>
bytes++; <br>
goto loopin; <br>
} <br>
if (c == EOF) <br>
goto loopin; <br>
} <br>
} <br>
(void) putc(c, fout); <br>
bytes++; <br>
} <br>
loopout: <br>
if ( din ) <br>
fclose(din); <br>
if ( datasock >= 0 ) <br>
{ <br>
close(datasock); <br>
datasock = -1; <br>
} <br>
(void)getreply(0); <br>
return(0); <br>
} <br>
<br>
int initconn(void) <br>
{ <br>
register char * a ,* p; <br>
socklen_t len; <br>
int on = 1,result; <br>
struct sockaddr_in dataaddr; <br>
<br>
if ( ( datasock = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) <br>
{ <br>
fprintf(stderr,"Data socket create faild,return.\n"); <br>
return (-1); <br>
} <br>
if ( setsockopt( datasock,SOL_SOCKET,SO_REUSEADDR,(char *)&on,sizeof(on) ) < 0 <br>
) <br>
fprintf(stderr,"Data socket reuse failed.\n"); <br>
<br>
dataaddr = localaddr; <br>
<br>
dataaddr.sin_port = 0; <br>
<br>
if (bind(datasock, (struct sockaddr *)&dataaddr, sizeof (dataaddr)) < 0) <br>
{ <br>
fprintf(stderr,"Data socket bind faild,return.\n"); <br>
return(-1); <br>
} <br>
<br>
len = sizeof (dataaddr); <br>
if (getsockname(datasock, (struct sockaddr *)&dataaddr, &len) < 0) <br>
{ <br>
fprintf(stderr,"Data socket getsockname faild,return.\n"); <br>
return(-1); <br>
} <br>
<br>
if (listen(datasock, 1) < 0) <br>
{ <br>
fprintf(stderr,"Data socket listen faild,return.\n"); <br>
return(-1); <br>
} <br>
<br>
a = (char *)&dataaddr.sin_addr; <br>
p = (char *)&dataaddr.sin_port; <br>
result = command("PORT %d,%d,%d,%d,%d,%d",UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3 <br>
]),UC(p[0]), UC(p[1])); <br>
<br>
if ( result == ERROR ) <br>
{ <br>
fprintf(stderr,"Send PORT command faild,return.\n"); <br>
return(-1); <br>
} <br>
} <br>
<br>
return(0); <br>
} <br>
<br>
<br>
FILE * dataconn(const char *lmode) <br>
{ <br>
struct sockaddr_in from; <br>
int s; <br>
socklen_t fromlen = sizeof(from); <br>
<br>
s = accept(datasock, (struct sockaddr *) &from, &fromlen); <br>
if (s < 0) <br>
{ <br>
fprintf(stderr,"Data socket accept failed,exit.\n"); <br>
(void) close(datasock), datasock = -1; <br>
return (NULL); <br>
} <br>
(void) close(datasock); <br>
datasock = s; <br>
<br>
return (fdopen(datasock, lmode)); <br>
} <br>
<br>
<br>
int cd(char *dir) <br>
{ <br>
if ( command("CWD %s", dir) == ERROR ) <br>
{ <br>
fprintf(stderr,"\nCan't cd directory %s\n",dir); <br>
return -1; <br>
} <br>
return 0; <br>
} <br>
<br>
void gotoneitem(int level,int dir,int begin,char *name) <br>
{ <br>
prnvertline(level); <br>
fprintf(lfp,"%s","--["); <br>
if ( bbs ) <br>
fprintf(lfp,"%c%c",ESC,ESC); <br>
if ( dir ) <br>
{ <br>
if ( bbs ) <br>
fprintf(lfp,"%s",YELLOW); <br>
if ( begin ) <br>
fprintf(lfp,"%s","目录开始"); <br>
else <br>
fprintf(lfp,"%s","目录结束"); <br>
} <br>
else <br>
{ <br>
if ( bbs ) <br>
fprintf(lfp,"%s",GREEN); <br>
fprintf(lfp,"%s","文件"); <br>
} <br>
if ( bbs ) <br>
{ <br>
fprintf(lfp,"%c%c",ESC,ESC); <br>
fprintf(lfp,"%s",WHITE); <br>
} <br>
fprintf(lfp,"%c%s\n",']',name); <br>
} <br>
<br>
void prnvertline(int level) <br>
{ <br>
{ <br>
int i; <br>
for ( i=1;i<=level;i++ ) <br>
fprintf(lfp,"%*c",i==1?1:3,'|'); <br>
} <br>
<br>
void usage(char *prgname) <br>
{ <br>
fprintf(stderr,"Usage:\t%s [-hupdflb] <host>\n",prgname); <br>
fprintf(stderr,"\t-h print this help infomation\n"); <br>
fprintf(stderr,"\t-u ftp user name (default anonymous)\n"); <br>
fprintf(stderr,"\t-p ftp passwd (default ysqcn@263.net)\n"); <br>
fprintf(stderr,"\t-d start directory (default /)\n"); <br>
fprintf(stderr,"\t-f file name to save the result (default -)\n"); <br>
fprintf(stderr,"\t-l the depth of Subdirectory (default 5)\n"); <br>
fprintf(stderr,"\t-b output file will be pasted on bbs ? (default no)\n"); <br>
fprintf(stderr,"\thost ftp server name\n"); <br>
} <br>
<br>
<br>
<br>
<br>
-- <br>
※ 修改:·ysqcn 於 09月18日23:31:13 修改本文·[FROM: 211.69.197.81] <br>
※ 来源:.UNIX编程WWW apue.dhs.org. [FROM: 211.69.197.81] <br>
-- <br>
※ 修改:·ysqcn 於 09月18日23:38:23 修改本文·[FROM: 211.69.197.81] <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.69.197.81] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="185.htm">上一层</a>][<a href="212.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 + -