date and time created 83/02/11 15:44:29 by rrh
[unix-history] / usr / src / usr.bin / mail / aux.c
index 056306a..cac91df 100644 (file)
@@ -2,7 +2,6 @@
 
 #include "rcv.h"
 #include <sys/stat.h>
 
 #include "rcv.h"
 #include <sys/stat.h>
-#include <sgtty.h>
 #include <ctype.h>
 
 /*
 #include <ctype.h>
 
 /*
@@ -11,7 +10,7 @@
  * Auxiliary functions.
  */
 
  * Auxiliary functions.
  */
 
-static char *SccsId = "@(#)aux.c       1.3 %G%";
+static char *SccsId = "@(#)aux.c       2.8 %G%";
 
 /*
  * Return a pointer to a dynamic copy of the argument.
 
 /*
  * Return a pointer to a dynamic copy of the argument.
@@ -123,20 +122,6 @@ isdir(name)
        return((sbuf.st_mode & S_IFMT) == S_IFDIR);
 }
 
        return((sbuf.st_mode & S_IFMT) == S_IFDIR);
 }
 
-/*
- * Compute the size in characters of the passed message
- */
-
-unsigned int
-msize(messp)
-       struct message *messp;
-{
-       register struct message *mp;
-
-       mp = messp;
-       return(mp->m_size);
-}
-
 /*
  * Count the number of arguments in the given string raw list.
  */
 /*
  * Count the number of arguments in the given string raw list.
  */
@@ -373,6 +358,21 @@ icequal(s1, s2)
        return(0);
 }
 
        return(0);
 }
 
