broome@ucbvax.ARPA (Jonathan C. Broome) (06/15/85)
[ yum! ] This is a new version of a program called "gloria" that was posted to the net a while back which searches through each user's home directory for a files with the name specified and modification times later than the last time checked. Essentially it's like "find / -name 'name' -mtime -"last" -exec cat {} \; ", only easier to type, and gloria keeps track of "last" for you... The main differences between this version and the original are: this one allows you to keep tabs on multiple files, instead of only ".plan"; it has the "-s" option to suppress printing the file's contents, and it prints control characters in ^X form (we have a lot of people who like to put escape sequences in their .plan's here!) Possible portability problems: 1. rindex() in main() - change to strrchr() for USG systems. 2. the method used in do_rc() - you may need to change it to use a temporary file to do the update, then copy back (or use rename() if you have it) As usual, send any bugs or improvements to me... =========================================================== Jonathan C. Broome University of California, Berkeley UUCP ...!ucbvax!broome ARPA broome@ucbvax.ARPA =========================================================== #----cut here-----cut here-----cut here-----cut here----- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # gloria.1 # gloria.c # This archive created by broome at Fri Jun 14 13:19:06 1985 export PATH; PATH=/bin:$PATH if test -f 'gloria.1' then echo shar: will not over-write existing file "'gloria.1'" else sed 's/^XX//' << \StUnKy_fLuFf > 'gloria.1' XX.TH GLORIA public XX.UC 4 XX.SH NAME XXgloria - search for changed files and print their contents XX.SH SYNOPSIS XXgloria [ -s ] \fIfile\fR XX.SH DESCRIPTION XX\fBGloria\fR searches through the home directories of each user XXon the machine for files named \fIfile\fR with modification dates XXafter the time last recorded in \fI~/.gloria\fR. Unless the \fI-s\fR XXoption is specified, it will also try to print out the contents XXof the file. XX.SH FILES XX~/.gloria --- contains date of last search for a given filename XX.SH SEE ALSO XXfind (1) XX.SH DIAGNOSTICS XX"[ Not Accessible ]" when file is unreadable. XX.SH BUGS XXShould probably learn about subdirectories and the like. XX.SH HISTORY XXFrom a first version posted to net.sources by Michael Mauldin XXof Columbia University (fuzzy@cmu-cs-c), this version by Jonathan Broome XX(broome@Berkeley) StUnKy_fLuFf if test 814 -ne "`wc -c < 'gloria.1'`" then echo shar: error transmitting "'gloria.1'" '(should have been 814 characters)' fi fi # end of overwriting check if test -f 'gloria.c' then echo shar: will not over-write existing file "'gloria.c'" else sed 's/^XX//' << \StUnKy_fLuFf > 'gloria.c' XX#include <pwd.h> XX#include <stdio.h> XX#include <sys/types.h> XX#include <sys/time.h> XX#include <sys/stat.h> XX XXchar *prog; XXchar filename[BUFSIZ]; /* name of file we're interested in */ XXint no_show = 0; /* 1 => don't show contents of file */ XX XXmain (argc, argv) XXint argc; XXchar **argv; XX{ XX char *r, *rindex(); XX char *ctime(); XX long now, last, do_rc(); XX XX if (prog = rindex (*argv, '/')) XX prog++; XX else XX prog = *argv; XX XXagain: XX if (--argc == 0) /* no arguments given */ XX usage (); XX XX if (strcmp (*++argv, "-s") == 0) { /* short form - just print name */ XX no_show = 1; XX goto again; XX } XX strcpy (filename, *argv); /* and save name of file to look for */ XX XX time (&now); XX last = do_rc (filename, now); /* get and update last time checked */ XX printf ("Last checked file %s on %s", filename, ctime (&last)); XX XX gloria (filename, last); /* and do it */ XX exit (0); XX} XX XX/* XX * Print a usage message and exit. XX */ XXusage () XX{ XX fprintf (stderr, "Usage: %s [-s] filename\n", prog); XX exit (1); XX} XX XX/* XX * Open ~/.gloria and get last date for file ``name'', XX * then update the old time (or create a new entry) XX * We use append mode so as to avoid having to do a XX * file-to-file copy, instead just do each read one XX * line ahead of each write. XX */ XX XXlong do_rc (name, now) XXchar *name; XXlong now; XX{ XX char *getenv(); XX char file[80], buf[80]; XX long when, last = 0L; XX FILE *rp, *wp; XX XX sprintf (buf, "%s/.gloria", getenv ("HOME")); /* open file for append */ XX if ((wp = fopen (buf, "a")) == NULL) { /* so we can read and */ XX fprintf (stderr, "%s: cannot open %s\n", buf);/* write at same time */ XX exit (1); /* (no truncate) */ XX } XX fseek (wp, 0L, 0); XX XX if ((rp = fopen (buf, "r")) != NULL) { /* only if rc file exists */ XX while (fgets (buf, 80, rp)) { XX sscanf (buf, "%s %ld", file, &when); /* name, last time checked */ XX fputs (file, wp); XX if (strcmp (file, name) == 0) { XX last = when; XX fprintf (wp, " %ld\n", now); XX } else XX fprintf (wp, " %ld\n", when); XX } XX fclose (rp); XX } XX XX if (last == 0L) /* wasn't in rc file */ XX fprintf (wp, "%s %ld\n", name, now); /* add new entry */ XX fclose (wp); XX return (last); XX} XX XX XX/* XX * Main Gloria loop - look for files whose names match and XX * have modification times after ``last''. XX */ XX XXgloria (name, last) XXchar *name; XXlong last; XX{ XX struct stat statb; XX struct passwd *pwd, *getpwent(); XX char buf[256]; XX FILE *fp; XX XX setpwent (); /* open passwd file */ XX while (pwd = getpwent ()) { XX sprintf (buf, "%s/%s", pwd->pw_dir, name); XX if (stat (buf, &statb)) /* no such file */ XX continue; XX if (statb.st_mtime >= last) { XX if (no_show) { /* don't show file */ XX printf ("%s\n", buf); XX continue; XX } XX printf ("\n==>> %s's file: (%s) <<== \n", pwd->pw_name, buf); XX if ((fp = fopen (buf, "r")) == NULL) XX printf ("[ Not Accessible ]\n"); XX else XX cat (fp); XX } XX } XX endpwent (); XX} XX XX/* XX * Show the contents of a file. We play it safe by converting control XX * characters to ^X form. (People are fond of putting escape sequences XX * in their .plan files around here!) XX */ XX XXcat (fp) XXFILE *fp; XX{ XX int ch; XX XX while ((ch = getc (fp)) != EOF) XX if (ch < ' ' && ch != '\t' && ch != '\n') XX printf ("^%c", ch + '@'); XX else XX putchar (ch); XX fclose (fp); XX if (ch != '\n') /* needs a newline at end */ XX putchar ('\n'); XX} StUnKy_fLuFf if test 3464 -ne "`wc -c < 'gloria.c'`" then echo shar: error transmitting "'gloria.c'" '(should have been 3464 characters)' fi fi # end of overwriting check # End of shell archive exit 0