remember current server type setting, don't change until doing
[unix-history] / usr / src / usr.bin / ftp / main.c
index e8cfb7b..2c9fdf5 100644 (file)
@@ -1,13 +1,37 @@
+/*
+ * 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
 #ifndef lint
-static char sccsid[] = "@(#)main.c     4.10 (Berkeley) %G%";
-#endif
+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     5.14 (Berkeley) %G%";
+#endif /* not lint */
 
 /*
  * FTP User Program -- Command Interface.
  */
 
 /*
  * FTP User Program -- Command Interface.
  */
-#include <sys/param.h>
+#include "ftp_var.h"
 #include <sys/socket.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
 #include <sys/ioctl.h>
+#include <sys/types.h>
 
 #include <arpa/ftp.h>
 
 
 #include <arpa/ftp.h>
 
@@ -18,18 +42,19 @@ static char sccsid[] = "@(#)main.c  4.10 (Berkeley) %G%";
 #include <netdb.h>
 #include <pwd.h>
 
 #include <netdb.h>
 #include <pwd.h>
 
-#include "ftp_var.h"
 
 
+uid_t  getuid();
 int    intr();
 int    lostpeer();
 extern char *home;
 int    intr();
 int    lostpeer();
 extern char *home;
+char   *getlogin();
 
 main(argc, argv)
        char *argv[];
 {
        register char *cp;
        int top;
 
 main(argc, argv)
        char *argv[];
 {
        register char *cp;
        int top;
-       struct passwd *pw;
+       struct passwd *pw = NULL;
        char homedir[MAXPATHLEN];
 
        sp = getservbyname("ftp", "tcp");
        char homedir[MAXPATHLEN];
 
        sp = getservbyname("ftp", "tcp");
@@ -71,44 +96,42 @@ main(argc, argv)
                                break;
 
                        default:
                                break;
 
                        default:
-                               fprintf(stderr,
+                               fprintf(stdout,
                                  "ftp: %c: unknown option\n", *cp);
                                exit(1);
                        }
                argc--, argv++;
        }
        fromatty = isatty(fileno(stdin));
                                  "ftp: %c: unknown option\n", *cp);
                                exit(1);
                        }
                argc--, argv++;
        }
        fromatty = isatty(fileno(stdin));
-       /*
-        * Set up defaults for FTP.
-        */
-       strcpy(typename, "ascii"), type = TYPE_A;
-       strcpy(formname, "non-print"), form = FORM_N;
-       strcpy(modename, "stream"), mode = MODE_S;
-       strcpy(structname, "file"), stru = STRU_F;
-       strcpy(bytename, "8"), bytesize = 8;
        if (fromatty)
                verbose++;
        if (fromatty)
                verbose++;
+       cpend = 0;           /* no pending replies */
+       proxy = 0;      /* proxy not active */
+       crflag = 1;    /* strip c.r. on ascii gets */
        /*
         * Set up the home directory in case we're globbing.
         */
        /*
         * Set up the home directory in case we're globbing.
         */