+/*
+ * Copy a string, lowercasing it as we go.
+ */
+istrcpy(dest, src)
+       char *dest, *src;
+{
+       register char *cp, *cp2;
+
+       cp2 = dest;
+       cp = src;
+       do {
+               *cp2++ = little(*cp);
+       } while (*cp++ != 0);
+}
+
 /*
  * The following code deals with input stacking to do source
  * commands.  All but the current file pointer are saved on
 /*
  * The following code deals with input stacking to do source
  * commands.  All but the current file pointer are saved on
@@ -383,6 +383,7 @@ static      int     ssp = -1;               /* Top of file stack */
 struct sstack {
        FILE    *s_file;                /* File we were in. */
        int     s_cond;                 /* Saved state of conditionals */
 struct sstack {
        FILE    *s_file;                /* File we were in. */
        int     s_cond;                 /* Saved state of conditionals */
+       int     s_loading;              /* Loading .mailrc, etc. */
 } sstack[_NFILE];
 
 /*
 } sstack[_NFILE];
 
 /*
@@ -395,9 +396,12 @@ source(name)
        char name[];
 {
        register FILE *fi;
        char name[];
 {
        register FILE *fi;
+       register char *cp;
 
 
-       if ((fi = fopen(name, "r")) == NULL) {
-               perror(name);
+       if ((cp = expand(name)) == NOSTR)
+               return(1);
+       if ((fi = fopen(cp, "r")) == NULL) {
+               perror(cp);
                return(1);
        }
        if (ssp >= _NFILE-2) {
                return(1);
        }
        if (ssp >= _NFILE-2) {
@@ -407,6 +411,8 @@ source(name)
        }
        sstack[++ssp].s_file = input;
        sstack[ssp].s_cond = cond;
        }
        sstack[++ssp].s_file = input;
        sstack[ssp].s_cond = cond;
+       sstack[ssp].s_loading = loading;
+       loading = 0;
        cond = CANY;
        input = fi;
        sourcing++;
        cond = CANY;
        input = fi;
        sourcing++;
@@ -444,9 +450,10 @@ unstack()
        if (cond != CANY)
                printf("Unmatched \"if\"\n");
        cond = sstack[ssp].s_cond;
        if (cond != CANY)
                printf("Unmatched \"if\"\n");
        cond = sstack[ssp].s_cond;
+       loading = sstack[ssp].s_loading;
        input = sstack[ssp--].s_file;
        if (ssp < 0)
        input = sstack[ssp--].s_file;
        if (ssp < 0)
-               sourcing = 0;
+               sourcing = loading;
        return(0);
 }
 
        return(0);
 }
 
@@ -477,14 +484,9 @@ alter(name)
        time_p[1] = statb.st_mtime;
        utime(name, time_p);
 #else
        time_p[1] = statb.st_mtime;
        utime(name, time_p);
 #else
-       if ((pid = fork()) != 0)
-               return;
-       clrbuf(stdout);
-       clrbuf(stderr);
-       clrbuf(stdin);
        sleep(1);
        if ((f = open(name, 0)) < 0)
        sleep(1);
        if ((f = open(name, 0)) < 0)
-               exit(1);
+               return;
        read(f, &w, 1);
        exit(0);
 #endif
        read(f, &w, 1);
        exit(0);
 #endif
@@ -506,12 +508,98 @@ blankline(linebuf)
        return(1);
 }
 
        return(1);
 }
 
+/*
+ * Get sender's name from this message.  If the message has
+ * a bunch of arpanet stuff in it, we may have to skin the name
+ * before returning it.
+ */
+char *
+nameof(mp, reptype)
+       register struct message *mp;
+{
+       register char *cp, *cp2;
+
+       cp = skin(name1(mp, reptype));
+       if (reptype != 0 || charcount(cp, '!') < 2)
+               return(cp);
+       cp2 = rindex(cp, '!');
+       cp2--;
+       while (cp2 > cp && *cp2 != '!')
+               cp2--;
+       if (*cp2 == '!')
+               return(cp2 + 1);
+       return(cp);
+}
+
+/*
+ * Skin an arpa net address according to the RFC 733 interpretation
+ * of "host-phrase."
+ */
+char *
+skin(name)
+       char *name;
+{
+       register int c;
+       register char *cp, *cp2;
+       int gotlt, lastsp;
+       char nbuf[BUFSIZ];
+
+       if (name == NOSTR)
+               return(NOSTR);
+       if (index(name, '(') == NOSTR && index(name, '<') == NOSTR)
+               return(name);
+       gotlt = 0;
+       lastsp = 0;
+       for (cp = name, cp2 = nbuf, c = *cp++; *cp; c = *cp++) {
+               switch (c) {
+               case '(':
+                       while (*cp != ')' && *cp != 0)
+                               cp++;
+                       if (*cp)
+                               cp++;
+                       break;
+
+               case ' ':
+                       lastsp = 1;
+                       break;
+
+               case '<':
+                       cp2 = nbuf;
+                       gotlt++;
+                       lastsp = 0;
+                       break;
+
+               case '>':
+                       if (gotlt)
+                               goto done;
+
+                       /* Fall into . . . */
+
+               default:
+                       if (lastsp) {
+                               lastsp = 0;
+                               *cp2++ = ' ';
+                       }
+                       *cp2++ = c;
+                       break;
+               }
+       }
+done:
+       *cp2 = 0;
+
+       return(savestr(nbuf));
+}
+
 /*
  * Fetch the sender's name from the passed message.
 /*
  * Fetch the sender's name from the passed message.
+ * Reptype can be
+ *     0 -- get sender's name for display purposes
+ *     1 -- get sender's name for reply
+ *     2 -- get sender's name for Reply
  */
 
 char *
  */
 
 char *
-nameof(mp)
+name1(mp, reptype)
        register struct message *mp;
 {
        char namebuf[LINESIZE];
        register struct message *mp;
 {
        char namebuf[LINESIZE];
@@ -520,10 +608,12 @@ nameof(mp)
        register FILE *ibuf;
        int first = 1;
 
        register FILE *ibuf;
        int first = 1;
 
-       if ((cp = hfield("reply-to", mp)) != NOSTR) {
-               strcpy(namebuf, cp);
-               return(namebuf);
-       }
+#ifndef SENDMAIL
+       if ((cp = hfield("from", mp)) != NOSTR)
+               return(cp);
+       if (reptype == 0 && (cp = hfield("sender", mp)) != NOSTR)
+               return(cp);
+#endif
        ibuf = setinput(mp);
        copy("", namebuf);
        if (readline(ibuf, linebuf) <= 0)
        ibuf = setinput(mp);
        copy("", namebuf);
        if (readline(ibuf, linebuf) <= 0)
@@ -565,11 +655,25 @@ newname:
        return(savestr(namebuf));
 }
 
        return(savestr(namebuf));
 }
 
+/*
+ * Count the occurances of c in str
+ */
+charcount(str, c)
+       char *str;
+{
+       register char *cp;
+       register int i;
+
+       for (i = 0, cp = str; *cp; cp++)
+               if (*cp == c)
+                       i++;
+       return(i);
+}
+
 /*
  * Find the rightmost pointer to an instance of the
  * character in the string and return it.
  */
 /*
  * Find the rightmost pointer to an instance of the
  * character in the string and return it.
  */
-
 char *
 rindex(str, c)
        char str[];
 char *
 rindex(str, c)
        char str[];
@@ -650,3 +754,20 @@ strncmp(as1, as2, an)
        return(n<0 ? 0 : *s1 - *--s2);
 }
 
        return(n<0 ? 0 : *s1 - *--s2);
 }
 
+/*
+ * See if the given header field is supposed to be ignored.
+ */
+isign(field)
+       char *field;
+{
+       char realfld[BUFSIZ];
+       register int h;
+       register struct ignore *igp;
+
+       istrcpy(realfld, field);
+       h = hash(realfld);
+       for (igp = ignore[h]; igp != 0; igp = igp->i_link)
+               if (strcmp(igp->i_field, realfld) == 0)
+                       return(1);
+       return(0);
+}