|
|
1.1 ! root 1: /* whatnowsbr.c - the WhatNow shell */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include <stdio.h> ! 5: #include <signal.h> ! 6: #include <sys/types.h> ! 7: #include <sys/stat.h> ! 8: ! 9: /* */ ! 10: ! 11: static struct swit whatnowswitches[] = { ! 12: #define DFOLDSW 0 ! 13: "draftfolder +folder", 0, ! 14: #define DMSGSW 1 ! 15: "draftmessage msg", 0, ! 16: #define NDFLDSW 2 ! 17: "nodraftfolder", 0, ! 18: ! 19: #define EDITRSW 3 ! 20: "editor editor", 0, ! 21: #define NEDITSW 4 ! 22: "noedit", 0, ! 23: ! 24: #define PRMPTSW 5 ! 25: "prompt string", 4, ! 26: ! 27: #define HELPSW 6 ! 28: "help", 4, ! 29: ! 30: NULL, NULL ! 31: }; ! 32: ! 33: /* */ ! 34: ! 35: static struct swit aleqs[] = { ! 36: #define DISPSW 0 ! 37: "display [<switches>]", 0, ! 38: #define EDITSW 1 ! 39: "edit [<editor> <switches>]", 0, ! 40: #define LISTSW 2 ! 41: "list [<switches>]", 0, ! 42: #define PUSHSW 3 ! 43: "push [<switches>]", 0, ! 44: #define QUITSW 4 ! 45: "quit [-delete]", 0, ! 46: #define REFILEOPT 5 ! 47: "refile [<switches>] +folder", 0, ! 48: #define SENDSW 6 ! 49: "send [<switches>]", 0, ! 50: #define WHOMSW 7 ! 51: "whom [<switches>]", 0, ! 52: ! 53: NULL, NULL ! 54: }; ! 55: ! 56: /* */ ! 57: ! 58: static char *myprompt = "\nWhat now? "; ! 59: ! 60: /* */ ! 61: ! 62: /* ARGSUSED */ ! 63: ! 64: int WhatNow (argc, argv) ! 65: int argc; ! 66: char **argv; ! 67: { ! 68: int isdf = 0, ! 69: nedit = 0, ! 70: use = 0; ! 71: char *cp, ! 72: *dfolder = NULL, ! 73: *dmsg = NULL, ! 74: *ed = NULL, ! 75: *drft = NULL, ! 76: *msgnam = NULL, ! 77: buf[100], ! 78: prompt[BUFSIZ], ! 79: **ap, ! 80: **argp, ! 81: *arguments[MAXARGS]; ! 82: struct stat st; ! 83: ! 84: invo_name = r1bindex (argv[0], '/'); ! 85: if ((cp = m_find (invo_name)) != NULL) { ! 86: ap = brkstring (cp = getcpy (cp), " ", "\n"); ! 87: ap = copyip (ap, arguments); ! 88: } ! 89: else ! 90: ap = arguments; ! 91: (void) copyip (argv + 1, ap); ! 92: argp = arguments; ! 93: ! 94: /* */ ! 95: ! 96: while (cp = *argp++) { ! 97: if (*cp == '-') ! 98: switch (smatch (++cp, whatnowswitches)) { ! 99: case AMBIGSW: ! 100: ambigsw (cp, whatnowswitches); ! 101: done (1); ! 102: case UNKWNSW: ! 103: adios (NULLCP, "-%s unknown", cp); ! 104: case HELPSW: ! 105: (void) sprintf (buf, "%s [switches] [file]", invo_name); ! 106: help (buf, whatnowswitches); ! 107: done (1); ! 108: ! 109: case DFOLDSW: ! 110: if (dfolder) ! 111: adios (NULLCP, "only one draft folder at a time!"); ! 112: if (!(cp = *argp++) || *cp == '-') ! 113: adios (NULLCP, "missing argument to %s", argp[-2]); ! 114: dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp, ! 115: *cp != '@' ? TFOLDER : TSUBCWF); ! 116: continue; ! 117: case DMSGSW: ! 118: if (dmsg) ! 119: adios (NULLCP, "only one draft message at a time!"); ! 120: if (!(dmsg = *argp++) || *dmsg == '-') ! 121: adios (NULLCP, "missing argument to %s", argp[-2]); ! 122: continue; ! 123: case NDFLDSW: ! 124: dfolder = NULL; ! 125: isdf = NOTOK; ! 126: continue; ! 127: ! 128: case EDITRSW: ! 129: if (!(ed = *argp++) || *ed == '-') ! 130: adios (NULLCP, "missing argument to %s", argp[-2]); ! 131: nedit = 0; ! 132: continue; ! 133: case NEDITSW: ! 134: nedit++; ! 135: continue; ! 136: ! 137: case PRMPTSW: ! 138: if (!(myprompt = *argp++) || *myprompt == '-') ! 139: adios (NULLCP, "missing argument to %s", argp[-2]); ! 140: continue; ! 141: } ! 142: if (drft) ! 143: adios (NULLCP, "only one draft at a time!"); ! 144: else ! 145: drft = cp; ! 146: } ! 147: ! 148: /* */ ! 149: ! 150: if (drft == NULL && (drft = getenv ("mhdraft")) == NULL || *drft == NULL) ! 151: drft = getcpy (m_draft (dfolder, dmsg, 1, &isdf)); ! 152: msgnam = (cp = getenv ("mhaltmsg")) && *cp ? getcpy (cp) : NULLCP; ! 153: if (ed == NULL && ((ed = getenv ("mheditor")) == NULL || *ed == NULL)) ! 154: ed = NULL, nedit++; ! 155: if ((cp = getenv ("mhuse")) && *cp) ! 156: use = atoi (cp); ! 157: if (!nedit ! 158: && editfile (&ed, NULLVP, drft, use, NULLMP, msgnam, NULLCP) < 0) ! 159: done (1); ! 160: ! 161: /* */ ! 162: ! 163: (void) sprintf (prompt, myprompt, invo_name); ! 164: for (;;) { ! 165: if (!(argp = getans (prompt, aleqs))) { ! 166: (void) unlink (LINK); ! 167: done (1); ! 168: } ! 169: switch (smatch (*argp, aleqs)) { ! 170: case DISPSW: ! 171: if (msgnam) ! 172: (void) showfile (++argp, msgnam); ! 173: else ! 174: advise (NULLCP, "no alternate message to display"); ! 175: break; ! 176: ! 177: case EDITSW: ! 178: if (*++argp) ! 179: ed = *argp++; ! 180: if (editfile (&ed, argp, drft, NOUSE, NULLMP, msgnam, NULLCP) ! 181: == NOTOK) ! 182: done (1); ! 183: break; ! 184: ! 185: case LISTSW: ! 186: (void) showfile (++argp, drft); ! 187: break; ! 188: ! 189: case WHOMSW: ! 190: (void) whomfile (++argp, drft); ! 191: break; ! 192: ! 193: case QUITSW: ! 194: if (*++argp && (*argp[0] == 'd' || ! 195: ((*argp)[0] == '-' && (*argp)[1] == 'd'))) { ! 196: if (unlink (drft) == NOTOK) ! 197: adios (drft, "unable to unlink"); ! 198: } ! 199: else ! 200: if (stat (drft, &st) != NOTOK) ! 201: advise (NULLCP, "draft left on %s", drft); ! 202: done (1); ! 203: ! 204: case PUSHSW: ! 205: sendfile (++argp, drft, 1); ! 206: done (1); ! 207: ! 208: case SENDSW: ! 209: sendfile (++argp, drft, 0); ! 210: break; ! 211: ! 212: case REFILEOPT: ! 213: if (refile (++argp, drft) == 0) ! 214: done (0); ! 215: break; ! 216: ! 217: default: ! 218: advise (NULLCP, "say what?"); ! 219: break; ! 220: } ! 221: } ! 222: } ! 223: ! 224: /* EDIT */ ! 225: ! 226: static int reedit = 0; ! 227: static char *edsave = NULL; ! 228: ! 229: ! 230: /* ARGSUSED */ ! 231: ! 232: static int editfile (ed, arg, file, use, mp, altmsg, cwd) ! 233: register struct msgs *mp; ! 234: register char **ed, ! 235: **arg, ! 236: *file, ! 237: *altmsg, ! 238: *cwd; ! 239: register int use; ! 240: { ! 241: int pid, ! 242: status; ! 243: register int vecp; ! 244: register char *cp; ! 245: char altpath[BUFSIZ], ! 246: linkpath[BUFSIZ], ! 247: *vec[MAXARGS]; ! 248: struct stat st; ! 249: #ifdef BSD42 ! 250: int slinked; ! 251: #endif BSD42 ! 252: ! 253: if (!reedit) { /* set initial editor */ ! 254: if (*ed == NULL && (*ed = m_find ("editor")) == NULL) ! 255: *ed = sysed; ! 256: } ! 257: else ! 258: if (!*ed) { /* no explicit editor */ ! 259: *ed = edsave; ! 260: if ((cp = r1bindex (*ed, '/')) == NULL) ! 261: cp = *ed; ! 262: cp = concat (cp, "-next", NULLCP); ! 263: if ((cp = m_find (cp)) != NULL) ! 264: *ed = cp; ! 265: } ! 266: ! 267: if (altmsg) { ! 268: if (mp == NULL || *altmsg == '/' || cwd == NULL) ! 269: (void) strcpy (altpath, altmsg); ! 270: else ! 271: (void) sprintf (altpath, "%s/%s", mp -> foldpath, altmsg); ! 272: if (cwd == NULL) ! 273: (void) strcpy (linkpath, LINK); ! 274: else ! 275: (void) sprintf (linkpath, "%s/%s", cwd, LINK); ! 276: } ! 277: ! 278: if (altmsg) { ! 279: (void) unlink (linkpath); ! 280: #ifdef BSD42 ! 281: if (link (altpath, linkpath) == NOTOK) { ! 282: (void) symlink (altpath, linkpath); ! 283: slinked = 1; ! 284: } ! 285: else ! 286: slinked = 0; ! 287: #else not BSD42 ! 288: (void) link (altpath, linkpath); ! 289: #endif not BSD42 ! 290: } ! 291: ! 292: m_update (); ! 293: (void) fflush (stdout); ! 294: ! 295: switch (pid = vfork ()) { ! 296: case NOTOK: ! 297: advise ("fork", "unable to"); ! 298: status = NOTOK; ! 299: break; ! 300: ! 301: case OK: ! 302: if (cwd) ! 303: (void) chdir (cwd); ! 304: if (altmsg) { ! 305: if (mp) ! 306: (void) putenv ("mhfolder", mp -> foldpath); ! 307: (void) putenv ("editalt", altpath); ! 308: } ! 309: ! 310: vecp = 0; ! 311: vec[vecp++] = r1bindex (*ed, '/'); ! 312: if (arg) ! 313: while (*arg) ! 314: vec[vecp++] = *arg++; ! 315: vec[vecp++] = file; ! 316: vec[vecp] = NULL; ! 317: ! 318: execvp (*ed, vec); ! 319: fprintf (stderr, "unable to exec "); ! 320: perror (*ed); ! 321: _exit (-1); ! 322: ! 323: default: ! 324: if (status = pidwait (pid, NOTOK)) { ! 325: if (((status & 0xff00) != 0xff00) ! 326: && (!reedit || (status & 0x00ff))) ! 327: if (!use && (status & 0xff00)) { ! 328: (void) unlink (file); ! 329: advise (NULLCP, "problems with edit--%s deleted", file); ! 330: } ! 331: else ! 332: advise (NULLCP, "problems with edit--%s preserved", ! 333: file); ! 334: status = -2; ! 335: break; ! 336: } ! 337: ! 338: reedit++; ! 339: #ifdef BSD42 ! 340: if (altmsg ! 341: && mp ! 342: && (!mp -> msgflags & READONLY) ! 343: && (slinked ! 344: ? lstat (linkpath, &st) != NOTOK ! 345: && (st.st_mode & S_IFMT) == S_IFREG ! 346: && copyf (linkpath, altpath) == NOTOK ! 347: : stat (linkpath, &st) != NOTOK ! 348: && st.st_nlink == 1 ! 349: && (unlink (altpath) == NOTOK ! 350: || link (linkpath, altpath) == NOTOK))) ! 351: advise (linkpath, "unable to update %s from", altmsg); ! 352: #else not BSD42 ! 353: if (altmsg ! 354: && mp ! 355: && (!mp -> msgflags & READONLY) ! 356: && stat (linkpath, &st) != NOTOK ! 357: && st.st_nlink == 1 ! 358: && (unlink (altpath) == NOTOK ! 359: || link (linkpath, altpath) == NOTOK)) ! 360: advise (linkpath, "unable to update %s from", altmsg); ! 361: #endif not BSD42 ! 362: } ! 363: ! 364: edsave = getcpy (*ed); ! 365: *ed = NULL; ! 366: if (altmsg) ! 367: (void) unlink (linkpath); ! 368: ! 369: return status; ! 370: } ! 371: ! 372: /* */ ! 373: ! 374: #ifdef BSD42 ! 375: static int copyf (ifile, ofile) ! 376: register char *ifile, ! 377: *ofile; ! 378: { ! 379: register int i; ! 380: int in, ! 381: out; ! 382: char buffer[BUFSIZ]; ! 383: ! 384: if ((in = open (ifile, 0)) == NOTOK) ! 385: return NOTOK; ! 386: if ((out = open (ofile, 1)) == NOTOK || ftruncate (out, 0) == NOTOK) { ! 387: if (out != NOTOK) { ! 388: admonish (ofile, "unable to truncate"); ! 389: (void) close (out); ! 390: } ! 391: (void) close (in); ! 392: return NOTOK; ! 393: } ! 394: ! 395: while ((i = read (in, buffer, sizeof buffer)) > OK) ! 396: if (write (out, buffer, i) != i) { ! 397: advise (ofile, "may have damaged"); ! 398: i = NOTOK; ! 399: break; ! 400: } ! 401: ! 402: (void) close (in); ! 403: (void) close (out); ! 404: ! 405: return i; ! 406: } ! 407: #endif BSD42 ! 408: ! 409: /* SEND */ ! 410: ! 411: static sendfile (arg, file, pushsw) ! 412: register char **arg, ! 413: *file; ! 414: int pushsw; ! 415: { ! 416: register int child_id, ! 417: i, ! 418: vecp; ! 419: char *cp, ! 420: *sp, ! 421: *vec[MAXARGS]; ! 422: ! 423: if (strcmp (sp = r1bindex (sendproc, '/'), "send") == 0) { ! 424: cp = invo_name; ! 425: sendit (invo_name = sp, arg, file, pushsw); ! 426: invo_name = cp; ! 427: return; ! 428: } ! 429: ! 430: m_update (); ! 431: (void) fflush (stdout); ! 432: ! 433: for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++) ! 434: sleep (5); ! 435: switch (child_id) { ! 436: case NOTOK: ! 437: advise (NULLCP, "unable to fork, so sending directly..."); ! 438: case OK: ! 439: vecp = 0; ! 440: vec[vecp++] = invo_name; ! 441: if (pushsw) ! 442: vec[vecp++] = "-push"; ! 443: if (arg) ! 444: while (*arg) ! 445: vec[vecp++] = *arg++; ! 446: vec[vecp++] = file; ! 447: vec[vecp] = NULL; ! 448: ! 449: execvp (sendproc, vec); ! 450: fprintf (stderr, "unable to exec "); ! 451: perror (sendproc); ! 452: _exit (-1); ! 453: ! 454: default: ! 455: if (pidwait (child_id, OK) == 0) ! 456: done (0); ! 457: return; ! 458: } ! 459: } ! 460: ! 461: /* */ ! 462: ! 463: static struct swit sendswitches[] = { ! 464: #define ALIASW 0 ! 465: "alias aliasfile", 0, ! 466: ! 467: #define DEBUGSW 1 ! 468: "debug", -5, ! 469: ! 470: #define ENCRSW 2 ! 471: "encrypt", ! 472: #ifndef TMA ! 473: -7, ! 474: #else TMA ! 475: 0, ! 476: #endif TMA ! 477: #define NENCRSW 3 ! 478: "noencrypt", ! 479: #ifndef TMA ! 480: -9, ! 481: #else TMA ! 482: 0, ! 483: #endif TMA ! 484: ! 485: #define FILTSW 4 ! 486: "filter filterfile", 0, ! 487: #define NFILTSW 5 ! 488: "nofilter", 0, ! 489: ! 490: #define FRMTSW 6 ! 491: "format", 0, ! 492: #define NFRMTSW 7 ! 493: "noformat", 0, ! 494: ! 495: #define FORWSW 8 ! 496: "forward", 0, ! 497: #define NFORWSW 9 ! 498: "noforward", 0, ! 499: ! 500: #define MSGDSW 10 ! 501: "msgid", 0, ! 502: #define NMSGDSW 11 ! 503: "nomsgid", 0, ! 504: ! 505: #define SPSHSW 12 ! 506: "push", 0, ! 507: #define NSPSHSW 13 ! 508: "nopush", 0, ! 509: ! 510: #define UNIQSW 14 ! 511: "unique", -6, ! 512: #define NUNIQSW 15 ! 513: "nounique", -8, ! 514: ! 515: #define VERBSW 16 ! 516: "verbose", 0, ! 517: #define NVERBSW 17 ! 518: "noverbose", 0, ! 519: ! 520: #define WATCSW 18 ! 521: "watch", 0, ! 522: #define NWATCSW 19 ! 523: "nowatch", 0, ! 524: ! 525: #define WIDTHSW 20 ! 526: "width columns", 0, ! 527: ! 528: #define SHELPSW 21 ! 529: "help", 4, ! 530: ! 531: #define MAILSW 22 ! 532: "mail", -4, ! 533: #define SAMLSW 23 ! 534: "saml", -4, ! 535: #define SSNDSW 24 ! 536: "send", -4, ! 537: #define SOMLSW 25 ! 538: "soml", -4, ! 539: ! 540: #define CLIESW 26 ! 541: "client host", -6, ! 542: #define SERVSW 27 ! 543: "server host", -6, ! 544: #define SNOOPSW 28 ! 545: "snoop", -5, ! 546: ! 547: #define SDRFSW 29 ! 548: "draftfolder +folder", -6, ! 549: #define SDRMSW 30 ! 550: "draftmessage msg", -6, ! 551: #define SNDRFSW 31 ! 552: "nodraftfolder", -3, ! 553: ! 554: NULL, NULL ! 555: }; ! 556: ! 557: /* */ ! 558: ! 559: extern int debugsw; /* from sendsbr.c */ ! 560: extern int forwsw; ! 561: extern int inplace; ! 562: extern int pushsw; ! 563: extern int unique; ! 564: ! 565: extern char *altmsg; /* .. */ ! 566: extern char *annotext; ! 567: extern char *distfile; ! 568: ! 569: /* */ ! 570: ! 571: static sendit (sp, arg, file, pushed) ! 572: register char *sp, ! 573: **arg, ! 574: *file; ! 575: int pushed; ! 576: { ! 577: int distsw = 0, ! 578: vecp = 1; ! 579: char *cp, ! 580: buf[100], ! 581: **ap, ! 582: **argp, ! 583: *arguments[MAXARGS], ! 584: *vec[MAXARGS]; ! 585: struct stat st; ! 586: #ifdef UCI ! 587: FILE *fp; ! 588: #endif UCI ! 589: ! 590: if (arg) ! 591: (void) copyip (arg, vec); ! 592: if ((cp = m_find (sp)) != NULL) { ! 593: ap = brkstring (cp = getcpy (cp), " ", "\n"); ! 594: ap = copyip (ap, arguments); ! 595: } ! 596: else ! 597: ap = arguments; ! 598: if (arg) ! 599: (void) copyip (vec, ap); ! 600: argp = arguments; ! 601: ! 602: debugsw = 0, forwsw = 1, inplace = 0, unique = 0; ! 603: altmsg = annotext = distfile = NULL; ! 604: vec[vecp++] = "-library"; ! 605: vec[vecp++] = getcpy (m_maildir ("")); ! 606: ! 607: /* */ ! 608: ! 609: while (cp = *argp++) { ! 610: if (*cp == '-') ! 611: switch (smatch (++cp, sendswitches)) { ! 612: case AMBIGSW: ! 613: ambigsw (cp, sendswitches); ! 614: return; ! 615: case UNKWNSW: ! 616: advise (NULLCP, "-%s unknown\n", cp); ! 617: return; ! 618: case SHELPSW: ! 619: (void) sprintf (buf, "%s [switches]", sp); ! 620: help (buf, sendswitches); ! 621: return; ! 622: ! 623: case SPSHSW: ! 624: pushed++; ! 625: continue; ! 626: case NSPSHSW: ! 627: pushed = 0; ! 628: continue; ! 629: ! 630: case UNIQSW: ! 631: unique++; ! 632: continue; ! 633: case NUNIQSW: ! 634: unique = 0; ! 635: continue; ! 636: case FORWSW: ! 637: forwsw++; ! 638: continue; ! 639: case NFORWSW: ! 640: forwsw = 0; ! 641: continue; ! 642: ! 643: case DEBUGSW: ! 644: debugsw++; /* fall */ ! 645: case NFILTSW: ! 646: case FRMTSW: ! 647: case NFRMTSW: ! 648: case MSGDSW: ! 649: case NMSGDSW: ! 650: case VERBSW: ! 651: case NVERBSW: ! 652: case WATCSW: ! 653: case NWATCSW: ! 654: case MAILSW: ! 655: case SAMLSW: ! 656: case SSNDSW: ! 657: case SOMLSW: ! 658: case ENCRSW: ! 659: case NENCRSW: ! 660: case SNOOPSW: ! 661: vec[vecp++] = --cp; ! 662: continue; ! 663: ! 664: case ALIASW: ! 665: case FILTSW: ! 666: case WIDTHSW: ! 667: case CLIESW: ! 668: case SERVSW: ! 669: vec[vecp++] = --cp; ! 670: if (!(cp = *argp++) || *cp == '-') { ! 671: advise (NULLCP, "missing argument to %s", argp[-2]); ! 672: return; ! 673: } ! 674: vec[vecp++] = cp; ! 675: continue; ! 676: ! 677: case SDRFSW: ! 678: case SDRMSW: ! 679: if (!(cp = *argp++) || *cp == '-') { ! 680: advise (NULLCP, "missing argument to %s", argp[-2]); ! 681: return; ! 682: } ! 683: case SNDRFSW: ! 684: continue; ! 685: } ! 686: advise (NULLCP, "usage: %s [switches]", sp); ! 687: return; ! 688: } ! 689: ! 690: /* */ ! 691: ! 692: #ifdef TMA ! 693: if ((cp = getenv ("KDS")) == NULL || *cp == NULL) ! 694: if ((cp = m_find ("kdsproc")) && *cp) ! 695: (void) putenv ("KDS", cp); ! 696: if ((cp = getenv ("TMADB")) == NULL || *cp == NULL) ! 697: if ((cp = m_find ("tmadb")) && *cp) ! 698: (void) putenv ("TMADB", m_maildir (cp)); ! 699: #endif TMA ! 700: ! 701: if ((cp = getenv ("SIGNATURE")) == NULL || *cp == NULL) ! 702: if ((cp = m_find ("signature")) && *cp) ! 703: (void) putenv ("SIGNATURE", cp); ! 704: #ifdef UCI ! 705: else { ! 706: (void) sprintf (buf, "%s/.signature", mypath); ! 707: if ((fp = fopen (buf, "r")) != NULL ! 708: && fgets (buf, sizeof buf, fp) != NULL) { ! 709: (void) fclose (fp); ! 710: if (cp = index (buf, '\n')) ! 711: *cp = NULL; ! 712: (void) putenv ("SIGNATURE", buf); ! 713: } ! 714: } ! 715: #endif UCI ! 716: ! 717: if ((annotext = getenv ("mhannotate")) == NULL || *annotext == NULL) ! 718: annotext = NULL; ! 719: if ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == NULL) ! 720: altmsg = NULL; ! 721: if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != NULL)) ! 722: inplace = atoi (cp); ! 723: ! 724: if ((cp = getenv ("mhdist")) ! 725: && *cp ! 726: && (distsw = atoi (cp)) ! 727: && altmsg) { ! 728: vec[vecp++] = "-dist"; ! 729: distfile = getcpy (m_scratch (altmsg, invo_name)); ! 730: if (link (altmsg, distfile) == NOTOK) ! 731: adios (distfile, "unable to link %s to", altmsg); ! 732: } ! 733: else ! 734: distfile = NULL; ! 735: ! 736: if (altmsg == NULL || stat (altmsg, &st) == NOTOK) ! 737: st.st_mtime = 0, st.st_dev = 0, st.st_ino = 0; ! 738: if (pushsw = pushed) ! 739: push (); ! 740: ! 741: vec[0] = r1bindex (postproc, '/'); ! 742: closefds (3); ! 743: ! 744: if (sendsbr (vec, vecp, file, &st) == OK) ! 745: done (0); ! 746: } ! 747: ! 748: /* WHOM */ ! 749: ! 750: static int whomfile (arg, file) ! 751: register char **arg, ! 752: *file; ! 753: { ! 754: int pid; ! 755: register int vecp; ! 756: char *vec[MAXARGS]; ! 757: ! 758: m_update (); ! 759: (void) fflush (stdout); ! 760: ! 761: switch (pid = vfork ()) { ! 762: case NOTOK: ! 763: advise ("fork", "unable to"); ! 764: return 1; ! 765: ! 766: case OK: ! 767: vecp = 0; ! 768: vec[vecp++] = r1bindex (whomproc, '/'); ! 769: vec[vecp++] = file; ! 770: if (arg) ! 771: while (*arg) ! 772: vec[vecp++] = *arg++; ! 773: vec[vecp] = NULL; ! 774: ! 775: execvp (whomproc, vec); ! 776: fprintf (stderr, "unable to exec "); ! 777: perror (whomproc); ! 778: _exit (-1); /* NOTREACHED */ ! 779: ! 780: default: ! 781: return (pidwait (pid, NOTOK) & 0377 ? 1 : 0); ! 782: } ! 783: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.