|
|
1.1 ! root 1: /* whom.c - report who a message would go to */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include <stdio.h> ! 5: #include <signal.h> ! 6: ! 7: /* */ ! 8: ! 9: static struct swit switches[] = { ! 10: #define ALIASW 0 ! 11: "alias aliasfile", 0, ! 12: ! 13: #define CHKSW 1 ! 14: "check", 0, ! 15: #define NOCHKSW 2 ! 16: "nocheck", 0, ! 17: ! 18: #define DRAFTSW 3 ! 19: "draft", 0, ! 20: ! 21: #define DFOLDSW 4 ! 22: "draftfolder +folder", 6, ! 23: #define DMSGSW 5 ! 24: "draftmessage msg", 6, ! 25: #define NDFLDSW 6 ! 26: "nodraftfolder", 0, ! 27: ! 28: #define HELPSW 7 ! 29: "help", 4, ! 30: ! 31: #define CLIESW 8 ! 32: "client host", -6, ! 33: #define SERVSW 9 ! 34: "server host", -6, ! 35: #define SNOOPSW 10 ! 36: "snoop", -5, ! 37: ! 38: NULL, NULL ! 39: }; ! 40: ! 41: /* */ ! 42: ! 43: /* ARGSUSED */ ! 44: ! 45: main (argc, argv) ! 46: int argc; ! 47: char *argv[]; ! 48: { ! 49: int child_id, ! 50: i, ! 51: status, ! 52: isdf = 0, ! 53: distsw = 0, ! 54: vecp = 0; ! 55: char *cp, ! 56: *dfolder = NULL, ! 57: *dmsg = NULL, ! 58: *msg = NULL, ! 59: **ap, ! 60: **argp, ! 61: backup[BUFSIZ], ! 62: buf[100], ! 63: *arguments[MAXARGS], ! 64: *vec[MAXARGS]; ! 65: ! 66: invo_name = r1bindex (argv[0], '/'); ! 67: if ((cp = m_find (invo_name)) != NULL) { ! 68: ap = brkstring (cp = getcpy (cp), " ", "\n"); ! 69: ap = copyip (ap, arguments); ! 70: } ! 71: else ! 72: ap = arguments; ! 73: (void) copyip (argv + 1, ap); ! 74: argp = arguments; ! 75: ! 76: vec[vecp++] = invo_name; ! 77: vec[vecp++] = "-whom"; ! 78: vec[vecp++] = "-library"; ! 79: vec[vecp++] = getcpy (m_maildir ("")); ! 80: ! 81: /* */ ! 82: ! 83: while (cp = *argp++) { ! 84: if (*cp == '-') ! 85: switch (smatch (++cp, switches)) { ! 86: case AMBIGSW: ! 87: ambigsw (cp, switches); ! 88: done (1); ! 89: case UNKWNSW: ! 90: adios (NULLCP, "-%s unknown", cp); ! 91: case HELPSW: ! 92: (void) sprintf (buf, "%s [switches] [file]", invo_name); ! 93: help (buf, switches); ! 94: done (1); ! 95: ! 96: case CHKSW: ! 97: case NOCHKSW: ! 98: case SNOOPSW: ! 99: vec[vecp++] = --cp; ! 100: continue; ! 101: ! 102: case DRAFTSW: ! 103: msg = draft; ! 104: continue; ! 105: ! 106: case DFOLDSW: ! 107: if (dfolder) ! 108: adios (NULLCP, "only one draft folder at a time!"); ! 109: if (!(cp = *argp++) || *cp == '-') ! 110: adios (NULLCP, "missing argument to %s", argp[-2]); ! 111: dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp, ! 112: *cp != '@' ? TFOLDER : TSUBCWF); ! 113: continue; ! 114: case DMSGSW: ! 115: if (dmsg) ! 116: adios (NULLCP, "only one draft message at a time!"); ! 117: if (!(dmsg = *argp++) || *dmsg == '-') ! 118: adios (NULLCP, "missing argument to %s", argp[-2]); ! 119: continue; ! 120: case NDFLDSW: ! 121: dfolder = NULL; ! 122: isdf = NOTOK; ! 123: continue; ! 124: ! 125: case ALIASW: ! 126: case CLIESW: ! 127: case SERVSW: ! 128: vec[vecp++] = --cp; ! 129: if (!(cp = *argp++) || *cp == '-') ! 130: adios (NULLCP, "missing argument to %s", argp[-2]); ! 131: vec[vecp++] = cp; ! 132: continue; ! 133: } ! 134: if (msg) ! 135: adios (NULLCP, "only one draft at a time!"); ! 136: else ! 137: vec[vecp++] = msg = cp; ! 138: } ! 139: ! 140: /* */ ! 141: ! 142: if (msg == NULL) { ! 143: #ifdef WHATNOW ! 144: if ((cp = getenv ("mhdraft")) == NULL || *cp == NULL) ! 145: #endif WHATNOW ! 146: cp = getcpy (m_draft (dfolder, dmsg, 1, &isdf)); ! 147: msg = vec[vecp++] = cp; ! 148: } ! 149: if ((cp = getenv ("mhdist")) ! 150: && *cp ! 151: && (distsw = atoi (cp)) ! 152: && (cp = getenv ("mhaltmsg")) ! 153: && *cp) { ! 154: if (distout (msg, cp, backup) == NOTOK) ! 155: done (1); ! 156: vec[vecp++] = "-dist"; ! 157: distsw++; ! 158: } ! 159: vec[vecp] = NULL; ! 160: ! 161: closefds (3); ! 162: ! 163: if (distsw) ! 164: for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++) ! 165: sleep (5); ! 166: switch (distsw ? child_id : OK) { ! 167: case NOTOK: ! 168: advise (NULLCP, "unable to fork, so checking directly..."); ! 169: case OK: ! 170: execvp (postproc, vec); ! 171: fprintf (stderr, "unable to exec "); ! 172: perror (postproc); ! 173: _exit (-1); ! 174: ! 175: default: ! 176: (void) signal (SIGHUP, SIG_IGN); ! 177: (void) signal (SIGINT, SIG_IGN); ! 178: (void) signal (SIGQUIT, SIG_IGN); ! 179: (void) signal (SIGTERM, SIG_IGN); ! 180: ! 181: status = pidwait (child_id, OK); ! 182: ! 183: (void) unlink (msg); ! 184: if (rename (backup, msg) == NOTOK) ! 185: adios (msg, "unable to rename %s to", backup); ! 186: done (status); ! 187: } ! 188: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.