-/*\r
- * Copyright (c) 1985, 1989 Regents of the University of California.\r
- * All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms are permitted\r
- * provided that the above copyright notice and this paragraph are\r
- * duplicated in all such forms and that any documentation,\r
- * advertising materials, and other materials related to such\r
- * distribution and use acknowledge that the software was developed\r
- * by the University of California, Berkeley. The name of the\r
- * University may not be used to endorse or promote products derived\r
- * from this software without specific prior written permission.\r
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\r
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\r
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
- */\r
-\r
-#ifndef lint\r
-static char sccsid[] = "@(#)cmds.c 5.18 (Berkeley) 4/20/89";\r
-#endif /* not lint */\r
-\r
-/*\r
- * FTP User Program -- Command Routines.\r
- */\r
-//#include <sys/param.h>\r
-//#include <sys/wait.h>\r
-#include <sys/stat.h>\r
-#if !defined(WIN32)\r
-#include <sys/socket.h>\r
-#include <arpa/ftp.h>\r
-#include <netinet/in.h>\r
-#include <netdb.h>\r
-#else\r
-#include <winsock.h>\r
-#endif\r
-\r
-#include <signal.h>\r
-#include <direct.h>\r
-#include <stdio.h>\r
-#include <errno.h>\r
-#include <ctype.h>\r
-#include <time.h>\r
-\r
-#include "ftp_var.h"\r
-#include "pathnames.h"\r
-#include "prototypes.h"\r
-\r
-extern char *globerr;\r
-extern char **glob();\r
-extern char home[];\r
-extern char *remglob();\r
-extern char *getenv();\r
-extern int allbinary;\r
-extern off_t restart_point;\r
-extern char reply_string[];\r
-\r
-char *mname;\r
-jmp_buf jabort;\r
-char *dotrans(), *domap();\r
-\r
-extern short portnum;\r
-extern char *hostname;\r
-extern int autologin;\r
-/*\r
- * Connect to peer server and\r
- * auto-login, if possible.\r
- */\r
-void setpeer(int argc, char *argv[])\r
-{\r
- char *host, *hookup();\r
-\r
- if (connected) {\r
- printf("Already connected to %s, use close first.\n",\r
- hostname);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(to) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc > 3) {\r
- printf("usage: %s host-name [port]\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (argc > 2) {\r
- portnum = atoi(argv[2]);\r
- if (portnum <= 0) {\r
- printf("%s: bad port number-- %s\n", argv[1], argv[2]);\r
- printf ("usage: %s host-name [port]\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- portnum = htons(portnum);\r
- }\r
- host = hookup(argv[1], portnum);\r
- if (host) {\r
-#if defined(unix) && NBBY == 8\r
- int overbose;\r
-#endif\r
- connected = 1;\r
- if (autologin)\r
- (void) login(argv[1]);\r
-\r
-#if defined(unix) && NBBY == 8\r
-/*\r
- * this ifdef is to keep someone form "porting" this to an incompatible\r
- * system and not checking this out. This way they have to think about it.\r
- */\r
- overbose = verbose;\r
- if (debug == 0)\r
- verbose = -1;\r
- allbinary = 0;\r
- if (command("SYST") == COMPLETE && overbose) {\r
- register char *cp, c;\r
- cp = index(reply_string+4, ' ');\r
- if (cp == NULL)\r
- cp = index(reply_string+4, '\r');\r
- if (cp) {\r
- if (cp[-1] == '.')\r
- cp--;\r
- c = *cp;\r
- *cp = '\0';\r
- }\r
-\r
- printf("Remote system type is %s.\n",\r
- reply_string+4);\r
- if (cp)\r
- *cp = c;\r
- }\r
- if (!strncmp(reply_string, "215 UNIX Type: L8", 17)) {\r
- setbinary();\r
- /* allbinary = 1; this violates the RFC */\r
- if (overbose)\r
- printf("Using %s mode to transfer files.\n",\r
- typename);\r
- } else if (overbose &&\r
- !strncmp(reply_string, "215 TOPS20", 10)) {\r
- printf(\r
-"Remember to set tenex mode when transfering binary files from this machine.\n");\r
- }\r
- verbose = overbose;\r
-#endif /* unix */\r
- }\r
- (void) fflush(stdout);\r
-}\r
-\r
-struct types {\r
- char *t_name;\r
- char *t_mode;\r
- int t_type;\r
- char *t_arg;\r
-} types[] = {\r
- { "ascii", "A", TYPE_A, 0 },\r
- { "binary", "I", TYPE_I, 0 },\r
- { "image", "I", TYPE_I, 0 },\r
- { "ebcdic", "E", TYPE_E, 0 },\r
- { "tenex", "L", TYPE_L, bytename },\r
- 0\r
-};\r
-\r
-/*\r
- * Set transfer type.\r
- */\r
-void settype(argc, argv)\r
- char *argv[];\r
-{\r
- register struct types *p;\r
- int comret;\r
-\r
- if (argc > 2) {\r
- char *sep;\r
-\r
- printf("usage: %s [", argv[0]);\r
- sep = " ";\r
- for (p = types; p->t_name; p++) {\r
- printf("%s%s", sep, p->t_name);\r
- if (*sep == ' ')\r
- sep = " | ";\r
- }\r
- printf(" ]\n");\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (argc < 2) {\r
- printf("Using %s mode to transfer files.\n", typename);\r
- (void) fflush(stdout);\r
- code = 0;\r
- return;\r
- }\r
- for (p = types; p->t_name; p++)\r
- if (strcmp(argv[1], p->t_name) == 0)\r
- break;\r
- if (p->t_name == 0) {\r
- printf("%s: unknown mode\n", argv[1]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if ((p->t_arg != NULL) && (*(p->t_arg) != '\0'))\r
- comret = command ("TYPE %s %s", p->t_mode, p->t_arg);\r
- else\r
- comret = command("TYPE %s", p->t_mode);\r
- if (comret == COMPLETE) {\r
- (void) strcpy(typename, p->t_name);\r
- type = p->t_type;\r
- }\r
-}\r
-\r
-char *stype[] = {\r
- "type",\r
- "",\r
- 0\r
-};\r
-\r
-/*\r
- * Set binary transfer type.\r
- */\r
-/*VARARGS*/\r
-void setbinary()\r
-{\r
- stype[1] = "binary";\r
- settype(2, stype);\r
-}\r
-\r
-/*\r
- * Set ascii transfer type.\r
- */\r
-/*VARARGS*/\r
-void setascii()\r
-{\r
- stype[1] = "ascii";\r
- settype(2, stype);\r
-}\r
-\r
-/*\r
- * Set tenex transfer type.\r
- */\r
-/*VARARGS*/\r
-void settenex()\r
-{\r
- stype[1] = "tenex";\r
- settype(2, stype);\r
-}\r
-\r
-/*\r
- * Set ebcdic transfer type.\r
- */\r
-/*VARARGS*/\r
-void setebcdic()\r
-{\r
- stype[1] = "ebcdic";\r
- settype(2, stype);\r
-}\r
-\r
-/*\r
- * Set file transfer mode.\r
- */\r
-#if 0\r
-/*ARGSUSED*/\r
-void setmode(argc, argv)\r
- char *argv[];\r
-{\r
-\r
- printf("We only support %s mode, sorry.\n", modename);\r
- (void) fflush(stdout);\r
- code = -1;\r
-}\r
-#endif\r
-\r
-/*\r
- * Set file transfer format.\r
- */\r
-/*ARGSUSED*/\r
-void setform(argc, argv)\r
- char *argv[];\r
-{\r
-\r
- printf("We only support %s format, sorry.\n", formname);\r
- (void) fflush(stdout);\r
- code = -1;\r
-}\r
-\r
-/*\r
- * Set file transfer structure.\r
- */\r
-/*ARGSUSED*/\r
-void setstruct(argc, argv)\r
- char *argv[];\r
-{\r
-\r
- printf("We only support %s structure, sorry.\n", structname);\r
- (void) fflush(stdout);\r
- code = -1;\r
-}\r
-\r
-/*\r
- * Send a single file.\r
- */\r
-void put(argc, argv)\r
- int argc;\r
- char *argv[];\r
-{\r
- char *cmd;\r
- int loc = 0;\r
- char *oldargv1, *oldargv2;\r
-\r
- if (argc == 2) {\r
- argc++;\r
- argv[2] = argv[1];\r
- loc++;\r
- }\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(local-file) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
-usage:\r
- printf("usage:%s local-file remote-file\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (argc < 3) {\r
- (void) strcat(line, " ");\r
- printf("(remote-file) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 3)\r
- goto usage;\r
- oldargv1 = argv[1];\r
- oldargv2 = argv[2];\r
- if (!globulize(&argv[1])) {\r
- code = -1;\r
- return;\r
- }\r
- /*\r
- * If "globulize" modifies argv[1], and argv[2] is a copy of\r
- * the old argv[1], make it a copy of the new argv[1].\r
- */\r
- if (argv[1] != oldargv1 && argv[2] == oldargv1) {\r
- argv[2] = argv[1];\r
- }\r
- cmd = (argv[0][0] == 'a') ? "APPE" : ((sunique) ? "STOU" : "STOR");\r
- if (loc && ntflag) {\r
- argv[2] = dotrans(argv[2]);\r
- }\r
- if (loc && mapflag) {\r
- argv[2] = domap(argv[2]);\r
- }\r
- sendrequest(cmd, argv[1], argv[2],\r
- argv[1] != oldargv1 || argv[2] != oldargv2);\r
-}\r
-\r
-/*\r
- * Send multiple files.\r
- */\r
-void mput(argc, argv)\r
- char *argv[];\r
-{\r
- register int i;\r
- int ointer;\r
- void mabort();\r
- extern jmp_buf jabort;\r
- char *tp;\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(local-files) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage:%s local-files\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- mname = argv[0];\r
- mflag = 1;\r
-// oldintr = signal(SIGINT, mabort);\r
- (void) setjmp(jabort);\r
- if (proxy) {\r
- char *cp, *tp2, tmpbuf[MAXPATHLEN];\r
-\r
- while ((cp = remglob(argv,0)) != NULL) {\r
- if (*cp == 0) {\r
- mflag = 0;\r
- continue;\r
- }\r
- if (mflag && confirm(argv[0], cp)) {\r
- tp = cp;\r
- if (mcase) {\r
- while (*tp && !islower(*tp)) {\r
- tp++;\r
- }\r
- if (!*tp) {\r
- tp = cp;\r
- tp2 = tmpbuf;\r
- while ((*tp2 = *tp) != (int) NULL) {\r
- if (isupper(*tp2)) {\r
- *tp2 = 'a' + *tp2 - 'A';\r
- }\r
- tp++;\r
- tp2++;\r
- }\r
- }\r
- tp = tmpbuf;\r
- }\r
- if (ntflag) {\r
- tp = dotrans(tp);\r
- }\r
- if (mapflag) {\r
- tp = domap(tp);\r
- }\r
- sendrequest((sunique) ? "STOU" : "STOR",\r
- cp, tp, cp != tp || !interactive);\r
- if (!mflag && fromatty) {\r
- ointer = interactive;\r
- interactive = 1;\r
- if (confirm("Continue with","mput")) {\r
- mflag++;\r
- }\r
- interactive = ointer;\r
- }\r
- }\r
- }\r
-// (void) signal(SIGINT, oldintr);\r
- mflag = 0;\r
- return;\r
- }\r
- for (i = 1; i < argc; i++) {\r
- register char **cpp, **gargs;\r
-\r
- if (!doglob) {\r
- if (mflag && confirm(argv[0], argv[i])) {\r
- tp = (ntflag) ? dotrans(argv[i]) : argv[i];\r
- tp = (mapflag) ? domap(tp) : tp;\r
- sendrequest((sunique) ? "STOU" : "STOR",\r
- argv[i], tp, tp != argv[i] || !interactive);\r
- if (!mflag && fromatty) {\r
- ointer = interactive;\r
- interactive = 1;\r
- if (confirm("Continue with","mput")) {\r
- mflag++;\r
- }\r
- interactive = ointer;\r
- }\r
- }\r
- continue;\r
- }\r
- gargs = glob(argv[i]);\r
- if (globerr != NULL) {\r
- printf("%s\n", globerr);\r
- (void) fflush(stdout);\r
- if (gargs) {\r
- blkfree(gargs);\r
- free((char *)gargs);\r
- }\r
- continue;\r
- }\r
- for (cpp = gargs; cpp && *cpp != NULL; cpp++) {\r
- if (mflag && confirm(argv[0], *cpp)) {\r
- tp = (ntflag) ? dotrans(*cpp) : *cpp;\r
- tp = (mapflag) ? domap(tp) : tp;\r
- sendrequest((sunique) ? "STOU" : "STOR",\r
- *cpp, tp, *cpp != tp || !interactive);\r
- if (!mflag && fromatty) {\r
- ointer = interactive;\r
- interactive = 1;\r
- if (confirm("Continue with","mput")) {\r
- mflag++;\r
- }\r
- interactive = ointer;\r
- }\r
- }\r
- }\r
- if (gargs != NULL) {\r
- blkfree(gargs);\r
- free((char *)gargs);\r
- }\r
- }\r
-// (void) signal(SIGINT, oldintr);\r
- mflag = 0;\r
-}\r
-\r
-void reget(argc, argv)\r
- char *argv[];\r
-{\r
- (void) getit(argc, argv, 1, "r+w");\r
-}\r
-\r
-void get(argc, argv)\r
- char *argv[];\r
-{\r
- (void) getit(argc, argv, 0, restart_point ? "r+w" : "w" );\r
-}\r
-\r
-/*\r
- * Receive one file.\r
- */\r
-int getit(argc, argv, restartit, mode)\r
- char *argv[];\r
- char *mode;\r
-{\r
- int loc = 0;\r
- char *oldargv1, *oldargv2;\r
-\r
- if (argc == 2) {\r
- argc++;\r
- argv[2] = argv[1];\r
- loc++;\r
- }\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(remote-file) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
-usage:\r
- printf("usage: %s remote-file [ local-file ]\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return (0);\r
- }\r
- if (argc < 3) {\r
- (void) strcat(line, " ");\r
- printf("(local-file) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 3)\r
- goto usage;\r
- oldargv1 = argv[1];\r
- oldargv2 = argv[2];\r
- if (!globulize(&argv[2])) {\r
- code = -1;\r
- return (0);\r
- }\r
- if (loc && mcase) {\r
- char *tp = argv[1], *tp2, tmpbuf[MAXPATHLEN];\r
-\r
- while (*tp && !islower(*tp)) {\r
- tp++;\r
- }\r
- if (!*tp) {\r
- tp = argv[2];\r
- tp2 = tmpbuf;\r
- while ((*tp2 = *tp) != (int) NULL) {\r
- if (isupper(*tp2)) {\r
- *tp2 = 'a' + *tp2 - 'A';\r
- }\r
- tp++;\r
- tp2++;\r
- }\r
- argv[2] = tmpbuf;\r
- }\r
- }\r
- if (loc && ntflag)\r
- argv[2] = dotrans(argv[2]);\r
- if (loc && mapflag)\r
- argv[2] = domap(argv[2]);\r
- if (restartit) {\r
- struct stat stbuf;\r
- int ret;\r
-\r
- ret = stat(argv[2], &stbuf);\r
- if (restartit == 1) {\r
- if (ret < 0) {\r
- perror(argv[2]);\r
- return (0);\r
- }\r
- restart_point = stbuf.st_size;\r
- } else {\r
- if (ret == 0) {\r
- int overbose;\r
-\r
- overbose = verbose;\r
- if (debug == 0)\r
- verbose = -1;\r
- if (command("MDTM %s", argv[1]) == COMPLETE) {\r
- int yy, mo, day, hour, min, sec;\r
- struct tm *tm;\r
- verbose = overbose;\r
- sscanf(reply_string,\r
- "%*s %04d%02d%02d%02d%02d%02d",\r
- &yy, &mo, &day, &hour, &min, &sec);\r
- tm = gmtime(&stbuf.st_mtime);\r
- tm->tm_mon++;\r
- if (tm->tm_year > yy%100)\r
- return (1);\r
- else if (tm->tm_year == yy%100) {\r
- if (tm->tm_mon > mo)\r
- return (1);\r
- } else if (tm->tm_mon == mo) {\r
- if (tm->tm_mday > day)\r
- return (1);\r
- } else if (tm->tm_mday == day) {\r
- if (tm->tm_hour > hour)\r
- return (1);\r
- } else if (tm->tm_hour == hour) {\r
- if (tm->tm_min > min)\r
- return (1);\r
- } else if (tm->tm_min == min) {\r
- if (tm->tm_sec > sec)\r
- return (1);\r
- }\r
- } else {\r
- printf("%s\n", reply_string);\r
- (void) fflush(stdout);\r
- verbose = overbose;\r
- return (0);\r
- }\r
- }\r
- }\r
- }\r
-\r
- recvrequest("RETR", argv[2], argv[1], mode,\r
- argv[1] != oldargv1 || argv[2] != oldargv2);\r
- restart_point = 0;\r
- return (0);\r
-}\r
-\r
-void\r
-mabort()\r
-{\r
- int ointer;\r
- extern jmp_buf jabort;\r
-\r
- printf("\n");\r
- (void) fflush(stdout);\r
- if (mflag && fromatty) {\r
- ointer = interactive;\r
- interactive = 1;\r
- if (confirm("Continue with", mname)) {\r
- interactive = ointer;\r
- longjmp(jabort,0);\r
- }\r
- interactive = ointer;\r
- }\r
- mflag = 0;\r
- longjmp(jabort,0);\r
-}\r
-\r
-/*\r
- * Get multiple files.\r
- */\r
-void mget(argc, argv)\r
- char *argv[];\r
-{\r
- char *cp, *tp, *tp2, tmpbuf[MAXPATHLEN];\r
- int ointer;\r
- void mabort();\r
- extern jmp_buf jabort;\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(remote-files) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage:%s remote-files\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- mname = argv[0];\r
- mflag = 1;\r
-// oldintr = signal(SIGINT,mabort);\r
- (void) setjmp(jabort);\r
- while ((cp = remglob(argv,proxy)) != NULL) {\r
- if (*cp == '\0') {\r
- mflag = 0;\r
- continue;\r
- }\r
- if (mflag && confirm(argv[0], cp)) {\r
- tp = cp;\r
- if (mcase) {\r
- while (*tp && !islower(*tp)) {\r
- tp++;\r
- }\r
- if (!*tp) {\r
- tp = cp;\r
- tp2 = tmpbuf;\r
- while ((*tp2 = *tp) != (int) NULL) {\r
- if (isupper(*tp2)) {\r
- *tp2 = 'a' + *tp2 - 'A';\r
- }\r
- tp++;\r
- tp2++;\r
- }\r
- }\r
- tp = tmpbuf;\r
- }\r
- if (ntflag) {\r
- tp = dotrans(tp);\r
- }\r
- if (mapflag) {\r
- tp = domap(tp);\r
- }\r
- recvrequest("RETR", tp, cp, "w",\r
- tp != cp || !interactive);\r
- if (!mflag && fromatty) {\r
- ointer = interactive;\r
- interactive = 1;\r
- if (confirm("Continue with","mget")) {\r
- mflag++;\r
- }\r
- interactive = ointer;\r
- }\r
- }\r
- }\r
-// (void) signal(SIGINT,oldintr);\r
- mflag = 0;\r
-}\r
-\r
-char *\r
-remglob(argv,doswitch)\r
- char *argv[];\r
- int doswitch;\r
-{\r
- char temp[16];\r
- static char buf[MAXPATHLEN];\r
- static FILE *ftemp = NULL;\r
- static char **args;\r
- int oldverbose, oldhash;\r
- char *cp, *mode;\r
-\r
- if (!mflag) {\r
- if (!doglob) {\r
- args = NULL;\r
- }\r
- else {\r
- if (ftemp) {\r
- (void) fclose(ftemp);\r
- ftemp = NULL;\r
- }\r
- }\r
- return(NULL);\r
- }\r
- if (!doglob) {\r
- if (args == NULL)\r
- args = argv;\r
- if ((cp = *++args) == NULL)\r
- args = NULL;\r
- return (cp);\r
- }\r
- if (ftemp == NULL) {\r
- (void) strcpy(temp, _PATH_TMP);\r
- (void) mktemp(temp);\r
- oldverbose = verbose, verbose = 0;\r
- oldhash = hash, hash = 0;\r
- if (doswitch) {\r
- pswitch(!proxy);\r
- }\r
- for (mode = "w"; *++argv != NULL; mode = "a")\r
- recvrequest ("NLST", temp, *argv, mode, 0);\r
- if (doswitch) {\r
- pswitch(!proxy);\r
- }\r
- verbose = oldverbose; hash = oldhash;\r
- ftemp = fopen(temp, "r");\r
- (void) unlink(temp);\r
- if (ftemp == NULL) {\r
- printf("can't find list of remote files, oops\n");\r
- (void) fflush(stdout);\r
- return (NULL);\r
- }\r
- }\r
- if (fgets(buf, sizeof (buf), ftemp) == NULL) {\r
- (void) fclose(ftemp), ftemp = NULL;\r
- return (NULL);\r
- }\r
- if ((cp = index(buf, '\n')) != NULL)\r
- *cp = '\0';\r
- return (buf);\r
-}\r
-\r
-char *\r
-onoff(bool)\r
- int bool;\r
-{\r
-\r
- return (bool ? "on" : "off");\r
-}\r
-\r
-/*\r
- * Show status.\r
- */\r
-/*ARGSUSED*/\r
-void status(argc, argv)\r
- char *argv[];\r
-{\r
- int i;\r
-\r
- if (connected)\r
- printf("Connected to %s.\n", hostname);\r
- else\r
- printf("Not connected.\n");\r
- if (!proxy) {\r
- pswitch(1);\r
- if (connected) {\r
- printf("Connected for proxy commands to %s.\n", hostname);\r
- }\r
- else {\r
- printf("No proxy connection.\n");\r
- }\r
- pswitch(0);\r
- }\r
- printf("Mode: %s; Type: %s; Form: %s; Structure: %s\n",\r
- modename, typename, formname, structname);\r
- printf("Verbose: %s; Bell: %s; Prompting: %s; Globbing: %s\n",\r
- onoff(verbose), onoff(bell), onoff(interactive),\r
- onoff(doglob));\r
- printf("Store unique: %s; Receive unique: %s\n", onoff(sunique),\r
- onoff(runique));\r
- printf("Case: %s; CR stripping: %s\n",onoff(mcase),onoff(crflag));\r
- if (ntflag) {\r
- printf("Ntrans: (in) %s (out) %s\n", ntin,ntout);\r
- }\r
- else {\r
- printf("Ntrans: off\n");\r
- }\r
- if (mapflag) {\r
- printf("Nmap: (in) %s (out) %s\n", mapin, mapout);\r
- }\r
- else {\r
- printf("Nmap: off\n");\r
- }\r
- printf("Hash mark printing: %s; Use of PORT cmds: %s\n",\r
- onoff(hash), onoff(sendport));\r
- if (macnum > 0) {\r
- printf("Macros:\n");\r
- for (i=0; i<macnum; i++) {\r
- printf("\t%s\n",macros[i].mac_name);\r
- }\r
- }\r
- (void) fflush(stdout);\r
- code = 0;\r
-}\r
-\r
-/*\r
- * Set beep on cmd completed mode.\r
- */\r
-/*VARARGS*/\r
-void setbell()\r
-{\r
-\r
- bell = !bell;\r
- printf("Bell mode %s.\n", onoff(bell));\r
- (void) fflush(stdout);\r
- code = bell;\r
-}\r
-\r
-/*\r
- * Turn on packet tracing.\r
- */\r
-/*VARARGS*/\r
-void settrace()\r
-{\r
-\r
- trace = !trace;\r
- printf("Packet tracing %s.\n", onoff(trace));\r
- (void) fflush(stdout);\r
- code = trace;\r
-}\r
-\r
-/*\r
- * Toggle hash mark printing during transfers.\r
- */\r
-/*VARARGS*/\r
-void sethash()\r
-{\r
-\r
- hash = !hash;\r
- printf("Hash mark printing %s", onoff(hash));\r
- code = hash;\r
- if (hash)\r
- printf(" (%d bytes/hash mark)", 1024);\r
- printf(".\n");\r
- (void) fflush(stdout);\r
-}\r
-\r
-/*\r
- * Turn on printing of server echo's.\r
- */\r
-/*VARARGS*/\r
-void setverbose()\r
-{\r
-\r
- verbose = !verbose;\r
- printf("Verbose mode %s.\n", onoff(verbose));\r
- (void) fflush(stdout);\r
- code = verbose;\r
-}\r
-\r
-/*\r
- * Toggle PORT cmd use before each data connection.\r
- */\r
-/*VARARGS*/\r
-void setport()\r
-{\r
-\r
- sendport = !sendport;\r
- printf("Use of PORT cmds %s.\n", onoff(sendport));\r
- (void) fflush(stdout);\r
- code = sendport;\r
-}\r
-\r
-/*\r
- * Turn on interactive prompting\r
- * during mget, mput, and mdelete.\r
- */\r
-/*VARARGS*/\r
-void setprompt()\r
-{\r
-\r
- interactive = !interactive;\r
- printf("Interactive mode %s.\n", onoff(interactive));\r
- (void) fflush(stdout);\r
- code = interactive;\r
-}\r
-\r
-/*\r
- * Toggle metacharacter interpretation\r
- * on local file names.\r
- */\r
-/*VARARGS*/\r
-void setglob()\r
-{\r
-\r
- doglob = !doglob;\r
- printf("Globbing %s.\n", onoff(doglob));\r
- (void) fflush(stdout);\r
- code = doglob;\r
-}\r
-\r
-/*\r
- * Set debugging mode on/off and/or\r
- * set level of debugging.\r
- */\r
-/*VARARGS*/\r
-void setdebug(argc, argv)\r
- char *argv[];\r
-{\r
- int val;\r
-\r
- if (argc > 1) {\r
- val = atoi(argv[1]);\r
- if (val < 0) {\r
- printf("%s: bad debugging value.\n", argv[1]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- } else\r
- val = !debug;\r
- debug = val;\r
- if (debug)\r
- options |= SO_DEBUG;\r
- else\r
- options &= ~SO_DEBUG;\r
- printf("Debugging %s (debug=%d).\n", onoff(debug), debug);\r
- (void) fflush(stdout);\r
- code = debug > 0;\r
-}\r
-\r
-/*\r
- * Set current working directory\r
- * on remote machine.\r
- */\r
-void cd(argc, argv)\r
- char *argv[];\r
-{\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(remote-directory) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage:%s remote-directory\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (command("CWD %s", argv[1]) == ERROR && code == 500) {\r
- if (verbose) {\r
- printf("CWD command not recognized, trying XCWD\n");\r
- (void) fflush(stdout);\r
- }\r
- (void) command("XCWD %s", argv[1]);\r
- }\r
-}\r
-\r
-/*\r
- * Set current working directory\r
- * on local machine.\r
- */\r
-void lcd(argc, argv)\r
- char *argv[];\r
-{\r
- char buf[MAXPATHLEN];\r
-\r
- if (argc < 2)\r
- argc++, argv[1] = home;\r
- if (argc != 2) {\r
- printf("usage:%s local-directory\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (!globulize(&argv[1])) {\r
- code = -1;\r
- return;\r
- }\r
- if (chdir(argv[1]) < 0) {\r
- perror(argv[1]);\r
- code = -1;\r
- return;\r
- }\r
- printf("Local directory now %s\n", getcwd(buf,sizeof(buf)));\r
- (void) fflush(stdout);\r
- code = 0;\r
-}\r
-\r
-/*\r
- * Delete a single file.\r
- */\r
-void delete(argc, argv)\r
- char *argv[];\r
-{\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(remote-file) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage:%s remote-file\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- (void) command("DELE %s", argv[1]);\r
-}\r
-\r
-/*\r
- * Delete multiple files.\r
- */\r
-void mdelete(argc, argv)\r
- char *argv[];\r
-{\r
- char *cp;\r
- int ointer;\r
- void mabort();\r
- extern jmp_buf jabort;\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(remote-files) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage:%s remote-files\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- mname = argv[0];\r
- mflag = 1;\r
-// oldintr = signal(SIGINT, mabort);\r
- (void) setjmp(jabort);\r
- while ((cp = remglob(argv,0)) != NULL) {\r
- if (*cp == '\0') {\r
- mflag = 0;\r
- continue;\r
- }\r
- if (mflag && confirm(argv[0], cp)) {\r
- (void) command("DELE %s", cp);\r
- if (!mflag && fromatty) {\r
- ointer = interactive;\r
- interactive = 1;\r
- if (confirm("Continue with", "mdelete")) {\r
- mflag++;\r
- }\r
- interactive = ointer;\r
- }\r
- }\r
- }\r
-// (void) signal(SIGINT, oldintr);\r
- mflag = 0;\r
-}\r
-\r
-/*\r
- * Rename a remote file.\r
- */\r
-void renamefile(argc, argv)\r
- char *argv[];\r
-{\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(from-name) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
-usage:\r
- printf("%s from-name to-name\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (argc < 3) {\r
- (void) strcat(line, " ");\r
- printf("(to-name) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 3)\r
- goto usage;\r
- if (command("RNFR %s", argv[1]) == CONTINUE)\r
- (void) command("RNTO %s", argv[2]);\r
-}\r
-\r
-/*\r
- * Get a directory listing\r
- * of remote files.\r
- */\r
-void ls(argc, argv)\r
- char *argv[];\r
-{\r
- char *cmd;\r
-\r
- if (argc < 2)\r
- argc++, argv[1] = NULL;\r
- if (argc < 3)\r
- argc++, argv[2] = "-";\r
- if (argc > 3) {\r
- printf("usage: %s remote-directory local-file\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- cmd = argv[0][0] == 'n' ? "NLST" : "LIST";\r
-// cmd = argv[0][0] == 'n' ? "NLST -CF" : "NLST -CF";\r
- if (strcmp(argv[2], "-") && !globulize(&argv[2])) {\r
- code = -1;\r
- return;\r
- }\r
- if (strcmp(argv[2], "-") && *argv[2] != '|')\r
- if (!globulize(&argv[2]) || !confirm("output to local-file:", argv[2])) {\r
- code = -1;\r
- return;\r
- }\r
- recvrequest(cmd, argv[2], argv[1], "w", 0);\r
-}\r
-\r
-/*\r
- * Get a directory listing\r
- * of multiple remote files.\r
- */\r
-void mls(argc, argv)\r
- char *argv[];\r
-{\r
- char *cmd, mode[1], *dest;\r
- int ointer, i;\r
- void mabort();\r
- extern jmp_buf jabort;\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(remote-files) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 3) {\r
- (void) strcat(line, " ");\r
- printf("(local-file) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 3) {\r
- printf("usage:%s remote-files local-file\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- dest = argv[argc - 1];\r
- argv[argc - 1] = NULL;\r
- if (strcmp(dest, "-") && *dest != '|')\r
- if (!globulize(&dest) || !confirm("output to local-file:", dest)) {\r
- code = -1;\r
- return;\r
- }\r
- cmd = argv[0][1] == 'l' ? "NLST" : "LIST";\r
- mname = argv[0];\r
- mflag = 1;\r
-// oldintr = signal(SIGINT, mabort);\r
- (void) setjmp(jabort);\r
- for (i = 1; mflag && i < argc-1; ++i) {\r
- *mode = (i == 1) ? 'w' : 'a';\r
- recvrequest(cmd, dest, argv[i], mode, 0);\r
- if (!mflag && fromatty) {\r
- ointer = interactive;\r
- interactive = 1;\r
- if (confirm("Continue with", argv[0])) {\r
- mflag ++;\r
- }\r
- interactive = ointer;\r
- }\r
- }\r
-// (void) signal(SIGINT, oldintr);\r
- mflag = 0;\r
-}\r
-\r
-/*\r
- * Do a shell escape\r
- */\r
-/*ARGSUSED*/\r
-shell(argc, argv)\r
- char *argv[];\r
-{\r
-#if 0\r
- int pid;\r
- sig_t (*old1)(), (*old2)();\r
- char shellnam[40], *shell, *namep;\r
- union wait status;\r
-\r
- old1 = signal (SIGINT, SIG_IGN);\r
- old2 = signal (SIGQUIT, SIG_IGN);\r
- if ((pid = fork()) == 0) {\r
- for (pid = 3; pid < 20; pid++)\r
- (void) close(pid);\r
- (void) signal(SIGINT, SIG_DFL);\r
- (void) signal(SIGQUIT, SIG_DFL);\r
- shell = getenv("SHELL");\r
- if (shell == NULL)\r
- shell = _PATH_BSHELL;\r
- namep = rindex(shell,'/');\r
- if (namep == NULL)\r
- namep = shell;\r
- (void) strcpy(shellnam,"-");\r
- (void) strcat(shellnam, ++namep);\r
- if (strcmp(namep, "sh") != 0)\r
- shellnam[0] = '+';\r
- if (debug) {\r
- printf ("%s\n", shell);\r
- (void) fflush (stdout);\r
- }\r
- if (argc > 1) {\r
- execl(shell,shellnam,"-c",altarg,(char *)0);\r
- }\r
- else {\r
- execl(shell,shellnam,(char *)0);\r
- }\r
- perror(shell);\r
- code = -1;\r
- exit(1);\r
- }\r
- if (pid > 0)\r
- while (wait(&status) != pid)\r
- ;\r
- (void) signal(SIGINT, old1);\r
- (void) signal(SIGQUIT, old2);\r
- if (pid == -1) {\r
- perror("Try again later");\r
- code = -1;\r
- }\r
- else {\r
- code = 0;\r
- }\r
-#endif\r
-\r
- char * AppName;\r
- char ShellCmd[MAX_PATH];\r
- char CmdLine[MAX_PATH];\r
- int i;\r
- PROCESS_INFORMATION ProcessInformation;\r
- BOOL Result;\r
- STARTUPINFO StartupInfo;\r
- char ShellName[] = "COMSPEC";\r
- int NumBytes;\r
-\r
- NumBytes = GetEnvironmentVariable( ShellName, ShellCmd, MAX_PATH);\r
-\r
- if (NumBytes == 0)\r
- {\r
- return(-1);\r
- }\r
-\r
- AppName = ShellCmd;\r
- strcpy( CmdLine, ShellCmd );\r
-\r
- if (argc > 1)\r
- {\r
- strncat(CmdLine, " /C", MAX_PATH);\r
- }\r
-\r
- for (i=1; i<argc; i++)\r
- {\r
- strncat(CmdLine, " ", MAX_PATH);\r
- strncat(CmdLine, argv[i], MAX_PATH);\r
- }\r
-\r
- StartupInfo.cb = sizeof( StartupInfo );\r
- StartupInfo.lpReserved = NULL;\r
- StartupInfo.lpDesktop = NULL;\r
- StartupInfo.lpTitle = NULL;\r
- StartupInfo.dwX = 0;\r
- StartupInfo.dwY = 0;\r
- StartupInfo.dwXSize = 0;\r
- StartupInfo.dwYSize = 0;\r
- StartupInfo.dwFlags = 0;\r
- StartupInfo.wShowWindow = 0;\r
- StartupInfo.cbReserved2 = 0;\r
- StartupInfo.lpReserved2 = NULL;\r
-\r
- Result = CreateProcess( AppName, // cmd name\r
- CmdLine, // cmd line arguments\r
- NULL,\r
- NULL, // security attributes\r
- FALSE, // inherit flags\r
- 0, // Creation flags\r
- NULL, // Environment\r
- NULL, // Current directory\r
- &StartupInfo, // Startup info structure\r
- &ProcessInformation); // processInfo structure\r
-\r
- if (Result)\r
- {\r
- WaitForSingleObject( ProcessInformation.hProcess, 0xffffffff);\r
-\r
- CloseHandle( ProcessInformation.hProcess);\r
- }\r
-\r
- if (Result)\r
- {\r
- return(-1);\r
- }\r
- else\r
- {\r
- return(0);\r
- }\r
-}\r
-\r
-/*\r
- * Send new user information (re-login)\r
- */\r
-user(argc, argv)\r
- int argc;\r
- char **argv;\r
-{\r
- char acct[80], *getpass();\r
- int n, aflag = 0;\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(username) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc > 4) {\r
- printf("usage: %s username [password] [account]\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return (0);\r
- }\r
- n = command("USER %s", argv[1]);\r
- if (n == CONTINUE) {\r
- if (argc < 3 )\r
- argv[2] = getpass("Password: "), argc++;\r
- n = command("PASS %s", argv[2]);\r
- }\r
- if (n == CONTINUE) {\r
- if (argc < 4) {\r
- printf("Account: "); (void) fflush(stdout);\r
- (void) fflush(stdout);\r
- (void) fgets(acct, sizeof(acct) - 1, stdin);\r
- acct[strlen(acct) - 1] = '\0';\r
- argv[3] = acct; argc++;\r
- }\r
- n = command("ACCT %s", argv[3]);\r
- aflag++;\r
- }\r
- if (n != COMPLETE) {\r
- fprintf(stdout, "Login failed.\n");\r
- (void) fflush(stdout);\r
- return (0);\r
- }\r
- if (!aflag && argc == 4) {\r
- (void) command("ACCT %s", argv[3]);\r
- }\r
- return (1);\r
-}\r
-\r
-/*\r
- * Print working directory.\r
- */\r
-/*VARARGS*/\r
-void pwd()\r
-{\r
- int oldverbose = verbose;\r
-\r
- /*\r
- * If we aren't verbose, this doesn't do anything!\r
- */\r
- verbose = 1;\r
- if (command("PWD") == ERROR && code == 500) {\r
- printf("PWD command not recognized, trying XPWD\n");\r
- (void) fflush(stdout);\r
- (void) command("XPWD");\r
- }\r
- verbose = oldverbose;\r
-}\r
-\r
-/*\r
- * Make a directory.\r
- */\r
-void makedir(argc, argv)\r
- char *argv[];\r
-{\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(directory-name) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage: %s directory-name\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (command("MKD %s", argv[1]) == ERROR && code == 500) {\r
- if (verbose) {\r
- printf("MKD command not recognized, trying XMKD\n");\r
- (void) fflush(stdout);\r
- }\r
- (void) command("XMKD %s", argv[1]);\r
- }\r
-}\r
-\r
-/*\r
- * Remove a directory.\r
- */\r
-void removedir(argc, argv)\r
- char *argv[];\r
-{\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(directory-name) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage: %s directory-name\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (command("RMD %s", argv[1]) == ERROR && code == 500) {\r
- if (verbose) {\r
- printf("RMD command not recognized, trying XRMD\n");\r
- (void) fflush(stdout);\r
- }\r
- (void) command("XRMD %s", argv[1]);\r
- }\r
-}\r
-\r
-/*\r
- * Send a line, verbatim, to the remote machine.\r
- */\r
-void quote(argc, argv)\r
- char *argv[];\r
-{\r
- int i;\r
- char buf[BUFSIZ];\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(command line to send) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage: %s line-to-send\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- (void) strcpy(buf, argv[1]);\r
- for (i = 2; i < argc; i++) {\r
- (void) strcat(buf, " ");\r
- (void) strcat(buf, argv[i]);\r
- }\r
- if (command(buf) == PRELIM) {\r
- while (getreply(0) == PRELIM);\r
- }\r
-}\r
-\r
-/*\r
- * Send a SITE command to the remote machine. The line\r
- * is sent almost verbatim to the remote machine, the\r
- * first argument is changed to SITE.\r
- */\r
-\r
-void site(argc, argv)\r
- char *argv[];\r
-{\r
- int i;\r
- char buf[BUFSIZ];\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(arguments to SITE command) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage: %s line-to-send\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- (void) strcpy(buf, "SITE ");\r
- (void) strcat(buf, argv[1]);\r
- for (i = 2; i < argc; i++) {\r
- (void) strcat(buf, " ");\r
- (void) strcat(buf, argv[i]);\r
- }\r
- if (command(buf) == PRELIM) {\r
- while (getreply(0) == PRELIM);\r
- }\r
-}\r
-\r
-void do_chmod(argc, argv)\r
- char *argv[];\r
-{\r
- if (argc == 2) {\r
- printf("usage: %s mode file-name\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (argc < 3) {\r
- (void) strcat(line, " ");\r
- printf("(mode and file-name) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc != 3) {\r
- printf("usage: %s mode file-name\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- (void)command("SITE CHMOD %s %s", argv[1], argv[2]);\r
-}\r
-\r
-void do_umask(argc, argv)\r
- char *argv[];\r
-{\r
- int oldverbose = verbose;\r
-\r
- verbose = 1;\r
- (void) command(argc == 1 ? "SITE UMASK" : "SITE UMASK %s", argv[1]);\r
- verbose = oldverbose;\r
-}\r
-\r
-void idle(argc, argv)\r
- char *argv[];\r
-{\r
- int oldverbose = verbose;\r
-\r
- verbose = 1;\r
- (void) command(argc == 1 ? "SITE IDLE" : "SITE IDLE %s", argv[1]);\r
- verbose = oldverbose;\r
-}\r
-\r
-/*\r
- * Ask the other side for help.\r
- */\r
-void rmthelp(argc, argv)\r
- char *argv[];\r
-{\r
- int oldverbose = verbose;\r
-\r
- verbose = 1;\r
- (void) command(argc == 1 ? "HELP" : "HELP %s", argv[1]);\r
- verbose = oldverbose;\r
-}\r
-\r
-/*\r
- * Terminate session and exit.\r
- */\r
-/*VARARGS*/\r
-void quit()\r
-{\r
-\r
- if (connected)\r
- disconnect();\r
- pswitch(1);\r
- if (connected) {\r
- disconnect();\r
- }\r
- exit(0);\r
-}\r
-\r
-/*\r
- * Terminate session, but don't exit.\r
- */\r
-void disconnect()\r
-{\r
- extern int cout;\r
- extern int data;\r
-\r
- if (!connected)\r
- return;\r
- (void) command("QUIT");\r
- cout = (int) NULL;\r
- connected = 0;\r
- data = -1;\r
- if (!proxy) {\r
- macnum = 0;\r
- }\r
-}\r
-\r
-confirm(cmd, file)\r
- char *cmd, *file;\r
-{\r
- char line[BUFSIZ];\r
-\r
- if (!interactive)\r
- return (1);\r
- printf("%s %s? ", cmd, file);\r
- (void) fflush(stdout);\r
- (void) gets(line);\r
- return (*line != 'n' && *line != 'N');\r
-}\r
-\r
-void fatal(msg)\r
- char *msg;\r
-{\r
-\r
- fprintf(stderr, "ftp: %s\n", msg);\r
- exit(1);\r
-}\r
-\r
-/*\r
- * Glob a local file name specification with\r
- * the expectation of a single return value.\r
- * Can't control multiple values being expanded\r
- * from the expression, we return only the first.\r
- */\r
-globulize(cpp)\r
- char **cpp;\r
-{\r
- char **globbed;\r
-\r
- if (!doglob)\r
- return (1);\r
- globbed = glob(*cpp);\r
- if (globerr != NULL) {\r
- printf("%s: %s\n", *cpp, globerr);\r
- (void) fflush(stdout);\r
- if (globbed) {\r
- blkfree(globbed);\r
- free((char *)globbed);\r
- }\r
- return (0);\r
- }\r
- if (globbed) {\r
- *cpp = *globbed++;\r
- /* don't waste too much memory */\r
- if (*globbed) {\r
- blkfree(globbed);\r
- free((char *)globbed);\r
- }\r
- }\r
- return (1);\r
-}\r
-\r
-void account(argc,argv)\r
- int argc;\r
- char **argv;\r
-{\r
- char acct[50], *getpass(), *ap;\r
-\r
- if (argc > 1) {\r
- ++argv;\r
- --argc;\r
- (void) strncpy(acct,*argv,49);\r
- acct[49] = '\0';\r
- while (argc > 1) {\r
- --argc;\r
- ++argv;\r
- (void) strncat(acct,*argv, 49-strlen(acct));\r
- }\r
- ap = acct;\r
- }\r
- else {\r
- ap = getpass("Account:");\r
- }\r
- (void) command("ACCT %s", ap);\r
-}\r
-\r
-jmp_buf abortprox;\r
-\r
-void\r
-proxabort()\r
-{\r
- extern int proxy;\r
-\r
- if (!proxy) {\r
- pswitch(1);\r
- }\r
- if (connected) {\r
- proxflag = 1;\r
- }\r
- else {\r
- proxflag = 0;\r
- }\r
- pswitch(0);\r
- longjmp(abortprox,1);\r
-}\r
-\r
-void doproxy(argc,argv)\r
- int argc;\r
- char *argv[];\r
-{\r
- void proxabort();\r
- register struct cmd *c;\r
- struct cmd *getcmd();\r
- extern struct cmd cmdtab[];\r
- extern jmp_buf abortprox;\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(command) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage:%s command\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- c = getcmd(argv[1]);\r
- if (c == (struct cmd *) -1) {\r
- printf("?Ambiguous command\n");\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (c == 0) {\r
- printf("?Invalid command\n");\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (!c->c_proxy) {\r
- printf("?Invalid proxy command\n");\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (setjmp(abortprox)) {\r
- code = -1;\r
- return;\r
- }\r
-// oldintr = signal(SIGINT, proxabort);\r
- pswitch(1);\r
- if (c->c_conn && !connected) {\r
- printf("Not connected\n");\r
- (void) fflush(stdout);\r
- pswitch(0);\r
-// (void) signal(SIGINT, oldintr);\r
- code = -1;\r
- return;\r
- }\r
- (*c->c_handler)(argc-1, argv+1);\r
- if (connected) {\r
- proxflag = 1;\r
- }\r
- else {\r
- proxflag = 0;\r
- }\r
- pswitch(0);\r
-// (void) signal(SIGINT, oldintr);\r
-}\r
-\r
-void setcase()\r
-{\r
- mcase = !mcase;\r
- printf("Case mapping %s.\n", onoff(mcase));\r
- (void) fflush(stdout);\r
- code = mcase;\r
-}\r
-\r
-void setcr()\r
-{\r
- crflag = !crflag;\r
- printf("Carriage Return stripping %s.\n", onoff(crflag));\r
- (void) fflush(stdout);\r
- code = crflag;\r
-}\r
-\r
-void setntrans(argc,argv)\r
- int argc;\r
- char *argv[];\r
-{\r
- if (argc == 1) {\r
- ntflag = 0;\r
- printf("Ntrans off.\n");\r
- (void) fflush(stdout);\r
- code = ntflag;\r
- return;\r
- }\r
- ntflag++;\r
- code = ntflag;\r
- (void) strncpy(ntin, argv[1], 16);\r
- ntin[16] = '\0';\r
- if (argc == 2) {\r
- ntout[0] = '\0';\r
- return;\r
- }\r
- (void) strncpy(ntout, argv[2], 16);\r
- ntout[16] = '\0';\r
-}\r
-\r
-char *\r
-dotrans(name)\r
- char *name;\r
-{\r
- static char new[MAXPATHLEN];\r
- char *cp1, *cp2 = new;\r
- register int i, ostop, found;\r
-\r
- for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++);\r
- for (cp1 = name; *cp1; cp1++) {\r
- found = 0;\r
- for (i = 0; *(ntin + i) && i < 16; i++) {\r
- if (*cp1 == *(ntin + i)) {\r
- found++;\r
- if (i < ostop) {\r
- *cp2++ = *(ntout + i);\r
- }\r
- break;\r
- }\r
- }\r
- if (!found) {\r
- *cp2++ = *cp1;\r
- }\r
- }\r
- *cp2 = '\0';\r
- return(new);\r
-}\r
-\r
-\r
-void\r
-setpassive(argc, argv)\r
- int argc;\r
- char *argv[];\r
-{\r
- passivemode = !passivemode;\r
- printf("Passive mode %s.\n", onoff(passivemode));\r
- (void) fflush(stdout);\r
- code = passivemode;\r
-}\r
-\r
-void setnmap(argc, argv)\r
- int argc;\r
- char *argv[];\r
-{\r
- char *cp;\r
-\r
- if (argc == 1) {\r
- mapflag = 0;\r
- printf("Nmap off.\n");\r
- (void) fflush(stdout);\r
- code = mapflag;\r
- return;\r
- }\r
- if (argc < 3) {\r
- (void) strcat(line, " ");\r
- printf("(mapout) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 3) {\r
- printf("Usage: %s [mapin mapout]\n",argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- mapflag = 1;\r
- code = 1;\r
- cp = index(altarg, ' ');\r
- if (proxy) {\r
- while(*++cp == ' ');\r
- altarg = cp;\r
- cp = index(altarg, ' ');\r
- }\r
- *cp = '\0';\r
- (void) strncpy(mapin, altarg, MAXPATHLEN - 1);\r
- while (*++cp == ' ');\r
- (void) strncpy(mapout, cp, MAXPATHLEN - 1);\r
-}\r
-\r
-char *\r
-domap(name)\r
- char *name;\r
-{\r
- static char new[MAXPATHLEN];\r
- register char *cp1 = name, *cp2 = mapin;\r
- char *tp[9], *te[9];\r
- int i, toks[9], toknum = 0, match = 1;\r
-\r
- for (i=0; i < 9; ++i) {\r
- toks[i] = 0;\r
- }\r
- while (match && *cp1 && *cp2) {\r
- switch (*cp2) {\r
- case '\\':\r
- if (*++cp2 != *cp1) {\r
- match = 0;\r
- }\r
- break;\r
- case '$':\r
- if (*(cp2+1) >= '1' && (*cp2+1) <= '9') {\r
- if (*cp1 != *(++cp2+1)) {\r
- toks[toknum = *cp2 - '1']++;\r
- tp[toknum] = cp1;\r
- while (*++cp1 && *(cp2+1)\r
- != *cp1);\r
- te[toknum] = cp1;\r
- }\r
- cp2++;\r
- break;\r
- }\r
- /* FALLTHROUGH */\r
- default:\r
- if (*cp2 != *cp1) {\r
- match = 0;\r
- }\r
- break;\r
- }\r
- if (match && *cp1) {\r
- cp1++;\r
- }\r
- if (match && *cp2) {\r
- cp2++;\r
- }\r
- }\r
- if (!match && *cp1) /* last token mismatch */\r
- {\r
- toks[toknum] = 0;\r
- }\r
- cp1 = new;\r
- *cp1 = '\0';\r
- cp2 = mapout;\r
- while (*cp2) {\r
- match = 0;\r
- switch (*cp2) {\r
- case '\\':\r
- if (*(cp2 + 1)) {\r
- *cp1++ = *++cp2;\r
- }\r
- break;\r
- case '[':\r
-LOOP:\r
- if (*++cp2 == '$' && isdigit(*(cp2+1))) {\r
- if (*++cp2 == '0') {\r
- char *cp3 = name;\r
-\r
- while (*cp3) {\r
- *cp1++ = *cp3++;\r
- }\r
- match = 1;\r
- }\r
- else if (toks[toknum = *cp2 - '1']) {\r
- char *cp3 = tp[toknum];\r
-\r
- while (cp3 != te[toknum]) {\r
- *cp1++ = *cp3++;\r
- }\r
- match = 1;\r
- }\r
- }\r
- else {\r
- while (*cp2 && *cp2 != ',' &&\r
- *cp2 != ']') {\r
- if (*cp2 == '\\') {\r
- cp2++;\r
- }\r
- else if (*cp2 == '$' &&\r
- isdigit(*(cp2+1))) {\r
- if (*++cp2 == '0') {\r
- char *cp3 = name;\r
-\r
- while (*cp3) {\r
- *cp1++ = *cp3++;\r
- }\r
- }\r
- else if (toks[toknum =\r
- *cp2 - '1']) {\r
- char *cp3=tp[toknum];\r
-\r
- while (cp3 !=\r
- te[toknum]) {\r
- *cp1++ = *cp3++;\r
- }\r
- }\r
- }\r
- else if (*cp2) {\r
- *cp1++ = *cp2++;\r
- }\r
- }\r
- if (!*cp2) {\r
- printf("nmap: unbalanced brackets\n");\r
- (void) fflush(stdout);\r
- return(name);\r
- }\r
- match = 1;\r
- cp2--;\r
- }\r
- if (match) {\r
- while (*++cp2 && *cp2 != ']') {\r
- if (*cp2 == '\\' && *(cp2 + 1)) {\r
- cp2++;\r
- }\r
- }\r
- if (!*cp2) {\r
- printf("nmap: unbalanced brackets\n");\r
- (void) fflush(stdout);\r
- return(name);\r
- }\r
- break;\r
- }\r
- switch (*++cp2) {\r
- case ',':\r
- goto LOOP;\r
- case ']':\r
- break;\r
- default:\r
- cp2--;\r
- goto LOOP;\r
- }\r
- break;\r
- case '$':\r
- if (isdigit(*(cp2 + 1))) {\r
- if (*++cp2 == '0') {\r
- char *cp3 = name;\r
-\r
- while (*cp3) {\r
- *cp1++ = *cp3++;\r
- }\r
- }\r
- else if (toks[toknum = *cp2 - '1']) {\r
- char *cp3 = tp[toknum];\r
-\r
- while (cp3 != te[toknum]) {\r
- *cp1++ = *cp3++;\r
- }\r
- }\r
- break;\r
- }\r
- /* intentional drop through */\r
- default:\r
- *cp1++ = *cp2;\r
- break;\r
- }\r
- cp2++;\r
- }\r
- *cp1 = '\0';\r
- if (!*new) {\r
- return(name);\r
- }\r
- return(new);\r
-}\r
-\r
-void setsunique()\r
-{\r
- sunique = !sunique;\r
- printf("Store unique %s.\n", onoff(sunique));\r
- (void) fflush(stdout);\r
- code = sunique;\r
-}\r
-\r
-void setrunique()\r
-{\r
- runique = !runique;\r
- printf("Receive unique %s.\n", onoff(runique));\r
- (void) fflush(stdout);\r
- code = runique;\r
-}\r
-\r
-/* change directory to perent directory */\r
-void cdup()\r
-{\r
- if (command("CDUP") == ERROR && code == 500) {\r
- if (verbose) {\r
- printf("CDUP command not recognized, trying XCUP\n");\r
- (void) fflush(stdout);\r
- }\r
- (void) command("XCUP");\r
- }\r
-}\r
-\r
-/* restart transfer at specific point */\r
-void restart(argc, argv)\r
- int argc;\r
- char *argv[];\r
-{\r
- extern long atol();\r
- if (argc != 2)\r
- printf("restart: offset not specified\n");\r
- else {\r
- restart_point = atol(argv[1]);\r
- printf("restarting at %ld. %s\n", restart_point,\r
- "execute get, put or append to initiate transfer");\r
- }\r
- (void) fflush(stdout);\r
-}\r
-\r
-/* show remote system type */\r
-void syst()\r
-{\r
- (void) command("SYST");\r
-}\r
-\r
-void macdef(argc, argv)\r
- int argc;\r
- char *argv[];\r
-{\r
- char *tmp;\r
- int c;\r
-\r
- if (macnum == 16) {\r
- printf("Limit of 16 macros have already been defined\n");\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(macro name) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc != 2) {\r
- printf("Usage: %s macro_name\n",argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if (interactive) {\r
- printf("Enter macro line by line, terminating it with a null line\n");\r
- (void) fflush(stdout);\r
- }\r
- (void) strncpy(macros[macnum].mac_name, argv[1], 8);\r
- if (macnum == 0) {\r
- macros[macnum].mac_start = macbuf;\r
- }\r
- else {\r
- macros[macnum].mac_start = macros[macnum - 1].mac_end + 1;\r
- }\r
- tmp = macros[macnum].mac_start;\r
- while (tmp != macbuf+4096) {\r
- if ((c = getchar()) == EOF) {\r
- printf("macdef:end of file encountered\n");\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- if ((*tmp = c) == '\n') {\r
- if (tmp == macros[macnum].mac_start) {\r
- macros[macnum++].mac_end = tmp;\r
- code = 0;\r
- return;\r
- }\r
- if (*(tmp-1) == '\0') {\r
- macros[macnum++].mac_end = tmp - 1;\r
- code = 0;\r
- return;\r
- }\r
- *tmp = '\0';\r
- }\r
- tmp++;\r
- }\r
- while (1) {\r
- while ((c = getchar()) != '\n' && c != EOF)\r
- /* LOOP */;\r
- if (c == EOF || getchar() == '\n') {\r
- printf("Macro not defined - 4k buffer exceeded\n");\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- }\r
-}\r
-\r
-/*\r
- * get size of file on remote machine\r
- */\r
-void sizecmd(argc, argv)\r
- char *argv[];\r
-{\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(filename) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage:%s filename\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- (void) command("SIZE %s", argv[1]);\r
-}\r
-\r
-/*\r
- * get last modification time of file on remote machine\r
- */\r
-void modtime(argc, argv)\r
- char *argv[];\r
-{\r
- int overbose;\r
-\r
- if (argc < 2) {\r
- (void) strcat(line, " ");\r
- printf("(filename) ");\r
- (void) fflush(stdout);\r
- (void) gets(&line[strlen(line)]);\r
- makeargv();\r
- argc = margc;\r
- argv = margv;\r
- }\r
- if (argc < 2) {\r
- printf("usage:%s filename\n", argv[0]);\r
- (void) fflush(stdout);\r
- code = -1;\r
- return;\r
- }\r
- overbose = verbose;\r
- if (debug == 0)\r
- verbose = -1;\r
- if (command("MDTM %s", argv[1]) == COMPLETE) {\r
- int yy, mo, day, hour, min, sec;\r
- sscanf(reply_string, "%*s %04d%02d%02d%02d%02d%02d", &yy, &mo,\r
- &day, &hour, &min, &sec);\r
- /* might want to print this in local time */\r
- printf("%s\t%02d/%02d/%04d %02d:%02d:%02d GMT\n", argv[1],\r
- mo, day, yy, hour, min, sec);\r
- } else\r
- printf("%s\n", reply_string);\r
- verbose = overbose;\r
- (void) fflush(stdout);\r
-}\r
-\r
-/*\r
- * show status on reomte machine\r
- */\r
-void rmtstatus(argc, argv)\r
- char *argv[];\r
-{\r
- (void) command(argc > 1 ? "STAT %s" : "STAT" , argv[1]);\r
-}\r
-\r
-/*\r
- * get file if modtime is more recent than current file\r
- */\r
-void newer(argc, argv)\r
- char *argv[];\r
-{\r
- if (getit(argc, argv, -1, "w")) {\r
- printf("Local file \"%s\" is newer than remote file \"%s\"\n",\r
- argv[1], argv[2]);\r
- (void) fflush(stdout);\r
- }\r
-}\r
+/*
+ * Copyright (c) 1985, 1989 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)cmds.c 5.18 (Berkeley) 4/20/89";
+#endif /* not lint */
+
+/*
+ * FTP User Program -- Command Routines.
+ */
+//#include <sys/param.h>
+//#include <sys/wait.h>
+#include <sys/stat.h>
+#if !defined(WIN32)
+#include <sys/socket.h>
+#include <arpa/ftp.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#else
+#include <winsock.h>
+#endif
+
+#include <signal.h>
+#include <direct.h>
+#include <stdio.h>
+#include <errno.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "ftp_var.h"
+#include "pathnames.h"
+#include "prototypes.h"
+
+extern char *globerr;
+extern char **glob();
+extern char home[];
+extern char *remglob();
+extern char *getenv();
+extern int allbinary;
+extern off_t restart_point;
+extern char reply_string[];
+
+char *mname;
+jmp_buf jabort;
+char *dotrans(), *domap();
+
+extern short portnum;
+extern char *hostname;
+extern int autologin;
+/*
+ * Connect to peer server and
+ * auto-login, if possible.
+ */
+void setpeer(int argc, char *argv[])
+{
+ char *host, *hookup();
+
+ if (connected) {
+ printf("Already connected to %s, use close first.\n",
+ hostname);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(to) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc > 3) {
+ printf("usage: %s host-name [port]\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (argc > 2) {
+ portnum = atoi(argv[2]);
+ if (portnum <= 0) {
+ printf("%s: bad port number-- %s\n", argv[1], argv[2]);
+ printf ("usage: %s host-name [port]\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ portnum = htons(portnum);
+ }
+ host = hookup(argv[1], portnum);
+ if (host) {
+#if defined(unix) && NBBY == 8
+ int overbose;
+#endif
+ connected = 1;
+ if (autologin)
+ (void) login(argv[1]);
+
+#if defined(unix) && NBBY == 8
+/*
+ * this ifdef is to keep someone form "porting" this to an incompatible
+ * system and not checking this out. This way they have to think about it.
+ */
+ overbose = verbose;
+ if (debug == 0)
+ verbose = -1;
+ allbinary = 0;
+ if (command("SYST") == COMPLETE && overbose) {
+ register char *cp, c;
+ cp = index(reply_string+4, ' ');
+ if (cp == NULL)
+ cp = index(reply_string+4, '\r');
+ if (cp) {
+ if (cp[-1] == '.')
+ cp--;
+ c = *cp;
+ *cp = '\0';
+ }
+
+ printf("Remote system type is %s.\n",
+ reply_string+4);
+ if (cp)
+ *cp = c;
+ }
+ if (!strncmp(reply_string, "215 UNIX Type: L8", 17)) {
+ setbinary();
+ /* allbinary = 1; this violates the RFC */
+ if (overbose)
+ printf("Using %s mode to transfer files.\n",
+ typename);
+ } else if (overbose &&
+ !strncmp(reply_string, "215 TOPS20", 10)) {
+ printf(
+"Remember to set tenex mode when transfering binary files from this machine.\n");
+ }
+ verbose = overbose;
+#endif /* unix */
+ }
+ (void) fflush(stdout);
+}
+
+struct types {
+ char *t_name;
+ char *t_mode;
+ int t_type;
+ char *t_arg;
+} types[] = {
+ { "ascii", "A", TYPE_A, 0 },
+ { "binary", "I", TYPE_I, 0 },
+ { "image", "I", TYPE_I, 0 },
+ { "ebcdic", "E", TYPE_E, 0 },
+ { "tenex", "L", TYPE_L, bytename },
+ 0
+};
+
+/*
+ * Set transfer type.
+ */
+void settype(argc, argv)
+ char *argv[];
+{
+ register struct types *p;
+ int comret;
+
+ if (argc > 2) {
+ char *sep;
+
+ printf("usage: %s [", argv[0]);
+ sep = " ";
+ for (p = types; p->t_name; p++) {
+ printf("%s%s", sep, p->t_name);
+ if (*sep == ' ')
+ sep = " | ";
+ }
+ printf(" ]\n");
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (argc < 2) {
+ printf("Using %s mode to transfer files.\n", typename);
+ (void) fflush(stdout);
+ code = 0;
+ return;
+ }
+ for (p = types; p->t_name; p++)
+ if (strcmp(argv[1], p->t_name) == 0)
+ break;
+ if (p->t_name == 0) {
+ printf("%s: unknown mode\n", argv[1]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if ((p->t_arg != NULL) && (*(p->t_arg) != '\0'))
+ comret = command ("TYPE %s %s", p->t_mode, p->t_arg);
+ else
+ comret = command("TYPE %s", p->t_mode);
+ if (comret == COMPLETE) {
+ (void) strcpy(typename, p->t_name);
+ type = p->t_type;
+ }
+}
+
+char *stype[] = {
+ "type",
+ "",
+ 0
+};
+
+/*
+ * Set binary transfer type.
+ */
+/*VARARGS*/
+void setbinary()
+{
+ stype[1] = "binary";
+ settype(2, stype);
+}
+
+/*
+ * Set ascii transfer type.
+ */
+/*VARARGS*/
+void setascii()
+{
+ stype[1] = "ascii";
+ settype(2, stype);
+}
+
+/*
+ * Set tenex transfer type.
+ */
+/*VARARGS*/
+void settenex()
+{
+ stype[1] = "tenex";
+ settype(2, stype);
+}
+
+/*
+ * Set ebcdic transfer type.
+ */
+/*VARARGS*/
+void setebcdic()
+{
+ stype[1] = "ebcdic";
+ settype(2, stype);
+}
+
+/*
+ * Set file transfer mode.
+ */
+#if 0
+/*ARGSUSED*/
+void setmode(argc, argv)
+ char *argv[];
+{
+
+ printf("We only support %s mode, sorry.\n", modename);
+ (void) fflush(stdout);
+ code = -1;
+}
+#endif
+
+/*
+ * Set file transfer format.
+ */
+/*ARGSUSED*/
+void setform(argc, argv)
+ char *argv[];
+{
+
+ printf("We only support %s format, sorry.\n", formname);
+ (void) fflush(stdout);
+ code = -1;
+}
+
+/*
+ * Set file transfer structure.
+ */
+/*ARGSUSED*/
+void setstruct(argc, argv)
+ char *argv[];
+{
+
+ printf("We only support %s structure, sorry.\n", structname);
+ (void) fflush(stdout);
+ code = -1;
+}
+
+/*
+ * Send a single file.
+ */
+void put(argc, argv)
+ int argc;
+ char *argv[];
+{
+ char *cmd;
+ int loc = 0;
+ char *oldargv1, *oldargv2;
+
+ if (argc == 2) {
+ argc++;
+ argv[2] = argv[1];
+ loc++;
+ }
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(local-file) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 2) {
+usage:
+ printf("usage:%s local-file remote-file\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (argc < 3) {
+ (void) strcat(line, " ");
+ printf("(remote-file) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 3)
+ goto usage;
+ oldargv1 = argv[1];
+ oldargv2 = argv[2];
+ if (!globulize(&argv[1])) {
+ code = -1;
+ return;
+ }
+ /*
+ * If "globulize" modifies argv[1], and argv[2] is a copy of
+ * the old argv[1], make it a copy of the new argv[1].
+ */
+ if (argv[1] != oldargv1 && argv[2] == oldargv1) {
+ argv[2] = argv[1];
+ }
+ cmd = (argv[0][0] == 'a') ? "APPE" : ((sunique) ? "STOU" : "STOR");
+ if (loc && ntflag) {
+ argv[2] = dotrans(argv[2]);
+ }
+ if (loc && mapflag) {
+ argv[2] = domap(argv[2]);
+ }
+ sendrequest(cmd, argv[1], argv[2],
+ argv[1] != oldargv1 || argv[2] != oldargv2);
+}
+
+/*
+ * Send multiple files.
+ */
+void mput(argc, argv)
+ char *argv[];
+{
+ register int i;
+ int ointer;
+ void mabort();
+ extern jmp_buf jabort;
+ char *tp;
+
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(local-files) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 2) {
+ printf("usage:%s local-files\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ mname = argv[0];
+ mflag = 1;
+// oldintr = signal(SIGINT, mabort);
+ (void) setjmp(jabort);
+ if (proxy) {
+ char *cp, *tp2, tmpbuf[MAXPATHLEN];
+
+ while ((cp = remglob(argv,0)) != 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);
+ }
+ sendrequest((sunique) ? "STOU" : "STOR",
+ cp, tp, cp != tp || !interactive);
+ if (!mflag && fromatty) {
+ ointer = interactive;
+ interactive = 1;
+ if (confirm("Continue with","mput")) {
+ mflag++;
+ }
+ interactive = ointer;
+ }
+ }
+ }
+// (void) signal(SIGINT, oldintr);
+ mflag = 0;
+ return;
+ }
+ for (i = 1; i < argc; i++) {
+ register char **cpp, **gargs;
+
+ if (!doglob) {
+ if (mflag && confirm(argv[0], argv[i])) {
+ tp = (ntflag) ? dotrans(argv[i]) : argv[i];
+ tp = (mapflag) ? domap(tp) : tp;
+ sendrequest((sunique) ? "STOU" : "STOR",
+ argv[i], tp, tp != argv[i] || !interactive);
+ if (!mflag && fromatty) {
+ ointer = interactive;
+ interactive = 1;
+ if (confirm("Continue with","mput")) {
+ mflag++;
+ }
+ interactive = ointer;
+ }
+ }
+ continue;
+ }
+ gargs = glob(argv[i]);
+ if (globerr != NULL) {
+ printf("%s\n", globerr);
+ (void) fflush(stdout);
+ if (gargs) {
+ blkfree(gargs);
+ free((char *)gargs);
+ }
+ continue;
+ }
+ for (cpp = gargs; cpp && *cpp != NULL; cpp++) {
+ if (mflag && confirm(argv[0], *cpp)) {
+ tp = (ntflag) ? dotrans(*cpp) : *cpp;
+ tp = (mapflag) ? domap(tp) : tp;
+ sendrequest((sunique) ? "STOU" : "STOR",
+ *cpp, tp, *cpp != tp || !interactive);
+ if (!mflag && fromatty) {
+ ointer = interactive;
+ interactive = 1;
+ if (confirm("Continue with","mput")) {
+ mflag++;
+ }
+ interactive = ointer;
+ }
+ }
+ }
+ if (gargs != NULL) {
+ blkfree(gargs);
+ free((char *)gargs);
+ }
+ }
+// (void) signal(SIGINT, oldintr);
+ mflag = 0;
+}
+
+void reget(argc, argv)
+ char *argv[];
+{
+ (void) getit(argc, argv, 1, "r+w");
+}
+
+void get(argc, argv)
+ char *argv[];
+{
+ (void) getit(argc, argv, 0, restart_point ? "r+w" : "w" );
+}
+
+/*
+ * Receive one file.
+ */
+int getit(argc, argv, restartit, mode)
+ char *argv[];
+ char *mode;
+{
+ int loc = 0;
+ char *oldargv1, *oldargv2;
+
+ if (argc == 2) {
+ argc++;
+ argv[2] = argv[1];
+ loc++;
+ }
+ 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) {
+usage:
+ printf("usage: %s remote-file [ local-file ]\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return (0);
+ }
+ if (argc < 3) {
+ (void) strcat(line, " ");
+ printf("(local-file) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 3)
+ goto usage;
+ oldargv1 = argv[1];
+ oldargv2 = argv[2];
+ if (!globulize(&argv[2])) {
+ code = -1;
+ return (0);
+ }
+ if (loc && mcase) {
+ char *tp = argv[1], *tp2, tmpbuf[MAXPATHLEN];
+
+ while (*tp && !islower(*tp)) {
+ tp++;
+ }
+ if (!*tp) {
+ tp = argv[2];
+ tp2 = tmpbuf;
+ while ((*tp2 = *tp) != (int) NULL) {
+ if (isupper(*tp2)) {
+ *tp2 = 'a' + *tp2 - 'A';
+ }
+ tp++;
+ tp2++;
+ }
+ argv[2] = tmpbuf;
+ }
+ }
+ if (loc && ntflag)
+ argv[2] = dotrans(argv[2]);
+ if (loc && mapflag)
+ argv[2] = domap(argv[2]);
+ if (restartit) {
+ struct stat stbuf;
+ int ret;
+
+ 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);
+}
+
+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);
+}
+
+/*
+ * Get multiple files.
+ */
+void mget(argc, argv)
+ char *argv[];
+{
+ char *cp, *tp, *tp2, tmpbuf[MAXPATHLEN];
+ int ointer;
+ void mabort();
+ 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, *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);
+}
+
+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)
+ 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)
+ 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)
+ 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)
+ char *argv[];
+{
+ char *cp;
+ int ointer;
+ void mabort();
+ 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)
+ 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)
+ char *argv[];
+{
+ char *cmd;
+
+ if (argc < 2)
+ argc++, argv[1] = NULL;
+ if (argc < 3)
+ argc++, argv[2] = "-";
+ if (argc > 3) {
+ printf("usage: %s remote-directory local-file\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ cmd = argv[0][0] == 'n' ? "NLST" : "LIST";
+// cmd = argv[0][0] == 'n' ? "NLST -CF" : "NLST -CF";
+ if (strcmp(argv[2], "-") && !globulize(&argv[2])) {
+ code = -1;
+ return;
+ }
+ if (strcmp(argv[2], "-") && *argv[2] != '|')
+ if (!globulize(&argv[2]) || !confirm("output to local-file:", argv[2])) {
+ code = -1;
+ return;
+ }
+ recvrequest(cmd, argv[2], argv[1], "w", 0);
+}
+
+/*
+ * Get a directory listing
+ * of multiple remote files.
+ */
+void mls(argc, argv)
+ char *argv[];
+{
+ char *cmd, mode[1], *dest;
+ int ointer, i;
+ void mabort();
+ 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 < 3) {
+ (void) strcat(line, " ");
+ printf("(local-file) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 3) {
+ printf("usage:%s remote-files local-file\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ dest = argv[argc - 1];
+ argv[argc - 1] = NULL;
+ if (strcmp(dest, "-") && *dest != '|')
+ if (!globulize(&dest) || !confirm("output to local-file:", dest)) {
+ code = -1;
+ return;
+ }
+ cmd = argv[0][1] == 'l' ? "NLST" : "LIST";
+ mname = argv[0];
+ mflag = 1;
+// oldintr = signal(SIGINT, mabort);
+ (void) setjmp(jabort);
+ for (i = 1; mflag && i < argc-1; ++i) {
+ *mode = (i == 1) ? 'w' : 'a';
+ recvrequest(cmd, dest, argv[i], mode, 0);
+ if (!mflag && fromatty) {
+ ointer = interactive;
+ interactive = 1;
+ if (confirm("Continue with", argv[0])) {
+ mflag ++;
+ }
+ interactive = ointer;
+ }
+ }
+// (void) signal(SIGINT, oldintr);
+ mflag = 0;
+}
+
+/*
+ * Do a shell escape
+ */
+/*ARGSUSED*/
+shell(argc, argv)
+ char *argv[];
+{
+#if 0
+ int pid;
+ sig_t (*old1)(), (*old2)();
+ char shellnam[40], *shell, *namep;
+ union wait status;
+
+ old1 = signal (SIGINT, SIG_IGN);
+ old2 = signal (SIGQUIT, SIG_IGN);
+ if ((pid = fork()) == 0) {
+ for (pid = 3; pid < 20; pid++)
+ (void) close(pid);
+ (void) signal(SIGINT, SIG_DFL);
+ (void) signal(SIGQUIT, SIG_DFL);
+ shell = getenv("SHELL");
+ if (shell == NULL)
+ shell = _PATH_BSHELL;
+ namep = rindex(shell,'/');
+ if (namep == NULL)
+ namep = shell;
+ (void) strcpy(shellnam,"-");
+ (void) strcat(shellnam, ++namep);
+ if (strcmp(namep, "sh") != 0)
+ shellnam[0] = '+';
+ if (debug) {
+ printf ("%s\n", shell);
+ (void) fflush (stdout);
+ }
+ if (argc > 1) {
+ execl(shell,shellnam,"-c",altarg,(char *)0);
+ }
+ else {
+ execl(shell,shellnam,(char *)0);
+ }
+ perror(shell);
+ code = -1;
+ exit(1);
+ }
+ if (pid > 0)
+ while (wait(&status) != pid)
+ ;
+ (void) signal(SIGINT, old1);
+ (void) signal(SIGQUIT, old2);
+ if (pid == -1) {
+ perror("Try again later");
+ code = -1;
+ }
+ else {
+ code = 0;
+ }
+#endif
+
+ char * AppName;
+ char ShellCmd[MAX_PATH];
+ char CmdLine[MAX_PATH];
+ int i;
+ PROCESS_INFORMATION ProcessInformation;
+ BOOL Result;
+ STARTUPINFO StartupInfo;
+ char ShellName[] = "COMSPEC";
+ int NumBytes;
+
+ NumBytes = GetEnvironmentVariable( ShellName, ShellCmd, MAX_PATH);
+
+ if (NumBytes == 0)
+ {
+ return(-1);
+ }
+
+ AppName = ShellCmd;
+ strcpy( CmdLine, ShellCmd );
+
+ if (argc > 1)
+ {
+ strncat(CmdLine, " /C", MAX_PATH);
+ }
+
+ for (i=1; i<argc; i++)
+ {
+ strncat(CmdLine, " ", MAX_PATH);
+ strncat(CmdLine, argv[i], MAX_PATH);
+ }
+
+ StartupInfo.cb = sizeof( StartupInfo );
+ StartupInfo.lpReserved = NULL;
+ StartupInfo.lpDesktop = NULL;
+ StartupInfo.lpTitle = NULL;
+ StartupInfo.dwX = 0;
+ StartupInfo.dwY = 0;
+ StartupInfo.dwXSize = 0;
+ StartupInfo.dwYSize = 0;
+ StartupInfo.dwFlags = 0;
+ StartupInfo.wShowWindow = 0;
+ StartupInfo.cbReserved2 = 0;
+ StartupInfo.lpReserved2 = NULL;
+
+ Result = CreateProcess( AppName, // cmd name
+ CmdLine, // cmd line arguments
+ NULL,
+ NULL, // security attributes
+ FALSE, // inherit flags
+ 0, // Creation flags
+ NULL, // Environment
+ NULL, // Current directory
+ &StartupInfo, // Startup info structure
+ &ProcessInformation); // processInfo structure
+
+ if (Result)
+ {
+ WaitForSingleObject( ProcessInformation.hProcess, 0xffffffff);
+
+ CloseHandle( ProcessInformation.hProcess);
+ }
+
+ if (Result)
+ {
+ return(-1);
+ }
+ else
+ {
+ return(0);
+ }
+}
+
+/*
+ * Send new user information (re-login)
+ */
+user(argc, argv)
+ int argc;
+ char **argv;
+{
+ char acct[80], *getpass();
+ int n, aflag = 0;
+
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(username) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc > 4) {
+ printf("usage: %s username [password] [account]\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return (0);
+ }
+ n = command("USER %s", argv[1]);
+ if (n == CONTINUE) {
+ if (argc < 3 )
+ argv[2] = getpass("Password: "), argc++;
+ n = command("PASS %s", argv[2]);
+ }
+ if (n == CONTINUE) {
+ if (argc < 4) {
+ printf("Account: "); (void) fflush(stdout);
+ (void) fflush(stdout);
+ (void) fgets(acct, sizeof(acct) - 1, stdin);
+ acct[strlen(acct) - 1] = '\0';
+ argv[3] = acct; argc++;
+ }
+ n = command("ACCT %s", argv[3]);
+ aflag++;
+ }
+ if (n != COMPLETE) {
+ fprintf(stdout, "Login failed.\n");
+ (void) fflush(stdout);
+ return (0);
+ }
+ if (!aflag && argc == 4) {
+ (void) command("ACCT %s", argv[3]);
+ }
+ return (1);
+}
+
+/*
+ * Print working directory.
+ */
+/*VARARGS*/
+void pwd()
+{
+ int oldverbose = verbose;
+
+ /*
+ * If we aren't verbose, this doesn't do anything!
+ */
+ verbose = 1;
+ if (command("PWD") == ERROR && code == 500) {
+ printf("PWD command not recognized, trying XPWD\n");
+ (void) fflush(stdout);
+ (void) command("XPWD");
+ }
+ verbose = oldverbose;
+}
+
+/*
+ * Make a directory.
+ */
+void makedir(argc, argv)
+ char *argv[];
+{
+
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(directory-name) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 2) {
+ printf("usage: %s directory-name\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (command("MKD %s", argv[1]) == ERROR && code == 500) {
+ if (verbose) {
+ printf("MKD command not recognized, trying XMKD\n");
+ (void) fflush(stdout);
+ }
+ (void) command("XMKD %s", argv[1]);
+ }
+}
+
+/*
+ * Remove a directory.
+ */
+void removedir(argc, argv)
+ char *argv[];
+{
+
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(directory-name) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 2) {
+ printf("usage: %s directory-name\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (command("RMD %s", argv[1]) == ERROR && code == 500) {
+ if (verbose) {
+ printf("RMD command not recognized, trying XRMD\n");
+ (void) fflush(stdout);
+ }
+ (void) command("XRMD %s", argv[1]);
+ }
+}
+
+/*
+ * Send a line, verbatim, to the remote machine.
+ */
+void quote(argc, argv)
+ char *argv[];
+{
+ int i;
+ char buf[BUFSIZ];
+
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(command line to send) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 2) {
+ printf("usage: %s line-to-send\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ (void) strcpy(buf, argv[1]);
+ for (i = 2; i < argc; i++) {
+ (void) strcat(buf, " ");
+ (void) strcat(buf, argv[i]);
+ }
+ if (command(buf) == PRELIM) {
+ while (getreply(0) == PRELIM);
+ }
+}
+
+/*
+ * Send a SITE command to the remote machine. The line
+ * is sent almost verbatim to the remote machine, the
+ * first argument is changed to SITE.
+ */
+
+void site(argc, argv)
+ char *argv[];
+{
+ int i;
+ char buf[BUFSIZ];
+
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(arguments to SITE command) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 2) {
+ printf("usage: %s line-to-send\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ (void) strcpy(buf, "SITE ");
+ (void) strcat(buf, argv[1]);
+ for (i = 2; i < argc; i++) {
+ (void) strcat(buf, " ");
+ (void) strcat(buf, argv[i]);
+ }
+ if (command(buf) == PRELIM) {
+ while (getreply(0) == PRELIM);
+ }
+}
+
+void do_chmod(argc, argv)
+ char *argv[];
+{
+ if (argc == 2) {
+ printf("usage: %s mode file-name\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (argc < 3) {
+ (void) strcat(line, " ");
+ printf("(mode and file-name) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc != 3) {
+ printf("usage: %s mode file-name\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ (void)command("SITE CHMOD %s %s", argv[1], argv[2]);
+}
+
+void do_umask(argc, argv)
+ char *argv[];
+{
+ int oldverbose = verbose;
+
+ verbose = 1;
+ (void) command(argc == 1 ? "SITE UMASK" : "SITE UMASK %s", argv[1]);
+ verbose = oldverbose;
+}
+
+void idle(argc, argv)
+ char *argv[];
+{
+ int oldverbose = verbose;
+
+ verbose = 1;
+ (void) command(argc == 1 ? "SITE IDLE" : "SITE IDLE %s", argv[1]);
+ verbose = oldverbose;
+}
+
+/*
+ * Ask the other side for help.
+ */
+void rmthelp(argc, argv)
+ char *argv[];
+{
+ int oldverbose = verbose;
+
+ verbose = 1;
+ (void) command(argc == 1 ? "HELP" : "HELP %s", argv[1]);
+ verbose = oldverbose;
+}
+
+/*
+ * Terminate session and exit.
+ */
+/*VARARGS*/
+void quit()
+{
+
+ if (connected)
+ disconnect();
+ pswitch(1);
+ if (connected) {
+ disconnect();
+ }
+ exit(0);
+}
+
+/*
+ * Terminate session, but don't exit.
+ */
+void disconnect()
+{
+ extern int cout;
+ extern int data;
+
+ if (!connected)
+ return;
+ (void) command("QUIT");
+ cout = (int) NULL;
+ connected = 0;
+ data = -1;
+ if (!proxy) {
+ macnum = 0;
+ }
+}
+
+confirm(cmd, file)
+ char *cmd, *file;
+{
+ char line[BUFSIZ];
+
+ if (!interactive)
+ return (1);
+ printf("%s %s? ", cmd, file);
+ (void) fflush(stdout);
+ (void) gets(line);
+ return (*line != 'n' && *line != 'N');
+}
+
+void fatal(msg)
+ char *msg;
+{
+
+ fprintf(stderr, "ftp: %s\n", msg);
+ exit(1);
+}
+
+/*
+ * Glob a local file name specification with
+ * the expectation of a single return value.
+ * Can't control multiple values being expanded
+ * from the expression, we return only the first.
+ */
+globulize(cpp)
+ char **cpp;
+{
+ char **globbed;
+
+ if (!doglob)
+ return (1);
+ globbed = glob(*cpp);
+ if (globerr != NULL) {
+ printf("%s: %s\n", *cpp, globerr);
+ (void) fflush(stdout);
+ if (globbed) {
+ blkfree(globbed);
+ free((char *)globbed);
+ }
+ return (0);
+ }
+ if (globbed) {
+ *cpp = *globbed++;
+ /* don't waste too much memory */
+ if (*globbed) {
+ blkfree(globbed);
+ free((char *)globbed);
+ }
+ }
+ return (1);
+}
+
+void account(argc,argv)
+ int argc;
+ char **argv;
+{
+ char acct[50], *getpass(), *ap;
+
+ if (argc > 1) {
+ ++argv;
+ --argc;
+ (void) strncpy(acct,*argv,49);
+ acct[49] = '\0';
+ while (argc > 1) {
+ --argc;
+ ++argv;
+ (void) strncat(acct,*argv, 49-strlen(acct));
+ }
+ ap = acct;
+ }
+ else {
+ ap = getpass("Account:");
+ }
+ (void) command("ACCT %s", ap);
+}
+
+jmp_buf abortprox;
+
+void
+proxabort()
+{
+ extern int proxy;
+
+ if (!proxy) {
+ pswitch(1);
+ }
+ if (connected) {
+ proxflag = 1;
+ }
+ else {
+ proxflag = 0;
+ }
+ pswitch(0);
+ longjmp(abortprox,1);
+}
+
+void doproxy(argc,argv)
+ int argc;
+ char *argv[];
+{
+ void proxabort();
+ register struct cmd *c;
+ struct cmd *getcmd();
+ extern struct cmd cmdtab[];
+ extern jmp_buf abortprox;
+
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(command) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 2) {
+ printf("usage:%s command\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ c = getcmd(argv[1]);
+ if (c == (struct cmd *) -1) {
+ printf("?Ambiguous command\n");
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (c == 0) {
+ printf("?Invalid command\n");
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (!c->c_proxy) {
+ printf("?Invalid proxy command\n");
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (setjmp(abortprox)) {
+ code = -1;
+ return;
+ }
+// oldintr = signal(SIGINT, proxabort);
+ pswitch(1);
+ if (c->c_conn && !connected) {
+ printf("Not connected\n");
+ (void) fflush(stdout);
+ pswitch(0);
+// (void) signal(SIGINT, oldintr);
+ code = -1;
+ return;
+ }
+ (*c->c_handler)(argc-1, argv+1);
+ if (connected) {
+ proxflag = 1;
+ }
+ else {
+ proxflag = 0;
+ }
+ pswitch(0);
+// (void) signal(SIGINT, oldintr);
+}
+
+void setcase()
+{
+ mcase = !mcase;
+ printf("Case mapping %s.\n", onoff(mcase));
+ (void) fflush(stdout);
+ code = mcase;
+}
+
+void setcr()
+{
+ crflag = !crflag;
+ printf("Carriage Return stripping %s.\n", onoff(crflag));
+ (void) fflush(stdout);
+ code = crflag;
+}
+
+void setntrans(argc,argv)
+ int argc;
+ char *argv[];
+{
+ if (argc == 1) {
+ ntflag = 0;
+ printf("Ntrans off.\n");
+ (void) fflush(stdout);
+ code = ntflag;
+ return;
+ }
+ ntflag++;
+ code = ntflag;
+ (void) strncpy(ntin, argv[1], 16);
+ ntin[16] = '\0';
+ if (argc == 2) {
+ ntout[0] = '\0';
+ return;
+ }
+ (void) strncpy(ntout, argv[2], 16);
+ ntout[16] = '\0';
+}
+
+char *
+dotrans(name)
+ char *name;
+{
+ static char new[MAXPATHLEN];
+ char *cp1, *cp2 = new;
+ register int i, ostop, found;
+
+ for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++);
+ for (cp1 = name; *cp1; cp1++) {
+ found = 0;
+ for (i = 0; *(ntin + i) && i < 16; i++) {
+ if (*cp1 == *(ntin + i)) {
+ found++;
+ if (i < ostop) {
+ *cp2++ = *(ntout + i);
+ }
+ break;
+ }
+ }
+ if (!found) {
+ *cp2++ = *cp1;
+ }
+ }
+ *cp2 = '\0';
+ return(new);
+}
+
+
+void
+setpassive(argc, argv)
+ int argc;
+ char *argv[];
+{
+ passivemode = !passivemode;
+ printf("Passive mode %s.\n", onoff(passivemode));
+ (void) fflush(stdout);
+ code = passivemode;
+}
+
+void setnmap(argc, argv)
+ int argc;
+ char *argv[];
+{
+ char *cp;
+
+ if (argc == 1) {
+ mapflag = 0;
+ printf("Nmap off.\n");
+ (void) fflush(stdout);
+ code = mapflag;
+ return;
+ }
+ if (argc < 3) {
+ (void) strcat(line, " ");
+ printf("(mapout) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 3) {
+ printf("Usage: %s [mapin mapout]\n",argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ mapflag = 1;
+ code = 1;
+ cp = index(altarg, ' ');
+ if (proxy) {
+ while(*++cp == ' ');
+ altarg = cp;
+ cp = index(altarg, ' ');
+ }
+ *cp = '\0';
+ (void) strncpy(mapin, altarg, MAXPATHLEN - 1);
+ while (*++cp == ' ');
+ (void) strncpy(mapout, cp, MAXPATHLEN - 1);
+}
+
+char *
+domap(name)
+ char *name;
+{
+ static char new[MAXPATHLEN];
+ register char *cp1 = name, *cp2 = mapin;
+ char *tp[9], *te[9];
+ int i, toks[9], toknum = 0, match = 1;
+
+ for (i=0; i < 9; ++i) {
+ toks[i] = 0;
+ }
+ while (match && *cp1 && *cp2) {
+ switch (*cp2) {
+ case '\\':
+ if (*++cp2 != *cp1) {
+ match = 0;
+ }
+ break;
+ case '$':
+ if (*(cp2+1) >= '1' && (*cp2+1) <= '9') {
+ if (*cp1 != *(++cp2+1)) {
+ toks[toknum = *cp2 - '1']++;
+ tp[toknum] = cp1;
+ while (*++cp1 && *(cp2+1)
+ != *cp1);
+ te[toknum] = cp1;
+ }
+ cp2++;
+ break;
+ }
+ /* FALLTHROUGH */
+ default:
+ if (*cp2 != *cp1) {
+ match = 0;
+ }
+ break;
+ }
+ if (match && *cp1) {
+ cp1++;
+ }
+ if (match && *cp2) {
+ cp2++;
+ }
+ }
+ if (!match && *cp1) /* last token mismatch */
+ {
+ toks[toknum] = 0;
+ }
+ cp1 = new;
+ *cp1 = '\0';
+ cp2 = mapout;
+ while (*cp2) {
+ match = 0;
+ switch (*cp2) {
+ case '\\':
+ if (*(cp2 + 1)) {
+ *cp1++ = *++cp2;
+ }
+ break;
+ case '[':
+LOOP:
+ if (*++cp2 == '$' && isdigit(*(cp2+1))) {
+ if (*++cp2 == '0') {
+ char *cp3 = name;
+
+ while (*cp3) {
+ *cp1++ = *cp3++;
+ }
+ match = 1;
+ }
+ else if (toks[toknum = *cp2 - '1']) {
+ char *cp3 = tp[toknum];
+
+ while (cp3 != te[toknum]) {
+ *cp1++ = *cp3++;
+ }
+ match = 1;
+ }
+ }
+ else {
+ while (*cp2 && *cp2 != ',' &&
+ *cp2 != ']') {
+ if (*cp2 == '\\') {
+ cp2++;
+ }
+ else if (*cp2 == '$' &&
+ isdigit(*(cp2+1))) {
+ if (*++cp2 == '0') {
+ char *cp3 = name;
+
+ while (*cp3) {
+ *cp1++ = *cp3++;
+ }
+ }
+ else if (toks[toknum =
+ *cp2 - '1']) {
+ char *cp3=tp[toknum];
+
+ while (cp3 !=
+ te[toknum]) {
+ *cp1++ = *cp3++;
+ }
+ }
+ }
+ else if (*cp2) {
+ *cp1++ = *cp2++;
+ }
+ }
+ if (!*cp2) {
+ printf("nmap: unbalanced brackets\n");
+ (void) fflush(stdout);
+ return(name);
+ }
+ match = 1;
+ cp2--;
+ }
+ if (match) {
+ while (*++cp2 && *cp2 != ']') {
+ if (*cp2 == '\\' && *(cp2 + 1)) {
+ cp2++;
+ }
+ }
+ if (!*cp2) {
+ printf("nmap: unbalanced brackets\n");
+ (void) fflush(stdout);
+ return(name);
+ }
+ break;
+ }
+ switch (*++cp2) {
+ case ',':
+ goto LOOP;
+ case ']':
+ break;
+ default:
+ cp2--;
+ goto LOOP;
+ }
+ break;
+ case '$':
+ if (isdigit(*(cp2 + 1))) {
+ if (*++cp2 == '0') {
+ char *cp3 = name;
+
+ while (*cp3) {
+ *cp1++ = *cp3++;
+ }
+ }
+ else if (toks[toknum = *cp2 - '1']) {
+ char *cp3 = tp[toknum];
+
+ while (cp3 != te[toknum]) {
+ *cp1++ = *cp3++;
+ }
+ }
+ break;
+ }
+ /* intentional drop through */
+ default:
+ *cp1++ = *cp2;
+ break;
+ }
+ cp2++;
+ }
+ *cp1 = '\0';
+ if (!*new) {
+ return(name);
+ }
+ return(new);
+}
+
+void setsunique()
+{
+ sunique = !sunique;
+ printf("Store unique %s.\n", onoff(sunique));
+ (void) fflush(stdout);
+ code = sunique;
+}
+
+void setrunique()
+{
+ runique = !runique;
+ printf("Receive unique %s.\n", onoff(runique));
+ (void) fflush(stdout);
+ code = runique;
+}
+
+/* change directory to perent directory */
+void cdup()
+{
+ if (command("CDUP") == ERROR && code == 500) {
+ if (verbose) {
+ printf("CDUP command not recognized, trying XCUP\n");
+ (void) fflush(stdout);
+ }
+ (void) command("XCUP");
+ }
+}
+
+/* restart transfer at specific point */
+void restart(argc, argv)
+ int argc;
+ char *argv[];
+{
+ extern long atol();
+ if (argc != 2)
+ printf("restart: offset not specified\n");
+ else {
+ restart_point = atol(argv[1]);
+ printf("restarting at %ld. %s\n", restart_point,
+ "execute get, put or append to initiate transfer");
+ }
+ (void) fflush(stdout);
+}
+
+/* show remote system type */
+void syst()
+{
+ (void) command("SYST");
+}
+
+void macdef(argc, argv)
+ int argc;
+ char *argv[];
+{
+ char *tmp;
+ int c;
+
+ if (macnum == 16) {
+ printf("Limit of 16 macros have already been defined\n");
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(macro name) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc != 2) {
+ printf("Usage: %s macro_name\n",argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if (interactive) {
+ printf("Enter macro line by line, terminating it with a null line\n");
+ (void) fflush(stdout);
+ }
+ (void) strncpy(macros[macnum].mac_name, argv[1], 8);
+ if (macnum == 0) {
+ macros[macnum].mac_start = macbuf;
+ }
+ else {
+ macros[macnum].mac_start = macros[macnum - 1].mac_end + 1;
+ }
+ tmp = macros[macnum].mac_start;
+ while (tmp != macbuf+4096) {
+ if ((c = getchar()) == EOF) {
+ printf("macdef:end of file encountered\n");
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ if ((*tmp = c) == '\n') {
+ if (tmp == macros[macnum].mac_start) {
+ macros[macnum++].mac_end = tmp;
+ code = 0;
+ return;
+ }
+ if (*(tmp-1) == '\0') {
+ macros[macnum++].mac_end = tmp - 1;
+ code = 0;
+ return;
+ }
+ *tmp = '\0';
+ }
+ tmp++;
+ }
+ while (1) {
+ while ((c = getchar()) != '\n' && c != EOF)
+ /* LOOP */;
+ if (c == EOF || getchar() == '\n') {
+ printf("Macro not defined - 4k buffer exceeded\n");
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ }
+}
+
+/*
+ * get size of file on remote machine
+ */
+void sizecmd(argc, argv)
+ char *argv[];
+{
+
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(filename) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 2) {
+ printf("usage:%s filename\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ (void) command("SIZE %s", argv[1]);
+}
+
+/*
+ * get last modification time of file on remote machine
+ */
+void modtime(argc, argv)
+ char *argv[];
+{
+ int overbose;
+
+ if (argc < 2) {
+ (void) strcat(line, " ");
+ printf("(filename) ");
+ (void) fflush(stdout);
+ (void) gets(&line[strlen(line)]);
+ makeargv();
+ argc = margc;
+ argv = margv;
+ }
+ if (argc < 2) {
+ printf("usage:%s filename\n", argv[0]);
+ (void) fflush(stdout);
+ code = -1;
+ return;
+ }
+ overbose = verbose;
+ if (debug == 0)
+ verbose = -1;
+ if (command("MDTM %s", argv[1]) == COMPLETE) {
+ int yy, mo, day, hour, min, sec;
+ sscanf(reply_string, "%*s %04d%02d%02d%02d%02d%02d", &yy, &mo,
+ &day, &hour, &min, &sec);
+ /* might want to print this in local time */
+ printf("%s\t%02d/%02d/%04d %02d:%02d:%02d GMT\n", argv[1],
+ mo, day, yy, hour, min, sec);
+ } else
+ printf("%s\n", reply_string);
+ verbose = overbose;
+ (void) fflush(stdout);
+}
+
+/*
+ * show status on reomte machine
+ */
+void rmtstatus(argc, argv)
+ char *argv[];
+{
+ (void) command(argc > 1 ? "STAT %s" : "STAT" , argv[1]);
+}
+
+/*
+ * get file if modtime is more recent than current file
+ */
+void newer(argc, argv)
+ char *argv[];
+{
+ if (getit(argc, argv, -1, "w")) {
+ printf("Local file \"%s\" is newer than remote file \"%s\"\n",
+ argv[1], argv[2]);
+ (void) fflush(stdout);
+ }
+}
static char sccsid[] = "@(#)domacro.c 1.6 (Berkeley) 2/28/89";
#endif /* not lint */
-#include "ftp_var.h"\r
+#include "ftp_var.h"
#include "prototypes.h"
#include <signal.h>
-#include <stdio.h>\r
-#include <time.h>\r
-#include <winsock.h>\r
-#include "prototypes.h"\r
-\r
-#define MAX_ASCII 100\r
-\r
-int checkRecv(SOCKET s);\r
-\r
-int checkRecv(SOCKET s)\r
-{\r
- int testVal;\r
- fd_set sSet;\r
- struct timeval timeout;\r
- timeout.tv_sec = 60;\r
-\r
- FD_ZERO(&sSet);\r
-\r
- FD_SET(s, &sSet);\r
-\r
- testVal = select(0, &sSet, NULL, NULL, &timeout);\r
-\r
- if (testVal == SOCKET_ERROR)\r
- fprintf(stderr, "Socket Error");\r
-\r
- return testVal;\r
-}\r
-\r
-void blkfree(char **av0)\r
-{\r
- register char **av = av0;\r
-\r
- while (*av)\r
- free(*av++);\r
-}\r
-\r
-char *glob(register char *v)\r
-{\r
- return NULL;\r
-}\r
-\r
-\r
-int sleep(int time)\r
-{\r
- return time;\r
-}\r
-\r
-int herror(char *string)\r
-{\r
- return 0;\r
-}\r
-#if 0\r
-\r
-int gettimeofday(struct timeval *timenow,\r
- struct timezone *zone)\r
-{\r
- time_t t;\r
-\r
- t = clock();\r
-\r
- timenow->tv_usec = t;\r
- timenow->tv_sec = t / CLK_TCK;\r
-\r
- return 0;\r
-}\r
-\r
-int fgetcSocket(int s)\r
-{\r
- int c;\r
- char buffer[10];\r
-\r
-// checkRecv(s);\r
-\r
- c = recv(s, buffer, 1, 0);\r
-\r
-#ifdef DEBUG_IN\r
- printf("%c", buffer[0]);\r
-#endif\r
-\r
- if (c == INVALID_SOCKET)\r
- return c;\r
-\r
- if (c == 0)\r
- return EOF;\r
-\r
- return buffer[0];\r
-}\r
-\r
-#else\r
-\r
-int fgetcSocket(int s)\r
-{\r
- static int index = 0;\r
- static int total = 0;\r
- static unsigned char buffer[4096];\r
-\r
- if (index == total)\r
- {\r
- index = 0;\r
- total = recv(s, buffer, sizeof(buffer), 0);\r
-\r
- if (total == INVALID_SOCKET)\r
- {\r
- total = 0;\r
- return ERROR;\r
- }\r
-\r
- if (total == 0)\r
- return EOF;\r
- }\r
- return buffer[index++];\r
-}\r
-\r
-#endif\r
-\r
-char *fprintfSocket(int s, char *format, ...)\r
-{\r
- va_list argptr;\r
- char buffer[10009];\r
-\r
- va_start(argptr, format);\r
- vsprintf(buffer, format, argptr);\r
- va_end(argptr);\r
-\r
- send(s, buffer, strlen(buffer), 0);\r
-\r
- return NULL;\r
-}\r
-\r
-char *fputsSocket(char *format, int s)\r
-{\r
- send(s, format, strlen(format), 0);\r
-\r
- return NULL;\r
-}\r
-\r
-int fputcSocket(int s, char putChar)\r
-{\r
- char buffer[2];\r
-\r
- buffer[0] = putChar;\r
- buffer[1] = '\0';\r
-\r
- if(SOCKET_ERROR==send(s, buffer, 1, 0)) {\r
- int iret=WSAGetLastError (); \r
- fprintf(stdout,"fputcSocket: %d\n",iret);\r
- return 0;\r
- }\r
- else {\r
- return putChar;\r
- }\r
-}\r
-int fputSocket(int s, char *buffer, int len)\r
-{\r
- int iret;\r
- while(len) {\r
- if(SOCKET_ERROR==(iret=send(s, buffer, len, 0))) \r
- {\r
- iret=WSAGetLastError (); \r
- fprintf(stdout,"fputcSocket: %d\n",iret);\r
- return 0;\r
- }\r
- else {\r
- return len-=iret;\r
- }\r
- }\r
- return 0;\r
-}\r
-\r
-char *fgetsSocket(int s, char *string)\r
-{\r
- char buffer[2] = {0};\r
- int i, count;\r
-\r
- for (i = 0, count = 1; count != 0 && buffer[0] != '\n'; i++)\r
- {\r
- checkRecv(s);\r
-\r
- count = recv(s, buffer, 1, 0);\r
-\r
- if (count == SOCKET_ERROR)\r
- {\r
- printf("Error in fgetssocket");\r
- return NULL;\r
- }\r
-\r
- if (count == 1)\r
- {\r
- string[i] = buffer[0];\r
- \r
- if (i == MAX_ASCII - 3)\r
- {\r
- count = 0;\r
- string[++i] = '\n';\r
- string[++i] = '\0';\r
- }\r
- }\r
- else\r
- {\r
- if (i == 0)\r
- return NULL;\r
- else\r
- {\r
- string[i] = '\n';\r
- string[i + 1] = '\0'; // This is risky\r
- return string;\r
- }\r
-\r
- }\r
-\r
- }\r
- string[i] = '\0';\r
-\r
-#ifdef DEBUG_IN\r
- printf("%s", string);\r
-#endif\r
- return string;\r
-}\r
-\r
-\r
-#if 0\r
-char *getpass(const char *prompt)\r
-{\r
- static char string[64];\r
-\r
- printf("%s", prompt);\r
-\r
- gets(string);\r
-\r
- return string;\r
-}\r
-#endif\r
-char *getpass (const char * prompt)\r
-{\r
- static char input[256];\r
- HANDLE in;\r
- HANDLE err;\r
- int count;\r
-\r
- in = GetStdHandle (STD_INPUT_HANDLE);\r
- err = GetStdHandle (STD_ERROR_HANDLE);\r
-\r
- if (in == INVALID_HANDLE_VALUE || err == INVALID_HANDLE_VALUE)\r
- return NULL;\r
-\r
- if (WriteFile (err, prompt, strlen (prompt), &count, NULL))\r
- {\r
- int istty = (GetFileType (in) == FILE_TYPE_CHAR);\r
- DWORD old_flags;\r
- int rc;\r
-\r
- if (istty)\r
- {\r
- if (GetConsoleMode (in, &old_flags))\r
- SetConsoleMode (in, ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT);\r
- else\r
- istty = 0;\r
- }\r
- /* Need to read line one byte at time to avoid blocking, if not a\r
- tty, so always do it this way. */\r
- count = 0;\r
- while (1)\r
- {\r
- DWORD dummy;\r
- char one_char;\r
-\r
- rc = ReadFile (in, &one_char, 1, &dummy, NULL);\r
- if (rc == 0)\r
- break;\r
- if (one_char == '\r')\r
- {\r
- /* CR is always followed by LF if reading from tty. */\r
- if (istty)\r
- continue;\r
- else\r
- break;\r
- }\r
- if (one_char == '\n')\r
- break;\r
- /* Silently truncate password string if overly long. */\r
- if (count < sizeof (input) - 1)\r
- input[count++] = one_char;\r
- }\r
- input[count] = '\0';\r
-\r
- WriteFile (err, "\r\n", 2, &count, NULL);\r
- if (istty)\r
- SetConsoleMode (in, old_flags);\r
- if (rc)\r
- return input;\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-// Stubbed out here. Should be changed in Source code...\r
-int access(const char *filename, int accessmethod)\r
-{\r
- return 0;\r
-}\r
-\r
-#ifndef __GNUC__\r
-#define EPOCHFILETIME (116444736000000000i64)\r
-#else\r
-#define EPOCHFILETIME (116444736000000000LL)\r
-#endif\r
-\r
-struct timezone {\r
- int tz_minuteswest; /* minutes W of Greenwich */\r
- int tz_dsttime; /* type of dst correction */\r
-};\r
-\r
-__inline int gettimeofday(struct timeval *tv, struct timezone *tz)\r
-{\r
- FILETIME ft;\r
- LARGE_INTEGER li;\r
- __int64 t;\r
- static int tzflag;\r
-\r
- if (tv)\r
- {\r
- GetSystemTimeAsFileTime(&ft);\r
- //li.LowPart = ft.dwLowDateTime;\r
- //li.HighPart = ft.dwHighDateTime;\r
- t = li.QuadPart; /* In 100-nanosecond intervals */\r
- t -= EPOCHFILETIME; /* Offset to the Epoch time */\r
- t /= 10; /* In microseconds */\r
- tv->tv_sec = (long)(t / 1000000);\r
- tv->tv_usec = (long)(t % 1000000);\r
- }\r
-\r
- if (tz)\r
- {\r
- if (!tzflag)\r
- {\r
- _tzset();\r
- tzflag++;\r
- }\r
- tz->tz_minuteswest = _timezone / 60;\r
- tz->tz_dsttime = _daylight;\r
- }\r
-\r
- return 0;\r
-}\r
+#include <stdio.h>
+#include <time.h>
+#include <winsock.h>
+#include "prototypes.h"
+
+#define MAX_ASCII 100
+
+int checkRecv(SOCKET s);
+
+int checkRecv(SOCKET s)
+{
+ int testVal;
+ fd_set sSet;
+ struct timeval timeout;
+ timeout.tv_sec = 60;
+
+ FD_ZERO(&sSet);
+
+ FD_SET(s, &sSet);
+
+ testVal = select(0, &sSet, NULL, NULL, &timeout);
+
+ if (testVal == SOCKET_ERROR)
+ fprintf(stderr, "Socket Error");
+
+ return testVal;
+}
+
+void blkfree(char **av0)
+{
+ register char **av = av0;
+
+ while (*av)
+ free(*av++);
+}
+
+char *glob(register char *v)
+{
+ return NULL;
+}
+
+
+int sleep(int time)
+{
+ return time;
+}
+
+int herror(char *string)
+{
+ return 0;
+}
+#if 0
+
+int gettimeofday(struct timeval *timenow,
+ struct timezone *zone)
+{
+ time_t t;
+
+ t = clock();
+
+ timenow->tv_usec = t;
+ timenow->tv_sec = t / CLK_TCK;
+
+ return 0;
+}
+
+int fgetcSocket(int s)
+{
+ int c;
+ char buffer[10];
+
+// checkRecv(s);
+
+ c = recv(s, buffer, 1, 0);
+
+#ifdef DEBUG_IN
+ printf("%c", buffer[0]);
+#endif
+
+ if (c == INVALID_SOCKET)
+ return c;
+
+ if (c == 0)
+ return EOF;
+
+ return buffer[0];
+}
+
+#else
+
+int fgetcSocket(int s)
+{
+ static int index = 0;
+ static int total = 0;
+ static unsigned char buffer[4096];
+
+ if (index == total)
+ {
+ index = 0;
+ total = recv(s, buffer, sizeof(buffer), 0);
+
+ if (total == INVALID_SOCKET)
+ {
+ total = 0;
+ return ERROR;
+ }
+
+ if (total == 0)
+ return EOF;
+ }
+ return buffer[index++];
+}
+
+#endif
+
+char *fprintfSocket(int s, char *format, ...)
+{
+ va_list argptr;
+ char buffer[10009];
+
+ va_start(argptr, format);
+ vsprintf(buffer, format, argptr);
+ va_end(argptr);
+
+ send(s, buffer, strlen(buffer), 0);
+
+ return NULL;
+}
+
+char *fputsSocket(char *format, int s)
+{
+ send(s, format, strlen(format), 0);
+
+ return NULL;
+}
+
+int fputcSocket(int s, char putChar)
+{
+ char buffer[2];
+
+ buffer[0] = putChar;
+ buffer[1] = '\0';
+
+ if(SOCKET_ERROR==send(s, buffer, 1, 0)) {
+ int iret=WSAGetLastError ();
+ fprintf(stdout,"fputcSocket: %d\n",iret);
+ return 0;
+ }
+ else {
+ return putChar;
+ }
+}
+int fputSocket(int s, char *buffer, int len)
+{
+ int iret;
+ while(len) {
+ if(SOCKET_ERROR==(iret=send(s, buffer, len, 0)))
+ {
+ iret=WSAGetLastError ();
+ fprintf(stdout,"fputcSocket: %d\n",iret);
+ return 0;
+ }
+ else {
+ return len-=iret;
+ }
+ }
+ return 0;
+}
+
+char *fgetsSocket(int s, char *string)
+{
+ char buffer[2] = {0};
+ int i, count;
+
+ for (i = 0, count = 1; count != 0 && buffer[0] != '\n'; i++)
+ {
+ checkRecv(s);
+
+ count = recv(s, buffer, 1, 0);
+
+ if (count == SOCKET_ERROR)
+ {
+ printf("Error in fgetssocket");
+ return NULL;
+ }
+
+ if (count == 1)
+ {
+ string[i] = buffer[0];
+
+ if (i == MAX_ASCII - 3)
+ {
+ count = 0;
+ string[++i] = '\n';
+ string[++i] = '\0';
+ }
+ }
+ else
+ {
+ if (i == 0)
+ return NULL;
+ else
+ {
+ string[i] = '\n';
+ string[i + 1] = '\0'; // This is risky
+ return string;
+ }
+
+ }
+
+ }
+ string[i] = '\0';
+
+#ifdef DEBUG_IN
+ printf("%s", string);
+#endif
+ return string;
+}
+
+
+#if 0
+char *getpass(const char *prompt)
+{
+ static char string[64];
+
+ printf("%s", prompt);
+
+ gets(string);
+
+ return string;
+}
+#endif
+char *getpass (const char * prompt)
+{
+ static char input[256];
+ HANDLE in;
+ HANDLE err;
+ int count;
+
+ in = GetStdHandle (STD_INPUT_HANDLE);
+ err = GetStdHandle (STD_ERROR_HANDLE);
+
+ if (in == INVALID_HANDLE_VALUE || err == INVALID_HANDLE_VALUE)
+ return NULL;
+
+ if (WriteFile (err, prompt, strlen (prompt), &count, NULL))
+ {
+ int istty = (GetFileType (in) == FILE_TYPE_CHAR);
+ DWORD old_flags;
+ int rc;
+
+ if (istty)
+ {
+ if (GetConsoleMode (in, &old_flags))
+ SetConsoleMode (in, ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT);
+ else
+ istty = 0;
+ }
+ /* Need to read line one byte at time to avoid blocking, if not a
+ tty, so always do it this way. */
+ count = 0;
+ while (1)
+ {
+ DWORD dummy;
+ char one_char;
+
+ rc = ReadFile (in, &one_char, 1, &dummy, NULL);
+ if (rc == 0)
+ break;
+ if (one_char == '\r')
+ {
+ /* CR is always followed by LF if reading from tty. */
+ if (istty)
+ continue;
+ else
+ break;
+ }
+ if (one_char == '\n')
+ break;
+ /* Silently truncate password string if overly long. */
+ if (count < sizeof (input) - 1)
+ input[count++] = one_char;
+ }
+ input[count] = '\0';
+
+ WriteFile (err, "\r\n", 2, &count, NULL);
+ if (istty)
+ SetConsoleMode (in, old_flags);
+ if (rc)
+ return input;
+ }
+
+ return NULL;
+}
+
+// Stubbed out here. Should be changed in Source code...
+int access(const char *filename, int accessmethod)
+{
+ return 0;
+}
+
+#ifndef __GNUC__
+#define EPOCHFILETIME (116444736000000000i64)
+#else
+#define EPOCHFILETIME (116444736000000000LL)
+#endif
+
+struct timezone {
+ int tz_minuteswest; /* minutes W of Greenwich */
+ int tz_dsttime; /* type of dst correction */
+};
+
+__inline int gettimeofday(struct timeval *tv, struct timezone *tz)
+{
+ FILETIME ft;
+ LARGE_INTEGER li;
+ __int64 t;
+ static int tzflag;
+
+ if (tv)
+ {
+ GetSystemTimeAsFileTime(&ft);
+ //li.LowPart = ft.dwLowDateTime;
+ //li.HighPart = ft.dwHighDateTime;
+ t = li.QuadPart; /* In 100-nanosecond intervals */
+ t -= EPOCHFILETIME; /* Offset to the Epoch time */
+ t /= 10; /* In microseconds */
+ tv->tv_sec = (long)(t / 1000000);
+ tv->tv_usec = (long)(t % 1000000);
+ }
+
+ if (tz)
+ {
+ if (!tzflag)
+ {
+ _tzset();
+ tzflag++;
+ }
+ tz->tz_minuteswest = _timezone / 60;
+ tz->tz_dsttime = _daylight;
+ }
+
+ return 0;
+}
-#define bcopy(s,d,l) memcpy((d),(s),(l))\r
-#define bzero(cp,l) memset((cp),0,(l))\r
-\r
-#define rindex strrchr\r
-#define index strchr\r
-\r
-#define getwd getcwd\r
-\r
-#define strcasecmp strcmp\r
-#define strncasecmp strnicmp\r
+#define bcopy(s,d,l) memcpy((d),(s),(l))
+#define bzero(cp,l) memset((cp),0,(l))
+
+#define rindex strrchr
+#define index strchr
+
+#define getwd getcwd
+
+#define strcasecmp strcmp
+#define strncasecmp strnicmp
-#define L_SET SEEK_SET\r
-#define L_INCR SEEK_CUR\r
-#define caddr_t void *\r
-/*\r
- * Copyright (c) 1985, 1989 Regents of the University of California.\r
- * All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms are permitted\r
- * provided that the above copyright notice and this paragraph are\r
- * duplicated in all such forms and that any documentation,\r
- * advertising materials, and other materials related to such\r
- * distribution and use acknowledge that the software was developed\r
- * by the University of California, Berkeley. The name of the\r
- * University may not be used to endorse or promote products derived\r
- * from this software without specific prior written permission.\r
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\r
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\r
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
- */\r
-\r
-#ifndef lint\r
-static char sccsid[] = "@(#)ftp.c 5.28 (Berkeley) 4/20/89";\r
-#endif /* not lint */\r
-#include <io.h>\r
-\r
-#include <sys/stat.h>\r
-\r
-#if !defined(WIN32)\r
-#include <sys/param.h>\r
-#include <sys/socket.h>\r
-#include <sys/time.h>\r
-#include <sys/file.h>\r
-#include <sys/ioctl.h>\r
-#include <netinet/in.h>\r
-#include <arpa/ftp.h>\r
-#include <arpa/telnet.h>\r
-#include <pwd.h>\r
-#include <varargs.h>\r
-#include <netdb.h>\r
-#else\r
-#include <winsock.h>\r
-#endif\r
-\r
-#include <stdio.h>\r
-#include <signal.h>\r
-#include <errno.h>\r
-#include <fcntl.h>\r
-\r
-#include "ftp_var.h"\r
-#include "prototypes.h"\r
-#ifndef MAXHOSTNAMELEN\r
-#define MAXHOSTNAMELEN 64\r
-#endif\r
-\r
-#ifdef NOVFPRINTF\r
-#define vfprintf(a,b,c) _doprnt(b,c,a)\r
-#endif\r
-\r
-#ifdef sun\r
-/* FD_SET wasn't defined until 4.0. its a cheap test for uid_t presence */\r
-#ifndef FD_SET\r
-#define NBBY 8 /* number of bits in a byte */\r
-/*\r
- * Select uses bit masks of file descriptors in longs.\r
- * These macros manipulate such bit fields (the filesystem macros use chars).\r
- * FD_SETSIZE may be defined by the user, but the default here\r
- * should be >= NOFILE (param.h).\r
- */\r
-#ifndef FD_SETSIZE\r
-#define FD_SETSIZE 256\r
-#endif\r
-\r
-typedef long fd_mask;\r
-#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */\r
-#ifndef howmany\r
-#define howmany(x, y) (((x)+((y)-1))/(y))\r
-#endif\r
-\r
-#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))\r
-#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))\r
-#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))\r
-#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))\r
-\r
-typedef int uid_t;\r
-typedef int gid_t;\r
-#endif\r
-#endif\r
-\r
-struct sockaddr_in hisctladdr;\r
-struct sockaddr_in data_addr;\r
-int data = -1;\r
-int abrtflag = 0;\r
-int ptflag = 0;\r
-int allbinary;\r
-struct sockaddr_in myctladdr;\r
-uid_t getuid();\r
-sig_t lostpeer();\r
-off_t restart_point = 0;\r
-\r
-int cin, cout;\r
-int dataconn(char *mode);\r
-\r
-int command(char *fmt, ...);\r
-\r
-char *hostname;\r
-\r
-typedef void (*Sig_t)(int);\r
-\r
-// Signal Handlers\r
-\r
-void psabort(int sig);\r
-\r
-char *hookup(char *host, int port)\r
-{\r
- register struct hostent *hp = 0;\r
- int s,len;\r
- static char hostnamebuf[80];\r
-\r
- bzero((char *)&hisctladdr, sizeof (hisctladdr));\r
- hisctladdr.sin_addr.s_addr = inet_addr(host);\r
- if (hisctladdr.sin_addr.s_addr != -1) {\r
- hisctladdr.sin_family = AF_INET;\r
- (void) strncpy(hostnamebuf, host, sizeof(hostnamebuf));\r
- } else {\r
- hp = gethostbyname(host);\r
- if (hp == NULL) {\r
- fprintf(stderr, "ftp: %s: ", host);\r
- herror((char *)NULL);\r
- code = -1;\r
- return((char *) 0);\r
- }\r
- hisctladdr.sin_family = hp->h_addrtype;\r
- bcopy(hp->h_addr_list[0],\r
- (caddr_t)&hisctladdr.sin_addr, hp->h_length);\r
- (void) strncpy(hostnamebuf, hp->h_name, sizeof(hostnamebuf));\r
- }\r
- hostname = hostnamebuf;\r
- s = socket(hisctladdr.sin_family, SOCK_STREAM, 0);\r
- if (s < 0) {\r
- perror("ftp: socket");\r
- code = -1;\r
- return (0);\r
- }\r
- hisctladdr.sin_port = port;\r
- while (connect(s, (struct sockaddr *)&hisctladdr, sizeof (hisctladdr)) < 0) {\r
- if (hp && hp->h_addr_list[1]) {\r
- int oerrno = errno;\r
-\r
- fprintf(stderr, "ftp: connect to address %s: ",\r
- inet_ntoa(hisctladdr.sin_addr));\r
- errno = oerrno;\r
- perror((char *) 0);\r
- hp->h_addr_list++;\r
- bcopy(hp->h_addr_list[0],\r
- (caddr_t)&hisctladdr.sin_addr, hp->h_length);\r
- fprintf(stdout, "Trying %s...\n",\r
- inet_ntoa(hisctladdr.sin_addr));\r
- (void) fflush(stdout);\r
- (void) close(s);\r
- s = socket(hisctladdr.sin_family, SOCK_STREAM, 0);\r
- if (s < 0) {\r
- perror("ftp: socket");\r
- code = -1;\r
- return (0);\r
- }\r
- continue;\r
- }\r
- perror("ftp: connect");\r
- code = -1;\r
- goto bad;\r
- }\r
- len = sizeof (myctladdr);\r
- if (getsockname(s, (struct sockaddr *)&myctladdr, &len) < 0) {\r
- perror("ftp: getsockname");\r
- code = -1;\r
- goto bad;\r
- }\r
- cin = cout = s;\r
- if (verbose) {\r
- printf("Connected to %s.\n", hostname);\r
- (void) fflush(stdout);\r
- }\r
- if (getreply(0) > 2) { /* read startup message from server */\r
- closesocket(cin);\r
- code = -1;\r
- goto bad;\r
- }\r
-#ifdef SO_OOBINLINE\r
- {\r
- int on = 1;\r
-\r
- if (setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (const char *) &on, sizeof(on))\r
- < 0 && debug) {\r
- perror("ftp: setsockopt");\r
- }\r
- }\r
-#endif //SO_OOBINLINE\r
-\r
- return (hostname);\r
-bad:\r
- (void) close(s);\r
- return ((char *)0);\r
-}\r
-\r
-int login(char *host)\r
-{\r
- char tmp[80];\r
- char *user, *pass, *acct;\r
- int n, aflag = 0;\r
-\r
- user = pass = acct = 0;\r
- if (ruserpass(host, &user, &pass, &acct) < 0) {\r
- code = -1;\r
- return(0);\r
- }\r
- while (user == NULL) {\r
- char *myname = "none"; // This needs to become the usename env\r
-\r
- if (myname)\r
- printf("Name (%s:%s): ", host, myname);\r
- else\r
- printf("Name (%s): ", host);\r
- (void) fflush(stdout);\r
- (void) fgets(tmp, sizeof(tmp) - 1, stdin);\r
- tmp[strlen(tmp) - 1] = '\0';\r
- if (*tmp == '\0')\r
- user = myname;\r
- else\r
- user = tmp;\r
- }\r
- n = command("USER %s", user);\r
- if (n == CONTINUE) {\r
- if (pass == NULL)\r
- pass = getpass("Password:");\r
- n = command("PASS %s", pass);\r
- fflush(stdin);\r
- }\r
- if (n == CONTINUE) {\r
- aflag++;\r
- acct = getpass("Account:");\r
- n = command("ACCT %s", acct);\r
- }\r
- if (n != COMPLETE) {\r
- fprintf(stderr, "Login failed.\n");\r
- return (0);\r
- }\r
- if (!aflag && acct != NULL)\r
- (void) command("ACCT %s", acct);\r
- if (proxy)\r
- return(1);\r
- for (n = 0; n < macnum; ++n) {\r
- if (!strcmp("init", macros[n].mac_name)) {\r
- (void) strcpy(line, "$init");\r
- makeargv();\r
- domacro(margc, margv);\r
- break;\r
- }\r
- }\r
- return (1);\r
-}\r
-\r
-void\r
-cmdabort(int sig)\r
-{\r
- extern jmp_buf ptabort;\r
-\r
- printf("\n");\r
- (void) fflush(stdout);\r
- abrtflag++;\r
- if (ptflag)\r
- longjmp(ptabort,1);\r
-}\r
-\r
-/*VARARGS1*/\r
-int command(char *fmt, ...)\r
-{\r
- va_list ap;\r
- int r;\r
- void (*oldintr)(int), cmdabort(int);\r
-\r
- abrtflag = 0;\r
- if (debug) {\r
- printf("---> ");\r
- va_start(ap, fmt);\r
- vfprintf(stdout, fmt, ap);\r
- va_end(ap);\r
- printf("\n");\r
- (void) fflush(stdout);\r
- }\r
- if (cout == (int) NULL) {\r
- perror ("No control connection for command");\r
- code = -1;\r
- return (0);\r
- }\r
- oldintr = signal(SIGINT,cmdabort);\r
- {\r
- char buffer[1024];\r
-\r
- va_start(ap, fmt);\r
- vsprintf(buffer, fmt, ap);\r
- va_end(ap);\r
-//DLJ: to work through firewalls - send the command as a single message\r
- strcat(buffer,"\r\n");\r
- fprintfSocket(cout, buffer);\r
- }\r
-//DLJ: the following two lines are replaced by the strcat above - seems to\r
-// make it work through firewalls.\r
-// fprintfSocket(cout, "\r\n");\r
-// (void) fflush(cout);\r
- cpend = 1;\r
- r = getreply(!strcmp(fmt, "QUIT"));\r
- if (abrtflag && oldintr != SIG_IGN)\r
- (*oldintr)(SIGINT);\r
-// (void) signal(SIGINT, oldintr);\r
- return(r);\r
-}\r
-\r
-char reply_string[BUFSIZ]; /* last line of previous reply */\r
-\r
-#include <ctype.h>\r
-\r
-getreply(expecteof)\r
- int expecteof;\r
-{\r
- register int c, n;\r
- register int dig;\r
- register char *cp;\r
- int originalcode = 0, continuation = 0;\r
- void (*oldintr)(int), cmdabort(int);\r
- int pflag = 0;\r
- char *pt = pasv;\r
-\r
- oldintr = signal(SIGINT,cmdabort);\r
- for (;;) {\r
- dig = n = code = 0;\r
- cp = reply_string;\r
- while ((c = fgetcSocket(cin)) != '\n') {\r
- if (c == IAC) { /* handle telnet commands */\r
- switch (c = fgetcSocket(cin)) {\r
- case WILL:\r
- case WONT:\r
- c = fgetcSocket(cin);\r
- fprintfSocket(cout, "%c%c%c",IAC,DONT,c);\r
- break;\r
- case DO:\r
- case DONT:\r
- c = fgetcSocket(cin);\r
- fprintfSocket(cout, "%c%c%c",IAC,WONT,c);\r
- break;\r
- default:\r
- break;\r
- }\r
- continue;\r
- }\r
- dig++;\r
- if (c == EOF) {\r
- if (expecteof) {\r
-// (void) signal(SIGINT,oldintr);\r
- code = 221;\r
- return (0);\r
- }\r
- lostpeer();\r
- if (verbose) {\r
- printf("421 Service not available, remote server has closed connection\n");\r
- (void) fflush(stdout);\r
- }\r
- code = 421;\r
- return(4);\r
- }\r
- if (c != '\r' && (verbose > 0 ||\r
- (verbose > -1 && n == '5' && dig > 4))) {\r
- if (proxflag &&\r
- (dig == 1 || dig == 5 && verbose == 0))\r
- printf("%s:",hostname);\r
- (void) putchar(c);\r
- (void) fflush(stdout);\r
- }\r
- if (dig < 4 && isdigit(c))\r
- code = code * 10 + (c - '0');\r
- if (!pflag && code == 227)\r
- pflag = 1;\r
- if (dig > 4 && pflag == 1 && isdigit(c))\r
- pflag = 2;\r
- if (pflag == 2) {\r
- if (c != '\r' && c != ')')\r
- *pt++ = c;\r
- else {\r
- *pt = '\0';\r
- pflag = 3;\r
- }\r
- }\r
- if (dig == 4 && c == '-') {\r
- if (continuation)\r
- code = 0;\r
- continuation++;\r
- }\r
- if (n == 0)\r
- n = c;\r
- if (cp < &reply_string[sizeof(reply_string) - 1])\r
- *cp++ = c;\r
- }\r
- if (verbose > 0 || verbose > -1 && n == '5') {\r
- (void) putchar(c);\r
- (void) fflush (stdout);\r
- }\r
- if (continuation && code != originalcode) {\r
- if (originalcode == 0)\r
- originalcode = code;\r
- continue;\r
- }\r
- *cp = '\0';\r
- if (n != '1')\r
- cpend = 0;\r
- (void) signal(SIGINT,oldintr);\r
- if (code == 421 || originalcode == 421)\r
- lostpeer();\r
- if (abrtflag && oldintr != cmdabort && oldintr != SIG_IGN)\r
- (*oldintr)(SIGINT);\r
- return (n - '0');\r
- }\r
-}\r
-\r
-empty(mask, sec)\r
- struct fd_set *mask;\r
- int sec;\r
-{\r
- struct timeval t;\r
-\r
- t.tv_sec = (long) sec;\r
- t.tv_usec = 0;\r
- return(select(32, mask, (struct fd_set *) 0, (struct fd_set *) 0, &t));\r
-}\r
-\r
-jmp_buf sendabort;\r
-\r
-void abortsend()\r
-{\r
-\r
- mflag = 0;\r
- abrtflag = 0;\r
- printf("\nsend aborted\n");\r
- (void) fflush(stdout);\r
- longjmp(sendabort, 1);\r
-}\r
-\r
-#define HASHBYTES 1024\r
-\r
-void sendrequest(char *cmd, char *local, char *remote, int printnames)\r
-{\r
- FILE *fin;\r
- int dout = 0;\r
- int (*closefunc)(), _pclose(), fclose();\r
- sig_t (*oldintr)(), (*oldintp)();\r
- void abortsend();\r
- char buf[BUFSIZ], *bufp;\r
- long bytes = 0, hashbytes = HASHBYTES;\r
- register int c, d;\r
- struct stat st;\r
- struct timeval start, stop;\r
- char *mode;\r
-\r
- if (verbose && printnames) {\r
- if (local && *local != '-')\r
- printf("local: %s ", local);\r
- if (remote)\r
- printf("remote: %s\n", remote);\r
- (void) fflush(stdout);\r
- }\r
- if (proxy) {\r
- proxtrans(cmd, local, remote);\r
- return;\r
- }\r
- closefunc = NULL;\r
- oldintr = NULL;\r
- oldintp = NULL;\r
- mode = "w";\r
- if (setjmp(sendabort)) {\r
- while (cpend) {\r
- (void) getreply(0);\r
- }\r
- if (data >= 0) {\r
- (void) close(data);\r
- data = -1;\r
- }\r
- if (oldintr)\r
-null();// (void) signal(SIGINT,oldintr);\r
- if (oldintp)\r
-null();// (void) signal(SIGPIPE,oldintp);\r
- code = -1;\r
- return;\r
- }\r
-null();// oldintr = signal(SIGINT, abortsend);\r
- if (strcmp(local, "-") == 0)\r
- fin = stdin;\r
- else if (*local == '|') {\r
-null();// oldintp = signal(SIGPIPE,SIG_IGN);\r
- fin = _popen(local + 1, "r");\r
- if (fin == NULL) {\r
- perror(local + 1);\r
-null();// (void) signal(SIGINT, oldintr);\r
-null();// (void) signal(SIGPIPE, oldintp);\r
- code = -1;\r
- return;\r
- }\r
- closefunc = _pclose;\r
- } else {\r
- fin = fopen(local, "r");\r
- if (fin == NULL) {\r
- perror(local);\r
-null();// (void) signal(SIGINT, oldintr);\r
- code = -1;\r
- return;\r
- }\r
- closefunc = fclose;\r
- if (fstat(fileno(fin), &st) < 0 ||\r
- (st.st_mode&S_IFMT) != S_IFREG) {\r
- fprintf(stdout, "%s: not a plain file.\n", local);\r
- (void) fflush(stdout);\r
-null();// (void) signal(SIGINT, oldintr);\r
- fclose(fin);\r
- code = -1;\r
- return;\r
- }\r
- }\r
- if (initconn()) {\r
-null();// (void) signal(SIGINT, oldintr);\r
- if (oldintp)\r
-null();// (void) signal(SIGPIPE, oldintp);\r
- code = -1;\r
- if (closefunc != NULL)\r
- (*closefunc)(fin);\r
- return;\r
- }\r
- if (setjmp(sendabort))\r
- goto abort;\r
-\r
- if (restart_point &&\r
- (strcmp(cmd, "STOR") == 0 || strcmp(cmd, "APPE") == 0)) {\r
- if (fseek(fin, (long) restart_point, 0) < 0) {\r
- perror(local);\r
- restart_point = 0;\r
- if (closefunc != NULL)\r
- (*closefunc)(fin);\r
- return;\r
- }\r
- if (command("REST %ld", (long) restart_point)\r
- != CONTINUE) {\r
- restart_point = 0;\r
- if (closefunc != NULL)\r
- (*closefunc)(fin);\r
- return;\r
- }\r
- restart_point = 0;\r
- mode = "r+w";\r
- }\r
- if (remote) {\r
- if (command("%s %s", cmd, remote) != PRELIM) {\r
-null();// (void) signal(SIGINT, oldintr);\r
- if (oldintp)\r
-null();// (void) signal(SIGPIPE, oldintp);\r
- if (closefunc != NULL)\r
- (*closefunc)(fin);\r
- return;\r
- }\r
- } else\r
- if (command("%s", cmd) != PRELIM) {\r
-null();// (void) signal(SIGINT, oldintr);\r
- if (oldintp)\r
-null();// (void) signal(SIGPIPE, oldintp);\r
- if (closefunc != NULL)\r
- (*closefunc)(fin);\r
- return;\r
- }\r
- dout = dataconn(mode);\r
- if (dout == (int)NULL)\r
- goto abort;\r
- (void) gettimeofday(&start, (struct timezone *)0);\r
-null();// oldintp = signal(SIGPIPE, SIG_IGN);\r
- switch (type) {\r
-\r
- case TYPE_I:\r
- case TYPE_L:\r
- errno = d = 0;\r
- while ((c = read(fileno(fin), buf, sizeof (buf))) > 0) {\r
- bytes += c;\r
- for (bufp = buf; c > 0; c -= d, bufp += d)\r
- if ((d = send(dout, bufp, c, 0)) <= 0)\r
- break;\r
- if (hash) {\r
- while (bytes >= hashbytes) {\r
- (void) putchar('#');\r
- hashbytes += HASHBYTES;\r
- }\r
- (void) fflush(stdout);\r
- }\r
- }\r
- if (hash && bytes > 0) {\r
- if (bytes < HASHBYTES)\r
- (void) putchar('#');\r
- (void) putchar('\n');\r
- (void) fflush(stdout);\r
- }\r
- if (c < 0)\r
- perror(local);\r
- if (d <= 0) {\r
- if (d == 0)\r
- fprintf(stderr, "netout: write returned 0?\n");\r
- else if (errno != EPIPE)\r
- perror("netout");\r
- bytes = -1;\r
- }\r
- break;\r
-\r
- case TYPE_A:\r
- {\r
- char buf[1024];\r
- static int bufsize = 1024;\r
- int ipos=0;\r
-\r
- while ((c = getc(fin)) != EOF) {\r
- if (c == '\n') {\r
- while (hash && (bytes >= hashbytes)) {\r
- (void) putchar('#');\r
- (void) fflush(stdout);\r
- hashbytes += HASHBYTES;\r
- }\r
-// Szurgot: The following code is unncessary on Win32.\r
-// (void) fputcSocket(dout, '\r');\r
-// bytes++;\r
- }\r
-\r
- if (ipos >= bufsize) {\r
- fputSocket(dout,buf,ipos);\r
- if(!hash) (void) putchar('.');\r
- ipos=0;\r
- }\r
- buf[ipos]=c; ++ipos;\r
- bytes++;\r
- }\r
- if (ipos) {\r
- fputSocket(dout,buf,ipos);\r
- ipos=0;\r
- }\r
- if (hash) {\r
- if (bytes < hashbytes)\r
- (void) putchar('#');\r
- (void) putchar('\n');\r
- (void) fflush(stdout);\r
- }\r
- else {\r
- (void) putchar('.');\r
- (void) putchar('\n');\r
- (void) fflush(stdout);\r
- }\r
- if (ferror(fin))\r
- perror(local);\r
-// if (ferror(dout)) {\r
-// if (errno != EPIPE)\r
-// perror("netout");\r
-// bytes = -1;\r
-// }\r
- break;\r
- }\r
- }\r
- (void) gettimeofday(&stop, (struct timezone *)0);\r
- if (closefunc != NULL)\r
- (*closefunc)(fin);\r
- if(closesocket(dout)) {\r
- int iret=WSAGetLastError ();\r
- fprintf(stdout,"Error closing socket(%d)\n",iret);\r
- (void) fflush(stdout);\r
- }\r
- (void) getreply(0);\r
-null();// (void) signal(SIGINT, oldintr);\r
- if (oldintp)\r
-null();// (void) signal(SIGPIPE, oldintp);\r
- if (bytes > 0)\r
- ptransfer("sent", bytes, &start, &stop);\r
- return;\r
-abort:\r
- (void) gettimeofday(&stop, (struct timezone *)0);\r
-null();// (void) signal(SIGINT, oldintr);\r
- if (oldintp)\r
-null();// (void) signal(SIGPIPE, oldintp);\r
- if (!cpend) {\r
- code = -1;\r
- return;\r
- }\r
- if (data >= 0) {\r
- (void) close(data);\r
- data = -1;\r
- }\r
- if (dout)\r
- if(closesocket(dout)) {\r
- int iret=WSAGetLastError ();\r
- fprintf(stdout,"Error closing socket(%d)\n",iret);\r
- (void) fflush(stdout);\r
- }\r
-\r
- (void) getreply(0);\r
- code = -1;\r
- if (closefunc != NULL && fin != NULL)\r
- (*closefunc)(fin);\r
- if (bytes > 0)\r
- ptransfer("sent", bytes, &start, &stop);\r
-}\r
-\r
-jmp_buf recvabort;\r
-\r
-\r
-void abortrecv()\r
-{\r
-\r
- mflag = 0;\r
- abrtflag = 0;\r
- printf("\n");\r
- (void) fflush(stdout);\r
- longjmp(recvabort, 1);\r
-}\r
-\r
-void recvrequest(char *cmd, char *local, char *remote, char *mode,\r
- int printnames)\r
-{\r
- FILE *fout;\r
- int din = 0;\r
- int (*closefunc)(), _pclose(), fclose();\r
- void (*oldintr)(int), (*oldintp)(int);\r
- void abortrecv();\r
- int oldverbose, oldtype = 0, is_retr, tcrflag, nfnd, bare_lfs = 0;\r
- char *gunique(), msg;\r
-// static char *buf; // Szurgot: Shouldn't this go SOMEWHERE?\r
- char buf[1024];\r
- static int bufsize = 1024;\r
- long bytes = 0, hashbytes = HASHBYTES;\r
-// struct\r
- fd_set mask;\r
- register int c, d;\r
- struct timeval start, stop;\r
-// struct stat st;\r
- extern void *malloc();\r
-\r
- is_retr = strcmp(cmd, "RETR") == 0;\r
- if (is_retr && verbose && printnames) {\r
- if (local && *local != '-')\r
- printf("local: %s ", local);\r
- if (remote)\r
- printf("remote: %s\n", remote);\r
- (void) fflush(stdout);\r
- }\r
- if (proxy && is_retr) {\r
- proxtrans(cmd, local, remote);\r
- return;\r
- }\r
- closefunc = NULL;\r
- oldintr = NULL;\r
- oldintp = NULL;\r
- tcrflag = !crflag && is_retr;\r
- if (setjmp(recvabort)) {\r
- while (cpend) {\r
- (void) getreply(0);\r
- }\r
- if (data >= 0) {\r
- (void) close(data);\r
- data = -1;\r
- }\r
- if (oldintr)\r
-null();// (void) signal(SIGINT, oldintr);\r
- code = -1;\r
- return;\r
- }\r
-null();// oldintr = signal(SIGINT, abortrecv);\r
- if (strcmp(local, "-") && *local != '|') {\r
-#ifndef __WIN32__\r
-// This whole thing is a problem... access Won't work on non-existent files\r
- if (access(local, 2) < 0) {\r
- char *dir = rindex(local, '/');\r
-\r
- if (errno != ENOENT && errno != EACCES) {\r
- perror(local);\r
- (void) signal(SIGINT, oldintr);\r
- code = -1;\r
- return;\r
- }\r
- if (dir != NULL)\r
- *dir = 0;\r
- d = access(dir ? local : ".", 2);\r
- if (dir != NULL)\r
- *dir = '/';\r
- if (d < 0) {\r
- perror(local);\r
- (void) signal(SIGINT, oldintr);\r
- code = -1;\r
- return;\r
- }\r
- if (!runique && errno == EACCES &&\r
- chmod(local, 0600) < 0) {\r
- perror(local);\r
- (void) signal(SIGINT, oldintr);\r
- code = -1;\r
- return;\r
- }\r
- if (runique && errno == EACCES &&\r
- (local = gunique(local)) == NULL) {\r
- (void) signal(SIGINT, oldintr);\r
- code = -1;\r
- return;\r
- }\r
- }\r
- else if (runique && (local = gunique(local)) == NULL) {\r
- (void) signal(SIGINT, oldintr);\r
- code = -1;\r
- return;\r
- }\r
-#endif\r
- }\r
- if (initconn()) {\r
-null();// (void) signal(SIGINT, oldintr);\r
- code = -1;\r
- return;\r
- }\r
- if (setjmp(recvabort))\r
- goto abort;\r
- if (!is_retr) {\r
- if (type != TYPE_A && (allbinary == 0 || type != TYPE_I)) {\r
- oldtype = type;\r
- oldverbose = verbose;\r
- if (!debug)\r
- verbose = 0;\r
- setascii();\r
- verbose = oldverbose;\r
- }\r
- } else if (restart_point) {\r
- if (command("REST %ld", (long) restart_point) != CONTINUE)\r
- return;\r
- }\r
- if (remote) {\r
- if (command("%s %s", cmd, remote) != PRELIM) {\r
-null();// (void) signal(SIGINT, oldintr);\r
- if (oldtype) {\r
- if (!debug)\r
- verbose = 0;\r
- switch (oldtype) {\r
- case TYPE_I:\r
- setbinary();\r
- break;\r
- case TYPE_E:\r
- setebcdic();\r
- break;\r
- case TYPE_L:\r
- settenex();\r
- break;\r
- }\r
- verbose = oldverbose;\r
- }\r
- return;\r
- }\r
- } else {\r
- if (command("%s", cmd) != PRELIM) {\r
-null();// (void) signal(SIGINT, oldintr);\r
- if (oldtype) {\r
- if (!debug)\r
- verbose = 0;\r
- switch (oldtype) {\r
- case TYPE_I:\r
- setbinary();\r
- break;\r
- case TYPE_E:\r
- setebcdic();\r
- break;\r
- case TYPE_L:\r
- settenex();\r
- break;\r
- }\r
- verbose = oldverbose;\r
- }\r
- return;\r
- }\r
- }\r
- din = dataconn("r");\r
- if (din == (int)NULL)\r
- goto abort;\r
- if (strcmp(local, "-") == 0)\r
- fout = stdout;\r
- else if (*local == '|') {\r
-null();// oldintp = signal(SIGPIPE, SIG_IGN);\r
- fout = _popen(local + 1, "w");\r
- if (fout == NULL) {\r
- perror(local+1);\r
- goto abort;\r
- }\r
- closefunc = _pclose;\r
- } else {\r
- fout = fopen(local, mode);\r
- if (fout == NULL) {\r
- perror(local);\r
- goto abort;\r
- }\r
- closefunc = fclose;\r
- }\r
- (void) gettimeofday(&start, (struct timezone *)0);\r
- switch (type) {\r
-\r
- case TYPE_I:\r
- case TYPE_L:\r
- if (restart_point &&\r
- lseek(fileno(fout), (long) restart_point, L_SET) < 0) {\r
- perror(local);\r
- if (closefunc != NULL)\r
- (*closefunc)(fout);\r
- return;\r
- }\r
- errno = d = 0;\r
-// while ((c = recv(din, buf, bufsize, 1)) > 0) {\r
-// if ((d = write(fileno(fout), buf, c)) != c)\r
-// if ((d = write(fileno(fout), buf, c)) != c)\r
-// break;\r
- while ((c = recv(din, buf, bufsize, 0)) > 0) {\r
- write(fileno(fout), buf, c);\r
- bytes += c;\r
- if (hash) {\r
- while (bytes >= hashbytes) {\r
- (void) putchar('#');\r
- hashbytes += HASHBYTES;\r
- }\r
- (void) fflush(stdout);\r
- }\r
- }\r
- if (hash && bytes > 0) {\r
- if (bytes < HASHBYTES)\r
- (void) putchar('#');\r
- (void) putchar('\n');\r
- (void) fflush(stdout);\r
- }\r
-// if (c < 0) {\r
-// if (errno != EPIPE)\r
-// perror("netin");\r
-// bytes = -1;\r
-// }\r
-// if (d < c) {\r
-// if (d < 0)\r
-// perror(local);\r
-// else\r
-// fprintf(stderr, "%s: short write\n", local);\r
-// }\r
- break;\r
-\r
- case TYPE_A:\r
- if (restart_point) {\r
- register int i, n, c;\r
-\r
- if (fseek(fout, 0L, L_SET) < 0)\r
- goto done;\r
- n = restart_point;\r
- i = 0;\r
- while (i++ < n) {\r
- if ((c=getc(fout)) == EOF)\r
- goto done;\r
- if (c == '\n')\r
- i++;\r
- }\r
- if (fseek(fout, 0L, L_INCR) < 0) {\r
-done:\r
- perror(local);\r
- if (closefunc != NULL)\r
- (*closefunc)(fout);\r
- return;\r
- }\r
- }\r
- while ((c = fgetcSocket(din)) != EOF) {\r
- if (c == '\n')\r
- bare_lfs++;\r
- while (c == '\r') {\r
- while (hash && (bytes >= hashbytes)) {\r
- (void) putchar('#');\r
- (void) fflush(stdout);\r
- hashbytes += HASHBYTES;\r
- }\r
- bytes++;\r
- if ((c = fgetcSocket(din)) != '\n' || tcrflag) {\r
- if (ferror(fout))\r
- goto break2;\r
- (void) putc('\r', fout);\r
- if (c == '\0') {\r
- bytes++;\r
- goto contin2;\r
- }\r
- if (c == EOF)\r
- goto contin2;\r
- }\r
- }\r
- (void) putc(c, fout);\r
- bytes++;\r
- contin2: ;\r
- }\r
-break2:\r
- if (bare_lfs) {\r
- printf("WARNING! %d bare linefeeds received in ASCII mode\n");\r
- printf("File may not have transferred correctly.\n");\r
- (void) fflush(stdout);\r
- }\r
- if (hash) {\r
- if (bytes < hashbytes)\r
- (void) putchar('#');\r
- (void) putchar('\n');\r
- (void) fflush(stdout);\r
- }\r
-// if (ferror(din)) {\r
-// if (errno != EPIPE)\r
-// perror("netin");\r
-// bytes = -1;\r
-// }\r
- if (ferror(fout))\r
- perror(local);\r
- break;\r
- }\r
- if (closefunc != NULL)\r
- (*closefunc)(fout);\r
-null();// (void) signal(SIGINT, oldintr);\r
- if (oldintp)\r
-null();// (void) signal(SIGPIPE, oldintp);\r
- (void) gettimeofday(&stop, (struct timezone *)0);\r
- if(closesocket(din)) {\r
- int iret=WSAGetLastError ();\r
- fprintf(stdout,"Error closing socket(%d)\n",iret);\r
- (void) fflush(stdout);\r
- }\r
-\r
- (void) getreply(0);\r
- if (bytes > 0 && is_retr)\r
- ptransfer("received", bytes, &start, &stop);\r
- if (oldtype) {\r
- if (!debug)\r
- verbose = 0;\r
- switch (oldtype) {\r
- case TYPE_I:\r
- setbinary();\r
- break;\r
- case TYPE_E:\r
- setebcdic();\r
- break;\r
- case TYPE_L:\r
- settenex();\r
- break;\r
- }\r
- verbose = oldverbose;\r
- }\r
- return;\r
-abort:\r
-\r
-/* abort using RFC959 recommended IP,SYNC sequence */\r
-\r
- (void) gettimeofday(&stop, (struct timezone *)0);\r
- if (oldintp)\r
-null();// (void) signal(SIGPIPE, oldintr);\r
-null();// (void) signal(SIGINT,SIG_IGN);\r
- if (oldtype) {\r
- if (!debug)\r
- verbose = 0;\r
- switch (oldtype) {\r
- case TYPE_I:\r
- setbinary();\r
- break;\r
- case TYPE_E:\r
- setebcdic();\r
- break;\r
- case TYPE_L:\r
- settenex();\r
- break;\r
- }\r
- verbose = oldverbose;\r
- }\r
- if (!cpend) {\r
- code = -1;\r
-null();// (void) signal(SIGINT,oldintr);\r
- return;\r
- }\r
-\r
- fprintfSocket(cout,"%c%c",IAC,IP);\r
- msg = (char)IAC;\r
-/* send IAC in urgent mode instead of DM because UNIX places oob mark */\r
-/* after urgent byte rather than before as now is protocol */\r
- if (send(cout,&msg,1,MSG_OOB) != 1) {\r
- perror("abort");\r
- }\r
- fprintfSocket(cout,"%cABOR\r\n",DM);\r
- FD_ZERO(&mask);\r
- FD_SET(cin, &mask); // Need to correct this\r
- if (din) {\r
- FD_SET(din, &mask); // Need to correct this\r
- }\r
- if ((nfnd = empty(&mask,10)) <= 0) {\r
- if (nfnd < 0) {\r
- perror("abort");\r
- }\r
- code = -1;\r
- lostpeer();\r
- }\r
- if (din && FD_ISSET(din, &mask)) {\r
- while ((c = recv(din, buf, bufsize, 0)) > 0)\r
- ;\r
- }\r
- if ((c = getreply(0)) == ERROR && code == 552) { /* needed for nic style abort */\r
- if (data >= 0) {\r
- (void) close(data);\r
- data = -1;\r
- }\r
- (void) getreply(0);\r
- }\r
- (void) getreply(0);\r
- code = -1;\r
- if (data >= 0) {\r
- (void) close(data);\r
- data = -1;\r
- }\r
- if (closefunc != NULL && fout != NULL)\r
- (*closefunc)(fout);\r
- if (din)\r
- if(closesocket(din)) {\r
- int iret=WSAGetLastError ();\r
- fprintf(stdout,"Error closing socket(%d)\n",iret);\r
- (void) fflush(stdout);\r
- }\r
-\r
- if (bytes > 0)\r
- ptransfer("received", bytes, &start, &stop);\r
-null();// (void) signal(SIGINT,oldintr);\r
-}\r
-\r
-/*\r
- * Need to start a listen on the data channel\r
- * before we send the command, otherwise the\r
- * server's connect may fail.\r
- */\r
-int sendport = -1;\r
-\r
-initconn()\r
-{\r
- register char *p, *a;\r
- int result, len, tmpno = 0;\r
- int on = 1;\r
- int a0, a1, a2, a3, p0, p1;\r
-\r
-\r
- if (passivemode) {\r
- data = socket(AF_INET, SOCK_STREAM, 0);\r
- if (data < 0) {\r
- perror("ftp: socket");\r
- return(1);\r
- }\r
- if ((options & SO_DEBUG) &&\r
- setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on,\r
- sizeof (on)) < 0)\r
- perror("ftp: setsockopt (ignored)");\r
- if (command("PASV") != COMPLETE) {\r
- printf("Passive mode refused.\n");\r
- goto bad;\r
- }\r
-\r
- /*\r
- * What we've got at this point is a string of comma\r
- * separated one-byte unsigned integer values.\r
- * The first four are the an IP address. The fifth is\r
- * the MSB of the port number, the sixth is the LSB.\r
- * From that we'll prepare a sockaddr_in.\r
- */\r
-\r
- if (sscanf(pasv,"%d,%d,%d,%d,%d,%d",\r
- &a0, &a1, &a2, &a3, &p0, &p1) != 6) {\r
- printf("Passive mode address scan failure. Shouldn't happen!\n");\r
- goto bad;\r
- }\r
-\r
- bzero(&data_addr, sizeof(data_addr));\r
- data_addr.sin_family = AF_INET;\r
- a = (char *)&data_addr.sin_addr.s_addr;\r
- a[0] = a0 & 0xff;\r
- a[1] = a1 & 0xff;\r
- a[2] = a2 & 0xff;\r
- a[3] = a3 & 0xff;\r
- p = (char *)&data_addr.sin_port;\r
- p[0] = p0 & 0xff;\r
- p[1] = p1 & 0xff;\r
-\r
- if (connect(data, (struct sockaddr *)&data_addr,\r
- sizeof(data_addr)) < 0) {\r
- perror("ftp: connect");\r
- goto bad;\r
- }\r
- return(0);\r
- }\r
-\r
-\r
-noport:\r
- data_addr = myctladdr;\r
- if (sendport)\r
- data_addr.sin_port = 0; /* let system pick one */\r
- if (data != -1)\r
- (void) close (data);\r
- data = socket(AF_INET, SOCK_STREAM, 0);\r
- if (data < 0) {\r
- perror("ftp: socket");\r
- if (tmpno)\r
- sendport = 1;\r
- return (1);\r
- }\r
- if (!sendport)\r
- if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof (on)) < 0) {\r
- perror("ftp: setsockopt (reuse address)");\r
- goto bad;\r
- }\r
- if (bind(data, (struct sockaddr *)&data_addr, sizeof (data_addr)) < 0) {\r
- perror("ftp: bind");\r
- goto bad;\r
- }\r
- if (options & SO_DEBUG &&\r
- setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof (on)) < 0)\r
- perror("ftp: setsockopt (ignored)");\r
- len = sizeof (data_addr);\r
- if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0) {\r
- perror("ftp: getsockname");\r
- goto bad;\r
- }\r
- if (listen(data, 1) < 0)\r
- perror("ftp: listen");\r
- if (sendport) {\r
- a = (char *)&data_addr.sin_addr;\r
- p = (char *)&data_addr.sin_port;\r
-#define UC(b) (((int)b)&0xff)\r
- result =\r
- command("PORT %d,%d,%d,%d,%d,%d",\r
- UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),\r
- UC(p[0]), UC(p[1]));\r
- if (result == ERROR && sendport == -1) {\r
- sendport = 0;\r
- tmpno = 1;\r
- goto noport;\r
- }\r
- return (result != COMPLETE);\r
- }\r
- if (tmpno)\r
- sendport = 1;\r
- return (0);\r
-bad:\r
- (void) fflush(stdout);\r
- (void) close(data), data = -1;\r
- if (tmpno)\r
- sendport = 1;\r
- return (1);\r
-}\r
-\r
-int dataconn(char *mode)\r
-{\r
- struct sockaddr_in from;\r
- int s, fromlen = sizeof (from);\r
-\r
- if (passivemode)\r
- return (data);\r
-\r
- s = accept(data, (struct sockaddr *) &from, &fromlen);\r
- if (s < 0) {\r
- perror("ftp: accept");\r
- (void) closesocket(data), data = -1;\r
- return (int) (NULL);\r
- }\r
- if(closesocket(data)) {\r
- int iret=WSAGetLastError ();\r
- fprintf(stdout,"Error closing socket(%d)\n",iret);\r
- (void) fflush(stdout);\r
- }\r
-\r
- data = s;\r
- return (data);\r
-}\r
-\r
-void ptransfer(direction, bytes, t0, t1)\r
- char *direction;\r
- long bytes;\r
- struct timeval *t0, *t1;\r
-{\r
- struct timeval td;\r
- double s, bs;\r
-\r
- if (verbose) {\r
- tvsub(&td, t1, t0);\r
- s = td.tv_sec + (td.tv_usec / 1000000.);\r
-#define nz(x) ((x) == 0 ? 1 : (x))\r
- bs = bytes / nz(s);\r
- printf("%ld bytes %s in %.2g seconds (%.2g Kbytes/s)\n",\r
- bytes, direction, s, bs / 1024.);\r
- (void) fflush(stdout);\r
- }\r
-}\r
-\r
-/*tvadd(tsum, t0)\r
- struct timeval *tsum, *t0;\r
-{\r
-\r
- tsum->tv_sec += t0->tv_sec;\r
- tsum->tv_usec += t0->tv_usec;\r
- if (tsum->tv_usec > 1000000)\r
- tsum->tv_sec++, tsum->tv_usec -= 1000000;\r
-} */\r
-\r
-void tvsub(tdiff, t1, t0)\r
- struct timeval *tdiff, *t1, *t0;\r
-{\r
-\r
- tdiff->tv_sec = t1->tv_sec - t0->tv_sec;\r
- tdiff->tv_usec = t1->tv_usec - t0->tv_usec;\r
- if (tdiff->tv_usec < 0)\r
- tdiff->tv_sec--, tdiff->tv_usec += 1000000;\r
-}\r
-\r
-void psabort(int flag)\r
-{\r
- extern int abrtflag;\r
-\r
- abrtflag++;\r
-}\r
-\r
-void pswitch(int flag)\r
-{\r
- extern int proxy, abrtflag;\r
- Sig_t oldintr;\r
- static struct comvars {\r
- int connect;\r
- char name[MAXHOSTNAMELEN];\r
- struct sockaddr_in mctl;\r
- struct sockaddr_in hctl;\r
- FILE *in;\r
- FILE *out;\r
- int tpe;\r
- int cpnd;\r
- int sunqe;\r
- int runqe;\r
- int mcse;\r
- int ntflg;\r
- char nti[17];\r
- char nto[17];\r
- int mapflg;\r
- char mi[MAXPATHLEN];\r
- char mo[MAXPATHLEN];\r
- } proxstruct, tmpstruct;\r
- struct comvars *ip, *op;\r
-\r
- abrtflag = 0;\r
- oldintr = signal(SIGINT, psabort);\r
- if (flag) {\r
- if (proxy)\r
- return;\r
- ip = &tmpstruct;\r
- op = &proxstruct;\r
- proxy++;\r
- }\r
- else {\r
- if (!proxy)\r
- return;\r
- ip = &proxstruct;\r
- op = &tmpstruct;\r
- proxy = 0;\r
- }\r
- ip->connect = connected;\r
- connected = op->connect;\r
- if (hostname) {\r
- (void) strncpy(ip->name, hostname, sizeof(ip->name) - 1);\r
- ip->name[strlen(ip->name)] = '\0';\r
- } else\r
- ip->name[0] = 0;\r
- hostname = op->name;\r
- ip->hctl = hisctladdr;\r
- hisctladdr = op->hctl;\r
- ip->mctl = myctladdr;\r
- myctladdr = op->mctl;\r
- (int) ip->in = cin; // What the hell am I looking at...?\r
- cin = (int) op->in;\r
- (int) ip->out = cout; // Same again...\r
- cout = (int) op->out;\r
- ip->tpe = type;\r
- type = op->tpe;\r
- if (!type)\r
- type = 1;\r
- ip->cpnd = cpend;\r
- cpend = op->cpnd;\r
- ip->sunqe = sunique;\r
- sunique = op->sunqe;\r
- ip->runqe = runique;\r
- runique = op->runqe;\r
- ip->mcse = mcase;\r
- mcase = op->mcse;\r
- ip->ntflg = ntflag;\r
- ntflag = op->ntflg;\r
- (void) strncpy(ip->nti, ntin, 16);\r
- (ip->nti)[strlen(ip->nti)] = '\0';\r
- (void) strcpy(ntin, op->nti);\r
- (void) strncpy(ip->nto, ntout, 16);\r
- (ip->nto)[strlen(ip->nto)] = '\0';\r
- (void) strcpy(ntout, op->nto);\r
- ip->mapflg = mapflag;\r
- mapflag = op->mapflg;\r
- (void) strncpy(ip->mi, mapin, MAXPATHLEN - 1);\r
- (ip->mi)[strlen(ip->mi)] = '\0';\r
- (void) strcpy(mapin, op->mi);\r
- (void) strncpy(ip->mo, mapout, MAXPATHLEN - 1);\r
- (ip->mo)[strlen(ip->mo)] = '\0';\r
- (void) strcpy(mapout, op->mo);\r
-// (void) signal(SIGINT, oldintr);\r
- if (abrtflag) {\r
- abrtflag = 0;\r
- (*oldintr)(1);\r
- }\r
-}\r
-\r
-jmp_buf ptabort;\r
-int ptabflg;\r
-\r
-void\r
-abortpt()\r
-{\r
- printf("\n");\r
- (void) fflush(stdout);\r
- ptabflg++;\r
- mflag = 0;\r
- abrtflag = 0;\r
- longjmp(ptabort, 1);\r
-}\r
-\r
-void proxtrans(cmd, local, remote)\r
- char *cmd, *local, *remote;\r
-{\r
-// void (*oldintr)(int);\r
- //void abortpt(int);\r
- int tmptype, oldtype = 0, secndflag = 0, nfnd;\r
- extern jmp_buf ptabort;\r
- char *cmd2;\r
-// struct\r
- fd_set mask;\r
-\r
- if (strcmp(cmd, "RETR"))\r
- cmd2 = "RETR";\r
- else\r
- cmd2 = runique ? "STOU" : "STOR";\r
- if (command("PASV") != COMPLETE) {\r
- printf("proxy server does not support third part transfers.\n");\r
- (void) fflush(stdout);\r
- return;\r
- }\r
- tmptype = type;\r
- pswitch(0);\r
- if (!connected) {\r
- printf("No primary connection\n");\r
- (void) fflush(stdout);\r
- pswitch(1);\r
- code = -1;\r
- return;\r
- }\r
- if (type != tmptype) {\r
- oldtype = type;\r
- switch (tmptype) {\r
- case TYPE_A:\r
- setascii();\r
- break;\r
- case TYPE_I:\r
- setbinary();\r
- break;\r
- case TYPE_E:\r
- setebcdic();\r
- break;\r
- case TYPE_L:\r
- settenex();\r
- break;\r
- }\r
- }\r
- if (command("PORT %s", pasv) != COMPLETE) {\r
- switch (oldtype) {\r
- case 0:\r
- break;\r
- case TYPE_A:\r
- setascii();\r
- break;\r
- case TYPE_I:\r
- setbinary();\r
- break;\r
- case TYPE_E:\r
- setebcdic();\r
- break;\r
- case TYPE_L:\r
- settenex();\r
- break;\r
- }\r
- pswitch(1);\r
- return;\r
- }\r
- if (setjmp(ptabort))\r
- goto abort;\r
-null();// oldintr = signal(SIGINT, abortpt);\r
- if (command("%s %s", cmd, remote) != PRELIM) {\r
-null();// (void) signal(SIGINT, oldintr);\r
- switch (oldtype) {\r
- case 0:\r
- break;\r
- case TYPE_A:\r
- setascii();\r
- break;\r
- case TYPE_I:\r
- setbinary();\r
- break;\r
- case TYPE_E:\r
- setebcdic();\r
- break;\r
- case TYPE_L:\r
- settenex();\r
- break;\r
- }\r
- pswitch(1);\r
- return;\r
- }\r
- sleep(2);\r
- pswitch(1);\r
- secndflag++;\r
- if (command("%s %s", cmd2, local) != PRELIM)\r
- goto abort;\r
- ptflag++;\r
- (void) getreply(0);\r
- pswitch(0);\r
- (void) getreply(0);\r
-null();// (void) signal(SIGINT, oldintr);\r
- switch (oldtype) {\r
- case 0:\r
- break;\r
- case TYPE_A:\r
- setascii();\r
- break;\r
- case TYPE_I:\r
- setbinary();\r
- break;\r
- case TYPE_E:\r
- setebcdic();\r
- break;\r
- case TYPE_L:\r
- settenex();\r
- break;\r
- }\r
- pswitch(1);\r
- ptflag = 0;\r
- printf("local: %s remote: %s\n", local, remote);\r
- (void) fflush(stdout);\r
- return;\r
-abort:\r
-null();// (void) signal(SIGINT, SIG_IGN);\r
- ptflag = 0;\r
- if (strcmp(cmd, "RETR") && !proxy)\r
- pswitch(1);\r
- else if (!strcmp(cmd, "RETR") && proxy)\r
- pswitch(0);\r
- if (!cpend && !secndflag) { /* only here if cmd = "STOR" (proxy=1) */\r
- if (command("%s %s", cmd2, local) != PRELIM) {\r
- pswitch(0);\r
- switch (oldtype) {\r
- case 0:\r
- break;\r
- case TYPE_A:\r
- setascii();\r
- break;\r
- case TYPE_I:\r
- setbinary();\r
- break;\r
- case TYPE_E:\r
- setebcdic();\r
- break;\r
- case TYPE_L:\r
- settenex();\r
- break;\r
- }\r
- if (cpend) {\r
- char msg[2];\r
-\r
- fprintfSocket(cout,"%c%c",IAC,IP);\r
- *msg = (char) IAC;\r
- *(msg+1) = (char) DM;\r
- if (send(cout,msg,2,MSG_OOB) != 2)\r
- perror("abort");\r
- fprintfSocket(cout,"ABOR\r\n");\r
- FD_ZERO(&mask);\r
-// FD_SET(fileno(cin), &mask); // Chris: Need to correct this\r
- if ((nfnd = empty(&mask,10)) <= 0) {\r
- if (nfnd < 0) {\r
- perror("abort");\r
- }\r
- if (ptabflg)\r
- code = -1;\r
- lostpeer();\r
- }\r
- (void) getreply(0);\r
- (void) getreply(0);\r
- }\r
- }\r
- pswitch(1);\r
- if (ptabflg)\r
- code = -1;\r
-null();// (void) signal(SIGINT, oldintr);\r
- return;\r
- }\r
- if (cpend) {\r
- char msg[2];\r
-\r
- fprintfSocket(cout,"%c%c",IAC,IP);\r
- *msg = (char)IAC;\r
- *(msg+1) = (char)DM;\r
- if (send(cout,msg,2,MSG_OOB) != 2)\r
- perror("abort");\r
- fprintfSocket(cout,"ABOR\r\n");\r
- FD_ZERO(&mask);\r
-// FD_SET(fileno(cin), &mask); // Chris: Need to correct this...\r
- if ((nfnd = empty(&mask,10)) <= 0) {\r
- if (nfnd < 0) {\r
- perror("abort");\r
- }\r
- if (ptabflg)\r
- code = -1;\r
- lostpeer();\r
- }\r
- (void) getreply(0);\r
- (void) getreply(0);\r
- }\r
- pswitch(!proxy);\r
- if (!cpend && !secndflag) { /* only if cmd = "RETR" (proxy=1) */\r
- if (command("%s %s", cmd2, local) != PRELIM) {\r
- pswitch(0);\r
- switch (oldtype) {\r
- case 0:\r
- break;\r
- case TYPE_A:\r
- setascii();\r
- break;\r
- case TYPE_I:\r
- setbinary();\r
- break;\r
- case TYPE_E:\r
- setebcdic();\r
- break;\r
- case TYPE_L:\r
- settenex();\r
- break;\r
- }\r
- if (cpend) {\r
- char msg[2];\r
-\r
- fprintfSocket(cout,"%c%c",IAC,IP);\r
- *msg = (char)IAC;\r
- *(msg+1) = (char)DM;\r
- if (send(cout,msg,2,MSG_OOB) != 2)\r
- perror("abort");\r
- fprintfSocket(cout,"ABOR\r\n");\r
- FD_ZERO(&mask);\r
-// FD_SET(fileno(cin), &mask); // Chris:\r
- if ((nfnd = empty(&mask,10)) <= 0) {\r
- if (nfnd < 0) {\r
- perror("abort");\r
- }\r
- if (ptabflg)\r
- code = -1;\r
- lostpeer();\r
- }\r
- (void) getreply(0);\r
- (void) getreply(0);\r
- }\r
- pswitch(1);\r
- if (ptabflg)\r
- code = -1;\r
-null();// (void) signal(SIGINT, oldintr);\r
- return;\r
- }\r
- }\r
- if (cpend) {\r
- char msg[2];\r
-\r
- fprintfSocket(cout,"%c%c",IAC,IP);\r
- *msg = (char)IAC;\r
- *(msg+1) = (char)DM;\r
- if (send(cout,msg,2,MSG_OOB) != 2)\r
- perror("abort");\r
- fprintfSocket(cout,"ABOR\r\n");\r
- FD_ZERO(&mask);\r
-// FD_SET(fileno(cin), &mask); // Chris:\r
- if ((nfnd = empty(&mask,10)) <= 0) {\r
- if (nfnd < 0) {\r
- perror("abort");\r
- }\r
- if (ptabflg)\r
- code = -1;\r
- lostpeer();\r
- }\r
- (void) getreply(0);\r
- (void) getreply(0);\r
- }\r
- pswitch(!proxy);\r
- if (cpend) {\r
- FD_ZERO(&mask);\r
-// FD_SET(fileno(cin), &mask); // Chris:\r
- if ((nfnd = empty(&mask,10)) <= 0) {\r
- if (nfnd < 0) {\r
- perror("abort");\r
- }\r
- if (ptabflg)\r
- code = -1;\r
- lostpeer();\r
- }\r
- (void) getreply(0);\r
- (void) getreply(0);\r
- }\r
- if (proxy)\r
- pswitch(0);\r
- switch (oldtype) {\r
- case 0:\r
- break;\r
- case TYPE_A:\r
- setascii();\r
- break;\r
- case TYPE_I:\r
- setbinary();\r
- break;\r
- case TYPE_E:\r
- setebcdic();\r
- break;\r
- case TYPE_L:\r
- settenex();\r
- break;\r
- }\r
- pswitch(1);\r
- if (ptabflg)\r
- code = -1;\r
-null();// (void) signal(SIGINT, oldintr);\r
-}\r
-\r
-void reset()\r
-{\r
-// struct\r
- fd_set mask;\r
- int nfnd = 1;\r
-\r
- FD_ZERO(&mask);\r
- while (nfnd > 0) {\r
-// FD_SET(fileno(cin), &mask); // Chris\r
- if ((nfnd = empty(&mask,0)) < 0) {\r
- perror("reset");\r
- code = -1;\r
- lostpeer();\r
- }\r
- else if (nfnd) {\r
- (void) getreply(0);\r
- }\r
- }\r
-}\r
-\r
-char *\r
-gunique(local)\r
- char *local;\r
-{\r
- static char new[MAXPATHLEN];\r
- char *cp = rindex(local, '/');\r
- int d, count=0;\r
- char ext = '1';\r
-\r
- if (cp)\r
- *cp = '\0';\r
- d = access(cp ? local : ".", 2);\r
- if (cp)\r
- *cp = '/';\r
- if (d < 0) {\r
- perror(local);\r
- return((char *) 0);\r
- }\r
- (void) strcpy(new, local);\r
- cp = new + strlen(new);\r
- *cp++ = '.';\r
- while (!d) {\r
- if (++count == 100) {\r
- printf("runique: can't find unique file name.\n");\r
- (void) fflush(stdout);\r
- return((char *) 0);\r
- }\r
- *cp++ = ext;\r
- *cp = '\0';\r
- if (ext == '9')\r
- ext = '0';\r
- else\r
- ext++;\r
- if ((d = access(new, 0)) < 0)\r
- break;\r
- if (ext != '0')\r
- cp--;\r
- else if (*(cp - 2) == '.')\r
- *(cp - 1) = '1';\r
- else {\r
- *(cp - 2) = *(cp - 2) + 1;\r
- cp--;\r
- }\r
- }\r
- return(new);\r
-}\r
-\r
-int null(void)\r
-{\r
- return 0;\r
-}\r
+#define L_SET SEEK_SET
+#define L_INCR SEEK_CUR
+#define caddr_t void *
+/*
+ * Copyright (c) 1985, 1989 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)ftp.c 5.28 (Berkeley) 4/20/89";
+#endif /* not lint */
+#include <io.h>
+
+#include <sys/stat.h>
+
+#if !defined(WIN32)
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#include <netinet/in.h>
+#include <arpa/ftp.h>
+#include <arpa/telnet.h>
+#include <pwd.h>
+#include <varargs.h>
+#include <netdb.h>
+#else
+#include <winsock.h>
+#endif
+
+#include <stdio.h>
+#include <signal.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include "ftp_var.h"
+#include "prototypes.h"
+#ifndef MAXHOSTNAMELEN
+#define MAXHOSTNAMELEN 64
+#endif
+
+#ifdef NOVFPRINTF
+#define vfprintf(a,b,c) _doprnt(b,c,a)
+#endif
+
+#ifdef sun
+/* FD_SET wasn't defined until 4.0. its a cheap test for uid_t presence */
+#ifndef FD_SET
+#define NBBY 8 /* number of bits in a byte */
+/*
+ * Select uses bit masks of file descriptors in longs.
+ * These macros manipulate such bit fields (the filesystem macros use chars).
+ * FD_SETSIZE may be defined by the user, but the default here
+ * should be >= NOFILE (param.h).
+ */
+#ifndef FD_SETSIZE
+#define FD_SETSIZE 256
+#endif
+
+typedef long fd_mask;
+#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */
+#ifndef howmany
+#define howmany(x, y) (((x)+((y)-1))/(y))
+#endif
+
+#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
+#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
+#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
+#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))
+
+typedef int uid_t;
+typedef int gid_t;
+#endif
+#endif
+
+struct sockaddr_in hisctladdr;
+struct sockaddr_in data_addr;
+int data = -1;
+int abrtflag = 0;
+int ptflag = 0;
+int allbinary;
+struct sockaddr_in myctladdr;
+uid_t getuid();
+sig_t lostpeer();
+off_t restart_point = 0;
+
+int cin, cout;
+int dataconn(char *mode);
+
+int command(char *fmt, ...);
+
+char *hostname;
+
+typedef void (*Sig_t)(int);
+
+// Signal Handlers
+
+void psabort(int sig);
+
+char *hookup(char *host, int port)
+{
+ register struct hostent *hp = 0;
+ int s,len;
+ static char hostnamebuf[80];
+
+ bzero((char *)&hisctladdr, sizeof (hisctladdr));
+ hisctladdr.sin_addr.s_addr = inet_addr(host);
+ if (hisctladdr.sin_addr.s_addr != -1) {
+ hisctladdr.sin_family = AF_INET;
+ (void) strncpy(hostnamebuf, host, sizeof(hostnamebuf));
+ } else {
+ hp = gethostbyname(host);
+ if (hp == NULL) {
+ fprintf(stderr, "ftp: %s: ", host);
+ herror((char *)NULL);
+ code = -1;
+ return((char *) 0);
+ }
+ hisctladdr.sin_family = hp->h_addrtype;
+ bcopy(hp->h_addr_list[0],
+ (caddr_t)&hisctladdr.sin_addr, hp->h_length);
+ (void) strncpy(hostnamebuf, hp->h_name, sizeof(hostnamebuf));
+ }
+ hostname = hostnamebuf;
+ s = socket(hisctladdr.sin_family, SOCK_STREAM, 0);
+ if (s < 0) {
+ perror("ftp: socket");
+ code = -1;
+ return (0);
+ }
+ hisctladdr.sin_port = port;
+ while (connect(s, (struct sockaddr *)&hisctladdr, sizeof (hisctladdr)) < 0) {
+ if (hp && hp->h_addr_list[1]) {
+ int oerrno = errno;
+
+ fprintf(stderr, "ftp: connect to address %s: ",
+ inet_ntoa(hisctladdr.sin_addr));
+ errno = oerrno;
+ perror((char *) 0);
+ hp->h_addr_list++;
+ bcopy(hp->h_addr_list[0],
+ (caddr_t)&hisctladdr.sin_addr, hp->h_length);
+ fprintf(stdout, "Trying %s...\n",
+ inet_ntoa(hisctladdr.sin_addr));
+ (void) fflush(stdout);
+ (void) close(s);
+ s = socket(hisctladdr.sin_family, SOCK_STREAM, 0);
+ if (s < 0) {
+ perror("ftp: socket");
+ code = -1;
+ return (0);
+ }
+ continue;
+ }
+ perror("ftp: connect");
+ code = -1;
+ goto bad;
+ }
+ len = sizeof (myctladdr);
+ if (getsockname(s, (struct sockaddr *)&myctladdr, &len) < 0) {
+ perror("ftp: getsockname");
+ code = -1;
+ goto bad;
+ }
+ cin = cout = s;
+ if (verbose) {
+ printf("Connected to %s.\n", hostname);
+ (void) fflush(stdout);
+ }
+ if (getreply(0) > 2) { /* read startup message from server */
+ closesocket(cin);
+ code = -1;
+ goto bad;
+ }
+#ifdef SO_OOBINLINE
+ {
+ int on = 1;
+
+ if (setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (const char *) &on, sizeof(on))
+ < 0 && debug) {
+ perror("ftp: setsockopt");
+ }
+ }
+#endif //SO_OOBINLINE
+
+ return (hostname);
+bad:
+ (void) close(s);
+ return ((char *)0);
+}
+
+int login(char *host)
+{
+ char tmp[80];
+ char *user, *pass, *acct;
+ int n, aflag = 0;
+
+ user = pass = acct = 0;
+ if (ruserpass(host, &user, &pass, &acct) < 0) {
+ code = -1;
+ return(0);
+ }
+ while (user == NULL) {
+ char *myname = "none"; // This needs to become the usename env
+
+ if (myname)
+ printf("Name (%s:%s): ", host, myname);
+ else
+ printf("Name (%s): ", host);
+ (void) fflush(stdout);
+ (void) fgets(tmp, sizeof(tmp) - 1, stdin);
+ tmp[strlen(tmp) - 1] = '\0';
+ if (*tmp == '\0')
+ user = myname;
+ else
+ user = tmp;
+ }
+ n = command("USER %s", user);
+ if (n == CONTINUE) {
+ if (pass == NULL)
+ pass = getpass("Password:");
+ n = command("PASS %s", pass);
+ fflush(stdin);
+ }
+ if (n == CONTINUE) {
+ aflag++;
+ acct = getpass("Account:");
+ n = command("ACCT %s", acct);
+ }
+ if (n != COMPLETE) {
+ fprintf(stderr, "Login failed.\n");
+ return (0);
+ }
+ if (!aflag && acct != NULL)
+ (void) command("ACCT %s", acct);
+ if (proxy)
+ return(1);
+ for (n = 0; n < macnum; ++n) {
+ if (!strcmp("init", macros[n].mac_name)) {
+ (void) strcpy(line, "$init");
+ makeargv();
+ domacro(margc, margv);
+ break;
+ }
+ }
+ return (1);
+}
+
+void
+cmdabort(int sig)
+{
+ extern jmp_buf ptabort;
+
+ printf("\n");
+ (void) fflush(stdout);
+ abrtflag++;
+ if (ptflag)
+ longjmp(ptabort,1);
+}
+
+/*VARARGS1*/
+int command(char *fmt, ...)
+{
+ va_list ap;
+ int r;
+ void (*oldintr)(int), cmdabort(int);
+
+ abrtflag = 0;
+ if (debug) {
+ printf("---> ");
+ va_start(ap, fmt);
+ vfprintf(stdout, fmt, ap);
+ va_end(ap);
+ printf("\n");
+ (void) fflush(stdout);
+ }
+ if (cout == (int) NULL) {
+ perror ("No control connection for command");
+ code = -1;
+ return (0);
+ }
+ oldintr = signal(SIGINT,cmdabort);
+ {
+ char buffer[1024];
+
+ va_start(ap, fmt);
+ vsprintf(buffer, fmt, ap);
+ va_end(ap);
+//DLJ: to work through firewalls - send the command as a single message
+ strcat(buffer,"\r\n");
+ fprintfSocket(cout, buffer);
+ }
+//DLJ: the following two lines are replaced by the strcat above - seems to
+// make it work through firewalls.
+// fprintfSocket(cout, "\r\n");
+// (void) fflush(cout);
+ cpend = 1;
+ r = getreply(!strcmp(fmt, "QUIT"));
+ if (abrtflag && oldintr != SIG_IGN)
+ (*oldintr)(SIGINT);
+// (void) signal(SIGINT, oldintr);
+ return(r);
+}
+
+char reply_string[BUFSIZ]; /* last line of previous reply */
+
+#include <ctype.h>
+
+getreply(expecteof)
+ int expecteof;
+{
+ register int c, n;
+ register int dig;
+ register char *cp;
+ int originalcode = 0, continuation = 0;
+ void (*oldintr)(int), cmdabort(int);
+ int pflag = 0;
+ char *pt = pasv;
+
+ oldintr = signal(SIGINT,cmdabort);
+ for (;;) {
+ dig = n = code = 0;
+ cp = reply_string;
+ while ((c = fgetcSocket(cin)) != '\n') {
+ if (c == IAC) { /* handle telnet commands */
+ switch (c = fgetcSocket(cin)) {
+ case WILL:
+ case WONT:
+ c = fgetcSocket(cin);
+ fprintfSocket(cout, "%c%c%c",IAC,DONT,c);
+ break;
+ case DO:
+ case DONT:
+ c = fgetcSocket(cin);
+ fprintfSocket(cout, "%c%c%c",IAC,WONT,c);
+ break;
+ default:
+ break;
+ }
+ continue;
+ }
+ dig++;
+ if (c == EOF) {
+ if (expecteof) {
+// (void) signal(SIGINT,oldintr);
+ code = 221;
+ return (0);
+ }
+ lostpeer();
+ if (verbose) {
+ printf("421 Service not available, remote server has closed connection\n");
+ (void) fflush(stdout);
+ }
+ code = 421;
+ return(4);
+ }
+ if (c != '\r' && (verbose > 0 ||
+ (verbose > -1 && n == '5' && dig > 4))) {
+ if (proxflag &&
+ (dig == 1 || dig == 5 && verbose == 0))
+ printf("%s:",hostname);
+ (void) putchar(c);
+ (void) fflush(stdout);
+ }
+ if (dig < 4 && isdigit(c))
+ code = code * 10 + (c - '0');
+ if (!pflag && code == 227)
+ pflag = 1;
+ if (dig > 4 && pflag == 1 && isdigit(c))
+ pflag = 2;
+ if (pflag == 2) {
+ if (c != '\r' && c != ')')
+ *pt++ = c;
+ else {
+ *pt = '\0';
+ pflag = 3;
+ }
+ }
+ if (dig == 4 && c == '-') {
+ if (continuation)
+ code = 0;
+ continuation++;
+ }
+ if (n == 0)
+ n = c;
+ if (cp < &reply_string[sizeof(reply_string) - 1])
+ *cp++ = c;
+ }
+ if (verbose > 0 || verbose > -1 && n == '5') {
+ (void) putchar(c);
+ (void) fflush (stdout);
+ }
+ if (continuation && code != originalcode) {
+ if (originalcode == 0)
+ originalcode = code;
+ continue;
+ }
+ *cp = '\0';
+ if (n != '1')
+ cpend = 0;
+ (void) signal(SIGINT,oldintr);
+ if (code == 421 || originalcode == 421)
+ lostpeer();
+ if (abrtflag && oldintr != cmdabort && oldintr != SIG_IGN)
+ (*oldintr)(SIGINT);
+ return (n - '0');
+ }
+}
+
+empty(mask, sec)
+ struct fd_set *mask;
+ int sec;
+{
+ struct timeval t;
+
+ t.tv_sec = (long) sec;
+ t.tv_usec = 0;
+ return(select(32, mask, (struct fd_set *) 0, (struct fd_set *) 0, &t));
+}
+
+jmp_buf sendabort;
+
+void abortsend()
+{
+
+ mflag = 0;
+ abrtflag = 0;
+ printf("\nsend aborted\n");
+ (void) fflush(stdout);
+ longjmp(sendabort, 1);
+}
+
+#define HASHBYTES 1024
+
+void sendrequest(char *cmd, char *local, char *remote, int printnames)
+{
+ FILE *fin;
+ int dout = 0;
+ int (*closefunc)(), _pclose(), fclose();
+ sig_t (*oldintr)(), (*oldintp)();
+ void abortsend();
+ char buf[BUFSIZ], *bufp;
+ long bytes = 0, hashbytes = HASHBYTES;
+ register int c, d;
+ struct stat st;
+ struct timeval start, stop;
+ char *mode;
+
+ if (verbose && printnames) {
+ if (local && *local != '-')
+ printf("local: %s ", local);
+ if (remote)
+ printf("remote: %s\n", remote);
+ (void) fflush(stdout);
+ }
+ if (proxy) {
+ proxtrans(cmd, local, remote);
+ return;
+ }
+ closefunc = NULL;
+ oldintr = NULL;
+ oldintp = NULL;
+ mode = "w";
+ if (setjmp(sendabort)) {
+ while (cpend) {
+ (void) getreply(0);
+ }
+ if (data >= 0) {
+ (void) close(data);
+ data = -1;
+ }
+ if (oldintr)
+null();// (void) signal(SIGINT,oldintr);
+ if (oldintp)
+null();// (void) signal(SIGPIPE,oldintp);
+ code = -1;
+ return;
+ }
+null();// oldintr = signal(SIGINT, abortsend);
+ if (strcmp(local, "-") == 0)
+ fin = stdin;
+ else if (*local == '|') {
+null();// oldintp = signal(SIGPIPE,SIG_IGN);
+ fin = _popen(local + 1, "r");
+ if (fin == NULL) {
+ perror(local + 1);
+null();// (void) signal(SIGINT, oldintr);
+null();// (void) signal(SIGPIPE, oldintp);
+ code = -1;
+ return;
+ }
+ closefunc = _pclose;
+ } else {
+ fin = fopen(local, "r");
+ if (fin == NULL) {
+ perror(local);
+null();// (void) signal(SIGINT, oldintr);
+ code = -1;
+ return;
+ }
+ closefunc = fclose;
+ if (fstat(fileno(fin), &st) < 0 ||
+ (st.st_mode&S_IFMT) != S_IFREG) {
+ fprintf(stdout, "%s: not a plain file.\n", local);
+ (void) fflush(stdout);
+null();// (void) signal(SIGINT, oldintr);
+ fclose(fin);
+ code = -1;
+ return;
+ }
+ }
+ if (initconn()) {
+null();// (void) signal(SIGINT, oldintr);
+ if (oldintp)
+null();// (void) signal(SIGPIPE, oldintp);
+ code = -1;
+ if (closefunc != NULL)
+ (*closefunc)(fin);
+ return;
+ }
+ if (setjmp(sendabort))
+ goto abort;
+
+ if (restart_point &&
+ (strcmp(cmd, "STOR") == 0 || strcmp(cmd, "APPE") == 0)) {
+ if (fseek(fin, (long) restart_point, 0) < 0) {
+ perror(local);
+ restart_point = 0;
+ if (closefunc != NULL)
+ (*closefunc)(fin);
+ return;
+ }
+ if (command("REST %ld", (long) restart_point)
+ != CONTINUE) {
+ restart_point = 0;
+ if (closefunc != NULL)
+ (*closefunc)(fin);
+ return;
+ }
+ restart_point = 0;
+ mode = "r+w";
+ }
+ if (remote) {
+ if (command("%s %s", cmd, remote) != PRELIM) {
+null();// (void) signal(SIGINT, oldintr);
+ if (oldintp)
+null();// (void) signal(SIGPIPE, oldintp);
+ if (closefunc != NULL)
+ (*closefunc)(fin);
+ return;
+ }
+ } else
+ if (command("%s", cmd) != PRELIM) {
+null();// (void) signal(SIGINT, oldintr);
+ if (oldintp)
+null();// (void) signal(SIGPIPE, oldintp);
+ if (closefunc != NULL)
+ (*closefunc)(fin);
+ return;
+ }
+ dout = dataconn(mode);
+ if (dout == (int)NULL)
+ goto abort;
+ (void) gettimeofday(&start, (struct timezone *)0);
+null();// oldintp = signal(SIGPIPE, SIG_IGN);
+ switch (type) {
+
+ case TYPE_I:
+ case TYPE_L:
+ errno = d = 0;
+ while ((c = read(fileno(fin), buf, sizeof (buf))) > 0) {
+ bytes += c;
+ for (bufp = buf; c > 0; c -= d, bufp += d)
+ if ((d = send(dout, bufp, c, 0)) <= 0)
+ break;
+ if (hash) {
+ while (bytes >= hashbytes) {
+ (void) putchar('#');
+ hashbytes += HASHBYTES;
+ }
+ (void) fflush(stdout);
+ }
+ }
+ if (hash && bytes > 0) {
+ if (bytes < HASHBYTES)
+ (void) putchar('#');
+ (void) putchar('\n');
+ (void) fflush(stdout);
+ }
+ if (c < 0)
+ perror(local);
+ if (d <= 0) {
+ if (d == 0)
+ fprintf(stderr, "netout: write returned 0?\n");
+ else if (errno != EPIPE)
+ perror("netout");
+ bytes = -1;
+ }
+ break;
+
+ case TYPE_A:
+ {
+ char buf[1024];
+ static int bufsize = 1024;
+ int ipos=0;
+
+ while ((c = getc(fin)) != EOF) {
+ if (c == '\n') {
+ while (hash && (bytes >= hashbytes)) {
+ (void) putchar('#');
+ (void) fflush(stdout);
+ hashbytes += HASHBYTES;
+ }
+// Szurgot: The following code is unncessary on Win32.
+// (void) fputcSocket(dout, '\r');
+// bytes++;
+ }
+
+ if (ipos >= bufsize) {
+ fputSocket(dout,buf,ipos);
+ if(!hash) (void) putchar('.');
+ ipos=0;
+ }
+ buf[ipos]=c; ++ipos;
+ bytes++;
+ }
+ if (ipos) {
+ fputSocket(dout,buf,ipos);
+ ipos=0;
+ }
+ if (hash) {
+ if (bytes < hashbytes)
+ (void) putchar('#');
+ (void) putchar('\n');
+ (void) fflush(stdout);
+ }
+ else {
+ (void) putchar('.');
+ (void) putchar('\n');
+ (void) fflush(stdout);
+ }
+ if (ferror(fin))
+ perror(local);
+// if (ferror(dout)) {
+// if (errno != EPIPE)
+// perror("netout");
+// bytes = -1;
+// }
+ break;
+ }
+ }
+ (void) gettimeofday(&stop, (struct timezone *)0);
+ if (closefunc != NULL)
+ (*closefunc)(fin);
+ if(closesocket(dout)) {
+ int iret=WSAGetLastError ();
+ fprintf(stdout,"Error closing socket(%d)\n",iret);
+ (void) fflush(stdout);
+ }
+ (void) getreply(0);
+null();// (void) signal(SIGINT, oldintr);
+ if (oldintp)
+null();// (void) signal(SIGPIPE, oldintp);
+ if (bytes > 0)
+ ptransfer("sent", bytes, &start, &stop);
+ return;
+abort:
+ (void) gettimeofday(&stop, (struct timezone *)0);
+null();// (void) signal(SIGINT, oldintr);
+ if (oldintp)
+null();// (void) signal(SIGPIPE, oldintp);
+ if (!cpend) {
+ code = -1;
+ return;
+ }
+ if (data >= 0) {
+ (void) close(data);
+ data = -1;
+ }
+ if (dout)
+ if(closesocket(dout)) {
+ int iret=WSAGetLastError ();
+ fprintf(stdout,"Error closing socket(%d)\n",iret);
+ (void) fflush(stdout);
+ }
+
+ (void) getreply(0);
+ code = -1;
+ if (closefunc != NULL && fin != NULL)
+ (*closefunc)(fin);
+ if (bytes > 0)
+ ptransfer("sent", bytes, &start, &stop);
+}
+
+jmp_buf recvabort;
+
+
+void abortrecv()
+{
+
+ mflag = 0;
+ abrtflag = 0;
+ printf("\n");
+ (void) fflush(stdout);
+ longjmp(recvabort, 1);
+}
+
+void recvrequest(char *cmd, char *local, char *remote, char *mode,
+ int printnames)
+{
+ FILE *fout;
+ int din = 0;
+ int (*closefunc)(), _pclose(), fclose();
+ void (*oldintr)(int), (*oldintp)(int);
+ void abortrecv();
+ int oldverbose, oldtype = 0, is_retr, tcrflag, nfnd, bare_lfs = 0;
+ char *gunique(), msg;
+// static char *buf; // Szurgot: Shouldn't this go SOMEWHERE?
+ char buf[1024];
+ static int bufsize = 1024;
+ long bytes = 0, hashbytes = HASHBYTES;
+// struct
+ fd_set mask;
+ register int c, d;
+ struct timeval start, stop;
+// struct stat st;
+ extern void *malloc();
+
+ is_retr = strcmp(cmd, "RETR") == 0;
+ if (is_retr && verbose && printnames) {
+ if (local && *local != '-')
+ printf("local: %s ", local);
+ if (remote)
+ printf("remote: %s\n", remote);
+ (void) fflush(stdout);
+ }
+ if (proxy && is_retr) {
+ proxtrans(cmd, local, remote);
+ return;
+ }
+ closefunc = NULL;
+ oldintr = NULL;
+ oldintp = NULL;
+ tcrflag = !crflag && is_retr;
+ if (setjmp(recvabort)) {
+ while (cpend) {
+ (void) getreply(0);
+ }
+ if (data >= 0) {
+ (void) close(data);
+ data = -1;
+ }
+ if (oldintr)
+null();// (void) signal(SIGINT, oldintr);
+ code = -1;
+ return;
+ }
+null();// oldintr = signal(SIGINT, abortrecv);
+ if (strcmp(local, "-") && *local != '|') {
+#ifndef __WIN32__
+// This whole thing is a problem... access Won't work on non-existent files
+ if (access(local, 2) < 0) {
+ char *dir = rindex(local, '/');
+
+ if (errno != ENOENT && errno != EACCES) {
+ perror(local);
+ (void) signal(SIGINT, oldintr);
+ code = -1;
+ return;
+ }
+ if (dir != NULL)
+ *dir = 0;
+ d = access(dir ? local : ".", 2);
+ if (dir != NULL)
+ *dir = '/';
+ if (d < 0) {
+ perror(local);
+ (void) signal(SIGINT, oldintr);
+ code = -1;
+ return;
+ }
+ if (!runique && errno == EACCES &&
+ chmod(local, 0600) < 0) {
+ perror(local);
+ (void) signal(SIGINT, oldintr);
+ code = -1;
+ return;
+ }
+ if (runique && errno == EACCES &&
+ (local = gunique(local)) == NULL) {
+ (void) signal(SIGINT, oldintr);
+ code = -1;
+ return;
+ }
+ }
+ else if (runique && (local = gunique(local)) == NULL) {
+ (void) signal(SIGINT, oldintr);
+ code = -1;
+ return;
+ }
+#endif
+ }
+ if (initconn()) {
+null();// (void) signal(SIGINT, oldintr);
+ code = -1;
+ return;
+ }
+ if (setjmp(recvabort))
+ goto abort;
+ if (!is_retr) {
+ if (type != TYPE_A && (allbinary == 0 || type != TYPE_I)) {
+ oldtype = type;
+ oldverbose = verbose;
+ if (!debug)
+ verbose = 0;
+ setascii();
+ verbose = oldverbose;
+ }
+ } else if (restart_point) {
+ if (command("REST %ld", (long) restart_point) != CONTINUE)
+ return;
+ }
+ if (remote) {
+ if (command("%s %s", cmd, remote) != PRELIM) {
+null();// (void) signal(SIGINT, oldintr);
+ if (oldtype) {
+ if (!debug)
+ verbose = 0;
+ switch (oldtype) {
+ case TYPE_I:
+ setbinary();
+ break;
+ case TYPE_E:
+ setebcdic();
+ break;
+ case TYPE_L:
+ settenex();
+ break;
+ }
+ verbose = oldverbose;
+ }
+ return;
+ }
+ } else {
+ if (command("%s", cmd) != PRELIM) {
+null();// (void) signal(SIGINT, oldintr);
+ if (oldtype) {
+ if (!debug)
+ verbose = 0;
+ switch (oldtype) {
+ case TYPE_I:
+ setbinary();
+ break;
+ case TYPE_E:
+ setebcdic();
+ break;
+ case TYPE_L:
+ settenex();
+ break;
+ }
+ verbose = oldverbose;
+ }
+ return;
+ }
+ }
+ din = dataconn("r");
+ if (din == (int)NULL)
+ goto abort;
+ if (strcmp(local, "-") == 0)
+ fout = stdout;
+ else if (*local == '|') {
+null();// oldintp = signal(SIGPIPE, SIG_IGN);
+ fout = _popen(local + 1, "w");
+ if (fout == NULL) {
+ perror(local+1);
+ goto abort;
+ }
+ closefunc = _pclose;
+ } else {
+ fout = fopen(local, mode);
+ if (fout == NULL) {
+ perror(local);
+ goto abort;
+ }
+ closefunc = fclose;
+ }
+ (void) gettimeofday(&start, (struct timezone *)0);
+ switch (type) {
+
+ case TYPE_I:
+ case TYPE_L:
+ if (restart_point &&
+ lseek(fileno(fout), (long) restart_point, L_SET) < 0) {
+ perror(local);
+ if (closefunc != NULL)
+ (*closefunc)(fout);
+ return;
+ }
+ errno = d = 0;
+// while ((c = recv(din, buf, bufsize, 1)) > 0) {
+// if ((d = write(fileno(fout), buf, c)) != c)
+// if ((d = write(fileno(fout), buf, c)) != c)
+// break;
+ while ((c = recv(din, buf, bufsize, 0)) > 0) {
+ write(fileno(fout), buf, c);
+ bytes += c;
+ if (hash) {
+ while (bytes >= hashbytes) {
+ (void) putchar('#');
+ hashbytes += HASHBYTES;
+ }
+ (void) fflush(stdout);
+ }
+ }
+ if (hash && bytes > 0) {
+ if (bytes < HASHBYTES)
+ (void) putchar('#');
+ (void) putchar('\n');
+ (void) fflush(stdout);
+ }
+// if (c < 0) {
+// if (errno != EPIPE)
+// perror("netin");
+// bytes = -1;
+// }
+// if (d < c) {
+// if (d < 0)
+// perror(local);
+// else
+// fprintf(stderr, "%s: short write\n", local);
+// }
+ break;
+
+ case TYPE_A:
+ if (restart_point) {
+ register int i, n, c;
+
+ if (fseek(fout, 0L, L_SET) < 0)
+ goto done;
+ n = restart_point;
+ i = 0;
+ while (i++ < n) {
+ if ((c=getc(fout)) == EOF)
+ goto done;
+ if (c == '\n')
+ i++;
+ }
+ if (fseek(fout, 0L, L_INCR) < 0) {
+done:
+ perror(local);
+ if (closefunc != NULL)
+ (*closefunc)(fout);
+ return;
+ }
+ }
+ while ((c = fgetcSocket(din)) != EOF) {
+ if (c == '\n')
+ bare_lfs++;
+ while (c == '\r') {
+ while (hash && (bytes >= hashbytes)) {
+ (void) putchar('#');
+ (void) fflush(stdout);
+ hashbytes += HASHBYTES;
+ }
+ bytes++;
+ if ((c = fgetcSocket(din)) != '\n' || tcrflag) {
+ if (ferror(fout))
+ goto break2;
+ (void) putc('\r', fout);
+ if (c == '\0') {
+ bytes++;
+ goto contin2;
+ }
+ if (c == EOF)
+ goto contin2;
+ }
+ }
+ (void) putc(c, fout);
+ bytes++;
+ contin2: ;
+ }
+break2:
+ if (bare_lfs) {
+ printf("WARNING! %d bare linefeeds received in ASCII mode\n");
+ printf("File may not have transferred correctly.\n");
+ (void) fflush(stdout);
+ }
+ if (hash) {
+ if (bytes < hashbytes)
+ (void) putchar('#');
+ (void) putchar('\n');
+ (void) fflush(stdout);
+ }
+// if (ferror(din)) {
+// if (errno != EPIPE)
+// perror("netin");
+// bytes = -1;
+// }
+ if (ferror(fout))
+ perror(local);
+ break;
+ }
+ if (closefunc != NULL)
+ (*closefunc)(fout);
+null();// (void) signal(SIGINT, oldintr);
+ if (oldintp)
+null();// (void) signal(SIGPIPE, oldintp);
+ (void) gettimeofday(&stop, (struct timezone *)0);
+ if(closesocket(din)) {
+ int iret=WSAGetLastError ();
+ fprintf(stdout,"Error closing socket(%d)\n",iret);
+ (void) fflush(stdout);
+ }
+
+ (void) getreply(0);
+ if (bytes > 0 && is_retr)
+ ptransfer("received", bytes, &start, &stop);
+ if (oldtype) {
+ if (!debug)
+ verbose = 0;
+ switch (oldtype) {
+ case TYPE_I:
+ setbinary();
+ break;
+ case TYPE_E:
+ setebcdic();
+ break;
+ case TYPE_L:
+ settenex();
+ break;
+ }
+ verbose = oldverbose;
+ }
+ return;
+abort:
+
+/* abort using RFC959 recommended IP,SYNC sequence */
+
+ (void) gettimeofday(&stop, (struct timezone *)0);
+ if (oldintp)
+null();// (void) signal(SIGPIPE, oldintr);
+null();// (void) signal(SIGINT,SIG_IGN);
+ if (oldtype) {
+ if (!debug)
+ verbose = 0;
+ switch (oldtype) {
+ case TYPE_I:
+ setbinary();
+ break;
+ case TYPE_E:
+ setebcdic();
+ break;
+ case TYPE_L:
+ settenex();
+ break;
+ }
+ verbose = oldverbose;
+ }
+ if (!cpend) {
+ code = -1;
+null();// (void) signal(SIGINT,oldintr);
+ return;
+ }
+
+ fprintfSocket(cout,"%c%c",IAC,IP);
+ msg = (char)IAC;
+/* send IAC in urgent mode instead of DM because UNIX places oob mark */
+/* after urgent byte rather than before as now is protocol */
+ if (send(cout,&msg,1,MSG_OOB) != 1) {
+ perror("abort");
+ }
+ fprintfSocket(cout,"%cABOR\r\n",DM);
+ FD_ZERO(&mask);
+ FD_SET(cin, &mask); // Need to correct this
+ if (din) {
+ FD_SET(din, &mask); // Need to correct this
+ }
+ if ((nfnd = empty(&mask,10)) <= 0) {
+ if (nfnd < 0) {
+ perror("abort");
+ }
+ code = -1;
+ lostpeer();
+ }
+ if (din && FD_ISSET(din, &mask)) {
+ while ((c = recv(din, buf, bufsize, 0)) > 0)
+ ;
+ }
+ if ((c = getreply(0)) == ERROR && code == 552) { /* needed for nic style abort */
+ if (data >= 0) {
+ (void) close(data);
+ data = -1;
+ }
+ (void) getreply(0);
+ }
+ (void) getreply(0);
+ code = -1;
+ if (data >= 0) {
+ (void) close(data);
+ data = -1;
+ }
+ if (closefunc != NULL && fout != NULL)
+ (*closefunc)(fout);
+ if (din)
+ if(closesocket(din)) {
+ int iret=WSAGetLastError ();
+ fprintf(stdout,"Error closing socket(%d)\n",iret);
+ (void) fflush(stdout);
+ }
+
+ if (bytes > 0)
+ ptransfer("received", bytes, &start, &stop);
+null();// (void) signal(SIGINT,oldintr);
+}
+
+/*
+ * Need to start a listen on the data channel
+ * before we send the command, otherwise the
+ * server's connect may fail.
+ */
+int sendport = -1;
+
+initconn()
+{
+ register char *p, *a;
+ int result, len, tmpno = 0;
+ int on = 1;
+ int a0, a1, a2, a3, p0, p1;
+
+
+ if (passivemode) {
+ data = socket(AF_INET, SOCK_STREAM, 0);
+ if (data < 0) {
+ perror("ftp: socket");
+ return(1);
+ }
+ if ((options & SO_DEBUG) &&
+ setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on,
+ sizeof (on)) < 0)
+ perror("ftp: setsockopt (ignored)");
+ if (command("PASV") != COMPLETE) {
+ printf("Passive mode refused.\n");
+ goto bad;
+ }
+
+ /*
+ * What we've got at this point is a string of comma
+ * separated one-byte unsigned integer values.
+ * The first four are the an IP address. The fifth is
+ * the MSB of the port number, the sixth is the LSB.
+ * From that we'll prepare a sockaddr_in.
+ */
+
+ if (sscanf(pasv,"%d,%d,%d,%d,%d,%d",
+ &a0, &a1, &a2, &a3, &p0, &p1) != 6) {
+ printf("Passive mode address scan failure. Shouldn't happen!\n");
+ goto bad;
+ }
+
+ bzero(&data_addr, sizeof(data_addr));
+ data_addr.sin_family = AF_INET;
+ a = (char *)&data_addr.sin_addr.s_addr;
+ a[0] = a0 & 0xff;
+ a[1] = a1 & 0xff;
+ a[2] = a2 & 0xff;
+ a[3] = a3 & 0xff;
+ p = (char *)&data_addr.sin_port;
+ p[0] = p0 & 0xff;
+ p[1] = p1 & 0xff;
+
+ if (connect(data, (struct sockaddr *)&data_addr,
+ sizeof(data_addr)) < 0) {
+ perror("ftp: connect");
+ goto bad;
+ }
+ return(0);
+ }
+
+
+noport:
+ data_addr = myctladdr;
+ if (sendport)
+ data_addr.sin_port = 0; /* let system pick one */
+ if (data != -1)
+ (void) close (data);
+ data = socket(AF_INET, SOCK_STREAM, 0);
+ if (data < 0) {
+ perror("ftp: socket");
+ if (tmpno)
+ sendport = 1;
+ return (1);
+ }
+ if (!sendport)
+ if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof (on)) < 0) {
+ perror("ftp: setsockopt (reuse address)");
+ goto bad;
+ }
+ if (bind(data, (struct sockaddr *)&data_addr, sizeof (data_addr)) < 0) {
+ perror("ftp: bind");
+ goto bad;
+ }
+ if (options & SO_DEBUG &&
+ setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof (on)) < 0)
+ perror("ftp: setsockopt (ignored)");
+ len = sizeof (data_addr);
+ if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0) {
+ perror("ftp: getsockname");
+ goto bad;
+ }
+ if (listen(data, 1) < 0)
+ perror("ftp: listen");
+ if (sendport) {
+ a = (char *)&data_addr.sin_addr;
+ p = (char *)&data_addr.sin_port;
+#define UC(b) (((int)b)&0xff)
+ result =
+ command("PORT %d,%d,%d,%d,%d,%d",
+ UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),
+ UC(p[0]), UC(p[1]));
+ if (result == ERROR && sendport == -1) {
+ sendport = 0;
+ tmpno = 1;
+ goto noport;
+ }
+ return (result != COMPLETE);
+ }
+ if (tmpno)
+ sendport = 1;
+ return (0);
+bad:
+ (void) fflush(stdout);
+ (void) close(data), data = -1;
+ if (tmpno)
+ sendport = 1;
+ return (1);
+}
+
+int dataconn(char *mode)
+{
+ struct sockaddr_in from;
+ int s, fromlen = sizeof (from);
+
+ if (passivemode)
+ return (data);
+
+ s = accept(data, (struct sockaddr *) &from, &fromlen);
+ if (s < 0) {
+ perror("ftp: accept");
+ (void) closesocket(data), data = -1;
+ return (int) (NULL);
+ }
+ if(closesocket(data)) {
+ int iret=WSAGetLastError ();
+ fprintf(stdout,"Error closing socket(%d)\n",iret);
+ (void) fflush(stdout);
+ }
+
+ data = s;
+ return (data);
+}
+
+void ptransfer(direction, bytes, t0, t1)
+ char *direction;
+ long bytes;
+ struct timeval *t0, *t1;
+{
+ struct timeval td;
+ double s, bs;
+
+ if (verbose) {
+ tvsub(&td, t1, t0);
+ s = td.tv_sec + (td.tv_usec / 1000000.);
+#define nz(x) ((x) == 0 ? 1 : (x))
+ bs = bytes / nz(s);
+ printf("%ld bytes %s in %.2g seconds (%.2g Kbytes/s)\n",
+ bytes, direction, s, bs / 1024.);
+ (void) fflush(stdout);
+ }
+}
+
+/*tvadd(tsum, t0)
+ struct timeval *tsum, *t0;
+{
+
+ tsum->tv_sec += t0->tv_sec;
+ tsum->tv_usec += t0->tv_usec;
+ if (tsum->tv_usec > 1000000)
+ tsum->tv_sec++, tsum->tv_usec -= 1000000;
+} */
+
+void tvsub(tdiff, t1, t0)
+ struct timeval *tdiff, *t1, *t0;
+{
+
+ tdiff->tv_sec = t1->tv_sec - t0->tv_sec;
+ tdiff->tv_usec = t1->tv_usec - t0->tv_usec;
+ if (tdiff->tv_usec < 0)
+ tdiff->tv_sec--, tdiff->tv_usec += 1000000;
+}
+
+void psabort(int flag)
+{
+ extern int abrtflag;
+
+ abrtflag++;
+}
+
+void pswitch(int flag)
+{
+ extern int proxy, abrtflag;
+ Sig_t oldintr;
+ static struct comvars {
+ int connect;
+ char name[MAXHOSTNAMELEN];
+ struct sockaddr_in mctl;
+ struct sockaddr_in hctl;
+ FILE *in;
+ FILE *out;
+ int tpe;
+ int cpnd;
+ int sunqe;
+ int runqe;
+ int mcse;
+ int ntflg;
+ char nti[17];
+ char nto[17];
+ int mapflg;
+ char mi[MAXPATHLEN];
+ char mo[MAXPATHLEN];
+ } proxstruct, tmpstruct;
+ struct comvars *ip, *op;
+
+ abrtflag = 0;
+ oldintr = signal(SIGINT, psabort);
+ if (flag) {
+ if (proxy)
+ return;
+ ip = &tmpstruct;
+ op = &proxstruct;
+ proxy++;
+ }
+ else {
+ if (!proxy)
+ return;
+ ip = &proxstruct;
+ op = &tmpstruct;
+ proxy = 0;
+ }
+ ip->connect = connected;
+ connected = op->connect;
+ if (hostname) {
+ (void) strncpy(ip->name, hostname, sizeof(ip->name) - 1);
+ ip->name[strlen(ip->name)] = '\0';
+ } else
+ ip->name[0] = 0;
+ hostname = op->name;
+ ip->hctl = hisctladdr;
+ hisctladdr = op->hctl;
+ ip->mctl = myctladdr;
+ myctladdr = op->mctl;
+ (int) ip->in = cin; // What the hell am I looking at...?
+ cin = (int) op->in;
+ (int) ip->out = cout; // Same again...
+ cout = (int) op->out;
+ ip->tpe = type;
+ type = op->tpe;
+ if (!type)
+ type = 1;
+ ip->cpnd = cpend;
+ cpend = op->cpnd;
+ ip->sunqe = sunique;
+ sunique = op->sunqe;
+ ip->runqe = runique;
+ runique = op->runqe;
+ ip->mcse = mcase;
+ mcase = op->mcse;
+ ip->ntflg = ntflag;
+ ntflag = op->ntflg;
+ (void) strncpy(ip->nti, ntin, 16);
+ (ip->nti)[strlen(ip->nti)] = '\0';
+ (void) strcpy(ntin, op->nti);
+ (void) strncpy(ip->nto, ntout, 16);
+ (ip->nto)[strlen(ip->nto)] = '\0';
+ (void) strcpy(ntout, op->nto);
+ ip->mapflg = mapflag;
+ mapflag = op->mapflg;
+ (void) strncpy(ip->mi, mapin, MAXPATHLEN - 1);
+ (ip->mi)[strlen(ip->mi)] = '\0';
+ (void) strcpy(mapin, op->mi);
+ (void) strncpy(ip->mo, mapout, MAXPATHLEN - 1);
+ (ip->mo)[strlen(ip->mo)] = '\0';
+ (void) strcpy(mapout, op->mo);
+// (void) signal(SIGINT, oldintr);
+ if (abrtflag) {
+ abrtflag = 0;
+ (*oldintr)(1);
+ }
+}
+
+jmp_buf ptabort;
+int ptabflg;
+
+void
+abortpt()
+{
+ printf("\n");
+ (void) fflush(stdout);
+ ptabflg++;
+ mflag = 0;
+ abrtflag = 0;
+ longjmp(ptabort, 1);
+}
+
+void proxtrans(cmd, local, remote)
+ char *cmd, *local, *remote;
+{
+// void (*oldintr)(int);
+ //void abortpt(int);
+ int tmptype, oldtype = 0, secndflag = 0, nfnd;
+ extern jmp_buf ptabort;
+ char *cmd2;
+// struct
+ fd_set mask;
+
+ if (strcmp(cmd, "RETR"))
+ cmd2 = "RETR";
+ else
+ cmd2 = runique ? "STOU" : "STOR";
+ if (command("PASV") != COMPLETE) {
+ printf("proxy server does not support third part transfers.\n");
+ (void) fflush(stdout);
+ return;
+ }
+ tmptype = type;
+ pswitch(0);
+ if (!connected) {
+ printf("No primary connection\n");
+ (void) fflush(stdout);
+ pswitch(1);
+ code = -1;
+ return;
+ }
+ if (type != tmptype) {
+ oldtype = type;
+ switch (tmptype) {
+ case TYPE_A:
+ setascii();
+ break;
+ case TYPE_I:
+ setbinary();
+ break;
+ case TYPE_E:
+ setebcdic();
+ break;
+ case TYPE_L:
+ settenex();
+ break;
+ }
+ }
+ if (command("PORT %s", pasv) != COMPLETE) {
+ switch (oldtype) {
+ case 0:
+ break;
+ case TYPE_A:
+ setascii();
+ break;
+ case TYPE_I:
+ setbinary();
+ break;
+ case TYPE_E:
+ setebcdic();
+ break;
+ case TYPE_L:
+ settenex();
+ break;
+ }
+ pswitch(1);
+ return;
+ }
+ if (setjmp(ptabort))
+ goto abort;
+null();// oldintr = signal(SIGINT, abortpt);
+ if (command("%s %s", cmd, remote) != PRELIM) {
+null();// (void) signal(SIGINT, oldintr);
+ switch (oldtype) {
+ case 0:
+ break;
+ case TYPE_A:
+ setascii();
+ break;
+ case TYPE_I:
+ setbinary();
+ break;
+ case TYPE_E:
+ setebcdic();
+ break;
+ case TYPE_L:
+ settenex();
+ break;
+ }
+ pswitch(1);
+ return;
+ }
+ sleep(2);
+ pswitch(1);
+ secndflag++;
+ if (command("%s %s", cmd2, local) != PRELIM)
+ goto abort;
+ ptflag++;
+ (void) getreply(0);
+ pswitch(0);
+ (void) getreply(0);
+null();// (void) signal(SIGINT, oldintr);
+ switch (oldtype) {
+ case 0:
+ break;
+ case TYPE_A:
+ setascii();
+ break;
+ case TYPE_I:
+ setbinary();
+ break;
+ case TYPE_E:
+ setebcdic();
+ break;
+ case TYPE_L:
+ settenex();
+ break;
+ }
+ pswitch(1);
+ ptflag = 0;
+ printf("local: %s remote: %s\n", local, remote);
+ (void) fflush(stdout);
+ return;
+abort:
+null();// (void) signal(SIGINT, SIG_IGN);
+ ptflag = 0;
+ if (strcmp(cmd, "RETR") && !proxy)
+ pswitch(1);
+ else if (!strcmp(cmd, "RETR") && proxy)
+ pswitch(0);
+ if (!cpend && !secndflag) { /* only here if cmd = "STOR" (proxy=1) */
+ if (command("%s %s", cmd2, local) != PRELIM) {
+ pswitch(0);
+ switch (oldtype) {
+ case 0:
+ break;
+ case TYPE_A:
+ setascii();
+ break;
+ case TYPE_I:
+ setbinary();
+ break;
+ case TYPE_E:
+ setebcdic();
+ break;
+ case TYPE_L:
+ settenex();
+ break;
+ }
+ if (cpend) {
+ char msg[2];
+
+ fprintfSocket(cout,"%c%c",IAC,IP);
+ *msg = (char) IAC;
+ *(msg+1) = (char) DM;
+ if (send(cout,msg,2,MSG_OOB) != 2)
+ perror("abort");
+ fprintfSocket(cout,"ABOR\r\n");
+ FD_ZERO(&mask);
+// FD_SET(fileno(cin), &mask); // Chris: Need to correct this
+ if ((nfnd = empty(&mask,10)) <= 0) {
+ if (nfnd < 0) {
+ perror("abort");
+ }
+ if (ptabflg)
+ code = -1;
+ lostpeer();
+ }
+ (void) getreply(0);
+ (void) getreply(0);
+ }
+ }
+ pswitch(1);
+ if (ptabflg)
+ code = -1;
+null();// (void) signal(SIGINT, oldintr);
+ return;
+ }
+ if (cpend) {
+ char msg[2];
+
+ fprintfSocket(cout,"%c%c",IAC,IP);
+ *msg = (char)IAC;
+ *(msg+1) = (char)DM;
+ if (send(cout,msg,2,MSG_OOB) != 2)
+ perror("abort");
+ fprintfSocket(cout,"ABOR\r\n");
+ FD_ZERO(&mask);
+// FD_SET(fileno(cin), &mask); // Chris: Need to correct this...
+ if ((nfnd = empty(&mask,10)) <= 0) {
+ if (nfnd < 0) {
+ perror("abort");
+ }
+ if (ptabflg)
+ code = -1;
+ lostpeer();
+ }
+ (void) getreply(0);
+ (void) getreply(0);
+ }
+ pswitch(!proxy);
+ if (!cpend && !secndflag) { /* only if cmd = "RETR" (proxy=1) */
+ if (command("%s %s", cmd2, local) != PRELIM) {
+ pswitch(0);
+ switch (oldtype) {
+ case 0:
+ break;
+ case TYPE_A:
+ setascii();
+ break;
+ case TYPE_I:
+ setbinary();
+ break;
+ case TYPE_E:
+ setebcdic();
+ break;
+ case TYPE_L:
+ settenex();
+ break;
+ }
+ if (cpend) {
+ char msg[2];
+
+ fprintfSocket(cout,"%c%c",IAC,IP);
+ *msg = (char)IAC;
+ *(msg+1) = (char)DM;
+ if (send(cout,msg,2,MSG_OOB) != 2)
+ perror("abort");
+ fprintfSocket(cout,"ABOR\r\n");
+ FD_ZERO(&mask);
+// FD_SET(fileno(cin), &mask); // Chris:
+ if ((nfnd = empty(&mask,10)) <= 0) {
+ if (nfnd < 0) {
+ perror("abort");
+ }
+ if (ptabflg)
+ code = -1;
+ lostpeer();
+ }
+ (void) getreply(0);
+ (void) getreply(0);
+ }
+ pswitch(1);
+ if (ptabflg)
+ code = -1;
+null();// (void) signal(SIGINT, oldintr);
+ return;
+ }
+ }
+ if (cpend) {
+ char msg[2];
+
+ fprintfSocket(cout,"%c%c",IAC,IP);
+ *msg = (char)IAC;
+ *(msg+1) = (char)DM;
+ if (send(cout,msg,2,MSG_OOB) != 2)
+ perror("abort");
+ fprintfSocket(cout,"ABOR\r\n");
+ FD_ZERO(&mask);
+// FD_SET(fileno(cin), &mask); // Chris:
+ if ((nfnd = empty(&mask,10)) <= 0) {
+ if (nfnd < 0) {
+ perror("abort");
+ }
+ if (ptabflg)
+ code = -1;
+ lostpeer();
+ }
+ (void) getreply(0);
+ (void) getreply(0);
+ }
+ pswitch(!proxy);
+ if (cpend) {
+ FD_ZERO(&mask);
+// FD_SET(fileno(cin), &mask); // Chris:
+ if ((nfnd = empty(&mask,10)) <= 0) {
+ if (nfnd < 0) {
+ perror("abort");
+ }
+ if (ptabflg)
+ code = -1;
+ lostpeer();
+ }
+ (void) getreply(0);
+ (void) getreply(0);
+ }
+ if (proxy)
+ pswitch(0);
+ switch (oldtype) {
+ case 0:
+ break;
+ case TYPE_A:
+ setascii();
+ break;
+ case TYPE_I:
+ setbinary();
+ break;
+ case TYPE_E:
+ setebcdic();
+ break;
+ case TYPE_L:
+ settenex();
+ break;
+ }
+ pswitch(1);
+ if (ptabflg)
+ code = -1;
+null();// (void) signal(SIGINT, oldintr);
+}
+
+void reset()
+{
+// struct
+ fd_set mask;
+ int nfnd = 1;
+
+ FD_ZERO(&mask);
+ while (nfnd > 0) {
+// FD_SET(fileno(cin), &mask); // Chris
+ if ((nfnd = empty(&mask,0)) < 0) {
+ perror("reset");
+ code = -1;
+ lostpeer();
+ }
+ else if (nfnd) {
+ (void) getreply(0);
+ }
+ }
+}
+
+char *
+gunique(local)
+ char *local;
+{
+ static char new[MAXPATHLEN];
+ char *cp = rindex(local, '/');
+ int d, count=0;
+ char ext = '1';
+
+ if (cp)
+ *cp = '\0';
+ d = access(cp ? local : ".", 2);
+ if (cp)
+ *cp = '/';
+ if (d < 0) {
+ perror(local);
+ return((char *) 0);
+ }
+ (void) strcpy(new, local);
+ cp = new + strlen(new);
+ *cp++ = '.';
+ while (!d) {
+ if (++count == 100) {
+ printf("runique: can't find unique file name.\n");
+ (void) fflush(stdout);
+ return((char *) 0);
+ }
+ *cp++ = ext;
+ *cp = '\0';
+ if (ext == '9')
+ ext = '0';
+ else
+ ext++;
+ if ((d = access(new, 0)) < 0)
+ break;
+ if (ext != '0')
+ cp--;
+ else if (*(cp - 2) == '.')
+ *(cp - 1) = '1';
+ else {
+ *(cp - 2) = *(cp - 2) + 1;
+ cp--;
+ }
+ }
+ return(new);
+}
+
+int null(void)
+{
+ return 0;
+}
-# Microsoft Developer Studio Generated NMAKE File, Based on ftp.dsp\r
-!IF "$(CFG)" == ""\r
-CFG=ftp - Win32 Debug\r
-!MESSAGE No configuration specified. Defaulting to ftp - Win32 Debug.\r
-!ENDIF\r
-\r
-!IF "$(CFG)" != "ftp - Win32 Release" && "$(CFG)" != "ftp - Win32 Debug"\r
-!MESSAGE Invalid configuration "$(CFG)" specified.\r
-!MESSAGE You can specify a configuration when running NMAKE\r
-!MESSAGE by defining the macro CFG on the command line. For example:\r
-!MESSAGE\r
-!MESSAGE NMAKE /f "ftp.mak" CFG="ftp - Win32 Debug"\r
-!MESSAGE\r
-!MESSAGE Possible choices for configuration are:\r
-!MESSAGE\r
-!MESSAGE "ftp - Win32 Release" (based on "Win32 (x86) Console Application")\r
-!MESSAGE "ftp - Win32 Debug" (based on "Win32 (x86) Console Application")\r
-!MESSAGE\r
-!ERROR An invalid configuration is specified.\r
-!ENDIF\r
-\r
-!IF "$(OS)" == "Windows_NT"\r
-NULL=\r
-!ELSE\r
-NULL=nul\r
-!ENDIF\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release"\r
-\r
-OUTDIR=.\Release\r
-INTDIR=.\Release\r
-# Begin Custom Macros\r
-OutDir=.\Release\r
-# End Custom Macros\r
-\r
-!IF "$(RECURSE)" == "0"\r
-\r
-ALL : "$(OUTDIR)\ftp.exe"\r
-\r
-!ELSE\r
-\r
-ALL : "$(OUTDIR)\ftp.exe"\r
-\r
-!ENDIF\r
-\r
-CLEAN :\r
- -@erase "$(INTDIR)\cmds.obj"\r
- -@erase "$(INTDIR)\cmdtab.obj"\r
- -@erase "$(INTDIR)\domacro.obj"\r
- -@erase "$(INTDIR)\fake.obj"\r
- -@erase "$(INTDIR)\ftp.obj"\r
- -@erase "$(INTDIR)\main.obj"\r
- -@erase "$(INTDIR)\ruserpass.obj"\r
- -@erase "$(INTDIR)\vc*.idb"\r
- -@erase "$(OUTDIR)\ftp.exe"\r
- -@erase "$(OUTDIR)\ftp.pch"\r
-\r
-"$(OUTDIR)" :\r
- if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
-\r
-CPP=cl.exe\r
-CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" \\r
- /D "HAVE_TIMEVAL" /Fp"$(INTDIR)\ftp.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD\\r
- /c\r
-CPP_OBJS=.\Release/\r
-CPP_SBRS=.\r
-\r
-.c{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cpp{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cxx{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.c{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cpp{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cxx{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-RSC=rc.exe\r
-BSC32=bscmake.exe\r
-BSC32_FLAGS=/nologo /o"$(OUTDIR)\ftp.bsc"\r
-BSC32_SBRS= \\r
-\r
-LINK32=link.exe\r
-LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\\r
- advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\\r
- odbccp32.lib wsock32.lib /nologo /subsystem:console /incremental:no\\r
- /pdb:"$(OUTDIR)\ftp.pdb" /machine:I386 /out:"$(OUTDIR)\ftp.exe"\r
-LINK32_OBJS= \\r
- "$(INTDIR)\cmds.obj" \\r
- "$(INTDIR)\cmdtab.obj" \\r
- "$(INTDIR)\domacro.obj" \\r
- "$(INTDIR)\fake.obj" \\r
- "$(INTDIR)\ftp.obj" \\r
- "$(INTDIR)\main.obj" \\r
- "$(INTDIR)\ruserpass.obj"\r
-\r
-"$(OUTDIR)\ftp.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
- $(LINK32) @<<\r
- $(LINK32_FLAGS) $(LINK32_OBJS)\r
-<<\r
-\r
-TargetPath=.\Release\ftp.exe\r
-InputPath=.\Release\ftp.exe\r
-SOURCE=$(InputPath)\r
-\r
-!ELSEIF "$(CFG)" == "ftp - Win32 Debug"\r
-\r
-OUTDIR=.\Debug\r
-INTDIR=.\Debug\r
-# Begin Custom Macros\r
-OutDir=.\Debug\r
-# End Custom Macros\r
-\r
-!IF "$(RECURSE)" == "0"\r
-\r
-ALL : "$(OUTDIR)\ftp.exe"\r
-\r
-!ELSE\r
-\r
-ALL : "$(OUTDIR)\ftp.exe"\r
-\r
-!ENDIF\r
-\r
-CLEAN :\r
- -@erase "$(INTDIR)\cmds.obj"\r
- -@erase "$(INTDIR)\cmdtab.obj"\r
- -@erase "$(INTDIR)\domacro.obj"\r
- -@erase "$(INTDIR)\fake.obj"\r
- -@erase "$(INTDIR)\ftp.obj"\r
- -@erase "$(INTDIR)\main.obj"\r
- -@erase "$(INTDIR)\ruserpass.obj"\r
- -@erase "$(INTDIR)\vc*.idb"\r
- -@erase "$(INTDIR)\vc*.pdb"\r
- -@erase "$(OUTDIR)\ftp.exe"\r
- -@erase "$(OUTDIR)\ftp.ilk"\r
- -@erase "$(OUTDIR)\ftp.pdb"\r
- -@erase "$(OUTDIR)\ftp.pch"\r
-\r
-"$(OUTDIR)" :\r
- if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
-\r
-CPP=cl.exe\r
-CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS"\\r
- /Fp"$(INTDIR)\ftp.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c\r
-CPP_OBJS=.\Debug/\r
-CPP_SBRS=.\r
-\r
-.c{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cpp{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cxx{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.c{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cpp{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cxx{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-RSC=rc.exe\r
-BSC32=bscmake.exe\r
-BSC32_FLAGS=/nologo /o"$(OUTDIR)\ftp.bsc"\r
-BSC32_SBRS= \\r
-\r
-LINK32=link.exe\r
-LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\\r
- advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\\r
- odbccp32.lib wsock32.lib /nologo /subsystem:console /incremental:yes\\r
- /pdb:"$(OUTDIR)\ftp.pdb" /debug /machine:I386 /out:"$(OUTDIR)\ftp.exe"\\r
- /pdbtype:sept\r
-LINK32_OBJS= \\r
- "$(INTDIR)\cmds.obj" \\r
- "$(INTDIR)\cmdtab.obj" \\r
- "$(INTDIR)\domacro.obj" \\r
- "$(INTDIR)\fake.obj" \\r
- "$(INTDIR)\ftp.obj" \\r
- "$(INTDIR)\main.obj" \\r
- "$(INTDIR)\ruserpass.obj"\r
-\r
-"$(OUTDIR)\ftp.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
- $(LINK32) @<<\r
- $(LINK32_FLAGS) $(LINK32_OBJS)\r
-<<\r
-\r
-TargetPath=.\Debug\ftp.exe\r
-InputPath=.\Debug\ftp.exe\r
-SOURCE=$(InputPath)\r
-\r
-!ENDIF\r
-\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release" || "$(CFG)" == "ftp - Win32 Debug"\r
-SOURCE=.\cmds.c\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release"\r
-\r
-DEP_CPP_CMDS_=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\pathnames.h"\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\cmds.obj" : $(SOURCE) $(DEP_CPP_CMDS_) "$(INTDIR)"\r
-\r
-\r
-!ELSEIF "$(CFG)" == "ftp - Win32 Debug"\r
-\r
-DEP_CPP_CMDS_=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\pathnames.h"\\r
- ".\prototypes.h"\\r
- {$(INCLUDE)}"sys\stat.h"\\r
- {$(INCLUDE)}"sys\types.h"\\r
-\r
-\r
-"$(INTDIR)\cmds.obj" : $(SOURCE) $(DEP_CPP_CMDS_) "$(INTDIR)"\r
-\r
-\r
-!ENDIF\r
-\r
-SOURCE=.\cmdtab.c\r
-DEP_CPP_CMDTA=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
-\r
-\r
-"$(INTDIR)\cmdtab.obj" : $(SOURCE) $(DEP_CPP_CMDTA) "$(INTDIR)"\r
-\r
-\r
-SOURCE=.\domacro.c\r
-DEP_CPP_DOMAC=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\domacro.obj" : $(SOURCE) $(DEP_CPP_DOMAC) "$(INTDIR)"\r
-\r
-\r
-SOURCE=.\fake.c\r
-DEP_CPP_FAKE_=\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\fake.obj" : $(SOURCE) $(DEP_CPP_FAKE_) "$(INTDIR)"\r
-\r
-\r
-SOURCE=.\ftp.c\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release"\r
-\r
-DEP_CPP_FTP_C=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\ftp.obj" : $(SOURCE) $(DEP_CPP_FTP_C) "$(INTDIR)"\r
-\r
-\r
-!ELSEIF "$(CFG)" == "ftp - Win32 Debug"\r
-\r
-DEP_CPP_FTP_C=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
- {$(INCLUDE)}"sys\stat.h"\\r
- {$(INCLUDE)}"sys\types.h"\\r
-\r
-\r
-"$(INTDIR)\ftp.obj" : $(SOURCE) $(DEP_CPP_FTP_C) "$(INTDIR)"\r
-\r
-\r
-!ENDIF\r
-\r
-SOURCE=.\main.c\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release"\r
-\r
-DEP_CPP_MAIN_=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\main.obj" : $(SOURCE) $(DEP_CPP_MAIN_) "$(INTDIR)"\r
-\r
-\r
-!ELSEIF "$(CFG)" == "ftp - Win32 Debug"\r
-\r
-DEP_CPP_MAIN_=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
- {$(INCLUDE)}"sys\types.h"\\r
-\r
-\r
-"$(INTDIR)\main.obj" : $(SOURCE) $(DEP_CPP_MAIN_) "$(INTDIR)"\r
-\r
-\r
-!ENDIF\r
-\r
-SOURCE=.\ruserpass.c\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release"\r
-\r
-DEP_CPP_RUSER=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\ruserpass.obj" : $(SOURCE) $(DEP_CPP_RUSER) "$(INTDIR)"\r
-\r
-\r
-!ELSEIF "$(CFG)" == "ftp - Win32 Debug"\r
-\r
-DEP_CPP_RUSER=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
- {$(INCLUDE)}"sys\stat.h"\\r
- {$(INCLUDE)}"sys\types.h"\\r
-\r
-\r
-"$(INTDIR)\ruserpass.obj" : $(SOURCE) $(DEP_CPP_RUSER) "$(INTDIR)"\r
-\r
-\r
-!ENDIF\r
-\r
-\r
-!ENDIF\r
+# Microsoft Developer Studio Generated NMAKE File, Based on ftp.dsp
+!IF "$(CFG)" == ""
+CFG=ftp - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to ftp - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "ftp - Win32 Release" && "$(CFG)" != "ftp - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "ftp.mak" CFG="ftp - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "ftp - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "ftp - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IF "$(CFG)" == "ftp - Win32 Release"
+
+OUTDIR=.\Release
+INTDIR=.\Release
+# Begin Custom Macros
+OutDir=.\Release
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\ftp.exe"
+
+!ELSE
+
+ALL : "$(OUTDIR)\ftp.exe"
+
+!ENDIF
+
+CLEAN :
+ -@erase "$(INTDIR)\cmds.obj"
+ -@erase "$(INTDIR)\cmdtab.obj"
+ -@erase "$(INTDIR)\domacro.obj"
+ -@erase "$(INTDIR)\fake.obj"
+ -@erase "$(INTDIR)\ftp.obj"
+ -@erase "$(INTDIR)\main.obj"
+ -@erase "$(INTDIR)\ruserpass.obj"
+ -@erase "$(INTDIR)\vc*.idb"
+ -@erase "$(OUTDIR)\ftp.exe"
+ -@erase "$(OUTDIR)\ftp.pch"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" \
+ /D "HAVE_TIMEVAL" /Fp"$(INTDIR)\ftp.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD\
+ /c
+CPP_OBJS=.\Release/
+CPP_SBRS=.
+
+.c{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\ftp.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib wsock32.lib /nologo /subsystem:console /incremental:no\
+ /pdb:"$(OUTDIR)\ftp.pdb" /machine:I386 /out:"$(OUTDIR)\ftp.exe"
+LINK32_OBJS= \
+ "$(INTDIR)\cmds.obj" \
+ "$(INTDIR)\cmdtab.obj" \
+ "$(INTDIR)\domacro.obj" \
+ "$(INTDIR)\fake.obj" \
+ "$(INTDIR)\ftp.obj" \
+ "$(INTDIR)\main.obj" \
+ "$(INTDIR)\ruserpass.obj"
+
+"$(OUTDIR)\ftp.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+TargetPath=.\Release\ftp.exe
+InputPath=.\Release\ftp.exe
+SOURCE=$(InputPath)
+
+!ELSEIF "$(CFG)" == "ftp - Win32 Debug"
+
+OUTDIR=.\Debug
+INTDIR=.\Debug
+# Begin Custom Macros
+OutDir=.\Debug
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\ftp.exe"
+
+!ELSE
+
+ALL : "$(OUTDIR)\ftp.exe"
+
+!ENDIF
+
+CLEAN :
+ -@erase "$(INTDIR)\cmds.obj"
+ -@erase "$(INTDIR)\cmdtab.obj"
+ -@erase "$(INTDIR)\domacro.obj"
+ -@erase "$(INTDIR)\fake.obj"
+ -@erase "$(INTDIR)\ftp.obj"
+ -@erase "$(INTDIR)\main.obj"
+ -@erase "$(INTDIR)\ruserpass.obj"
+ -@erase "$(INTDIR)\vc*.idb"
+ -@erase "$(INTDIR)\vc*.pdb"
+ -@erase "$(OUTDIR)\ftp.exe"
+ -@erase "$(OUTDIR)\ftp.ilk"
+ -@erase "$(OUTDIR)\ftp.pdb"
+ -@erase "$(OUTDIR)\ftp.pch"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS"\
+ /Fp"$(INTDIR)\ftp.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+CPP_OBJS=.\Debug/
+CPP_SBRS=.
+
+.c{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\ftp.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib wsock32.lib /nologo /subsystem:console /incremental:yes\
+ /pdb:"$(OUTDIR)\ftp.pdb" /debug /machine:I386 /out:"$(OUTDIR)\ftp.exe"\
+ /pdbtype:sept
+LINK32_OBJS= \
+ "$(INTDIR)\cmds.obj" \
+ "$(INTDIR)\cmdtab.obj" \
+ "$(INTDIR)\domacro.obj" \
+ "$(INTDIR)\fake.obj" \
+ "$(INTDIR)\ftp.obj" \
+ "$(INTDIR)\main.obj" \
+ "$(INTDIR)\ruserpass.obj"
+
+"$(OUTDIR)\ftp.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+TargetPath=.\Debug\ftp.exe
+InputPath=.\Debug\ftp.exe
+SOURCE=$(InputPath)
+
+!ENDIF
+
+
+!IF "$(CFG)" == "ftp - Win32 Release" || "$(CFG)" == "ftp - Win32 Debug"
+SOURCE=.\cmds.c
+
+!IF "$(CFG)" == "ftp - Win32 Release"
+
+DEP_CPP_CMDS_=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\pathnames.h"\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\cmds.obj" : $(SOURCE) $(DEP_CPP_CMDS_) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "ftp - Win32 Debug"
+
+DEP_CPP_CMDS_=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\pathnames.h"\
+ ".\prototypes.h"\
+ {$(INCLUDE)}"sys\stat.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\cmds.obj" : $(SOURCE) $(DEP_CPP_CMDS_) "$(INTDIR)"
+
+
+!ENDIF
+
+SOURCE=.\cmdtab.c
+DEP_CPP_CMDTA=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+
+
+"$(INTDIR)\cmdtab.obj" : $(SOURCE) $(DEP_CPP_CMDTA) "$(INTDIR)"
+
+
+SOURCE=.\domacro.c
+DEP_CPP_DOMAC=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\domacro.obj" : $(SOURCE) $(DEP_CPP_DOMAC) "$(INTDIR)"
+
+
+SOURCE=.\fake.c
+DEP_CPP_FAKE_=\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\fake.obj" : $(SOURCE) $(DEP_CPP_FAKE_) "$(INTDIR)"
+
+
+SOURCE=.\ftp.c
+
+!IF "$(CFG)" == "ftp - Win32 Release"
+
+DEP_CPP_FTP_C=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\ftp.obj" : $(SOURCE) $(DEP_CPP_FTP_C) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "ftp - Win32 Debug"
+
+DEP_CPP_FTP_C=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+ {$(INCLUDE)}"sys\stat.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\ftp.obj" : $(SOURCE) $(DEP_CPP_FTP_C) "$(INTDIR)"
+
+
+!ENDIF
+
+SOURCE=.\main.c
+
+!IF "$(CFG)" == "ftp - Win32 Release"
+
+DEP_CPP_MAIN_=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\main.obj" : $(SOURCE) $(DEP_CPP_MAIN_) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "ftp - Win32 Debug"
+
+DEP_CPP_MAIN_=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\main.obj" : $(SOURCE) $(DEP_CPP_MAIN_) "$(INTDIR)"
+
+
+!ENDIF
+
+SOURCE=.\ruserpass.c
+
+!IF "$(CFG)" == "ftp - Win32 Release"
+
+DEP_CPP_RUSER=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\ruserpass.obj" : $(SOURCE) $(DEP_CPP_RUSER) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "ftp - Win32 Debug"
+
+DEP_CPP_RUSER=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+ {$(INCLUDE)}"sys\stat.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\ruserpass.obj" : $(SOURCE) $(DEP_CPP_RUSER) "$(INTDIR)"
+
+
+!ENDIF
+
+
+!ENDIF
-# Microsoft Developer Studio Generated NMAKE File, Based on ftp.dsp\r
-!IF "$(CFG)" == ""\r
-CFG=ftp - Win32 Debug\r
-!MESSAGE No configuration specified. Defaulting to ftp - Win32 Debug.\r
-!ENDIF\r
-\r
-!IF "$(CFG)" != "ftp - Win32 Release" && "$(CFG)" != "ftp - Win32 Debug"\r
-!MESSAGE Invalid configuration "$(CFG)" specified.\r
-!MESSAGE You can specify a configuration when running NMAKE\r
-!MESSAGE by defining the macro CFG on the command line. For example:\r
-!MESSAGE\r
-!MESSAGE NMAKE /f "ftp.mak" CFG="ftp - Win32 Debug"\r
-!MESSAGE\r
-!MESSAGE Possible choices for configuration are:\r
-!MESSAGE\r
-!MESSAGE "ftp - Win32 Release" (based on "Win32 (x86) Console Application")\r
-!MESSAGE "ftp - Win32 Debug" (based on "Win32 (x86) Console Application")\r
-!MESSAGE\r
-!ERROR An invalid configuration is specified.\r
-!ENDIF\r
-\r
-!IF "$(OS)" == "Windows_NT"\r
-NULL=\r
-!ELSE\r
-NULL=nul\r
-!ENDIF\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release"\r
-\r
-OUTDIR=.\Release\r
-INTDIR=.\Release\r
-# Begin Custom Macros\r
-OutDir=.\Release\r
-# End Custom Macros\r
-\r
-!IF "$(RECURSE)" == "0"\r
-\r
-ALL : "$(OUTDIR)\ftp.exe" "\emacs-19.34\bin\ftp.exe"\r
-\r
-!ELSE\r
-\r
-ALL : "$(OUTDIR)\ftp.exe" "\emacs-19.34\bin\ftp.exe"\r
-\r
-!ENDIF\r
-\r
-CLEAN :\r
- -@erase "$(INTDIR)\cmds.obj"\r
- -@erase "$(INTDIR)\cmdtab.obj"\r
- -@erase "$(INTDIR)\domacro.obj"\r
- -@erase "$(INTDIR)\fake.obj"\r
- -@erase "$(INTDIR)\ftp.obj"\r
- -@erase "$(INTDIR)\main.obj"\r
- -@erase "$(INTDIR)\ruserpass.obj"\r
- -@erase "$(INTDIR)\vc50.idb"\r
- -@erase "$(OUTDIR)\ftp.exe"\r
- -@erase "\emacs-19.34\bin\ftp.exe"\r
-\r
-"$(OUTDIR)" :\r
- if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
-\r
-CPP=cl.exe\r
-CPP_PROJ=/nologo /ML /W3 /GX /O2 /I "C:\emacs-19.34\nt\inc" /I\\r
- "C:\emacs-19.34\src" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D\\r
- "HAVE_TIMEVAL" /Fp"$(INTDIR)\ftp.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD\\r
- /c\r
-CPP_OBJS=.\Release/\r
-CPP_SBRS=.\r
-\r
-.c{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cpp{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cxx{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.c{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cpp{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cxx{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-RSC=rc.exe\r
-BSC32=bscmake.exe\r
-BSC32_FLAGS=/nologo /o"$(OUTDIR)\ftp.bsc"\r
-BSC32_SBRS= \\r
-\r
-LINK32=link.exe\r
-LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\\r
- advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\\r
- odbccp32.lib /nologo /subsystem:console /incremental:no\\r
- /pdb:"$(OUTDIR)\ftp.pdb" /machine:I386 /out:"$(OUTDIR)\ftp.exe"\r
-LINK32_OBJS= \\r
- "$(INTDIR)\cmds.obj" \\r
- "$(INTDIR)\cmdtab.obj" \\r
- "$(INTDIR)\domacro.obj" \\r
- "$(INTDIR)\fake.obj" \\r
- "$(INTDIR)\ftp.obj" \\r
- "$(INTDIR)\main.obj" \\r
- "$(INTDIR)\ruserpass.obj" \\r
- "d:\Program Files\DevStudio\VC\lib\WSOCK32.LIB"\r
-\r
-"$(OUTDIR)\ftp.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
- $(LINK32) @<<\r
- $(LINK32_FLAGS) $(LINK32_OBJS)\r
-<<\r
-\r
-TargetPath=.\Release\ftp.exe\r
-InputPath=.\Release\ftp.exe\r
-SOURCE=$(InputPath)\r
-\r
-"\emacs-19.34\bin\ftp.exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
-# copy $(TargetPath) \emacs-19.34\bin\r
-\r
-!ELSEIF "$(CFG)" == "ftp - Win32 Debug"\r
-\r
-OUTDIR=.\Debug\r
-INTDIR=.\Debug\r
-# Begin Custom Macros\r
-OutDir=.\Debug\r
-# End Custom Macros\r
-\r
-!IF "$(RECURSE)" == "0"\r
-\r
-ALL : "$(OUTDIR)\ftp.exe" "\emacs-19.34\bin\ftp.exe"\r
-\r
-!ELSE\r
-\r
-ALL : "$(OUTDIR)\ftp.exe" "\emacs-19.34\bin\ftp.exe"\r
-\r
-!ENDIF\r
-\r
-CLEAN :\r
- -@erase "$(INTDIR)\cmds.obj"\r
- -@erase "$(INTDIR)\cmdtab.obj"\r
- -@erase "$(INTDIR)\domacro.obj"\r
- -@erase "$(INTDIR)\fake.obj"\r
- -@erase "$(INTDIR)\ftp.obj"\r
- -@erase "$(INTDIR)\main.obj"\r
- -@erase "$(INTDIR)\ruserpass.obj"\r
- -@erase "$(INTDIR)\vc50.idb"\r
- -@erase "$(INTDIR)\vc50.pdb"\r
- -@erase "$(OUTDIR)\ftp.exe"\r
- -@erase "$(OUTDIR)\ftp.ilk"\r
- -@erase "$(OUTDIR)\ftp.pdb"\r
- -@erase "\emacs-19.34\bin\ftp.exe"\r
-\r
-"$(OUTDIR)" :\r
- if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
-\r
-CPP=cl.exe\r
-CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /I "C:\emacs-19.34\nt\inc" /I\\r
- "C:\emacs-19.34\src" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS"\\r
- /Fp"$(INTDIR)\ftp.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c\r
-CPP_OBJS=.\Debug/\r
-CPP_SBRS=.\r
-\r
-.c{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cpp{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cxx{$(CPP_OBJS)}.obj::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.c{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cpp{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-.cxx{$(CPP_SBRS)}.sbr::\r
- $(CPP) @<<\r
- $(CPP_PROJ) $<\r
-<<\r
-\r
-RSC=rc.exe\r
-BSC32=bscmake.exe\r
-BSC32_FLAGS=/nologo /o"$(OUTDIR)\ftp.bsc"\r
-BSC32_SBRS= \\r
-\r
-LINK32=link.exe\r
-LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\\r
- advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\\r
- odbccp32.lib /nologo /subsystem:console /incremental:yes\\r
- /pdb:"$(OUTDIR)\ftp.pdb" /debug /machine:I386 /out:"$(OUTDIR)\ftp.exe"\\r
- /pdbtype:sept\r
-LINK32_OBJS= \\r
- "$(INTDIR)\cmds.obj" \\r
- "$(INTDIR)\cmdtab.obj" \\r
- "$(INTDIR)\domacro.obj" \\r
- "$(INTDIR)\fake.obj" \\r
- "$(INTDIR)\ftp.obj" \\r
- "$(INTDIR)\main.obj" \\r
- "$(INTDIR)\ruserpass.obj" \\r
- "d:\Program Files\DevStudio\VC\lib\WSOCK32.LIB"\r
-\r
-"$(OUTDIR)\ftp.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
- $(LINK32) @<<\r
- $(LINK32_FLAGS) $(LINK32_OBJS)\r
-<<\r
-\r
-TargetPath=.\Debug\ftp.exe\r
-InputPath=.\Debug\ftp.exe\r
-SOURCE=$(InputPath)\r
-\r
-"\emacs-19.34\bin\ftp.exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
-# copy $(TargetPath) \emacs-19.34\bin\r
-\r
-!ENDIF\r
-\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release" || "$(CFG)" == "ftp - Win32 Debug"\r
-SOURCE=.\cmds.c\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release"\r
-\r
-DEP_CPP_CMDS_=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\pathnames.h"\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\cmds.obj" : $(SOURCE) $(DEP_CPP_CMDS_) "$(INTDIR)"\r
-\r
-\r
-!ELSEIF "$(CFG)" == "ftp - Win32 Debug"\r
-\r
-DEP_CPP_CMDS_=\\r
- "..\..\..\emacs-19.34\nt\inc\netdb.h"\\r
- "..\..\..\emacs-19.34\nt\inc\netinet\in.h"\\r
- "..\..\..\emacs-19.34\nt\inc\sys\socket.h"\\r
- "..\..\..\emacs-19.34\src\nt.h"\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\pathnames.h"\\r
- ".\prototypes.h"\\r
- {$(INCLUDE)}"sys\stat.h"\\r
- {$(INCLUDE)}"sys\types.h"\\r
-\r
-\r
-"$(INTDIR)\cmds.obj" : $(SOURCE) $(DEP_CPP_CMDS_) "$(INTDIR)"\r
-\r
-\r
-!ENDIF\r
-\r
-SOURCE=.\cmdtab.c\r
-DEP_CPP_CMDTA=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
-\r
-\r
-"$(INTDIR)\cmdtab.obj" : $(SOURCE) $(DEP_CPP_CMDTA) "$(INTDIR)"\r
-\r
-\r
-SOURCE=.\domacro.c\r
-DEP_CPP_DOMAC=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\domacro.obj" : $(SOURCE) $(DEP_CPP_DOMAC) "$(INTDIR)"\r
-\r
-\r
-SOURCE=.\fake.c\r
-DEP_CPP_FAKE_=\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\fake.obj" : $(SOURCE) $(DEP_CPP_FAKE_) "$(INTDIR)"\r
-\r
-\r
-SOURCE=.\ftp.c\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release"\r
-\r
-DEP_CPP_FTP_C=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\ftp.obj" : $(SOURCE) $(DEP_CPP_FTP_C) "$(INTDIR)"\r
-\r
-\r
-!ELSEIF "$(CFG)" == "ftp - Win32 Debug"\r
-\r
-DEP_CPP_FTP_C=\\r
- "..\..\..\emacs-19.34\nt\inc\netdb.h"\\r
- "..\..\..\emacs-19.34\nt\inc\netinet\in.h"\\r
- "..\..\..\emacs-19.34\nt\inc\pwd.h"\\r
- "..\..\..\emacs-19.34\nt\inc\sys\file.h"\\r
- "..\..\..\emacs-19.34\nt\inc\sys\ioctl.h"\\r
- "..\..\..\emacs-19.34\nt\inc\sys\param.h"\\r
- "..\..\..\emacs-19.34\nt\inc\sys\socket.h"\\r
- "..\..\..\emacs-19.34\nt\inc\sys\time.h"\\r
- "..\..\..\emacs-19.34\src\nt.h"\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
- {$(INCLUDE)}"sys\stat.h"\\r
- {$(INCLUDE)}"sys\types.h"\\r
-\r
-\r
-"$(INTDIR)\ftp.obj" : $(SOURCE) $(DEP_CPP_FTP_C) "$(INTDIR)"\r
-\r
-\r
-!ENDIF\r
-\r
-SOURCE=.\main.c\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release"\r
-\r
-DEP_CPP_MAIN_=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\main.obj" : $(SOURCE) $(DEP_CPP_MAIN_) "$(INTDIR)"\r
-\r
-\r
-!ELSEIF "$(CFG)" == "ftp - Win32 Debug"\r
-\r
-DEP_CPP_MAIN_=\\r
- "..\..\..\emacs-19.34\nt\inc\netdb.h"\\r
- "..\..\..\emacs-19.34\nt\inc\pwd.h"\\r
- "..\..\..\emacs-19.34\nt\inc\sys\ioctl.h"\\r
- "..\..\..\emacs-19.34\nt\inc\sys\socket.h"\\r
- "..\..\..\emacs-19.34\src\nt.h"\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
- {$(INCLUDE)}"sys\types.h"\\r
-\r
-\r
-"$(INTDIR)\main.obj" : $(SOURCE) $(DEP_CPP_MAIN_) "$(INTDIR)"\r
-\r
-\r
-!ENDIF\r
-\r
-SOURCE=.\ruserpass.c\r
-\r
-!IF "$(CFG)" == "ftp - Win32 Release"\r
-\r
-DEP_CPP_RUSER=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
-\r
-\r
-"$(INTDIR)\ruserpass.obj" : $(SOURCE) $(DEP_CPP_RUSER) "$(INTDIR)"\r
-\r
-\r
-!ELSEIF "$(CFG)" == "ftp - Win32 Debug"\r
-\r
-DEP_CPP_RUSER=\\r
- ".\fake.h"\\r
- ".\ftp_var.h"\\r
- ".\prototypes.h"\\r
- {$(INCLUDE)}"sys\stat.h"\\r
- {$(INCLUDE)}"sys\types.h"\\r
-\r
-\r
-"$(INTDIR)\ruserpass.obj" : $(SOURCE) $(DEP_CPP_RUSER) "$(INTDIR)"\r
-\r
-\r
-!ENDIF\r
-\r
-\r
-!ENDIF\r
+# Microsoft Developer Studio Generated NMAKE File, Based on ftp.dsp
+!IF "$(CFG)" == ""
+CFG=ftp - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to ftp - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "ftp - Win32 Release" && "$(CFG)" != "ftp - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "ftp.mak" CFG="ftp - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "ftp - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "ftp - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IF "$(CFG)" == "ftp - Win32 Release"
+
+OUTDIR=.\Release
+INTDIR=.\Release
+# Begin Custom Macros
+OutDir=.\Release
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\ftp.exe" "\emacs-19.34\bin\ftp.exe"
+
+!ELSE
+
+ALL : "$(OUTDIR)\ftp.exe" "\emacs-19.34\bin\ftp.exe"
+
+!ENDIF
+
+CLEAN :
+ -@erase "$(INTDIR)\cmds.obj"
+ -@erase "$(INTDIR)\cmdtab.obj"
+ -@erase "$(INTDIR)\domacro.obj"
+ -@erase "$(INTDIR)\fake.obj"
+ -@erase "$(INTDIR)\ftp.obj"
+ -@erase "$(INTDIR)\main.obj"
+ -@erase "$(INTDIR)\ruserpass.obj"
+ -@erase "$(INTDIR)\vc50.idb"
+ -@erase "$(OUTDIR)\ftp.exe"
+ -@erase "\emacs-19.34\bin\ftp.exe"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /ML /W3 /GX /O2 /I "C:\emacs-19.34\nt\inc" /I\
+ "C:\emacs-19.34\src" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D\
+ "HAVE_TIMEVAL" /Fp"$(INTDIR)\ftp.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD\
+ /c
+CPP_OBJS=.\Release/
+CPP_SBRS=.
+
+.c{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\ftp.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /subsystem:console /incremental:no\
+ /pdb:"$(OUTDIR)\ftp.pdb" /machine:I386 /out:"$(OUTDIR)\ftp.exe"
+LINK32_OBJS= \
+ "$(INTDIR)\cmds.obj" \
+ "$(INTDIR)\cmdtab.obj" \
+ "$(INTDIR)\domacro.obj" \
+ "$(INTDIR)\fake.obj" \
+ "$(INTDIR)\ftp.obj" \
+ "$(INTDIR)\main.obj" \
+ "$(INTDIR)\ruserpass.obj" \
+ "d:\Program Files\DevStudio\VC\lib\WSOCK32.LIB"
+
+"$(OUTDIR)\ftp.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+TargetPath=.\Release\ftp.exe
+InputPath=.\Release\ftp.exe
+SOURCE=$(InputPath)
+
+"\emacs-19.34\bin\ftp.exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+# copy $(TargetPath) \emacs-19.34\bin
+
+!ELSEIF "$(CFG)" == "ftp - Win32 Debug"
+
+OUTDIR=.\Debug
+INTDIR=.\Debug
+# Begin Custom Macros
+OutDir=.\Debug
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\ftp.exe" "\emacs-19.34\bin\ftp.exe"
+
+!ELSE
+
+ALL : "$(OUTDIR)\ftp.exe" "\emacs-19.34\bin\ftp.exe"
+
+!ENDIF
+
+CLEAN :
+ -@erase "$(INTDIR)\cmds.obj"
+ -@erase "$(INTDIR)\cmdtab.obj"
+ -@erase "$(INTDIR)\domacro.obj"
+ -@erase "$(INTDIR)\fake.obj"
+ -@erase "$(INTDIR)\ftp.obj"
+ -@erase "$(INTDIR)\main.obj"
+ -@erase "$(INTDIR)\ruserpass.obj"
+ -@erase "$(INTDIR)\vc50.idb"
+ -@erase "$(INTDIR)\vc50.pdb"
+ -@erase "$(OUTDIR)\ftp.exe"
+ -@erase "$(OUTDIR)\ftp.ilk"
+ -@erase "$(OUTDIR)\ftp.pdb"
+ -@erase "\emacs-19.34\bin\ftp.exe"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /I "C:\emacs-19.34\nt\inc" /I\
+ "C:\emacs-19.34\src" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS"\
+ /Fp"$(INTDIR)\ftp.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+CPP_OBJS=.\Debug/
+CPP_SBRS=.
+
+.c{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\ftp.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /subsystem:console /incremental:yes\
+ /pdb:"$(OUTDIR)\ftp.pdb" /debug /machine:I386 /out:"$(OUTDIR)\ftp.exe"\
+ /pdbtype:sept
+LINK32_OBJS= \
+ "$(INTDIR)\cmds.obj" \
+ "$(INTDIR)\cmdtab.obj" \
+ "$(INTDIR)\domacro.obj" \
+ "$(INTDIR)\fake.obj" \
+ "$(INTDIR)\ftp.obj" \
+ "$(INTDIR)\main.obj" \
+ "$(INTDIR)\ruserpass.obj" \
+ "d:\Program Files\DevStudio\VC\lib\WSOCK32.LIB"
+
+"$(OUTDIR)\ftp.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+TargetPath=.\Debug\ftp.exe
+InputPath=.\Debug\ftp.exe
+SOURCE=$(InputPath)
+
+"\emacs-19.34\bin\ftp.exe" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+# copy $(TargetPath) \emacs-19.34\bin
+
+!ENDIF
+
+
+!IF "$(CFG)" == "ftp - Win32 Release" || "$(CFG)" == "ftp - Win32 Debug"
+SOURCE=.\cmds.c
+
+!IF "$(CFG)" == "ftp - Win32 Release"
+
+DEP_CPP_CMDS_=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\pathnames.h"\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\cmds.obj" : $(SOURCE) $(DEP_CPP_CMDS_) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "ftp - Win32 Debug"
+
+DEP_CPP_CMDS_=\
+ "..\..\..\emacs-19.34\nt\inc\netdb.h"\
+ "..\..\..\emacs-19.34\nt\inc\netinet\in.h"\
+ "..\..\..\emacs-19.34\nt\inc\sys\socket.h"\
+ "..\..\..\emacs-19.34\src\nt.h"\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\pathnames.h"\
+ ".\prototypes.h"\
+ {$(INCLUDE)}"sys\stat.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\cmds.obj" : $(SOURCE) $(DEP_CPP_CMDS_) "$(INTDIR)"
+
+
+!ENDIF
+
+SOURCE=.\cmdtab.c
+DEP_CPP_CMDTA=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+
+
+"$(INTDIR)\cmdtab.obj" : $(SOURCE) $(DEP_CPP_CMDTA) "$(INTDIR)"
+
+
+SOURCE=.\domacro.c
+DEP_CPP_DOMAC=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\domacro.obj" : $(SOURCE) $(DEP_CPP_DOMAC) "$(INTDIR)"
+
+
+SOURCE=.\fake.c
+DEP_CPP_FAKE_=\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\fake.obj" : $(SOURCE) $(DEP_CPP_FAKE_) "$(INTDIR)"
+
+
+SOURCE=.\ftp.c
+
+!IF "$(CFG)" == "ftp - Win32 Release"
+
+DEP_CPP_FTP_C=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\ftp.obj" : $(SOURCE) $(DEP_CPP_FTP_C) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "ftp - Win32 Debug"
+
+DEP_CPP_FTP_C=\
+ "..\..\..\emacs-19.34\nt\inc\netdb.h"\
+ "..\..\..\emacs-19.34\nt\inc\netinet\in.h"\
+ "..\..\..\emacs-19.34\nt\inc\pwd.h"\
+ "..\..\..\emacs-19.34\nt\inc\sys\file.h"\
+ "..\..\..\emacs-19.34\nt\inc\sys\ioctl.h"\
+ "..\..\..\emacs-19.34\nt\inc\sys\param.h"\
+ "..\..\..\emacs-19.34\nt\inc\sys\socket.h"\
+ "..\..\..\emacs-19.34\nt\inc\sys\time.h"\
+ "..\..\..\emacs-19.34\src\nt.h"\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+ {$(INCLUDE)}"sys\stat.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\ftp.obj" : $(SOURCE) $(DEP_CPP_FTP_C) "$(INTDIR)"
+
+
+!ENDIF
+
+SOURCE=.\main.c
+
+!IF "$(CFG)" == "ftp - Win32 Release"
+
+DEP_CPP_MAIN_=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\main.obj" : $(SOURCE) $(DEP_CPP_MAIN_) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "ftp - Win32 Debug"
+
+DEP_CPP_MAIN_=\
+ "..\..\..\emacs-19.34\nt\inc\netdb.h"\
+ "..\..\..\emacs-19.34\nt\inc\pwd.h"\
+ "..\..\..\emacs-19.34\nt\inc\sys\ioctl.h"\
+ "..\..\..\emacs-19.34\nt\inc\sys\socket.h"\
+ "..\..\..\emacs-19.34\src\nt.h"\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\main.obj" : $(SOURCE) $(DEP_CPP_MAIN_) "$(INTDIR)"
+
+
+!ENDIF
+
+SOURCE=.\ruserpass.c
+
+!IF "$(CFG)" == "ftp - Win32 Release"
+
+DEP_CPP_RUSER=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+
+
+"$(INTDIR)\ruserpass.obj" : $(SOURCE) $(DEP_CPP_RUSER) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "ftp - Win32 Debug"
+
+DEP_CPP_RUSER=\
+ ".\fake.h"\
+ ".\ftp_var.h"\
+ ".\prototypes.h"\
+ {$(INCLUDE)}"sys\stat.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\ruserpass.obj" : $(SOURCE) $(DEP_CPP_RUSER) "$(INTDIR)"
+
+
+!ENDIF
+
+
+!ENDIF
-#include "fake.h"\r
-#include <winsock.h>\r
-#include <setjmp.h>\r
-\r
-//typedef void (*Sig_t)(int);\r
-\r
-int fgetcSocket(int s);\r
-char *fputsSocket(char *format, int s);\r
-\r
-char *fprintfSocket(int s, char *format, ...);\r
-\r
-int fputcSocket(int s, char putChar);\r
-int fputSocket(int s, char *putChar, int len);\r
-char *fgetsSocket(int s, char *string);\r
-\r
-/* The following defines are from ftp.h and telnet.h from bsd.h */\r
-/* All relevent copyrights below apply. */\r
-\r
-#define IAC 255\r
-#define DONT 254\r
-#define DO 253\r
-#define WONT 252\r
-#define WILL 251\r
-#define SB 250\r
-#define GA 249\r
-#define EL 248\r
-#define EC 247\r
-#define AYT 246\r
-#define AO 245\r
-#define IP 244\r
-#define BREAK 243\r
-#define DM 242\r
-#define NOP 241\r
-#define SE 240\r
-#define EOR 239\r
-#define ABORT 238\r
-#define SUSP 237\r
-#define xEOF 236\r
-\r
-\r
-#define MAXPATHLEN 255\r
-#define TYPE_A 'A'\r
-#define TYPE_I 'I'\r
-#define TYPE_E 'E'\r
-#define TYPE_L 'L'\r
-\r
-#define PRELIM 1\r
-#define COMPLETE 2\r
-#define CONTINUE 3\r
-#define TRANSIENT 4\r
-\r
-#define MODE_S 1\r
-#define MODE_B 2\r
-#define MODE_C 3\r
-\r
-#define STRU_F 1\r
-#define STRU_R 2\r
-#define STRU_P 3\r
-\r
-#define SIGQUIT 1\r
-#define SIGPIPE 2\r
-#define SIGALRM 3\r
-\r
-\r
-#define FORM_N 1\r
-#define FORM_T 2\r
-#define FORM_C 3\r
-\r
-\r
-/*\r
- * Copyright (c) 1985 Regents of the University of California.\r
- * All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms are permitted\r
- * provided that the above copyright notice and this paragraph are\r
- * duplicated in all such forms and that any documentation,\r
- * advertising materials, and other materials related to such\r
- * distribution and use acknowledge that the software was developed\r
- * by the University of California, Berkeley. The name of the\r
- * University may not be used to endorse or promote products derived\r
- * from this software without specific prior written permission.\r
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\r
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\r
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
- *\r
- * @(#)ftp_var.h 5.5 (Berkeley) 6/29/88\r
- */\r
-\r
-/*\r
- * FTP global variables.\r
- */\r
-\r
-/*\r
- * Options and other state info.\r
- */\r
-extern int trace; /* trace packets exchanged */\r
-extern int hash; /* print # for each buffer transferred */\r
-extern int sendport; /* use PORT cmd for each data connection */\r
-extern int verbose; /* print messages coming back from server */\r
-extern int connected; /* connected to server */\r
-extern int fromatty; /* input is from a terminal */\r
-extern int interactive; /* interactively prompt on m* cmds */\r
-extern int debug; /* debugging level */\r
-extern int bell; /* ring bell on cmd completion */\r
-extern int doglob; /* glob local file names */\r
-extern int proxy; /* proxy server connection active */\r
-extern int proxflag; /* proxy connection exists */\r
-extern int sunique; /* store files on server with unique name */\r
-extern int runique; /* store local files with unique name */\r
-extern int mcase; /* map upper to lower case for mget names */\r
-extern int ntflag; /* use ntin ntout tables for name translation */\r
-extern int mapflag; /* use mapin mapout templates on file names */\r
-extern int code; /* return/reply code for ftp command */\r
-extern int crflag; /* if 1, strip car. rets. on ascii gets */\r
-extern char pasv[64]; /* passive port for proxy data connection */\r
-extern int passivemode; /* passive mode enabled */\r
-extern char *altarg; /* argv[1] with no shell-like preprocessing */\r
-extern char ntin[17]; /* input translation table */\r
-extern char ntout[17]; /* output translation table */\r
-\r
-extern char mapin[MAXPATHLEN]; /* input map template */\r
-extern char mapout[MAXPATHLEN]; /* output map template */\r
-extern char typename[32]; /* name of file transfer type */\r
-extern int type; /* file transfer type */\r
-extern char structname[32]; /* name of file transfer structure */\r
-extern int stru; /* file transfer structure */\r
-extern char formname[32]; /* name of file transfer format */\r
-extern int form; /* file transfer format */\r
-extern char modename[32]; /* name of file transfer mode */\r
-extern int mode; /* file transfer mode */\r
-extern char bytename[32]; /* local byte size in ascii */\r
-extern int bytesize; /* local byte size in binary */\r
-\r
-extern jmp_buf toplevel; /* non-local goto stuff for cmd scanner */\r
-\r
-extern char line[200]; /* input line buffer */\r
-extern char *stringbase; /* current scan point in line buffer */\r
-extern char argbuf[200]; /* argument storage buffer */\r
-extern char *argbase; /* current storage point in arg buffer */\r
-extern int margc; /* count of arguments on input line */\r
-extern char *margv[20]; /* args parsed from input line */\r
-extern int cpend; /* flag: if != 0, then pending server reply */\r
-extern int mflag; /* flag: if != 0, then active multi command */\r
-\r
-extern int options; /* used during socket creation */\r
-\r
-/*\r
- * Format of command table.\r
- */\r
-struct cmd {\r
- char *c_name; /* name of command */\r
- char *c_help; /* help string */\r
- char c_bell; /* give bell when command completes */\r
- char c_conn; /* must be connected to use command */\r
- char c_proxy; /* proxy server may execute */\r
- int (*c_handler)(); /* function to call */\r
-};\r
-\r
-struct macel {\r
- char mac_name[9]; /* macro name */\r
- char *mac_start; /* start of macro in macbuf */\r
- char *mac_end; /* end of macro in macbuf */\r
-};\r
-\r
-int macnum; /* number of defined macros */\r
-struct macel macros[16];\r
-char macbuf[4096];\r
-\r
-extern char *tail();\r
-extern char *remglob();\r
-extern int errno;\r
-extern char *mktemp();\r
-\r
-#if defined(__ANSI__) || defined(sparc)\r
-typedef void sig_t;\r
-#else\r
-typedef int sig_t;\r
-#endif\r
-\r
-typedef int uid_t;\r
-int herror(char *s);\r
+#include "fake.h"
+#include <winsock.h>
+#include <setjmp.h>
+
+//typedef void (*Sig_t)(int);
+
+int fgetcSocket(int s);
+char *fputsSocket(char *format, int s);
+
+char *fprintfSocket(int s, char *format, ...);
+
+int fputcSocket(int s, char putChar);
+int fputSocket(int s, char *putChar, int len);
+char *fgetsSocket(int s, char *string);
+
+/* The following defines are from ftp.h and telnet.h from bsd.h */
+/* All relevent copyrights below apply. */
+
+#define IAC 255
+#define DONT 254
+#define DO 253
+#define WONT 252
+#define WILL 251
+#define SB 250
+#define GA 249
+#define EL 248
+#define EC 247
+#define AYT 246
+#define AO 245
+#define IP 244
+#define BREAK 243
+#define DM 242
+#define NOP 241
+#define SE 240
+#define EOR 239
+#define ABORT 238
+#define SUSP 237
+#define xEOF 236
+
+
+#define MAXPATHLEN 255
+#define TYPE_A 'A'
+#define TYPE_I 'I'
+#define TYPE_E 'E'
+#define TYPE_L 'L'
+
+#define PRELIM 1
+#define COMPLETE 2
+#define CONTINUE 3
+#define TRANSIENT 4
+
+#define MODE_S 1
+#define MODE_B 2
+#define MODE_C 3
+
+#define STRU_F 1
+#define STRU_R 2
+#define STRU_P 3
+
+#define SIGQUIT 1
+#define SIGPIPE 2
+#define SIGALRM 3
+
+
+#define FORM_N 1
+#define FORM_T 2
+#define FORM_C 3
+
+
+/*
+ * Copyright (c) 1985 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * @(#)ftp_var.h 5.5 (Berkeley) 6/29/88
+ */
+
+/*
+ * FTP global variables.
+ */
+
+/*
+ * Options and other state info.
+ */
+extern int trace; /* trace packets exchanged */
+extern int hash; /* print # for each buffer transferred */
+extern int sendport; /* use PORT cmd for each data connection */
+extern int verbose; /* print messages coming back from server */
+extern int connected; /* connected to server */
+extern int fromatty; /* input is from a terminal */
+extern int interactive; /* interactively prompt on m* cmds */
+extern int debug; /* debugging level */
+extern int bell; /* ring bell on cmd completion */
+extern int doglob; /* glob local file names */
+extern int proxy; /* proxy server connection active */
+extern int proxflag; /* proxy connection exists */
+extern int sunique; /* store files on server with unique name */
+extern int runique; /* store local files with unique name */
+extern int mcase; /* map upper to lower case for mget names */
+extern int ntflag; /* use ntin ntout tables for name translation */
+extern int mapflag; /* use mapin mapout templates on file names */
+extern int code; /* return/reply code for ftp command */
+extern int crflag; /* if 1, strip car. rets. on ascii gets */
+extern char pasv[64]; /* passive port for proxy data connection */
+extern int passivemode; /* passive mode enabled */
+extern char *altarg; /* argv[1] with no shell-like preprocessing */
+extern char ntin[17]; /* input translation table */
+extern char ntout[17]; /* output translation table */
+
+extern char mapin[MAXPATHLEN]; /* input map template */
+extern char mapout[MAXPATHLEN]; /* output map template */
+extern char typename[32]; /* name of file transfer type */
+extern int type; /* file transfer type */
+extern char structname[32]; /* name of file transfer structure */
+extern int stru; /* file transfer structure */
+extern char formname[32]; /* name of file transfer format */
+extern int form; /* file transfer format */
+extern char modename[32]; /* name of file transfer mode */
+extern int mode; /* file transfer mode */
+extern char bytename[32]; /* local byte size in ascii */
+extern int bytesize; /* local byte size in binary */
+
+extern jmp_buf toplevel; /* non-local goto stuff for cmd scanner */
+
+extern char line[200]; /* input line buffer */
+extern char *stringbase; /* current scan point in line buffer */
+extern char argbuf[200]; /* argument storage buffer */
+extern char *argbase; /* current storage point in arg buffer */
+extern int margc; /* count of arguments on input line */
+extern char *margv[20]; /* args parsed from input line */
+extern int cpend; /* flag: if != 0, then pending server reply */
+extern int mflag; /* flag: if != 0, then active multi command */
+
+extern int options; /* used during socket creation */
+
+/*
+ * Format of command table.
+ */
+struct cmd {
+ char *c_name; /* name of command */
+ char *c_help; /* help string */
+ char c_bell; /* give bell when command completes */
+ char c_conn; /* must be connected to use command */
+ char c_proxy; /* proxy server may execute */
+ int (*c_handler)(); /* function to call */
+};
+
+struct macel {
+ char mac_name[9]; /* macro name */
+ char *mac_start; /* start of macro in macbuf */
+ char *mac_end; /* end of macro in macbuf */
+};
+
+int macnum; /* number of defined macros */
+struct macel macros[16];
+char macbuf[4096];
+
+extern char *tail();
+extern char *remglob();
+extern int errno;
+extern char *mktemp();
+
+#if defined(__ANSI__) || defined(sparc)
+typedef void sig_t;
+#else
+typedef int sig_t;
+#endif
+
+typedef int uid_t;
+int herror(char *s);
-/*\r
- * Copyright (c) 1985, 1989 Regents of the University of California.\r
- * All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms are permitted\r
- * provided that the above copyright notice and this paragraph are\r
- * duplicated in all such forms and that any documentation,\r
- * advertising materials, and other materials related to such\r
- * distribution and use acknowledge that the software was developed\r
- * by the University of California, Berkeley. The name of the\r
- * University may not be used to endorse or promote products derived\r
- * from this software without specific prior written permission.\r
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\r
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\r
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
- */\r
-\r
-#ifndef lint\r
-char copyright[] =\r
-"@(#) Copyright (c) 1985, 1989 Regents of the University of California.\n\\r
- All rights reserved.\n";\r
-#endif /* not lint */\r
-\r
-#ifndef lint\r
-static char sccsid[] = "@(#)main.c based on 5.13 (Berkeley) 3/14/89";\r
-#endif /* not lint */\r
-\r
-/*\r
- * FTP User Program -- Command Interface.\r
- */\r
-#if !defined(WIN32)\r
-#include <netdb.h>\r
-#include <sys/socket.h>\r
-#include <sys/ioctl.h>\r
-#include <arpa/ftp.h>\r
-#include <errno.h>\r
-#include <pwd.h>\r
-#endif\r
-#include "ftp_var.h"\r
-#include "prototypes.h"\r
-#include <sys/types.h>\r
-\r
-#include <io.h>\r
-#include <fcntl.h>\r
-\r
-#include <signal.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <ctype.h>\r
-\r
-\r
-#if defined(sun) && !defined(FD_SET)\r
-typedef int uid_t;\r
-#endif\r
-\r
-uid_t getuid();\r
-void intr();\r
-void lostpeer();\r
-char *getlogin();\r
-\r
-short portnum;\r
-\r
-char home[128];\r
-char *globerr;\r
-int autologin;\r
-\r
-\r
-\r
-/* Lot's of options... */\r
-/*\r
- * Options and other state info.\r
- */\r
-int trace; /* trace packets exchanged */\r
-int hash; /* print # for each buffer transferred */\r
-int sendport; /* use PORT cmd for each data connection */\r
-int verbose; /* print messages coming back from server */\r
-int connected; /* connected to server */\r
-int fromatty; /* input is from a terminal */\r
-int interactive; /* interactively prompt on m* cmds */\r
-int debug; /* debugging level */\r
-int bell; /* ring bell on cmd completion */\r
-int doglob; /* glob local file names */\r
-int proxy; /* proxy server connection active */\r
-int passivemode;\r
-int proxflag; /* proxy connection exists */\r
-int sunique; /* store files on server with unique name */\r
-int runique; /* store local files with unique name */\r
-int mcase; /* map upper to lower case for mget names */\r
-int ntflag; /* use ntin ntout tables for name translation */\r
-int mapflag; /* use mapin mapout templates on file names */\r
-int code; /* return/reply code for ftp command */\r
-int crflag; /* if 1, strip car. rets. on ascii gets */\r
-char pasv[64]; /* passive port for proxy data connection */\r
-char *altarg; /* argv[1] with no shell-like preprocessing */\r
-char ntin[17]; /* input translation table */\r
-char ntout[17]; /* output translation table */\r
-// #include <sys/param.h>\r
-char mapin[MAXPATHLEN]; /* input map template */\r
-char mapout[MAXPATHLEN]; /* output map template */\r
-char typename[32]; /* name of file transfer type */\r
-int type; /* file transfer type */\r
-char structname[32]; /* name of file transfer structure */\r
-int stru; /* file transfer structure */\r
-char formname[32]; /* name of file transfer format */\r
-int form; /* file transfer format */\r
-char modename[32]; /* name of file transfer mode */\r
-int mode; /* file transfer mode */\r
-char bytename[32]; /* local byte size in ascii */\r
-int bytesize; /* local byte size in binary */\r
-\r
-jmp_buf toplevel; /* non-local goto stuff for cmd scanner */\r
-\r
-char line[200]; /* input line buffer */\r
-char *stringbase; /* current scan point in line buffer */\r
-char argbuf[200]; /* argument storage buffer */\r
-char *argbase; /* current storage point in arg buffer */\r
-int margc; /* count of arguments on input line */\r
-char *margv[20]; /* args parsed from input line */\r
-int cpend; /* flag: if != 0, then pending server reply */\r
-int mflag; /* flag: if != 0, then active multi command */\r
-\r
-int options; /* used during socket creation */\r
-\r
-\r
-\r
-int main(int argc, char *argv[])\r
-{\r
- register char *cp;\r
- int top;\r
- struct passwd *pw = NULL;\r
-#if 0\r
- char homedir[MAXPATHLEN];\r
-#endif\r
-\r
- int err;\r
- WORD wVerReq;\r
-\r
- WSADATA WSAData;\r
- struct servent *sp; /* service spec for tcp/ftp */\r
-\r
- /* Disable output buffering, for the benefit of Emacs. */\r
- //setbuf(stdout, NULL);\r
-\r
- _fmode = O_BINARY; // This causes an error somewhere.\r
-\r
- wVerReq = MAKEWORD(1,1);\r
-\r
- err = WSAStartup(wVerReq, &WSAData);\r
- if (err != 0)\r
- {\r
- fprintf(stderr, "Could not initialize Windows socket interface.");\r
- exit(1);\r
- }\r
-\r
- sp = getservbyname("ftp", "tcp");\r
- if (sp == 0) {\r
- fprintf(stderr, "ftp: ftp/tcp: unknown service\n");\r
- exit(1);\r
- }\r
-\r
- portnum = sp->s_port;\r
-\r
-\r
- doglob = 1;\r
- interactive = 1;\r
- autologin = 1;\r
- argc--, argv++;\r
- while (argc > 0 && **argv == '-') {\r
- for (cp = *argv + 1; *cp; cp++)\r
- switch (*cp) {\r
-\r
- case 'd':\r
- options |= SO_DEBUG;\r
- debug++;\r
- break;\r
-\r
- case 'v':\r
- verbose++;\r
- break;\r
-\r
- case 't':\r
- trace++;\r
- break;\r
-\r
- case 'i':\r
- interactive = 0;\r
- break;\r
-\r
- case 'n':\r
- autologin = 0;\r
- break;\r
-\r
- case 'g':\r
- doglob = 0;\r
- break;\r
-\r
- default:\r
- fprintf(stdout,\r
- "ftp: %c: unknown option\n", *cp);\r
- exit(1);\r
- }\r
- argc--, argv++;\r
- }\r
-// fromatty = isatty(fileno(stdin));\r
- fromatty = 1; // Strengthen this test\r
- /*\r
- * Set up defaults for FTP.\r
- */\r
- (void) strcpy(typename, "ascii"), type = TYPE_A;\r
- (void) strcpy(formname, "non-print"), form = FORM_N;\r
- (void) strcpy(modename, "stream"), mode = MODE_S;\r
- (void) strcpy(structname, "file"), stru = STRU_F;\r
- (void) strcpy(bytename, "8"), bytesize = 8;\r
- if (fromatty)\r
- verbose++;\r
- cpend = 0; /* no pending replies */\r
- proxy = 0; /* proxy not active */\r
- passivemode = 1; /* passive mode *is* active */\r
- crflag = 1; /* strip c.r. on ascii gets */\r
- /*\r
- * Set up the home directory in case we're globbing.\r
- */\r
-#if 0\r
- cp = getlogin();\r
- if (cp != NULL) {\r
- pw = getpwnam(cp);\r
- }\r
- if (pw == NULL)\r
- pw = getpwuid(getuid());\r
- if (pw != NULL) {\r
- home = homedir;\r
- (void) strcpy(home, pw->pw_dir);\r
- }\r
-#endif\r
- strcpy(home, "C:/");\r
- if (argc > 0) {\r
- if (setjmp(toplevel))\r
- exit(0);\r
-// (void) signal(SIGINT, intr);\r
-// (void) signal(SIGPIPE, lostpeer);\r
- setpeer(argc + 1, argv - 1);\r
- }\r
- top = setjmp(toplevel) == 0;\r
- if (top) {\r
-// (void) signal(SIGINT, intr);\r
-// (void) signal(SIGPIPE, lostpeer);\r
- }\r
- for (;;) {\r
- cmdscanner(top);\r
- top = 1;\r
- }\r
-}\r
-\r
-void\r
-intr()\r
-{\r
-\r
- longjmp(toplevel, 1);\r
-}\r
-\r
-void lostpeer(void)\r
-{\r
- extern int cout;\r
- extern int data;\r
-\r
- if (connected) {\r
- if (cout != (int) NULL) {\r
- closesocket(cout);\r
- cout = (int) NULL;\r
- }\r
- if (data >= 0) {\r
- (void) shutdown(data, 1+1);\r
- (void) close(data);\r
- data = -1;\r
- }\r
- connected = 0;\r
- }\r
- pswitch(1);\r
- if (connected) {\r
- if (cout != (int)NULL) {\r
- closesocket(cout);\r
- cout = (int) NULL;\r
- }\r
- connected = 0;\r
- }\r
- proxflag = 0;\r
- pswitch(0);\r
-}\r
-\r
-/*char *\r
-tail(filename)\r
- char *filename;\r
-{\r
- register char *s;\r
-\r
- while (*filename) {\r
- s = rindex(filename, '/');\r
- if (s == NULL)\r
- break;\r
- if (s[1])\r
- return (s + 1);\r
- *s = '\0';\r
- }\r
- return (filename);\r
-}\r
-*/\r
-/*\r
- * Command parser.\r
- */\r
-void cmdscanner(top)\r
- int top;\r
-{\r
- register struct cmd *c;\r
- struct cmd *getcmd();\r
- extern int help();\r
-\r
- if (!top)\r
- (void) putchar('\n');\r
- for (;;) {\r
- (void) fflush(stdout);\r
- if (fromatty) {\r
- printf("ftp> ");\r
- (void) fflush(stdout);\r
- }\r
- if (gets(line) == 0) {\r
- if (feof(stdin) || ferror(stdin))\r
- quit();\r
- break;\r
- }\r
- if (line[0] == 0)\r
- break;\r
- makeargv();\r
- if (margc == 0) {\r
- continue;\r
- }\r
- c = getcmd(margv[0]);\r
- if (c == (struct cmd *)-1) {\r
- printf("?Ambiguous command\n");\r
- continue;\r
- }\r
- if (c == 0) {\r
- printf("?Invalid command\n");\r
- continue;\r
- }\r
- if (c->c_conn && !connected) {\r
- printf ("Not connected.\n");\r
- continue;\r
- }\r
- (*c->c_handler)(margc, margv);\r
- if (bell && c->c_bell)\r
- (void) putchar('\007');\r
- if (c->c_handler != help)\r
- break;\r
- }\r
- (void) fflush(stdout);\r
-// (void) signal(SIGINT, intr);\r
-// (void) signal(SIGPIPE, lostpeer);\r
-}\r
-\r
-struct cmd *\r
-getcmd(name)\r
- register char *name;\r
-{\r
- extern struct cmd cmdtab[];\r
- register char *p, *q;\r
- register struct cmd *c, *found;\r
- register int nmatches, longest;\r
-\r
- longest = 0;\r
- nmatches = 0;\r
- found = 0;\r
- for (c = cmdtab; p = c->c_name; c++) {\r
- for (q = name; *q == *p++; q++)\r
- if (*q == 0) /* exact match? */\r
- return (c);\r
- if (!*q) { /* the name was a prefix */\r
- if (q - name > longest) {\r
- longest = q - name;\r
- nmatches = 1;\r
- found = c;\r
- } else if (q - name == longest)\r
- nmatches++;\r
- }\r
- }\r
- if (nmatches > 1)\r
- return ((struct cmd *)-1);\r
- return (found);\r
-}\r
-\r
-/*\r
- * Slice a string up into argc/argv.\r
- */\r
-\r
-int slrflag;\r
-\r
-void makeargv()\r
-{\r
- char **argp;\r
- char *slurpstring();\r
-\r
- margc = 0;\r
- argp = margv;\r
- stringbase = line; /* scan from first of buffer */\r
- argbase = argbuf; /* store from first of buffer */\r
- slrflag = 0;\r
- while (*argp++ = slurpstring())\r
- margc++;\r
-}\r
-\r
-/*\r
- * Parse string into argbuf;\r
- * implemented with FSM to\r
- * handle quoting and strings\r
- */\r
-char *\r
-slurpstring()\r
-{\r
- int got_one = 0;\r
- register char *sb = stringbase;\r
- register char *ap = argbase;\r
- char *tmp = argbase; /* will return this if token found */\r
-\r
- if (*sb == '!' || *sb == '$') { /* recognize ! as a token for shell */\r
- switch (slrflag) { /* and $ as token for macro invoke */\r
- case 0:\r
- slrflag++;\r
- stringbase++;\r
- return ((*sb == '!') ? "!" : "$");\r
- /* NOTREACHED */\r
- case 1:\r
- slrflag++;\r
- altarg = stringbase;\r
- break;\r
- default:\r
- break;\r
- }\r
- }\r
-\r
-S0:\r
- switch (*sb) {\r
-\r
- case '\0':\r
- goto OUT1;\r
-\r
- case ' ':\r
- case '\t':\r
- sb++; goto S0;\r
-\r
- default:\r
- switch (slrflag) {\r
- case 0:\r
- slrflag++;\r
- break;\r
- case 1:\r
- slrflag++;\r
- altarg = sb;\r
- break;\r
- default:\r
- break;\r
- }\r
- goto S1;\r
- }\r
-\r
-S1:\r
- switch (*sb) {\r
-\r
- case ' ':\r
- case '\t':\r
- case '\0':\r
- goto OUT1; /* end of token */\r
-\r
- case '\\':\r
- sb++; goto S2; /* slurp next character */\r
-\r
- case '"':\r
- sb++; goto S3; /* slurp quoted string */\r
-\r
- default:\r
- *ap++ = *sb++; /* add character to token */\r
- got_one = 1;\r
- goto S1;\r
- }\r
-\r
-S2:\r
- switch (*sb) {\r
-\r
- case '\0':\r
- goto OUT1;\r
-\r
- default:\r
- *ap++ = *sb++;\r
- got_one = 1;\r
- goto S1;\r
- }\r
-\r
-S3:\r
- switch (*sb) {\r
-\r
- case '\0':\r
- goto OUT1;\r
-\r
- case '"':\r
- sb++; goto S1;\r
-\r
- default:\r
- *ap++ = *sb++;\r
- got_one = 1;\r
- goto S3;\r
- }\r
-\r
-OUT1:\r
- if (got_one)\r
- *ap++ = '\0';\r
- argbase = ap; /* update storage pointer */\r
- stringbase = sb; /* update scan pointer */\r
- if (got_one) {\r
- return(tmp);\r
- }\r
- switch (slrflag) {\r
- case 0:\r
- slrflag++;\r
- break;\r
- case 1:\r
- slrflag++;\r
- altarg = (char *) 0;\r
- break;\r
- default:\r
- break;\r
- }\r
- return((char *)0);\r
-}\r
-\r
-#define HELPINDENT (sizeof ("directory"))\r
-\r
-/*\r
- * Help command.\r
- * Call each command handler with argc == 0 and argv[0] == name.\r
- */\r
-int help(argc, argv)\r
- int argc;\r
- char *argv[];\r
-{\r
- extern struct cmd cmdtab[];\r
- register struct cmd *c;\r
-\r
- if (argc == 1) {\r
- register int i, j, w, k;\r
- int columns, width = 0, lines;\r
- extern int NCMDS;\r
-\r
- printf("Commands may be abbreviated. Commands are:\n\n");\r
- for (c = cmdtab; c < &cmdtab[NCMDS]; c++) {\r
- int len = strlen(c->c_name);\r
-\r
- if (len > width)\r
- width = len;\r
- }\r
- width = (width + 8) &~ 7;\r
- columns = 80 / width;\r
- if (columns == 0)\r
- columns = 1;\r
- lines = (NCMDS + columns - 1) / columns;\r
- for (i = 0; i < lines; i++) {\r
- for (j = 0; j < columns; j++) {\r
- c = cmdtab + j * lines + i;\r
- if (c->c_name && (!proxy || c->c_proxy)) {\r
- printf("%s", c->c_name);\r
- }\r
- else if (c->c_name) {\r
- for (k=0; k < (int) strlen(c->c_name); k++) {\r
- (void) putchar(' ');\r
- }\r
- }\r
- if (c + lines >= &cmdtab[NCMDS]) {\r
- printf("\n");\r
- break;\r
- }\r
- w = strlen(c->c_name);\r
- while (w < width) {\r
- w = (w + 8) &~ 7;\r
- (void) putchar('\t');\r
- }\r
- }\r
- }\r
- (void) fflush(stdout);\r
- return 0;\r
- }\r
- while (--argc > 0) {\r
- register char *arg;\r
- arg = *++argv;\r
- c = getcmd(arg);\r
- if (c == (struct cmd *)-1)\r
- printf("?Ambiguous help command %s\n", arg);\r
- else if (c == (struct cmd *)0)\r
- printf("?Invalid help command %s\n", arg);\r
- else\r
- printf("%-*s\t%s\n", HELPINDENT,\r
- c->c_name, c->c_help);\r
- }\r
- (void) fflush(stdout);\r
- return 0;\r
-}\r
+/*
+ * Copyright (c) 1985, 1989 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1985, 1989 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)main.c based on 5.13 (Berkeley) 3/14/89";
+#endif /* not lint */
+
+/*
+ * FTP User Program -- Command Interface.
+ */
+#if !defined(WIN32)
+#include <netdb.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <arpa/ftp.h>
+#include <errno.h>
+#include <pwd.h>
+#endif
+#include "ftp_var.h"
+#include "prototypes.h"
+#include <sys/types.h>
+
+#include <io.h>
+#include <fcntl.h>
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+
+#if defined(sun) && !defined(FD_SET)
+typedef int uid_t;
+#endif
+
+uid_t getuid();
+void intr();
+void lostpeer();
+char *getlogin();
+
+short portnum;
+
+char home[128];
+char *globerr;
+int autologin;
+
+
+
+/* Lot's of options... */
+/*
+ * Options and other state info.
+ */
+int trace; /* trace packets exchanged */
+int hash; /* print # for each buffer transferred */
+int sendport; /* use PORT cmd for each data connection */
+int verbose; /* print messages coming back from server */
+int connected; /* connected to server */
+int fromatty; /* input is from a terminal */
+int interactive; /* interactively prompt on m* cmds */
+int debug; /* debugging level */
+int bell; /* ring bell on cmd completion */
+int doglob; /* glob local file names */
+int proxy; /* proxy server connection active */
+int passivemode;
+int proxflag; /* proxy connection exists */
+int sunique; /* store files on server with unique name */
+int runique; /* store local files with unique name */
+int mcase; /* map upper to lower case for mget names */
+int ntflag; /* use ntin ntout tables for name translation */
+int mapflag; /* use mapin mapout templates on file names */
+int code; /* return/reply code for ftp command */
+int crflag; /* if 1, strip car. rets. on ascii gets */
+char pasv[64]; /* passive port for proxy data connection */
+char *altarg; /* argv[1] with no shell-like preprocessing */
+char ntin[17]; /* input translation table */
+char ntout[17]; /* output translation table */
+// #include <sys/param.h>
+char mapin[MAXPATHLEN]; /* input map template */
+char mapout[MAXPATHLEN]; /* output map template */
+char typename[32]; /* name of file transfer type */
+int type; /* file transfer type */
+char structname[32]; /* name of file transfer structure */
+int stru; /* file transfer structure */
+char formname[32]; /* name of file transfer format */
+int form; /* file transfer format */
+char modename[32]; /* name of file transfer mode */
+int mode; /* file transfer mode */
+char bytename[32]; /* local byte size in ascii */
+int bytesize; /* local byte size in binary */
+
+jmp_buf toplevel; /* non-local goto stuff for cmd scanner */
+
+char line[200]; /* input line buffer */
+char *stringbase; /* current scan point in line buffer */
+char argbuf[200]; /* argument storage buffer */
+char *argbase; /* current storage point in arg buffer */
+int margc; /* count of arguments on input line */
+char *margv[20]; /* args parsed from input line */
+int cpend; /* flag: if != 0, then pending server reply */
+int mflag; /* flag: if != 0, then active multi command */
+
+int options; /* used during socket creation */
+
+
+
+int main(int argc, char *argv[])
+{
+ register char *cp;
+ int top;
+ struct passwd *pw = NULL;
+#if 0
+ char homedir[MAXPATHLEN];
+#endif
+
+ int err;
+ WORD wVerReq;
+
+ WSADATA WSAData;
+ struct servent *sp; /* service spec for tcp/ftp */
+
+ /* Disable output buffering, for the benefit of Emacs. */
+ //setbuf(stdout, NULL);
+
+ _fmode = O_BINARY; // This causes an error somewhere.
+
+ wVerReq = MAKEWORD(1,1);
+
+ err = WSAStartup(wVerReq, &WSAData);
+ if (err != 0)
+ {
+ fprintf(stderr, "Could not initialize Windows socket interface.");
+ exit(1);
+ }
+
+ sp = getservbyname("ftp", "tcp");
+ if (sp == 0) {
+ fprintf(stderr, "ftp: ftp/tcp: unknown service\n");
+ exit(1);
+ }
+
+ portnum = sp->s_port;
+
+
+ doglob = 1;
+ interactive = 1;
+ autologin = 1;
+ argc--, argv++;
+ while (argc > 0 && **argv == '-') {
+ for (cp = *argv + 1; *cp; cp++)
+ switch (*cp) {
+
+ case 'd':
+ options |= SO_DEBUG;
+ debug++;
+ break;
+
+ case 'v':
+ verbose++;
+ break;
+
+ case 't':
+ trace++;
+ break;
+
+ case 'i':
+ interactive = 0;
+ break;
+
+ case 'n':
+ autologin = 0;
+ break;
+
+ case 'g':
+ doglob = 0;
+ break;
+
+ default:
+ fprintf(stdout,
+ "ftp: %c: unknown option\n", *cp);
+ exit(1);
+ }
+ argc--, argv++;
+ }
+// fromatty = isatty(fileno(stdin));
+ fromatty = 1; // Strengthen this test
+ /*
+ * Set up defaults for FTP.
+ */
+ (void) strcpy(typename, "ascii"), type = TYPE_A;
+ (void) strcpy(formname, "non-print"), form = FORM_N;
+ (void) strcpy(modename, "stream"), mode = MODE_S;
+ (void) strcpy(structname, "file"), stru = STRU_F;
+ (void) strcpy(bytename, "8"), bytesize = 8;
+ if (fromatty)
+ verbose++;
+ cpend = 0; /* no pending replies */
+ proxy = 0; /* proxy not active */
+ passivemode = 1; /* passive mode *is* active */
+ crflag = 1; /* strip c.r. on ascii gets */
+ /*
+ * Set up the home directory in case we're globbing.
+ */
+#if 0
+ cp = getlogin();
+ if (cp != NULL) {
+ pw = getpwnam(cp);
+ }
+ if (pw == NULL)
+ pw = getpwuid(getuid());
+ if (pw != NULL) {
+ home = homedir;
+ (void) strcpy(home, pw->pw_dir);
+ }
+#endif
+ strcpy(home, "C:/");
+ if (argc > 0) {
+ if (setjmp(toplevel))
+ exit(0);
+// (void) signal(SIGINT, intr);
+// (void) signal(SIGPIPE, lostpeer);
+ setpeer(argc + 1, argv - 1);
+ }
+ top = setjmp(toplevel) == 0;
+ if (top) {
+// (void) signal(SIGINT, intr);
+// (void) signal(SIGPIPE, lostpeer);
+ }
+ for (;;) {
+ cmdscanner(top);
+ top = 1;
+ }
+}
+
+void
+intr()
+{
+
+ longjmp(toplevel, 1);
+}
+
+void lostpeer(void)
+{
+ extern int cout;
+ extern int data;
+
+ if (connected) {
+ if (cout != (int) NULL) {
+ closesocket(cout);
+ cout = (int) NULL;
+ }
+ if (data >= 0) {
+ (void) shutdown(data, 1+1);
+ (void) close(data);
+ data = -1;
+ }
+ connected = 0;
+ }
+ pswitch(1);
+ if (connected) {
+ if (cout != (int)NULL) {
+ closesocket(cout);
+ cout = (int) NULL;
+ }
+ connected = 0;
+ }
+ proxflag = 0;
+ pswitch(0);
+}
+
+/*char *
+tail(filename)
+ char *filename;
+{
+ register char *s;
+
+ while (*filename) {
+ s = rindex(filename, '/');
+ if (s == NULL)
+ break;
+ if (s[1])
+ return (s + 1);
+ *s = '\0';
+ }
+ return (filename);
+}
+*/
+/*
+ * Command parser.
+ */
+void cmdscanner(top)
+ int top;
+{
+ register struct cmd *c;
+ struct cmd *getcmd();
+ extern int help();
+
+ if (!top)
+ (void) putchar('\n');
+ for (;;) {
+ (void) fflush(stdout);
+ if (fromatty) {
+ printf("ftp> ");
+ (void) fflush(stdout);
+ }
+ if (gets(line) == 0) {
+ if (feof(stdin) || ferror(stdin))
+ quit();
+ break;
+ }
+ if (line[0] == 0)
+ break;
+ makeargv();
+ if (margc == 0) {
+ continue;
+ }
+ c = getcmd(margv[0]);
+ if (c == (struct cmd *)-1) {
+ printf("?Ambiguous command\n");
+ continue;
+ }
+ if (c == 0) {
+ printf("?Invalid command\n");
+ continue;
+ }
+ if (c->c_conn && !connected) {
+ printf ("Not connected.\n");
+ continue;
+ }
+ (*c->c_handler)(margc, margv);
+ if (bell && c->c_bell)
+ (void) putchar('\007');
+ if (c->c_handler != help)
+ break;
+ }
+ (void) fflush(stdout);
+// (void) signal(SIGINT, intr);
+// (void) signal(SIGPIPE, lostpeer);
+}
+
+struct cmd *
+getcmd(name)
+ register char *name;
+{
+ extern struct cmd cmdtab[];
+ register char *p, *q;
+ register struct cmd *c, *found;
+ register int nmatches, longest;
+
+ longest = 0;
+ nmatches = 0;
+ found = 0;
+ for (c = cmdtab; p = c->c_name; c++) {
+ for (q = name; *q == *p++; q++)
+ if (*q == 0) /* exact match? */
+ return (c);
+ if (!*q) { /* the name was a prefix */
+ if (q - name > longest) {
+ longest = q - name;
+ nmatches = 1;
+ found = c;
+ } else if (q - name == longest)
+ nmatches++;
+ }
+ }
+ if (nmatches > 1)
+ return ((struct cmd *)-1);
+ return (found);
+}
+
+/*
+ * Slice a string up into argc/argv.
+ */
+
+int slrflag;
+
+void makeargv()
+{
+ char **argp;
+ char *slurpstring();
+
+ margc = 0;
+ argp = margv;
+ stringbase = line; /* scan from first of buffer */
+ argbase = argbuf; /* store from first of buffer */
+ slrflag = 0;
+ while (*argp++ = slurpstring())
+ margc++;
+}
+
+/*
+ * Parse string into argbuf;
+ * implemented with FSM to
+ * handle quoting and strings
+ */
+char *
+slurpstring()
+{
+ int got_one = 0;
+ register char *sb = stringbase;
+ register char *ap = argbase;
+ char *tmp = argbase; /* will return this if token found */
+
+ if (*sb == '!' || *sb == '$') { /* recognize ! as a token for shell */
+ switch (slrflag) { /* and $ as token for macro invoke */
+ case 0:
+ slrflag++;
+ stringbase++;
+ return ((*sb == '!') ? "!" : "$");
+ /* NOTREACHED */
+ case 1:
+ slrflag++;
+ altarg = stringbase;
+ break;
+ default:
+ break;
+ }
+ }
+
+S0:
+ switch (*sb) {
+
+ case '\0':
+ goto OUT1;
+
+ case ' ':
+ case '\t':
+ sb++; goto S0;
+
+ default:
+ switch (slrflag) {
+ case 0:
+ slrflag++;
+ break;
+ case 1:
+ slrflag++;
+ altarg = sb;
+ break;
+ default:
+ break;
+ }
+ goto S1;
+ }
+
+S1:
+ switch (*sb) {
+
+ case ' ':
+ case '\t':
+ case '\0':
+ goto OUT1; /* end of token */
+
+ case '\\':
+ sb++; goto S2; /* slurp next character */
+
+ case '"':
+ sb++; goto S3; /* slurp quoted string */
+
+ default:
+ *ap++ = *sb++; /* add character to token */
+ got_one = 1;
+ goto S1;
+ }
+
+S2:
+ switch (*sb) {
+
+ case '\0':
+ goto OUT1;
+
+ default:
+ *ap++ = *sb++;
+ got_one = 1;
+ goto S1;
+ }
+
+S3:
+ switch (*sb) {
+
+ case '\0':
+ goto OUT1;
+
+ case '"':
+ sb++; goto S1;
+
+ default:
+ *ap++ = *sb++;
+ got_one = 1;
+ goto S3;
+ }
+
+OUT1:
+ if (got_one)
+ *ap++ = '\0';
+ argbase = ap; /* update storage pointer */
+ stringbase = sb; /* update scan pointer */
+ if (got_one) {
+ return(tmp);
+ }
+ switch (slrflag) {
+ case 0:
+ slrflag++;
+ break;
+ case 1:
+ slrflag++;
+ altarg = (char *) 0;
+ break;
+ default:
+ break;
+ }
+ return((char *)0);
+}
+
+#define HELPINDENT (sizeof ("directory"))
+
+/*
+ * Help command.
+ * Call each command handler with argc == 0 and argv[0] == name.
+ */
+int help(argc, argv)
+ int argc;
+ char *argv[];
+{
+ extern struct cmd cmdtab[];
+ register struct cmd *c;
+
+ if (argc == 1) {
+ register int i, j, w, k;
+ int columns, width = 0, lines;
+ extern int NCMDS;
+
+ printf("Commands may be abbreviated. Commands are:\n\n");
+ for (c = cmdtab; c < &cmdtab[NCMDS]; c++) {
+ int len = strlen(c->c_name);
+
+ if (len > width)
+ width = len;
+ }
+ width = (width + 8) &~ 7;
+ columns = 80 / width;
+ if (columns == 0)
+ columns = 1;
+ lines = (NCMDS + columns - 1) / columns;
+ for (i = 0; i < lines; i++) {
+ for (j = 0; j < columns; j++) {
+ c = cmdtab + j * lines + i;
+ if (c->c_name && (!proxy || c->c_proxy)) {
+ printf("%s", c->c_name);
+ }
+ else if (c->c_name) {
+ for (k=0; k < (int) strlen(c->c_name); k++) {
+ (void) putchar(' ');
+ }
+ }
+ if (c + lines >= &cmdtab[NCMDS]) {
+ printf("\n");
+ break;
+ }
+ w = strlen(c->c_name);
+ while (w < width) {
+ w = (w + 8) &~ 7;
+ (void) putchar('\t');
+ }
+ }
+ }
+ (void) fflush(stdout);
+ return 0;
+ }
+ while (--argc > 0) {
+ register char *arg;
+ arg = *++argv;
+ c = getcmd(arg);
+ if (c == (struct cmd *)-1)
+ printf("?Ambiguous help command %s\n", arg);
+ else if (c == (struct cmd *)0)
+ printf("?Invalid help command %s\n", arg);
+ else
+ printf("%-*s\t%s\n", HELPINDENT,
+ c->c_name, c->c_help);
+ }
+ (void) fflush(stdout);
+ return 0;
+}
-\r
-int getreply(int expecteof);\r
-int ruserpass(char *host, char **aname, char **apass, char **aacct);\r
-char *getpass(const char *prompt);\r
-void makeargv(void);\r
-void domacro(int argc, char *argv[]);\r
-void proxtrans(char *cmd, char *local, char *remote);\r
-int null(void);\r
-int initconn(void);\r
-void disconnect(void);\r
-void ptransfer(char *direction, long bytes, struct timeval *t0, struct timeval *t1);\r
-void setascii(void);\r
-void setbinary(void);\r
-void setebcdic(void);\r
-void settenex(void);\r
-void tvsub(struct timeval *tdiff, struct timeval *t1, struct timeval *t0);\r
-void setpassive(int argc, char *argv[]);\r
-void setpeer(int argc, char *argv[]);\r
-void cmdscanner(int top);\r
-void pswitch(int flag);\r
-void quit(void);\r
-int login(char *host);\r
-int command(char *fmt, ...);\r
-int globulize(char **cpp);\r
-void sendrequest(char *cmd, char *local, char *remote, int printnames);\r
-void recvrequest(char *cmd, char *local, char *remote, char *mode,\r
- int printnames);\r
-int confirm(char *cmd, char *file);\r
-void blkfree(char **av0);\r
-int getit(int argc, char *argv[], int restartit, char *mode);\r
-static int token(void);\r
-int sleep(int time);\r
+
+int getreply(int expecteof);
+int ruserpass(char *host, char **aname, char **apass, char **aacct);
+char *getpass(const char *prompt);
+void makeargv(void);
+void domacro(int argc, char *argv[]);
+void proxtrans(char *cmd, char *local, char *remote);
+int null(void);
+int initconn(void);
+void disconnect(void);
+void ptransfer(char *direction, long bytes, struct timeval *t0, struct timeval *t1);
+void setascii(void);
+void setbinary(void);
+void setebcdic(void);
+void settenex(void);
+void tvsub(struct timeval *tdiff, struct timeval *t1, struct timeval *t0);
+void setpassive(int argc, char *argv[]);
+void setpeer(int argc, char *argv[]);
+void cmdscanner(int top);
+void pswitch(int flag);
+void quit(void);
+int login(char *host);
+int command(char *fmt, ...);
+int globulize(char **cpp);
+void sendrequest(char *cmd, char *local, char *remote, int printnames);
+void recvrequest(char *cmd, char *local, char *remote, char *mode,
+ int printnames);
+int confirm(char *cmd, char *file);
+void blkfree(char **av0);
+int getit(int argc, char *argv[], int restartit, char *mode);
+static int token(void);
+int sleep(int time);
-/*\r
- * Copyright (c) 1985 Regents of the University of California.\r
- * All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms are permitted\r
- * provided that the above copyright notice and this paragraph are\r
- * duplicated in all such forms and that any documentation,\r
- * advertising materials, and other materials related to such\r
- * distribution and use acknowledge that the software was developed\r
- * by the University of California, Berkeley. The name of the\r
- * University may not be used to endorse or promote products derived\r
- * from this software without specific prior written permission.\r
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\r
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\r
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
- */\r
-\r
-#ifndef lint\r
-static char sccsid[] = "@(#)ruserpass.c 5.1 (Berkeley) 3/1/89";\r
-#endif /* not lint */\r
-\r
-#include <sys/types.h>\r
-#include <stdio.h>\r
-//#include <utmp.h>\r
-#include <ctype.h>\r
-#include <sys/stat.h>\r
-#include <errno.h>\r
-#include "ftp_var.h"\r
-#include "prototypes.h"\r
-#include <winsock.h>\r
-\r
-char *renvlook(), *index(), *getenv(), *getpass(), *getlogin();\r
-void *malloc();\r
-char *strcpy();\r
-struct utmp *getutmp();\r
-static FILE *cfile;\r
-\r
-#ifndef MAXHOSTNAMELEN\r
-#define MAXHOSTNAMELEN 64\r
-#endif\r
-\r
-#define DEFAULT 1\r
-#define LOGIN 2\r
-#define PASSWD 3\r
-#define ACCOUNT 4\r
-#define MACDEF 5\r
-#define ID 10\r
-#define MACH 11\r
-\r
-static char tokval[100];\r
-\r
-static struct toktab {\r
- char *tokstr;\r
- int tval;\r
-} toktab[]= {\r
- "default", DEFAULT,\r
- "login", LOGIN,\r
- "password", PASSWD,\r
- "passwd", PASSWD,\r
- "account", ACCOUNT,\r
- "machine", MACH,\r
- "macdef", MACDEF,\r
- 0, 0\r
-};\r
-\r
-extern char *hostname;\r
-\r
-int ruserpass(char *host, char **aname, char **apass, char **aacct)\r
-{\r
- char *hdir, buf[BUFSIZ], *tmp;\r
- char myname[MAXHOSTNAMELEN], *mydomain;\r
- int t, i, c, usedefault = 0;\r
- struct stat stb;\r
- extern int errno;\r
-\r
- hdir = getenv("HOME");\r
- if (hdir == NULL)\r
- hdir = ".";\r
- (void) sprintf(buf, "%s/.netrc", hdir);\r
- cfile = fopen(buf, "r");\r
- if (cfile == NULL) {\r
- if (errno != ENOENT)\r
- perror(buf);\r
- return(0);\r
- }\r
-\r
-\r
- if (gethostname(myname, sizeof(myname)) < 0)\r
- myname[0] = '\0';\r
- if ((mydomain = index(myname, '.')) == NULL)\r
- mydomain = "";\r
-next:\r
- while ((t = token())) switch(t) {\r
-\r
- case DEFAULT:\r
- usedefault = 1;\r
- /* FALL THROUGH */\r
-\r
- case MACH:\r
- if (!usedefault) {\r
- if (token() != ID)\r
- continue;\r
- /*\r
- * Allow match either for user's input host name\r
- * or official hostname. Also allow match of\r
- * incompletely-specified host in local domain.\r
- */\r
- if (strcasecmp(host, tokval) == 0)\r
- goto match;\r
- if (strcasecmp(hostname, tokval) == 0)\r
- goto match;\r
- if ((tmp = index(hostname, '.')) != NULL &&\r
- strcasecmp(tmp, mydomain) == 0 &&\r
- strncasecmp(hostname, tokval, tmp - hostname) == 0 &&\r
- tokval[tmp - hostname] == '\0')\r
- goto match;\r
- if ((tmp = index(host, '.')) != NULL &&\r
- strcasecmp(tmp, mydomain) == 0 &&\r
- strncasecmp(host, tokval, tmp - host) == 0 &&\r
- tokval[tmp - host] == '\0')\r
- goto match;\r
- continue;\r
- }\r
- match:\r
- while ((t = token()) && t != MACH && t != DEFAULT) switch(t) {\r
-\r
- case LOGIN:\r
- if (token())\r
- if (*aname == 0) { \r
- *aname = malloc((unsigned) strlen(tokval) + 1);\r
- (void) strcpy(*aname, tokval);\r
- } else {\r
- if (strcmp(*aname, tokval))\r
- goto next;\r
- }\r
- break;\r
- case PASSWD:\r
- if (strcmp(*aname, "anonymous") &&\r
- fstat(fileno(cfile), &stb) >= 0 &&\r
- (stb.st_mode & 077) != 0) {\r
- fprintf(stderr, "Error - .netrc file not correct mode.\n");\r
- fprintf(stderr, "Remove password or correct mode.\n");\r
- goto bad;\r
- }\r
- if (token() && *apass == 0) {\r
- *apass = malloc((unsigned) strlen(tokval) + 1);\r
- (void) strcpy(*apass, tokval);\r
- }\r
- break;\r
- case ACCOUNT:\r
- if (fstat(fileno(cfile), &stb) >= 0\r
- && (stb.st_mode & 077) != 0) {\r
- fprintf(stderr, "Error - .netrc file not correct mode.\n");\r
- fprintf(stderr, "Remove account or correct mode.\n");\r
- goto bad;\r
- }\r
- if (token() && *aacct == 0) {\r
- *aacct = malloc((unsigned) strlen(tokval) + 1);\r
- (void) strcpy(*aacct, tokval);\r
- }\r
- break;\r
- case MACDEF:\r
- if (proxy) {\r
- (void) fclose(cfile);\r
- return(0);\r
- }\r
- while ((c=getc(cfile)) != EOF && c == ' ' || c == '\t');\r
- if (c == EOF || c == '\n') {\r
- printf("Missing macdef name argument.\n");\r
- goto bad;\r
- }\r
- if (macnum == 16) {\r
- printf("Limit of 16 macros have already been defined\n");\r
- goto bad;\r
- }\r
- tmp = macros[macnum].mac_name;\r
- *tmp++ = c;\r
- for (i=0; i < 8 && (c=getc(cfile)) != EOF &&\r
- !isspace(c); ++i) {\r
- *tmp++ = c;\r
- }\r
- if (c == EOF) {\r
- printf("Macro definition missing null line terminator.\n");\r
- goto bad;\r
- }\r
- *tmp = '\0';\r
- if (c != '\n') {\r
- while ((c=getc(cfile)) != EOF && c != '\n');\r
- }\r
- if (c == EOF) {\r
- printf("Macro definition missing null line terminator.\n");\r
- goto bad;\r
- }\r
- if (macnum == 0) {\r
- macros[macnum].mac_start = macbuf;\r
- }\r
- else {\r
- macros[macnum].mac_start = macros[macnum-1].mac_end + 1;\r
- }\r
- tmp = macros[macnum].mac_start;\r
- while (tmp != macbuf + 4096) {\r
- if ((c=getc(cfile)) == EOF) {\r
- printf("Macro definition missing null line terminator.\n");\r
- goto bad;\r
- }\r
- *tmp = c;\r
- if (*tmp == '\n') {\r
- if (*(tmp-1) == '\0') {\r
- macros[macnum++].mac_end = tmp - 1;\r
- break;\r
- }\r
- *tmp = '\0';\r
- }\r
- tmp++;\r
- }\r
- if (tmp == macbuf + 4096) {\r
- printf("4K macro buffer exceeded\n");\r
- goto bad;\r
- }\r
- break;\r
- default:\r
- fprintf(stderr, "Unknown .netrc keyword %s\n", tokval);\r
- break;\r
- }\r
- goto done;\r
- }\r
-done:\r
- (void) fclose(cfile);\r
- return(0);\r
-bad:\r
- (void) fclose(cfile);\r
- return(-1);\r
-}\r
-\r
-static int token(void)\r
-{\r
- char *cp;\r
- int c;\r
- struct toktab *t;\r
- \r
- if (feof(cfile))\r
- return (0);\r
- while ((c = getc(cfile)) != EOF &&\r
- (c == '\r' || c == '\n' || c == '\t' || c == ' ' || c == ','))\r
- continue;\r
- if (c == EOF)\r
- return (0);\r
- cp = tokval;\r
- if (c == '"') {\r
- while ((c = getc(cfile)) != EOF && c != '"') {\r
- if (c == '\\')\r
- c = getc(cfile);\r
- *cp++ = c;\r
- }\r
- } else {\r
- *cp++ = c;\r
- while ((c = getc(cfile)) != EOF\r
- && c != '\n' && c != '\t' && c != ' ' && c != ',' && c != '\r') {\r
- if (c == '\\')\r
- c = getc(cfile);\r
- *cp++ = c;\r
- }\r
- }\r
- *cp = 0;\r
- if (tokval[0] == 0)\r
- return (0);\r
- for (t = toktab; t->tokstr; t++)\r
- if (!strcmp(t->tokstr, tokval))\r
- return (t->tval);\r
- return (ID);\r
-}\r
+/*
+ * Copyright (c) 1985 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)ruserpass.c 5.1 (Berkeley) 3/1/89";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <stdio.h>
+//#include <utmp.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include "ftp_var.h"
+#include "prototypes.h"
+#include <winsock.h>
+
+char *renvlook(), *index(), *getenv(), *getpass(), *getlogin();
+void *malloc();
+char *strcpy();
+struct utmp *getutmp();
+static FILE *cfile;
+
+#ifndef MAXHOSTNAMELEN
+#define MAXHOSTNAMELEN 64
+#endif
+
+#define DEFAULT 1
+#define LOGIN 2
+#define PASSWD 3
+#define ACCOUNT 4
+#define MACDEF 5
+#define ID 10
+#define MACH 11
+
+static char tokval[100];
+
+static struct toktab {
+ char *tokstr;
+ int tval;
+} toktab[]= {
+ "default", DEFAULT,
+ "login", LOGIN,
+ "password", PASSWD,
+ "passwd", PASSWD,
+ "account", ACCOUNT,
+ "machine", MACH,
+ "macdef", MACDEF,
+ 0, 0
+};
+
+extern char *hostname;
+
+int ruserpass(char *host, char **aname, char **apass, char **aacct)
+{
+ char *hdir, buf[BUFSIZ], *tmp;
+ char myname[MAXHOSTNAMELEN], *mydomain;
+ int t, i, c, usedefault = 0;
+ struct stat stb;
+ extern int errno;
+
+ hdir = getenv("HOME");
+ if (hdir == NULL)
+ hdir = ".";
+ (void) sprintf(buf, "%s/.netrc", hdir);
+ cfile = fopen(buf, "r");
+ if (cfile == NULL) {
+ if (errno != ENOENT)
+ perror(buf);
+ return(0);
+ }
+
+
+ if (gethostname(myname, sizeof(myname)) < 0)
+ myname[0] = '\0';
+ if ((mydomain = index(myname, '.')) == NULL)
+ mydomain = "";
+next:
+ while ((t = token())) switch(t) {
+
+ case DEFAULT:
+ usedefault = 1;
+ /* FALL THROUGH */
+
+ case MACH:
+ if (!usedefault) {
+ if (token() != ID)
+ continue;
+ /*
+ * Allow match either for user's input host name
+ * or official hostname. Also allow match of
+ * incompletely-specified host in local domain.
+ */
+ if (strcasecmp(host, tokval) == 0)
+ goto match;
+ if (strcasecmp(hostname, tokval) == 0)
+ goto match;
+ if ((tmp = index(hostname, '.')) != NULL &&
+ strcasecmp(tmp, mydomain) == 0 &&
+ strncasecmp(hostname, tokval, tmp - hostname) == 0 &&
+ tokval[tmp - hostname] == '\0')
+ goto match;
+ if ((tmp = index(host, '.')) != NULL &&
+ strcasecmp(tmp, mydomain) == 0 &&
+ strncasecmp(host, tokval, tmp - host) == 0 &&
+ tokval[tmp - host] == '\0')
+ goto match;
+ continue;
+ }
+ match:
+ while ((t = token()) && t != MACH && t != DEFAULT) switch(t) {
+
+ case LOGIN:
+ if (token())
+ if (*aname == 0) {
+ *aname = malloc((unsigned) strlen(tokval) + 1);
+ (void) strcpy(*aname, tokval);
+ } else {
+ if (strcmp(*aname, tokval))
+ goto next;
+ }
+ break;
+ case PASSWD:
+ if (strcmp(*aname, "anonymous") &&
+ fstat(fileno(cfile), &stb) >= 0 &&
+ (stb.st_mode & 077) != 0) {
+ fprintf(stderr, "Error - .netrc file not correct mode.\n");
+ fprintf(stderr, "Remove password or correct mode.\n");
+ goto bad;
+ }
+ if (token() && *apass == 0) {
+ *apass = malloc((unsigned) strlen(tokval) + 1);
+ (void) strcpy(*apass, tokval);
+ }
+ break;
+ case ACCOUNT:
+ if (fstat(fileno(cfile), &stb) >= 0
+ && (stb.st_mode & 077) != 0) {
+ fprintf(stderr, "Error - .netrc file not correct mode.\n");
+ fprintf(stderr, "Remove account or correct mode.\n");
+ goto bad;
+ }
+ if (token() && *aacct == 0) {
+ *aacct = malloc((unsigned) strlen(tokval) + 1);
+ (void) strcpy(*aacct, tokval);
+ }
+ break;
+ case MACDEF:
+ if (proxy) {
+ (void) fclose(cfile);
+ return(0);
+ }
+ while ((c=getc(cfile)) != EOF && c == ' ' || c == '\t');
+ if (c == EOF || c == '\n') {
+ printf("Missing macdef name argument.\n");
+ goto bad;
+ }
+ if (macnum == 16) {
+ printf("Limit of 16 macros have already been defined\n");
+ goto bad;
+ }
+ tmp = macros[macnum].mac_name;
+ *tmp++ = c;
+ for (i=0; i < 8 && (c=getc(cfile)) != EOF &&
+ !isspace(c); ++i) {
+ *tmp++ = c;
+ }
+ if (c == EOF) {
+ printf("Macro definition missing null line terminator.\n");
+ goto bad;
+ }
+ *tmp = '\0';
+ if (c != '\n') {
+ while ((c=getc(cfile)) != EOF && c != '\n');
+ }
+ if (c == EOF) {
+ printf("Macro definition missing null line terminator.\n");
+ goto bad;
+ }
+ if (macnum == 0) {
+ macros[macnum].mac_start = macbuf;
+ }
+ else {
+ macros[macnum].mac_start = macros[macnum-1].mac_end + 1;
+ }
+ tmp = macros[macnum].mac_start;
+ while (tmp != macbuf + 4096) {
+ if ((c=getc(cfile)) == EOF) {
+ printf("Macro definition missing null line terminator.\n");
+ goto bad;
+ }
+ *tmp = c;
+ if (*tmp == '\n') {
+ if (*(tmp-1) == '\0') {
+ macros[macnum++].mac_end = tmp - 1;
+ break;
+ }
+ *tmp = '\0';
+ }
+ tmp++;
+ }
+ if (tmp == macbuf + 4096) {
+ printf("4K macro buffer exceeded\n");
+ goto bad;
+ }
+ break;
+ default:
+ fprintf(stderr, "Unknown .netrc keyword %s\n", tokval);
+ break;
+ }
+ goto done;
+ }
+done:
+ (void) fclose(cfile);
+ return(0);
+bad:
+ (void) fclose(cfile);
+ return(-1);
+}
+
+static int token(void)
+{
+ char *cp;
+ int c;
+ struct toktab *t;
+
+ if (feof(cfile))
+ return (0);
+ while ((c = getc(cfile)) != EOF &&
+ (c == '\r' || c == '\n' || c == '\t' || c == ' ' || c == ','))
+ continue;
+ if (c == EOF)
+ return (0);
+ cp = tokval;
+ if (c == '"') {
+ while ((c = getc(cfile)) != EOF && c != '"') {
+ if (c == '\\')
+ c = getc(cfile);
+ *cp++ = c;
+ }
+ } else {
+ *cp++ = c;
+ while ((c = getc(cfile)) != EOF
+ && c != '\n' && c != '\t' && c != ' ' && c != ',' && c != '\r') {
+ if (c == '\\')
+ c = getc(cfile);
+ *cp++ = c;
+ }
+ }
+ *cp = 0;
+ if (tokval[0] == 0)
+ return (0);
+ for (t = toktab; t->tokstr; t++)
+ if (!strcmp(t->tokstr, tokval))
+ return (t->tval);
+ return (ID);
+}