|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.