-       pw = getpwnam(getlogin());
+       cp = getlogin();
+       if (cp != NULL) {
+               pw = getpwnam(cp);
+       }
        if (pw == NULL)
                pw = getpwuid(getuid());
        if (pw != NULL) {
                home = homedir;
        if (pw == NULL)
                pw = getpwuid(getuid());
        if (pw != NULL) {
                home = homedir;
-               strcpy(home, pw->pw_dir);
+               (void) strcpy(home, pw->pw_dir);
        }
        if (argc > 0) {
                if (setjmp(toplevel))
                        exit(0);
        }
        if (argc > 0) {
                if (setjmp(toplevel))
                        exit(0);
-               signal(SIGINT, intr);
-               signal(SIGPIPE, lostpeer);
+               (void) signal(SIGINT, intr);
+               (void) signal(SIGPIPE, lostpeer);
                setpeer(argc + 1, argv - 1);
        }
        top = setjmp(toplevel) == 0;
        if (top) {
                setpeer(argc + 1, argv - 1);
        }
        top = setjmp(toplevel) == 0;
        if (top) {
-               signal(SIGINT, intr);
-               signal(SIGPIPE, lostpeer);
+               (void) signal(SIGINT, intr);
+               (void) signal(SIGPIPE, lostpeer);
        }
        for (;;) {
                cmdscanner(top);
        }
        for (;;) {
                cmdscanner(top);
@@ -129,21 +152,31 @@ lostpeer()
 
        if (connected) {
                if (cout != NULL) {
 
        if (connected) {
                if (cout != NULL) {
-                       shutdown(fileno(cout), 1+1);
-                       fclose(cout);
+                       (void) shutdown(fileno(cout), 1+1);
+                       (void) fclose(cout);
                        cout = NULL;
                }
                if (data >= 0) {
                        cout = NULL;
                }
                if (data >= 0) {
-                       shutdown(data, 1+1);
+                       (void) shutdown(data, 1+1);
                        (void) close(data);
                        data = -1;
                }
                connected = 0;
        }
                        (void) close(data);
                        data = -1;
                }
                connected = 0;
        }
-       longjmp(toplevel, 1);
+       pswitch(1);
+       if (connected) {
+               if (cout != NULL) {
+                       (void) shutdown(fileno(cout), 1+1);
+                       (void) fclose(cout);
+                       cout = NULL;
+               }
+               connected = 0;
+       }
+       proxflag = 0;
+       pswitch(0);
 }
 
 }
 
-char *
+/*char *
 tail(filename)
        char *filename;
 {
 tail(filename)
        char *filename;
 {
@@ -159,7 +192,7 @@ tail(filename)
        }
        return (filename);
 }
        }
        return (filename);
 }
-
+*/
 /*
  * Command parser.
  */
 /*
  * Command parser.
  */
@@ -168,28 +201,26 @@ cmdscanner(top)
 {
        register struct cmd *c;
        struct cmd *getcmd();
 {
        register struct cmd *c;
        struct cmd *getcmd();
-       extern struct cmd cmdtab[];
        extern int help();
 
        if (!top)
        extern int help();
 
        if (!top)
-               putchar('\n');
+               (void) putchar('\n');
        for (;;) {
                if (fromatty) {
                        printf("ftp> ");
        for (;;) {
                if (fromatty) {
                        printf("ftp> ");
-                       fflush(stdout);
+                       (void) fflush(stdout);
                }
                if (gets(line) == 0) {
                }
                if (gets(line) == 0) {
-                       if (feof(stdin)) {
-                               if (!fromatty)
-                                       quit();
-                               clearerr(stdin);
-                               putchar('\n');
-                       }
+                       if (feof(stdin) || ferror(stdin))
+                               quit();
                        break;
                }
                if (line[0] == 0)
                        break;
                makeargv();
                        break;
                }
                if (line[0] == 0)
                        break;
                makeargv();
+               if (margc == 0) {
+                       continue;
+               }
                c = getcmd(margv[0]);
                if (c == (struct cmd *)-1) {
                        printf("?Ambiguous command\n");
                c = getcmd(margv[0]);
                if (c == (struct cmd *)-1) {
                        printf("?Ambiguous command\n");
@@ -205,17 +236,19 @@ cmdscanner(top)
                }
                (*c->c_handler)(margc, margv);
                if (bell && c->c_bell)
                }
                (*c->c_handler)(margc, margv);
                if (bell && c->c_bell)
-                       putchar(CTRL(g));
+                       (void) putchar('\007');
                if (c->c_handler != help)
                        break;
        }
                if (c->c_handler != help)
                        break;
        }
-       longjmp(toplevel, 0);
+       (void) signal(SIGINT, intr);
+       (void) signal(SIGPIPE, lostpeer);
 }
 
 struct cmd *
 getcmd(name)
        register char *name;
 {
 }
 
 struct cmd *
 getcmd(name)
        register char *name;
 {
+       extern struct cmd cmdtab[];
        register char *p, *q;
        register struct cmd *c, *found;
        register int nmatches, longest;
        register char *p, *q;
        register struct cmd *c, *found;
        register int nmatches, longest;
@@ -244,6 +277,9 @@ getcmd(name)
 /*
  * Slice a string up into argc/argv.
  */
 /*
  * Slice a string up into argc/argv.
  */
+
+int slrflag;
+
 makeargv()
 {
        char **argp;
 makeargv()
 {
        char **argp;
@@ -253,6 +289,7 @@ makeargv()
        argp = margv;
        stringbase = line;              /* scan from first of buffer */
        argbase = argbuf;               /* store from first of buffer */
        argp = margv;
        stringbase = line;              /* scan from first of buffer */
        argbase = argbuf;               /* store from first of buffer */
+       slrflag = 0;
        while (*argp++ = slurpstring())
                margc++;
 }
        while (*argp++ = slurpstring())
                margc++;
 }
@@ -270,10 +307,22 @@ slurpstring()
        register char *ap = argbase;
        char *tmp = argbase;            /* will return this if token found */
 
        register char *ap = argbase;
        char *tmp = argbase;            /* will return this if token found */
 
-       if (*sb == '!') {               /* recognize ! as a token for shell */
-               stringbase++;
-               return ("!");
+       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) {
 
 S0:
        switch (*sb) {
 
@@ -285,6 +334,17 @@ S0:
                sb++; goto S0;
 
        default:
                sb++; goto S0;
 
        default:
+               switch (slrflag) {
+                       case 0:
+                               slrflag++;
+                               break;
+                       case 1:
+                               slrflag++;
+                               altarg = sb;
+                               break;
+                       default:
+                               break;
+               }
                goto S1;
        }
 
                goto S1;
        }
 
@@ -340,8 +400,20 @@ OUT:
                *ap++ = '\0';
        argbase = ap;                   /* update storage pointer */
        stringbase = sb;                /* update scan pointer */
                *ap++ = '\0';
        argbase = ap;                   /* update storage pointer */
        stringbase = sb;                /* update scan pointer */
-       if (got_one)
+       if (got_one) {
                return(tmp);
                return(tmp);
+       }
+       switch (slrflag) {
+               case 0:
+                       slrflag++;
+                       break;
+               case 1:
+                       slrflag++;
+                       altarg = (char *) 0;
+                       break;
+               default:
+                       break;
+       }
        return((char *)0);
 }
 
        return((char *)0);
 }
 
