fix perror messages for tos
[unix-history] / usr / src / usr.bin / ftp / main.c
index 5f18842..41474ce 100644 (file)
@@ -1,13 +1,27 @@
+/*
+ * Copyright (c) 1985, 1989 Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
+ */
+
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)main.c     4.8 (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.16 (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 +32,18 @@ static char sccsid[] = "@(#)main.c  4.8 (Berkeley) %G%";
 #include <netdb.h>
 #include <pwd.h>
 
 #include <netdb.h>
 #include <pwd.h>
 
-#include "ftp_var.h"
-
-int    intr();
-int    lostpeer();
+uid_t  getuid();
+sig_t  intr();
+sig_t  lostpeer();
 extern char *home;
 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 +85,43 @@ 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 */
+       sendport = -1;  /* not using ports */
        /*
         * 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);
@@ -116,12 +129,14 @@ main(argc, argv)
        }
 }
 
        }
 }
 
+sig_t
 intr()
 {
 
        longjmp(toplevel, 1);
 }
 
 intr()
 {
 
        longjmp(toplevel, 1);
 }
 
+sig_t
 lostpeer()
 {
        extern FILE *cout;
 lostpeer()
 {
        extern FILE *cout;
@@ -129,21 +144,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 +184,7 @@ tail(filename)
        }
        return (filename);
 }
        }
        return (filename);
 }
-
+*/
 /*
  * Command parser.
  */
 /*
  * Command parser.
  */
@@ -168,21 +193,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");
@@ -198,17 +228,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;
@@ -237,6 +269,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;
@@ -246,6 +281,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++;
 }
@@ -263,10 +299,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) {
 
@@ -278,6 +326,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;
        }
 
@@ -333,8 +392,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);
 }
 
@@ -348,10 +419,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;
 
@@ -370,7 +442,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;
@@ -378,7 +457,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');
                                }
                        }
                }
                                }
                        }
                }
@@ -397,19 +476,3 @@ help(argc, argv)
                                c->c_name, c->c_help);
        }
 }
                                c->c_name, c->c_help);
        }
 }
-
-/*
- * Call routine with argc, argv set from args (terminated by 0).
- */
-/* VARARGS2 */
-call(routine, args)
-       int (*routine)();
-       int args;
-{
-       register int *argp;
-       register int argc;
-
-       for (argc = 0, argp = &args; *argp++ != 0; argc++)
-               ;
-       (*routine)(argc, &args);
-}