Annotation of 43BSDReno/contrib/mh/support/bboards/bbexp.c, revision 1.1.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:     struct stat st;
                     91: 
                     92:     if ((fd = lkopen (bb -> bb_file, 6)) == NOTOK) {
                     93:        advise (bb -> bb_file, "unable to lock and open");
                     94:        return;
                     95:     }
                     96: 
                     97:     (void) sprintf (tmpfil, "%s/#bbexpXXXXXX", pw -> pw_dir);
                     98:     (void) unlink (mktemp (tmpfil));
                     99:     if ((td = creat (tmpfil, 0600)) == NOTOK) {
                    100:        advise (tmpfil, "unable to create");
                    101:        goto out1;
                    102:     }
                    103:     (void) close (td);
                    104:     if ((td = creat (cp = map_name (tmpfil), 0600)) == NOTOK) {
                    105:        advise (cp, "unable to create");
                    106:        goto out2;
                    107:     }
                    108:     (void) close (td);
                    109: 
                    110:     if ((bb -> bb_flags & BB_ARCH)
                    111:            && stat (bb -> bb_archive, &st) == NOTOK
                    112:            && stat (bb -> bb_file, &st) != NOTOK
                    113:            && (td = creat (bb -> bb_archive, (int) (st.st_mode & 0777))) != NOTOK)
                    114:        (void) close (td);
                    115: 
                    116:     (void) sprintf (command, "%s %s%s", mshproc, bb -> bb_file,
                    117:            isatty (fileno (stdout)) ? " 2>&1 | cat" : "");
                    118:     printf ("%s  (%s old messages)\n", command,
                    119:            (bb -> bb_flags & BB_ARCH) == BB_ASAV ? "archive" : "remove");
                    120:     (void) fflush (stdout);
                    121:     if ((pf = popen (command, "w")) == NULL) {
                    122:        advise (NULLCP, "unable to popen \"%s\" for writing", command);
                    123:        goto out3;
                    124:     }
                    125:     (void) signal (SIGPIPE, pipeser);
                    126:     broken_pipe = 0;
                    127: 
                    128:     fprintf (pf, "pick %s -before -%d -sequence select -zero\n",
                    129:            "-datefield BB-Posted", first);
                    130:     fprintf (pf, "pick -before -%d -sequence select -nozero\n", second);
                    131:     fprintf (pf, "scan select\n");
                    132:     if ((bb -> bb_flags & BB_ARCH) == BB_ASAV)
                    133:        fprintf (pf, "pack select -file %s\n", bb -> bb_archive);
                    134:     fprintf (pf, "rmm select\n");
                    135:     fprintf (pf, "packf all -file %s\n", tmpfil);
                    136: #ifdef notdef                  /* want real EOF to end it */
                    137:     fprintf (pf, "quit\n");
                    138: #endif notdef
                    139:     if (td = pclose (pf))
                    140:        advise (NULLCP, "msh returns %d", td);
                    141:     (void) signal (SIGPIPE, SIG_DFL);
                    142: 
                    143:     if (move (tmpfil, bb -> bb_file) != NOTOK)
                    144:        (void) move (cp, bb -> bb_map);
                    145: 
                    146: out3: ;
                    147:     (void) unlink (cp);
                    148: out2: ;
                    149:     (void) unlink (tmpfil);
                    150: out1: ;
                    151:     (void) lkclose (fd, bb -> bb_file);
                    152: }
                    153: 
                    154: /*  */
                    155: 
                    156: static  int move (input, output)
                    157: char   *input,
                    158:        *output;
                    159: {
                    160:     int     i,
                    161:             in,
                    162:             out;
                    163:     struct stat st1,
                    164:                 st2;
                    165: 
                    166:     if ((in = open (input, 0)) == NOTOK) {
                    167:        advise (input, "unable to re-open");
                    168:        return NOTOK;
                    169:     }
                    170: 
                    171:     i = stat (output, &st1);
                    172:     if ((out = creat (output, BBMODE)) == NOTOK) {
                    173:        advise (output, "unable to re-create");
                    174:        return NOTOK;
                    175:     }
                    176:     if (i != NOTOK && chmod (output, (int) (st1.st_mode & 0777)) == NOTOK)
                    177:        admonish (output, "unable to change mode of");
                    178:     if (i != NOTOK && stat (output, &st2) != NOTOK && st2.st_gid != st1.st_gid)
                    179:        chgrp (output, st1.st_gid);
                    180: 
                    181:     cpydata (in, out, input, output);
                    182: 
                    183:     (void) close (in);
                    184:     (void) close (out);
                    185: 
                    186:     return OK;
                    187: }
                    188: 
                    189: /*  */
                    190: 
                    191: static  chgrp (file, gid)
                    192: char   *file;
                    193: short   gid;
                    194: {
                    195:     int     child_id;
                    196:     char    group[BUFSIZ];
                    197: 
                    198:     switch (child_id = fork ()) {
                    199:        case NOTOK: 
                    200:            admonish ("fork", "unable to");
                    201:            return;
                    202: 
                    203:        case OK: 
                    204:            (void) setuid (geteuid ());
                    205:            (void) sprintf (group, "%d", gid);
                    206:            execlp ("/bin/chgrp", chgrp, group, file, NULLCP);
                    207:            fprintf (stderr, "unable to exec ");
                    208:            perror ("/bin/chgrp");
                    209:            _exit (1);
                    210: 
                    211:        default: 
                    212:            (void) pidwait (child_id, OK);
                    213:            break;
                    214:     }
                    215: }
                    216: 
                    217: /*  */
                    218: 
                    219: /* ARGSUSED */
                    220: 
                    221: static  int pipeser (i)
                    222: int     i;
                    223: {
                    224: #ifndef        BSD42
                    225:     (void) signal (SIGPIPE, pipeser);
                    226: #endif not BSD42
                    227: 
                    228:     if (!broken_pipe++)
                    229:        advise (NULLCP, "broken pipe");
                    230: }

unix.superglobalmegacorp.com

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