@@ -355,10 +427,11 @@ help(argc, argv)
        int argc;
        char *argv[];
 {
        int argc;
        char *argv[];
 {
+       extern struct cmd cmdtab[];
        register struct cmd *c;
 
        if (argc == 1) {
        register struct cmd *c;
 
        if (argc == 1) {
-               register int i, j, w;
+               register int i, j, w, k;
                int columns, width = 0, lines;
                extern int NCMDS;
 
                int columns, width = 0, lines;
                extern int NCMDS;
 
@@ -377,7 +450,14 @@ help(argc, argv)
                for (i = 0; i < lines; i++) {
                        for (j = 0; j < columns; j++) {
                                c = cmdtab + j * lines + i;
                for (i = 0; i < lines; i++) {
                        for (j = 0; j < columns; j++) {
                                c = cmdtab + j * lines + i;
-                               printf("%s", c->c_name);
+                               if (c->c_name && (!proxy || c->c_proxy)) {
+                                       printf("%s", c->c_name);
+                               }
+                               else if (c->c_name) {
+                                       for (k=0; k < strlen(c->c_name); k++) {
+                                               (void) putchar(' ');
+                                       }
+                               }
                                if (c + lines >= &cmdtab[NCMDS]) {
                                        printf("\n");
                                        break;
                                if (c + lines >= &cmdtab[NCMDS]) {
                                        printf("\n");
                                        break;
@@ -385,7 +465,7 @@ help(argc, argv)
                                w = strlen(c->c_name);
                                while (w < width) {
                                        w = (w + 8) &~ 7;
                                w = strlen(c->c_name);
                                while (w < width) {
                                        w = (w + 8) &~ 7;
-                                       putchar('\t');
+                                       (void) putchar('\t');
                                }
                        }
                }
                                }
                        }
                }
@@ -408,7 +488,7 @@ help(argc, argv)
 /*
  * Call routine with argc, argv set from args (terminated by 0).
  */
 /*
  * Call routine with argc, argv set from args (terminated by 0).
  */
-/* VARARGS2 */
+/*VARARGS1*/
 call(routine, args)
        int (*routine)();
        int args;
 call(routine, args)
        int (*routine)();
        int args;