BSD 4 release
[unix-history] / usr / src / cmd / mail.c
index 5dce570..9f6a2e1 100644 (file)
@@ -7,6 +7,12 @@
 #include <sys/stat.h>
 #include <setjmp.h>
 #include <whoami.h>
 #include <sys/stat.h>
 #include <setjmp.h>
 #include <whoami.h>
+#include <sysexits.h>
+
+static char SccsId[] = "@(#)mail.c     4.1     10/1/80";
+
+#define DELIVERMAIL    "/etc/delivermail"
+
 
 /*copylet flags */
        /*remote mail, add rmtmsg */
 
 /*copylet flags */
        /*remote mail, add rmtmsg */
 #define        LSIZE   256
 #define        MAXLET  300     /* maximum number of letters */
 #define        MAILMODE (~0644)                /* mode of created mail */
 #define        LSIZE   256
 #define        MAXLET  300     /* maximum number of letters */
 #define        MAILMODE (~0644)                /* mode of created mail */
+# ifndef DELIVERMAIL
 #define        RMAIL   "/usr/net/bin/sendberkmail"
 #define LOCNAM1        "csvax"
 #define LOCNAM2        "ucbvax"
 #define LOCNAM3        "vax"
 #define LOCNAM4        "v"
 #define        RMAIL   "/usr/net/bin/sendberkmail"
 #define LOCNAM1        "csvax"
 #define LOCNAM2        "ucbvax"
 #define LOCNAM3        "vax"
 #define LOCNAM4        "v"
+# endif
 
 char   line[LSIZE];
 char   resp[LSIZE];
 
 char   line[LSIZE];
 char   resp[LSIZE];
@@ -37,7 +45,7 @@ char  *getenv();
 char   *index();
 char   lettmp[] = "/tmp/maXXXXX";
 char   maildir[] = "/usr/spool/mail/";
 char   *index();
 char   lettmp[] = "/tmp/maXXXXX";
 char   maildir[] = "/usr/spool/mail/";
-char   mailfile[] = "/usr/spool/mail/xxxxxxxxxxxxxxxxxxxxxxx";
+char   mailfile[] = "/usr/spool/mail/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
 char   dead[] = "dead.letter";
 char   *thissys = sysname;
 char   *netname = "vax";
 char   dead[] = "dead.letter";
 char   *thissys = sysname;
 char   *netname = "vax";
@@ -59,6 +67,7 @@ int   flgp;
 int    delflg = 1;
 int    hseqno;
 jmp_buf        sjbuf;
 int    delflg = 1;
 int    hseqno;
 jmp_buf        sjbuf;
+int    rmail;
 
 main(argc, argv)
 char **argv;
 
 main(argc, argv)
 char **argv;
@@ -86,8 +95,10 @@ char **argv;
                fprintf(stderr, "mail: cannot open %s for writing\n", lettmp);
                done();
        }
                fprintf(stderr, "mail: cannot open %s for writing\n", lettmp);
                done();
        }
+       if (argv[0][0] == 'r')
+               rmail++;
        if (argv[0][0] != 'r' &&        /* no favors for rmail*/
        if (argv[0][0] != 'r' &&        /* no favors for rmail*/
-          (argc == 1 || argv[1][0] == '-' && !any(argv[1][1], "rh")))
+          (argc == 1 || argv[1][0] == '-' && !any(argv[1][1], "rhd")))
                printmail(argc, argv);
        else
                sendmail(argc, argv);
                printmail(argc, argv);
        else
                sendmail(argc, argv);
