PWB1/sys/source/s2/whatsnew.c
#include "stdio.h"
#include "stat.h"
#include "time.h"
#include "dir.h"
struct statb sbuf;
struct dir dirb;
int low;
long comp;
main(argc,argv)
int argc;
char **argv;
{
char newlist[64], newdate[64], command[65], *sptr;
char base[25];
int line, list, n, dfd;
long atol();
/* setup pathname for .newlist and .newdate */
sptr = logdir();
strcpy(base,sptr);
strcpy(newlist,sptr);
strcpy(newdate,newlist);
strcat(newlist,"/.newlist");
strcat(newdate,"/.newdate");
list = fopen(newlist,"r");
stat(newdate,&sbuf);
comp = sbuf.i_mtime;
argv++;
if(--argc) {
if(**argv == '-') {
comp = atol(++*argv);
if(comp < 700000L) {
printf("bad date\n");
exit(1);
}
low++;
argc--;
argv++;
}
if(argc) list = fopen(*argv,"r");
}
if(list == NULL) {
printf("cannot read list\n");
exit(1);
}
if(!comp) {
printf("cannot obtain comparison date\n");
exit(1);
}
line = 0;
chdir(base);
while(fgets(command,64,list)) {
line++;
n = strlen(command);
if(command[--n] != '\n') {
printf("bad input line: %d\n",line);
while(getc(stdin) != '\n');
continue;
}
command[n] = '\0';
if(stat(command,&sbuf) < 0) {
printf("%s: cannot access file status\n",command);
continue;
}
if((sbuf.i_mode & IFMT) == IFDIR) {
if((dfd = open(command,0)) < 0) {
printf("\n%s: cannot read directory\n",command);
chdir (base);
continue;
}
if(chdir(command) < 0) {
printf("%s: cannot chdir\n",command);
chdir(base);
continue;
}
printf("%s:\n",command);
seek(dfd,32,0);
while(read(dfd,&dirb,16) == 16)
if(dirb.d_ino) {
if(stat(dirb.d_name,&sbuf) < 0)
printf("%s: cannot access file status\n",dirb.d_name);
else check(dirb.d_name);
}
printf("\n");
chdir (base);
close(dfd);
}
else check(command);
}
if(!low) creat(newdate,0600);
}
long
atol(s)
register char *s;
{
register int n;
long value;
for(n=0,value=0; '0' <= *s && *s <= '9'; n++)
value = value * 10 + *s++ - '0';
if( n != 6) return (0);
return(value);
}
check(string)
register char *string;
{
register struct time *t;
long lcomp;
if(low) {
t = localtime(&sbuf.i_mtime);
lcomp = t->t_year * 10000L
+ (t->t_month + 1) * 100L
+ t->t_day_month;
if(lcomp > comp)
printf("%s: modified %s", string, ctime(&sbuf.i_mtime));
return;
}
if(sbuf.i_mtime > comp)
printf("%s: modified %s", string, ctime(&sbuf.i_mtime));
}