view 3rdparty/packages/uucpbb/src/expire.c @ 2855:e126b9acab32 lwtools-port

rules.mak: Do not hardcode path for "echo" It is basically the only tool with full path here and I don't see any reason for it. We don't use special echo options that would fail on the shell built-in echo. Also don't hardcode path for losetup. sudo should make sure you have the relevant location in your path, and that the path is sanitized, otherwise your sudo setup is broken.
author Tormod Volden <debian.tormod@gmail.com>
date Sat, 13 Jul 2013 11:30:31 +0200
parents 5ba8e711a1a3
children
line wrap: on
line source

/*  expire.c   This program deletes old Usenet news articles.
    Copyright (C) 1990, 1993  Rick Adams and Bob Billson

    This file is part of the OS-9 UUCP package, UUCPbb.

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

    The author of UUCPbb, Bob Billson, can be contacted at:
    bob@kc2wz.bubble.org  or  uunet!kc2wz!bob  or  by snail mail:
    21 Bates Way, Westfield, NJ 07090
*/

/* Options:
   --------
      -t         test (don't actually delete articles)
      -x<level>  debug, default is 0 (OFF)
      -n<group>  expire only given group
      -e<days>   expire articles older than specified number of days

     With no arguments, expires all articles older than 14 days in
     all newsgroups.  */

#define MAIN                                       /* added -- REB */

#include "uucp.h"
#include <modes.h>
#include <signal.h>

#define MAXDAYS  14                     /* default time article lives --REB */

QQ int expireflag = TRUE;
QQ int debuglvl = 0;
QQ int ngroups;
QQ FILE *log;
QQ int gotactive, ramdisk, logopen;
QQ unsigned myuid;                              /* to keep makepath() happy */
char sender[] = "expire";                       /*                          */
char fname[100];                                /* to keep getdirs() happy  */
struct active groups[MAXNEWSGROUPS];


main (argc, argv)
int argc;
char *argv[];
{
     char newsgroup[100];
     register int i;                                      /* Changed -- REB */
     int limit, found;
     int option, interrupt(), onegroup;                   /* Added -- REB */
     char *fixgroupname();

     *newsgroup = '\0';
     found = FALSE;
     limit = MAXDAYS;
     gotactive = FALSE;                          /* Added --REB */
     onegroup = FALSE;                           /*              */
     logopen = FALSE;

     myuid = getuid();

     if (myuid != 0)
          fatal ("you are not the superuser!");

     intercept (interrupt);                      /* signal trap --REB */

     if ((newsdir = getdirs ("newsdir")) == NULL)
          fatal ("newsdir not in Parameters");

     if ((logdir = getenv ("LOGDIR")) != NULL)
          logdir = strdup (logdir);
     else
          logdir = LOGDIR;

     /* Added --REB */
     while ((option = getopt (argc, argv, "e:x:n:t")) != EOF)
          switch (option)
            {
               case 'e':
                    limit = atoi (optarg);
                    break;

               case 'x':
                    debuglvl = atoi (optarg);
                    break;

               case 'n':
                    strcpy (newsgroup, optarg);
                    onegroup = TRUE;
                    break;
 
               case 't':
                    expireflag = FALSE;
                    break;

               case '?':
                    usage();
                    break;
            }

     openlog();

     if (!onegroup)
          fprintf (log, "%s %s expiring articles over %d days old\n",
                        sender, gtime(), limit);

     /* read active file into in-core table */
     readactive (S_IREAD|S_IWRITE|S_ISHARE, FALSE);
     gotactive = TRUE;

     /* cycle through available newsgroups */
     for (i = 0;  i < ngroups && !found;  i++)
       {
          char *ngroup;

          ngroup = NULL;

          /* Only expire one newsgroup? */
          if (*newsgroup != '\0')
               if (strucmp (newsgroup, groups[i].newsgroup) == 0)
                    found = TRUE;
               else
                    continue;

          if (expireflag)
            {
               fprintf (log, "%s %s expiring: %s", 
                              sender, gtime(), groups[i].newsgroup);
               if (onegroup)
                    fprintf (log, " articles over %d days old", limit);

               putc ('\n', log);
            }
          else
               printf ("would expire '%s' newsgroup\n", groups[i].newsgroup);

          if (chdir (newsdir) == ERROR)
            {
               sprintf (fname, "can't change to news directory '%s'",                                         newsdir);
               fatal (fname);
            }

          ngroup = fixgroupname (groups[i].newsgroup);
          makepath (groups[i].newsgroup);

          if (ngroup != NULL)
            {
               free (ngroup);
               ngroup = NULL;
            }
          expgroup (&(groups[i]), limit);
       }

     if (*newsgroup != '\0'  &&  !found)
          fprintf (log, "%s %s newsgroup not found: %s\n",
                        sender, gtime(), newsgroup);

     /* Update active file to reflect expired news articles */
     updactive();
     closelog();
     exit (0);
}



int openlog()
{
     char temp[80];

     ramdisk = FALSE;

     /* For testing send everything to the screen --REB */
     if (expireflag == FALSE)
          log = stdout;

     /* with debug on, don't use the RAM disk --REB */
     else if (debuglvl > 0)
       {
          sprintf (temp, "%s/uulog", logdir);
          log = fopen (temp, "a");
          logopen = TRUE;
       }

     /* for normal use (debug off), use RAM disk for temporary log -- REB */
     else
       {
          sprintf (temp, "%s/uulog", RAMDISK);

          if ((log = fopen (temp, "w")) != NULL)
               ramdisk = TRUE;
          else
            {
               sprintf (temp, "%s/uulog", logdir);
               log = fopen (temp, "a");
            }

          logopen = TRUE;
       }

     /* log file should be unbuffered -- REB */
     setbuf (log, NULL);
}



int closelog()
{
     char temp[80], temp2[80];

     /* close log file -- REB */
     if (logopen)
       {
          fclose (log);
          logopen = FALSE;

          /* move RAM disk copy to permanent log file -- REB */
          if (ramdisk)
            {
               asetuid (0);
               sprintf (temp2, "%s/uulog", RAMDISK);
               sprintf (temp, "%s/uulog", logdir);
               fileapnd (temp2, temp, TRUE);
               unlink (temp2);
            }
       }
}



/* clean up if we get a keyboard interrupt --REB */

int interrupt (sig)
int sig;
{
     closelog();
     exit (sig);
}



int usage()
{
     char *strdetab(), temp[80];
     register char **use;
     static char *usetxt[] = {
          "expire\t\tnews article expire utility",
          " ",
          "\t-t\t\t test (don't actually delete articles)",
          "\t-x<level>  debug, default is 0 (OFF)",
          "\t-n<group>  expire only given group",
          "\t-e<days>   expire articles older than specified number of days",
          " ",
          "\tWith no arguments, expires all articles older than 14 days in",
          "\tall newsgroups.",
          NULL
       };

     for (use = usetxt; *use != NULL; ++use)
          fprintf (stderr, " %s\n", strdetab (strcpy (temp, *use), 4));

     fprintf (stderr, "\nv%s (%s) This is free software released under the GNU General Public\n",
                      version, VERDATE);
     fputs ("License.  Please send suggestions/bug reports to:  bob@kc2wz.bubble.org\n", stderr);
     exit (0);
}



int fatal (msg)
char *msg;
{
     fprintf (stderr, "expire: %s", msg);

     if (errno != 0)
          fprintf (stderr, "...error %d\n", errno);

     exit (0);
}