Annotation of 42BSD/usr.bin/uucp/uuclean.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)uuclean.c  5.2 (Berkeley) 7/2/83";
                      3: #endif
                      4: 
                      5: #include "uucp.h"
                      6: #include <signal.h>
                      7: #include <pwd.h>
                      8: #include <sys/types.h>
                      9: #include <sys/stat.h>
                     10: #ifdef NDIR
                     11: #include "ndir.h"
                     12: #else
                     13: #include <sys/dir.h>
                     14: #endif
                     15: 
                     16: extern time_t time();
                     17: 
                     18: 
                     19: /*******
                     20:  *
                     21:  *     uuclean  -  this program will search through the spool
                     22:  *     directory (Spool) and delete all files with a requested
                     23:  *     prefix which are older than (nomtime) seconds.
                     24:  *     If the -m option is set, the program will try to
                     25:  *     send mail to the usid of the file.
                     26:  *
                     27:  *     options:
                     28:  *             -m  -  send mail for deleted file
                     29:  *             -d  -  directory to clean
                     30:  *             -n  -  time to age files before delete (in hours)
                     31:  *             -p  -  prefix for search
                     32:  *             -x  -  turn on debug outputs
                     33:  *     exit status:
                     34:  *             0  -  normal return
                     35:  *             1  -  can not read directory
                     36:  */
                     37: 
                     38: #define DPREFIX "U"
                     39: #define NOMTIME 72     /* hours to age files before deletion */
                     40: 
                     41: main(argc, argv)
                     42: char *argv[];
                     43: {
                     44:        DIR *dirp;
                     45:        char file[NAMESIZE];
                     46:        time_t nomtime, ptime;
                     47:        struct stat stbuf;
                     48:        int mflg=0;
                     49:        int orig_uid = getuid();
                     50: 
                     51:        strcpy(Progname, "uuclean");
                     52:        uucpname(Myname);
                     53:        nomtime = NOMTIME * (time_t)3600;
                     54: 
                     55:        while (argc>1 && argv[1][0] == '-') {
                     56:                switch (argv[1][1]) {
                     57:                case 'd':
                     58:                        Spool = &argv[1][2];
                     59:                        break;
                     60:                case 'm':
                     61:                        mflg = 1;
                     62:                        break;
                     63:                case 'n':
                     64:                        nomtime = atoi(&argv[1][2]) * (time_t)3600;
                     65:                        break;
                     66:                case 'p':
                     67:                        if (&argv[1][2] != '\0')
                     68:                                stpre(&argv[1][2]);
                     69:                        break;
                     70:                case 'x':
                     71:                        chkdebug(orig_uid);
                     72:                        Debug = atoi(&argv[1][2]);
                     73:                        if (Debug <= 0)
                     74:                                Debug = 1;
                     75:                        break;
                     76:                default:
                     77:                        printf("unknown flag %s\n", argv[1]); break;
                     78:                }
                     79:                --argc;  argv++;
                     80:        }
                     81: 
                     82:        DEBUG(4, "DEBUG# %s\n", "START");
                     83:        chdir(Spool);   /* NO subdirs in uuclean!  rti!trt */
                     84: 
                     85:        if ((dirp = opendir(Spool)) == NULL) {
                     86:                printf("%s directory unreadable\n", Spool);
                     87:                exit(1);
                     88:        }
                     89: 
                     90:        time(&ptime);
                     91:        while (gnamef(dirp, file)) {
                     92:                if (!chkpre(file))
                     93:                        continue;
                     94: 
                     95:                if (stat(file, &stbuf) == -1) { /* NO subdirs in uuclean! */
                     96:                DEBUG(4, "stat on %s failed\n", file);
                     97:                        continue;
                     98:                }
                     99: 
                    100: 
                    101:                if ((stbuf.st_mode & S_IFMT) == S_IFDIR)
                    102:                        continue;
                    103: /*
                    104:  * teklabs.1518, Terry Laskodi, +2s/ctime/mtime/
                    105:  * so mv-ing files about does not defeat uuclean
                    106:  */
                    107:                if ((ptime - stbuf.st_mtime) < nomtime)
                    108:                        continue;
                    109:                if (file[0] == CMDPRE)
                    110:                        notfyuser(file);
                    111:                DEBUG(4, "unlink file %s\n", file);
                    112:                unlink(file);
                    113:                if (mflg) sdmail(file, stbuf.st_uid);
                    114:        }
                    115: 
                    116:        closedir(dirp);
                    117:        exit(0);
                    118: }
                    119: 
                    120: 
                    121: #define MAXPRE 10
                    122: char Pre[MAXPRE][NAMESIZE];
                    123: int Npre = 0;
                    124: /***
                    125:  *     chkpre(file)    check for prefix
                    126:  *     char *file;
                    127:  *
                    128:  *     return codes:
                    129:  *             0  -  not prefix
                    130:  *             1  -  is prefix
                    131:  */
                    132: 
                    133: chkpre(file)
                    134: char *file;
                    135: {
                    136:        int i;
                    137: 
                    138:        for (i = 0; i < Npre; i++) {
                    139:                if (prefix(Pre[i], file))
                    140:                        return(1);
                    141:                }
                    142:        return(0);
                    143: }
                    144: 
                    145: /***
                    146:  *     stpre(p)        store prefix
                    147:  *     char *p;
                    148:  *
                    149:  *     return codes:  none
                    150:  */
                    151: 
                    152: stpre(p)
                    153: char *p;
                    154: {
                    155:        if (Npre < MAXPRE - 2)
                    156:                strcpy(Pre[Npre++], p);
                    157:        return;
                    158: }
                    159: 
                    160: /***
                    161:  *     notfyuser(file) - notfiy requestor of deleted requres
                    162:  *
                    163:  *     return code - none
                    164:  */
                    165: 
                    166: notfyuser(file)
                    167: char *file;
                    168: {
                    169:        FILE *fp;
                    170:        int numrq;
                    171:        char frqst[100], lrqst[100];
                    172:        char msg[BUFSIZ];
                    173:        char *args[10];
                    174: 
                    175:        if ((fp = fopen(file, "r")) == NULL)
                    176:                return;
                    177:        if (fgets(frqst, 100, fp) == NULL) {
                    178:                fclose(fp);
                    179:                return;
                    180:        }
                    181:        numrq = 1;
                    182:        while (fgets(lrqst, 100, fp))
                    183:                numrq++;
                    184:        fclose(fp);
                    185:        sprintf(msg,
                    186:          "File %s delete. \nCould not contact remote. \n%d requests deleted.\n", file, numrq);
                    187:        if (numrq == 1) {
                    188:                strcat(msg, "REQUEST: ");
                    189:                strcat(msg, frqst);
                    190:        }
                    191:        else {
                    192:                strcat(msg, "FIRST REQUEST: ");
                    193:                strcat(msg, frqst);
                    194:                strcat(msg, "\nLAST REQUEST: ");
                    195:                strcat(msg, lrqst);
                    196:        }
                    197:        getargs(frqst, args);
                    198:        mailst(args[3], msg, "");
                    199:        return;
                    200: }
                    201: 
                    202: 
                    203: /***
                    204:  *     sdmail(file, uid)
                    205:  *
                    206:  *     sdmail  -  this routine will determine the owner
                    207:  *     of the file (file), create a message string and
                    208:  *     call "mailst" to send the cleanup message.
                    209:  *     This is only implemented for local system
                    210:  *     mail at this time.
                    211:  */
                    212: 
                    213: sdmail(file, uid)
                    214: char *file;
                    215: {
                    216:        static struct passwd *pwd;
                    217:        struct passwd *getpwuid();
                    218:        char mstr[40];
                    219: 
                    220:        sprintf(mstr, "uuclean deleted file %s\n", file);
                    221:        if (pwd->pw_uid == uid) {
                    222:                mailst(pwd->pw_name, mstr, "");
                    223:        return(0);
                    224:        }
                    225: 
                    226:        setpwent();
                    227:        if ((pwd = getpwuid(uid)) != NULL) {
                    228:                mailst(pwd->pw_name, mstr, "");
                    229:        }
                    230:        return(0);
                    231: }
                    232: 
                    233: cleanup(code)
                    234: int code;
                    235: {
                    236:        exit(code);
                    237: }

unix.superglobalmegacorp.com

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