Set eol-style
authorGé van Geldorp <ge@gse.nl>
Tue, 8 Feb 2005 18:58:59 +0000 (18:58 +0000)
committerGé van Geldorp <ge@gse.nl>
Tue, 8 Feb 2005 18:58:59 +0000 (18:58 +0000)
svn path=/trunk/; revision=13467

reactos/apps/utils/net/ftp/cmds.c
reactos/apps/utils/net/ftp/domacro.c
reactos/apps/utils/net/ftp/fake.c
reactos/apps/utils/net/ftp/fake.h
reactos/apps/utils/net/ftp/ftp.c
reactos/apps/utils/net/ftp/ftp.mak
reactos/apps/utils/net/ftp/ftp.mak.orig
reactos/apps/utils/net/ftp/ftp_var.h
reactos/apps/utils/net/ftp/main.c
reactos/apps/utils/net/ftp/prototypes.h
reactos/apps/utils/net/ftp/ruserpass.c

index d155320..c88e3a0 100644 (file)
-/*\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);
+       }
+}
index 7590585..a4eeed1 100644 (file)
@@ -19,7 +19,7 @@
 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>
index f93dc80..24f549f 100644 (file)
-#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;
+}
index 82197ef..816c781 100644 (file)
@@ -1,10 +1,10 @@
-#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
index e670212..34d443b 100644 (file)
-#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;
+}
index bdd46b3..084404f 100644 (file)
-# 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
index 73af13e..b482649 100644 (file)
-# 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
index b5da7a7..7c33434 100644 (file)
-#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);
index 409c5c6..fd6c506 100644 (file)
-/*\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;
+}
index 96648ae..3bff115 100644 (file)
@@ -1,32 +1,32 @@
-\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);
index e8fec04..ea6751b 100644 (file)
-/*\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);
+}