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

Defined functions

chgrp defined in line 182; used 2 times
main defined in line 240; never used
move defined in line 147; used 2 times
pipeser defined in line 212; used 3 times
process defined in line 78; used 2 times

Defined variables

broken_pipe defined in line 17; used 2 times

Defined macros

FIRST defined in line 13; used 2 times
SECOND defined in line 14; used 2 times
Last modified: 1986-04-21
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1571
Valid CSS Valid XHTML 1.0 Strict