cmds.c
来自「一个类似windows」· C语言 代码 · 共 2,374 行 · 第 1/4 页
C
2,374 行
ret = stat(argv[2], &stbuf);
if (restartit == 1) {
if (ret < 0) {
perror(argv[2]);
return (0);
}
restart_point = stbuf.st_size;
} else {
if (ret == 0) {
int overbose;
overbose = verbose;
if (debug == 0)
verbose = -1;
if (command("MDTM %s", argv[1]) == COMPLETE) {
int yy, mo, day, hour, min, sec;
struct tm *tm;
verbose = overbose;
sscanf(reply_string,
"%*s %04d%02d%02d%02d%02d%02d",
&yy, &mo, &day, &hour, &min, &sec);
tm = gmtime(&stbuf.st_mtime);
tm->tm_mon++;
if (tm->tm_year > yy%100)
return (1);
else if (tm->tm_year == yy%100) {
if (tm->tm_mon > mo)
return (1);
} else if (tm->tm_mon == mo) {
if (tm->tm_mday > day)
return (1);
} else if (tm->tm_mday == day) {
if (tm->tm_hour > hour)
return (1);
} else if (tm->tm_hour == hour) {
if (tm->tm_min > min)
return (1);
} else if (tm->tm_min == min) {
if (tm->tm_sec > sec)
return (1);
}
} else {
printf("%s\n", reply_string);
(void) fflush(stdout);
verbose = overbose;
return (0);
}
}
}
}
recvrequest("RETR", argv[2], argv[1], mode,
argv[1] != oldargv1 || argv[2] != oldargv2);
restart_point = 0;
return (0);
}
#if 0
static void
mabort()
{
int ointer;
extern jmp_buf jabort;
printf("\n");
(void) fflush(stdout);
if (mflag && fromatty) {
ointer = interactive;
interactive = 1;
if (confirm("Continue with", mname)) {
interactive = ointer;
longjmp(jabort,0);
}
interactive = ointer;
}
mflag = 0;
longjmp(jabort,0);
}
#endif
/*
* Get multiple files.
*/
void mget(argc, argv)
const char *argv[];
{
const char *cp, *tp;
char *tp2, tmpbuf[MAXPATHLEN];
int ointer;
extern jmp_buf jabort;
if (argc < 2) {
(void) strcat(line, " ");
printf("(remote-files) ");
(void) fflush(stdout);
(void) gets(&line[strlen(line)]);
makeargv();
argc = margc;
argv = margv;
}
if (argc < 2) {
printf("usage:%s remote-files\n", argv[0]);
(void) fflush(stdout);
code = -1;
return;
}
mname = argv[0];
mflag = 1;
// oldintr = signal(SIGINT,mabort);
(void) setjmp(jabort);
while ((cp = remglob(argv,proxy)) != NULL) {
if (*cp == '\0') {
mflag = 0;
continue;
}
if (mflag && confirm(argv[0], cp)) {
tp = cp;
if (mcase) {
while (*tp && !islower(*tp)) {
tp++;
}
if (!*tp) {
tp = cp;
tp2 = tmpbuf;
while ((*tp2 = *tp) != (int) NULL) {
if (isupper(*tp2)) {
*tp2 = 'a' + *tp2 - 'A';
}
tp++;
tp2++;
}
}
tp = tmpbuf;
}
if (ntflag) {
tp = dotrans(tp);
}
if (mapflag) {
tp = domap(tp);
}
recvrequest("RETR", tp, cp, "w",
tp != cp || !interactive);
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
if (confirm("Continue with","mget")) {
mflag++;
}
interactive = ointer;
}
}
}
// (void) signal(SIGINT,oldintr);
mflag = 0;
}
char *
remglob(argv,doswitch)
char *argv[];
int doswitch;
{
char temp[16];
static char buf[MAXPATHLEN];
static FILE *ftemp = NULL;
static char **args;
int oldverbose, oldhash;
char *cp;
const char *mode;
if (!mflag) {
if (!doglob) {
args = NULL;
}
else {
if (ftemp) {
(void) fclose(ftemp);
ftemp = NULL;
}
}
return(NULL);
}
if (!doglob) {
if (args == NULL)
args = argv;
if ((cp = *++args) == NULL)
args = NULL;
return (cp);
}
if (ftemp == NULL) {
(void) strcpy(temp, _PATH_TMP);
(void) mktemp(temp);
oldverbose = verbose, verbose = 0;
oldhash = hash, hash = 0;
if (doswitch) {
pswitch(!proxy);
}
for (mode = "w"; *++argv != NULL; mode = "a")
recvrequest ("NLST", temp, *argv, mode, 0);
if (doswitch) {
pswitch(!proxy);
}
verbose = oldverbose; hash = oldhash;
ftemp = fopen(temp, "r");
(void) unlink(temp);
if (ftemp == NULL) {
printf("can't find list of remote files, oops\n");
(void) fflush(stdout);
return (NULL);
}
}
if (fgets(buf, sizeof (buf), ftemp) == NULL) {
(void) fclose(ftemp), ftemp = NULL;
return (NULL);
}
if ((cp = index(buf, '\n')) != NULL)
*cp = '\0';
return (buf);
}
static const char *
onoff(bool)
int bool;
{
return (bool ? "on" : "off");
}
/*
* Show status.
*/
/*ARGSUSED*/
void status(argc, argv)
char *argv[];
{
int i;
if (connected)
printf("Connected to %s.\n", hostname);
else
printf("Not connected.\n");
if (!proxy) {
pswitch(1);
if (connected) {
printf("Connected for proxy commands to %s.\n", hostname);
}
else {
printf("No proxy connection.\n");
}
pswitch(0);
}
printf("Mode: %s; Type: %s; Form: %s; Structure: %s\n",
modename, typename, formname, structname);
printf("Verbose: %s; Bell: %s; Prompting: %s; Globbing: %s\n",
onoff(verbose), onoff(bell), onoff(interactive),
onoff(doglob));
printf("Store unique: %s; Receive unique: %s\n", onoff(sunique),
onoff(runique));
printf("Case: %s; CR stripping: %s\n",onoff(mcase),onoff(crflag));
if (ntflag) {
printf("Ntrans: (in) %s (out) %s\n", ntin,ntout);
}
else {
printf("Ntrans: off\n");
}
if (mapflag) {
printf("Nmap: (in) %s (out) %s\n", mapin, mapout);
}
else {
printf("Nmap: off\n");
}
printf("Hash mark printing: %s; Use of PORT cmds: %s\n",
onoff(hash), onoff(sendport));
if (macnum > 0) {
printf("Macros:\n");
for (i=0; i<macnum; i++) {
printf("\t%s\n",macros[i].mac_name);
}
}
(void) fflush(stdout);
code = 0;
}
/*
* Set beep on cmd completed mode.
*/
/*VARARGS*/
void setbell()
{
bell = !bell;
printf("Bell mode %s.\n", onoff(bell));
(void) fflush(stdout);
code = bell;
}
/*
* Turn on packet tracing.
*/
/*VARARGS*/
void settrace()
{
trace = !trace;
printf("Packet tracing %s.\n", onoff(trace));
(void) fflush(stdout);
code = trace;
}
/*
* Toggle hash mark printing during transfers.
*/
/*VARARGS*/
void sethash()
{
hash = !hash;
printf("Hash mark printing %s", onoff(hash));
code = hash;
if (hash)
printf(" (%d bytes/hash mark)", 1024);
printf(".\n");
(void) fflush(stdout);
}
/*
* Turn on printing of server echo's.
*/
/*VARARGS*/
void setverbose()
{
verbose = !verbose;
printf("Verbose mode %s.\n", onoff(verbose));
(void) fflush(stdout);
code = verbose;
}
/*
* Toggle PORT cmd use before each data connection.
*/
/*VARARGS*/
void setport()
{
sendport = !sendport;
printf("Use of PORT cmds %s.\n", onoff(sendport));
(void) fflush(stdout);
code = sendport;
}
/*
* Turn on interactive prompting
* during mget, mput, and mdelete.
*/
/*VARARGS*/
void setprompt()
{
interactive = !interactive;
printf("Interactive mode %s.\n", onoff(interactive));
(void) fflush(stdout);
code = interactive;
}
/*
* Toggle metacharacter interpretation
* on local file names.
*/
/*VARARGS*/
void setglob()
{
doglob = !doglob;
printf("Globbing %s.\n", onoff(doglob));
(void) fflush(stdout);
code = doglob;
}
/*
* Set debugging mode on/off and/or
* set level of debugging.
*/
/*VARARGS*/
void setdebug(argc, argv)
char *argv[];
{
int val;
if (argc > 1) {
val = atoi(argv[1]);
if (val < 0) {
printf("%s: bad debugging value.\n", argv[1]);
(void) fflush(stdout);
code = -1;
return;
}
} else
val = !debug;
debug = val;
if (debug)
options |= SO_DEBUG;
else
options &= ~SO_DEBUG;
printf("Debugging %s (debug=%d).\n", onoff(debug), debug);
(void) fflush(stdout);
code = debug > 0;
}
/*
* Set current working directory
* on remote machine.
*/
void cd(argc, argv)
const char *argv[];
{
if (argc < 2) {
(void) strcat(line, " ");
printf("(remote-directory) ");
(void) fflush(stdout);
(void) gets(&line[strlen(line)]);
makeargv();
argc = margc;
argv = margv;
}
if (argc < 2) {
printf("usage:%s remote-directory\n", argv[0]);
(void) fflush(stdout);
code = -1;
return;
}
if (command("CWD %s", argv[1]) == ERROR && code == 500) {
if (verbose) {
printf("CWD command not recognized, trying XCWD\n");
(void) fflush(stdout);
}
(void) command("XCWD %s", argv[1]);
}
}
/*
* Set current working directory
* on local machine.
*/
void lcd(argc, argv)
const char *argv[];
{
char buf[MAXPATHLEN];
if (argc < 2)
argc++, argv[1] = home;
if (argc != 2) {
printf("usage:%s local-directory\n", argv[0]);
(void) fflush(stdout);
code = -1;
return;
}
if (!globulize(&argv[1])) {
code = -1;
return;
}
if (chdir(argv[1]) < 0) {
perror(argv[1]);
code = -1;
return;
}
printf("Local directory now %s\n", getcwd(buf,sizeof(buf)));
(void) fflush(stdout);
code = 0;
}
/*
* Delete a single file.
*/
void delete(argc, argv)
const char *argv[];
{
if (argc < 2) {
(void) strcat(line, " ");
printf("(remote-file) ");
(void) fflush(stdout);
(void) gets(&line[strlen(line)]);
makeargv();
argc = margc;
argv = margv;
}
if (argc < 2) {
printf("usage:%s remote-file\n", argv[0]);
(void) fflush(stdout);
code = -1;
return;
}
(void) command("DELE %s", argv[1]);
}
/*
* Delete multiple files.
*/
void mdelete(argc, argv)
const char *argv[];
{
char *cp;
int ointer;
extern jmp_buf jabort;
if (argc < 2) {
(void) strcat(line, " ");
printf("(remote-files) ");
(void) fflush(stdout);
(void) gets(&line[strlen(line)]);
makeargv();
argc = margc;
argv = margv;
}
if (argc < 2) {
printf("usage:%s remote-files\n", argv[0]);
(void) fflush(stdout);
code = -1;
return;
}
mname = argv[0];
mflag = 1;
// oldintr = signal(SIGINT, mabort);
(void) setjmp(jabort);
while ((cp = remglob(argv,0)) != NULL) {
if (*cp == '\0') {
mflag = 0;
continue;
}
if (mflag && confirm(argv[0], cp)) {
(void) command("DELE %s", cp);
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
if (confirm("Continue with", "mdelete")) {
mflag++;
}
interactive = ointer;
}
}
}
// (void) signal(SIGINT, oldintr);
mflag = 0;
}
/*
* Rename a remote file.
*/
void renamefile(argc, argv)
const char *argv[];
{
if (argc < 2) {
(void) strcat(line, " ");
printf("(from-name) ");
(void) fflush(stdout);
(void) gets(&line[strlen(line)]);
makeargv();
argc = margc;
argv = margv;
}
if (argc < 2) {
usage:
printf("%s from-name to-name\n", argv[0]);
(void) fflush(stdout);
code = -1;
return;
}
if (argc < 3) {
(void) strcat(line, " ");
printf("(to-name) ");
(void) fflush(stdout);
(void) gets(&line[strlen(line)]);
makeargv();
argc = margc;
argv = margv;
}
if (argc < 3)
goto usage;
if (command("RNFR %s", argv[1]) == CONTINUE)
(void) command("RNTO %s", argv[2]);
}
/*
* Get a directory listing
* of remote files.
*/
void ls(argc, argv)
const char *argv[];
{
const char *cmd;
if (argc < 2)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?