remember current server type setting, don't change until doing
[unix-history] / usr / src / usr.bin / ftp / main.c
index 1c810b7..2c9fdf5 100644 (file)
@@ -1,31 +1,61 @@
+/*
+ * 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.4 (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/types.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 <signal.h>
 #include <stdio.h>
 #include <errno.h>
 #include <ctype.h>
 #include <netdb.h>
 
 #include <signal.h>
 #include <stdio.h>
 #include <errno.h>
 #include <ctype.h>
 #include <netdb.h>
+#include <pwd.h>
 
 
-#include "ftp.h"
-#include "ftp_var.h"
 
 
+uid_t  getuid();
 int    intr();
 int    lostpeer();
 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 = NULL;
+       char homedir[MAXPATHLEN];
 
        sp = getservbyname("ftp", "tcp");
        if (sp == 0) {
 
        sp = getservbyname("ftp", "tcp");
        if (sp == 0) {
@@ -33,6 +63,7 @@ main(argc, argv)
                exit(1);
        }
        doglob = 1;
                exit(1);
        }
        doglob = 1;
+       interactive = 1;
        autologin = 1;
        argc--, argv++;
        while (argc > 0 && **argv == '-') {
        autologin = 1;
        argc--, argv++;
        while (argc > 0 && **argv == '-') {
@@ -53,7 +84,7 @@ main(argc, argv)
                                break;
 
                        case 'i':
                                break;
 
                        case 'i':
-                               interactive++;
+                               interactive = 0;
                                break;
 
                        case 'n':
                                break;
 
                        case 'n':
@@ -65,34 +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.
+        */
+       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);
+       }
        if (argc > 0) {
                if (setjmp(toplevel))
                        exit(0);
        if (argc > 0) {
                if (setjmp(toplevel))
                        exit(0);
-               sigset(SIGINT, intr);
-               sigset(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) {
-               sigset(SIGINT, intr);
-               sigset(SIGPIPE, lostpeer);
+               (void) signal(SIGINT, intr);
+               (void) signal(SIGPIPE, lostpeer);
        }
        for (;;) {
                cmdscanner(top);
        }
        for (;;) {
                cmdscanner(top);
@@ -113,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;
 {
@@ -143,7 +192,7 @@ tail(filename)
        }
        return (filename);
 }
        }
        return (filename);
 }
-
+*/
 /*
  * Command parser.
  */
 /*
  * Command parser.
  */
@@ -152,21 +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) || ferror(stdin))
+                               quit();
                        break;
                        break;
+               }
                if (line[0] == 0)
                        break;
                makeargv();
                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");
@@ -176,19 +230,25 @@ cmdscanner(top)
                        printf("?Invalid command\n");
                        continue;
                }
                        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)
                (*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;
@@ -217,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;
@@ -226,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++;
 }
@@ -243,6 +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 == '!' || *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) {
 
@@ -254,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;
        }
 
@@ -309,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);
 }
 
@@ -324,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;
 
@@ -346,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;
@@ -354,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');
                                }
                        }
                }
                                }
                        }
                }
@@ -377,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;