@@ -118,9 +129,15 @@ char **argv;
 {
        int flg, i, j, print;
        char *p, *getarg();
 {
        int flg, i, j, print;
        char *p, *getarg();
+       struct stat statb;
 
        setuid(getuid());
        cat(mailfile, maildir, my_name);
 
        setuid(getuid());
        cat(mailfile, maildir, my_name);
+       if (stat(mailfile, &statb) >= 0
+           && (statb.st_mode & S_IFMT) == S_IFDIR) {
+               strcat(mailfile, "/");
+               strcat(mailfile, my_name);
+       }
        for (; argc>1; argv++, argc--) {
                if (argv[1][0]=='-') {
                        if (argv[1][1]=='q')
        for (; argc>1; argv++, argc--) {
                if (argv[1][0]=='-') {
                        if (argv[1][1]=='q')
@@ -386,6 +403,33 @@ char **argv;
        int first;
        register char *cp;
        int gaver = 0;
        int first;
        register char *cp;
        int gaver = 0;
+# ifdef DELIVERMAIL
+       char *newargv[1000];
+       register char **ap;
+       register char **vp;
+       int dflag;
+
+       dflag = 0;
+       if (argc < 1)
+               fprintf(stderr, "puke\n");
+       for (vp = argv, ap = newargv + 1; (*ap = *vp++) != 0; ap++)
+       {
+               if (ap[0][0] == '-' && ap[0][1] == 'd')
+                       dflag++;
+       }
+       if (!dflag)
+       {
+               /* give it to delivermail, rah rah! */
+               unlink(lettmp);
+               ap = newargv+1;
+               if (rmail)
+                       *ap-- = "-s";
+               *ap = "-delivermail";
+               execv(DELIVERMAIL, ap);
+               perror(DELIVERMAIL);
+               exit(EX_UNAVAILABLE);
+       }
+# endif DELIVERMAIL
 
        truename[0] = 0;
        line[0] = '\0';
 
        truename[0] = 0;
        line[0] = '\0';
@@ -423,6 +467,11 @@ char **argv;
                        argc--;
                        break;
 
                        argc--;
                        break;
 
+# ifdef DELIVERMAIL
+               case 'd':
+                       break;
+# endif DELIVERMAIL
+               
                default:
                        usage();
                        done();
                default:
                        usage();
                        done();
@@ -552,6 +601,7 @@ skip:
        exit(0);
 }
 
        exit(0);
 }
 
+# ifndef DELIVERMAIL
 /*
  * Send mail on the Berkeley network.
  * Sorry Bill, sendrmt() is so awful we just gave up.
 /*
  * Send mail on the Berkeley network.
  * Sorry Bill, sendrmt() is so awful we just gave up.
@@ -573,6 +623,7 @@ sendberkmail(n, name, fromaddr)
        pclose(cmdf);
        return(9);
 }
        pclose(cmdf);
        return(9);
 }
+# endif
 
 usage()
 {
 
 usage()
 {
@@ -585,21 +636,25 @@ int n;
 char *name;
 char *fromaddr;
 {
 char *name;
 char *fromaddr;
 {
-       char file[50];
+       char file[100];
        register char *p;
        register mask;
        struct passwd *pw, *getpwnam();
        register char *p;
        register mask;
        struct passwd *pw, *getpwnam();
+       struct stat statb;
 
 
+# ifndef DELIVERMAIL
        stripfx(LOCNAM1, &name);
        stripfx(LOCNAM2, &name);
        stripfx(LOCNAM3, &name);
        stripfx(LOCNAM4, &name);
        if(*name == ':')name++;         /* skip colon in to-name */
        stripfx(LOCNAM1, &name);
        stripfx(LOCNAM2, &name);
        stripfx(LOCNAM3, &name);
        stripfx(LOCNAM4, &name);
        if(*name == ':')name++;         /* skip colon in to-name */
-       for(p=name; *p!=':' &&*p!='\0'; p++);
+       for(p=name; *p!=':' && *p!='!' && *p!='^' &&*p!='\0'; p++);
        /* if(*p == ':') return(sendrmt(n, name, RMAIL)); */
        if (*p == ':')
                return(sendberkmail(n, name, fromaddr));
        /* if(*p == ':') return(sendrmt(n, name, RMAIL)); */
        if (*p == ':')
                return(sendberkmail(n, name, fromaddr));
-       else if (strcmp(name, "msgs") == 0) return(sendrmt(n, "-s", "/usr/ucb/msgs"));
+       else if (*p=='\0' && strcmp(name, "msgs") == 0)
+               return(sendrmt(n, "-s", "/usr/ucb/msgs"));
+# endif
        for(p=name; *p!='!'&&*p!='^' &&*p!='\0'; p++)
                ;
        if (*p == '!'|| *p=='^')
        for(p=name; *p!='!'&&*p!='^' &&*p!='\0'; p++)
                ;
        if (*p == '!'|| *p=='^')
@@ -609,6 +664,10 @@ char *fromaddr;
                return(0);
        }
        cat(file, maildir, name);
                return(0);
        }
        cat(file, maildir, name);
+       if (stat(file, &statb) >= 0 && (statb.st_mode & S_IFMT) == S_IFDIR) {
+               strcat(file, "/");
+               strcat(file, name);
+       }
        mask = umask(MAILMODE);
        malf = fopen(file, "a");
        umask(mask);
        mask = umask(MAILMODE);
        malf = fopen(file, "a");
        umask(mask);
@@ -754,6 +813,7 @@ register char *s, *p;
        *s = '\0';
        return(p);
 }
        *s = '\0';
        return(p);
 }
+# ifndef DELIVERMAIL
 /*
        stripfx(prefix string, pointer to string)
 
 /*
        stripfx(prefix string, pointer to string)
 
@@ -772,3 +832,4 @@ stripfx(pfx, name)
                return;
        *name = cp;
 }
                return;
        *name = cp;
 }
+# endif