Annotation of 43BSD/contrib/mh/support/bboards/bbexp.c, revision 1.1

1.1     ! root        1: /* bbexp.c - expunge the BBoards area */
        !             2: 
        !             3: #include "../h/mh.h"
        !             4: #include "../h/dropsbr.h"
        !             5: #include "../zotnet/bboards.h"
        !             6: #include <pwd.h>
        !             7: #include <signal.h>
        !             8: #include <stdio.h>
        !             9: #include <sys/types.h>
        !            10: #include <sys/stat.h>
        !            11: 
        !            12: 
        !            13: #define        FIRST   12
        !            14: #define        SECOND  20
        !            15: 
        !            16: 
        !            17: static int  broken_pipe;
        !            18: 
        !            19: int    pipeser ();
        !            20: 
        !            21: 
        !            22: struct passwd *getpwnam ();
        !            23: 
        !            24: /*  */
        !            25: 
        !            26: /* ARGSUSED */
        !            27: 
        !            28: main (argc, argv)
        !            29: int    argc;
        !            30: char  **argv;
        !            31: {
        !            32:     int            first = FIRST,
        !            33:            second = SECOND;
        !            34:     char   *cp;
        !            35:     struct bboard  *bb;
        !            36:     struct passwd  *pw;
        !            37: 
        !            38:     invo_name = r1bindex (*argv++, '/');
        !            39:     m_foil (NULLCP);
        !            40: 
        !            41:     if ((pw = getpwnam (BBOARDS)) == NULL)
        !            42:        adios (NULLCP, "no entry for ~%s", BBOARDS);
        !            43:     if (pw -> pw_uid != geteuid ())
        !            44:        adios (NULLCP, "not running setuid to %s", BBOARDS);
        !            45: 
        !            46:     if (*argv && **argv == '-') {
        !            47:        if ((first = atoi (*argv + 1)) < 1)
        !            48:            first = FIRST;
        !            49:        argv++;
        !            50:     }
        !            51:     if (*argv && **argv == '-') {
        !            52:        if ((second = atoi (*argv + 1)) < 1)
        !            53:            second = SECOND;
        !            54:        argv++;
        !            55:     }
        !            56:     
        !            57:     (void) setbbent (SB_STAY);
        !            58:     if (*argv == NULL)
        !            59:        while (bb = getbbent ()) {
        !            60:            if ((bb -> bb_flags & BB_ARCH) & (BB_ASAV | BB_AREM))
        !            61:                process (bb, pw, first, second);
        !            62:        }
        !            63:     else
        !            64:        while (cp = *argv++)
        !            65:            if ((bb = getbbnam (cp)) || (bb = getbbaka (cp))) {
        !            66:                if ((bb -> bb_flags & BB_ARCH) & (BB_ASAV | BB_AREM))
        !            67:                    process (bb, pw, first, second);
        !            68:            }
        !            69:            else
        !            70:                advise (NULLCP, "no such BBoard as %s", cp);
        !            71:     (void) endbbent ();
        !            72: 
        !            73:     exit (0);
        !            74: }
        !            75: 
        !            76: /*  */
        !            77: 
        !            78: static process(bb, pw, first, second)
        !            79: struct bboard *bb;
        !            80: struct passwd *pw;
        !            81: int    first,
        !            82:        second;
        !            83: {
        !            84:     int     fd,
        !            85:             td;
        !            86:     char   *cp,
        !            87:             command[BUFSIZ],
        !            88:             tmpfil[BUFSIZ];
        !            89:     FILE * pf;
        !            90: 
        !            91:     if ((fd = lkopen (bb -> bb_file, 6)) == NOTOK) {
        !            92:        advise (bb -> bb_file, "unable to lock and open");
        !            93:        return;
        !            94:     }
        !            95: 
        !            96:     (void) sprintf (tmpfil, "%s/#bbexpXXXXXX", pw -> pw_dir);
        !            97:     (void) unlink (mktemp (tmpfil));
        !            98:     if ((td = creat (tmpfil, 0600)) == NOTOK) {
        !            99:        advise (tmpfil, "unable to create");
        !           100:        goto out1;
        !           101:     }
        !           102:     (void) close (td);
        !           103:     if ((td = creat (cp = map_name (tmpfil), 0600)) == NOTOK) {
        !           104:        advise (cp, "unable to create");
        !           105:        goto out2;
        !           106:     }
        !           107:     (void) close (td);
        !           108: 
        !           109:     (void) sprintf (command, "%s %s%s", mshproc, bb -> bb_file,
        !           110:            isatty (fileno (stdout)) ? " 2>&1 | cat" : "");
        !           111:     printf ("%s  (%s old messages)\n", command,
        !           112:            (bb -> bb_flags & BB_ARCH) == BB_ASAV ? "archive" : "remove");
        !           113:     (void) fflush (stdout);
        !           114:     if ((pf = popen (command, "w")) == NULL) {
        !           115:        advise (NULLCP, "unable to popen \"%s\" for writing", command);
        !           116:        goto out3;
        !           117:     }
        !           118:     (void) signal (SIGPIPE, pipeser);
        !           119:     broken_pipe = 0;
        !           120: 
        !           121:     fprintf (pf, "pick %s -before -%d -sequence select -zero\n",
        !           122:            "-datefield BB-Posted", first);
        !           123:     fprintf (pf, "pick -before -%d -sequence select -nozero\n", second);
        !           124:     fprintf (pf, "scan select\n");
        !           125:     if ((bb -> bb_flags & BB_ARCH) == BB_ASAV)
        !           126:        fprintf (pf, "pack select -file %s\n", bb -> bb_archive);
        !           127:     fprintf (pf, "rmm select\n");
        !           128:     fprintf (pf, "pack all -file %s\n", tmpfil);
        !           129:     fprintf (pf, "quit\n");
        !           130:     if (td = pclose (pf))
        !           131:        advise (NULLCP, "msh returns %d", td);
        !           132:     (void) signal (SIGPIPE, SIG_DFL);
        !           133: 
        !           134:     if (move (tmpfil, bb -> bb_file) != NOTOK)
        !           135:        (void) move (cp, bb -> bb_map);
        !           136: 
        !           137: out3: ;
        !           138:     (void) unlink (cp);
        !           139: out2: ;
        !           140:     (void) unlink (tmpfil);
        !           141: out1: ;
        !           142:     (void) lkclose (fd, bb -> bb_file);
        !           143: }
        !           144: 
        !           145: /*  */
        !           146: 
        !           147: static  int move (input, output)
        !           148: char   *input,
        !           149:        *output;
        !           150: {
        !           151:     int     i,
        !           152:             in,
        !           153:             out;
        !           154:     struct stat st1,
        !           155:                 st2;
        !           156: 
        !           157:     if ((in = open (input, 0)) == NOTOK) {
        !           158:        advise (input, "unable to re-open");
        !           159:        return NOTOK;
        !           160:     }
        !           161: 
        !           162:     i = stat (output, &st1);
        !           163:     if ((out = creat (output, BBMODE)) == NOTOK) {
        !           164:        advise (output, "unable to re-create");
        !           165:        return NOTOK;
        !           166:     }
        !           167:     if (i != NOTOK && chmod (output, (int) (st1.st_mode & 0777)) == NOTOK)
        !           168:        admonish (output, "unable to change mode of");
        !           169:     if (i != NOTOK && stat (output, &st2) != NOTOK && st2.st_gid != st1.st_gid)
        !           170:        chgrp (output, st1.st_gid);
        !           171: 
        !           172:     cpydata (in, out, input, output);
        !           173: 
        !           174:     (void) close (in);
        !           175:     (void) close (out);
        !           176: 
        !           177:     return OK;
        !           178: }
        !           179: 
        !           180: /*  */
        !           181: 
        !           182: static  chgrp (file, gid)
        !           183: char   *file;
        !           184: short   gid;
        !           185: {
        !           186:     int     child_id;
        !           187:     char    group[BUFSIZ];
        !           188: 
        !           189:     switch (child_id = fork ()) {
        !           190:        case NOTOK: 
        !           191:            admonish ("fork", "unable to");
        !           192:            return;
        !           193: 
        !           194:        case OK: 
        !           195:            (void) setuid (geteuid ());
        !           196:            (void) sprintf (group, "%d", gid);
        !           197:            execlp ("/bin/chgrp", chgrp, group, file, NULLCP);
        !           198:            fprintf (stderr, "unable to exec ");
        !           199:            perror ("/bin/chgrp");
        !           200:            _exit (1);
        !           201: 
        !           202:        default: 
        !           203:            (void) pidwait (child_id, OK);
        !           204:            break;
        !           205:     }
        !           206: }
        !           207: 
        !           208: /*  */
        !           209: 
        !           210: /* ARGSUSED */
        !           211: 
        !           212: static  int pipeser (i)
        !           213: int     i;
        !           214: {
        !           215: #ifndef        BSD42
        !           216:     (void) signal (SIGPIPE, pipeser);
        !           217: #endif not BSD42
        !           218: 
        !           219:     if (!broken_pipe++)
        !           220:        advise (NULLCP, "broken pipe");
        !           221: }
        !           222: 
        !           223: /*  */
        !           224: 
        !           225: #ifdef notdef
        !           226: 
        !           227: /* This is the OLD way of doing it */
        !           228: 
        !           229:                              bbremove.sh
        !           230: : run this script through /bin/sh
        !           231: pick +bbl -before -12 -datefield BB-Posted -sequence select -zero
        !           232: pick +bbl -before -20 -sequence select -nozero
        !           233: scan select; refile -src +bbl select +bbl/arc
        !           234: rmf +bbl/arc
        !           235: 
        !           236:                               bbsave.sh
        !           237: : run this script through /bin/sh
        !           238: pick +bbl -before -12 -datefield BB-Posted -sequence select -zero
        !           239: pick +bbl -before -20 -sequence select -nozero
        !           240: scan select; refile -src +bbl select +bbl/arc
        !           241: 
        !           242: /* bbexp.c - generate a script to archive the BBoards area */
        !           243: 
        !           244: #include <stdio.h>
        !           245: #include "../zotnet/bboards.h"
        !           246: 
        !           247: /*  */
        !           248: 
        !           249: /* ARGSUSED */
        !           250: 
        !           251: main (argc, argv)
        !           252: int     argc;
        !           253: char  **argv;
        !           254: {
        !           255:     struct bboard  *bb;
        !           256: 
        !           257:     printf ("#! /bin/sh\n");
        !           258: 
        !           259:     (void) setbbent (SB_STAY);
        !           260:     while (bb = getbbent ())
        !           261:        switch (bb -> bb_flags & BB_ARCH) {
        !           262:            case BB_ASAV: 
        !           263:                printf ("bbl -shell bbsave %s\n", bb -> bb_name);
        !           264:                break;
        !           265: 
        !           266:            case BB_AREM: 
        !           267:                printf ("bbl -shell bbremove %s\n", bb -> bb_name);
        !           268:                break;
        !           269:        }
        !           270: 
        !           271:     (void) endbbent ();
        !           272: 
        !           273:     exit (0);
        !           274: }
        !           275: #endif notdef

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.