|
|
1.1 ! root 1: /* msgchk.c - check for mail */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include <stdio.h> ! 5: #include "../zotnet/mts.h" ! 6: #include <sys/types.h> ! 7: #include <sys/stat.h> ! 8: #include <pwd.h> ! 9: ! 10: /* */ ! 11: ! 12: static struct swit switches[] = { ! 13: #define HELPSW 0 ! 14: "help", 4, ! 15: ! 16: #ifdef POP ! 17: #define HOSTSW 1 ! 18: "host host", 0, ! 19: #define USERSW 2 ! 20: "user user", 0, ! 21: ! 22: #define RPOPSW 3 ! 23: "rpop", 0, ! 24: #define NRPOPSW 4 ! 25: "norpop", 0, ! 26: #endif POP ! 27: ! 28: ! 29: NULL, NULL ! 30: }; ! 31: ! 32: /* */ ! 33: ! 34: #define NONEOK 0x0 ! 35: #define UUCPOLD 0x1 ! 36: #define UUCPNEW 0x2 ! 37: #define UUCPOK (UUCPOLD | UUCPNEW) ! 38: #define MMDFOLD 0x4 ! 39: #define MMDFNEW 0x8 ! 40: #define MMDFOK (MMDFOLD | MMDFNEW) ! 41: ! 42: ! 43: #ifdef POP ! 44: int snoop = 0; ! 45: #endif POP ! 46: ! 47: ! 48: #ifdef SYS5 ! 49: struct passwd *getpwuid(), *getpwnam(); ! 50: #endif SYS5 ! 51: ! 52: /* */ ! 53: ! 54: /* ARGSUSED */ ! 55: ! 56: main (argc, argv) ! 57: int argc; ! 58: char *argv[]; ! 59: { ! 60: int vecp = 0; ! 61: #ifdef POP ! 62: int rpop = 1; ! 63: #endif POP ! 64: char *cp, ! 65: #ifdef POP ! 66: *host = NULL, ! 67: #endif POP ! 68: buf[80], ! 69: **ap, ! 70: **argp, ! 71: *arguments[MAXARGS], ! 72: *vec[50]; ! 73: struct passwd *pw; ! 74: ! 75: invo_name = r1bindex (argv[0], '/'); ! 76: mts_init (invo_name); ! 77: #ifdef POP ! 78: if (pophost && *pophost) ! 79: host = pophost; ! 80: if ((cp = getenv ("MHPOPDEBUG")) && *cp) ! 81: snoop++; ! 82: #endif POP ! 83: if ((cp = m_find (invo_name)) != NULL) { ! 84: ap = brkstring (cp = getcpy (cp), " ", "\n"); ! 85: ap = copyip (ap, arguments); ! 86: } ! 87: else ! 88: ap = arguments; ! 89: (void) copyip (argv + 1, ap); ! 90: argp = arguments; ! 91: ! 92: /* */ ! 93: ! 94: while (cp = *argp++) { ! 95: if (*cp == '-') ! 96: switch (smatch (++cp, switches)) { ! 97: case AMBIGSW: ! 98: ambigsw (cp, switches); ! 99: done (1); ! 100: case UNKWNSW: ! 101: adios (NULLCP, "-%s unknown", cp); ! 102: case HELPSW: ! 103: (void) sprintf (buf, "%s [switches] [users ...]", ! 104: invo_name); ! 105: help (buf, switches); ! 106: done (1); ! 107: ! 108: #ifdef POP ! 109: case HOSTSW: ! 110: if (!(host = *argp++) || *host == '-') ! 111: adios (NULLCP, "missing argument to %s", argp[-2]); ! 112: continue; ! 113: case USERSW: ! 114: if (!(cp = *argp++) || *cp == '-') ! 115: adios (NULLCP, "missing argument to %s", argp[-2]); ! 116: vec[vecp++] = cp; ! 117: continue; ! 118: case RPOPSW: ! 119: rpop++; ! 120: continue; ! 121: case NRPOPSW: ! 122: rpop = 0; ! 123: continue; ! 124: #endif POP ! 125: } ! 126: vec[vecp++] = cp; ! 127: } ! 128: ! 129: /* */ ! 130: ! 131: #ifdef POP ! 132: if (!*host) ! 133: host = NULL; ! 134: if (!host || !rpop) ! 135: (void) setuid (getuid ()); ! 136: #endif POP ! 137: if (vecp == 0) { ! 138: #ifdef POP ! 139: if (host) ! 140: remotemail (host, NULLCP, rpop, 1); ! 141: else ! 142: #endif POP ! 143: if ((pw = getpwuid (getuid ())) == NULL) ! 144: adios (NULLCP, "you lose"); ! 145: else ! 146: checkmail (pw, 1); ! 147: } ! 148: else { ! 149: vec[vecp] = NULL; ! 150: ! 151: for (vecp = 0; cp = vec[vecp]; vecp++) ! 152: #ifdef POP ! 153: if (host) ! 154: remotemail (host, cp, rpop, 0); ! 155: else ! 156: #endif POP ! 157: if (pw = getpwnam (cp)) ! 158: checkmail (pw, 0); ! 159: else ! 160: advise (NULLCP, "no such user as %s", cp); ! 161: } ! 162: ! 163: done (0); ! 164: } ! 165: ! 166: /* */ ! 167: ! 168: checkmail (pw, personal) ! 169: register struct passwd *pw; ! 170: int personal; ! 171: { ! 172: int mf; ! 173: char buffer[BUFSIZ]; ! 174: struct stat st; ! 175: ! 176: (void) sprintf (buffer, "%s/%s", ! 177: mmdfldir[0] ? mmdfldir : pw -> pw_dir, ! 178: mmdflfil[0] ? mmdflfil : pw -> pw_name); ! 179: mf = (stat (buffer, &st) == NOTOK || st.st_size == 0) ? NONEOK ! 180: : st.st_atime <= st.st_mtime ? MMDFNEW : MMDFOLD; ! 181: ! 182: #ifdef MF ! 183: if (umincproc != NULL && *umincproc != NULL) { ! 184: (void) sprintf (buffer, "%s/%s", ! 185: uucpldir[0] ? uucpldir : pw -> pw_dir, ! 186: uucplfil[0] ? uucplfil : pw -> pw_name); ! 187: mf |= (stat (buffer, &st) == NOTOK || st.st_size == 0) ? NONEOK ! 188: : st.st_atime <= st.st_mtime ? UUCPNEW : UUCPOLD; ! 189: } ! 190: #endif MF ! 191: ! 192: if ((mf & UUCPOK) || (mf & MMDFOK)) { ! 193: printf (personal ? "You have " : "%s has ", pw -> pw_name); ! 194: if (mf & UUCPOK) ! 195: printf ("%s old-style bell", ! 196: mf & UUCPOLD ? "old" : "new"); ! 197: if ((mf & UUCPOK) && (mf & MMDFOK)) ! 198: printf (" and "); ! 199: if (mf & MMDFOK) ! 200: printf ("%s Internet", ! 201: mf & MMDFOLD ? "old" : "new"); ! 202: printf (" mail waiting\n"); ! 203: } ! 204: else ! 205: printf (personal ? "You don't %s%s" : "%s doesn't %s", ! 206: personal ? "" : pw -> pw_name, "have any mail waiting\n"); ! 207: } ! 208: ! 209: /* */ ! 210: ! 211: #ifdef POP ! 212: extern char response[]; ! 213: ! 214: ! 215: remotemail (host, user, rpop, personal) ! 216: register char *host; ! 217: char *user; ! 218: int rpop, ! 219: personal; ! 220: { ! 221: int nmsgs, ! 222: nbytes; ! 223: char *pass; ! 224: ! 225: if (rpop) { ! 226: if (user == NULL) ! 227: user = getusr (); ! 228: pass = getusr (); ! 229: } ! 230: else ! 231: ruserpass (host, &user, &pass); ! 232: ! 233: if (pop_init (host, user, pass, snoop, rpop) == NOTOK ! 234: || pop_stat (&nmsgs, &nbytes) == NOTOK ! 235: || pop_quit () == NOTOK) { ! 236: advise (NULLCP, "%s", response); ! 237: return; ! 238: } ! 239: ! 240: if (nmsgs) { ! 241: printf (personal ? "You have " : "%s has ", user); ! 242: printf ("%d message%s (%d bytes)", ! 243: nmsgs, nmsgs != 1 ? "s" : "", nbytes); ! 244: } ! 245: else ! 246: printf (personal ? "You don't %s%s" : "%s doesn't %s", ! 247: personal ? "" : user, "have any mail waiting"); ! 248: printf (" on %s\n", host); ! 249: } ! 250: #endif POP
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.