xref: /plan9/sys/src/cmd/fortune.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier char choice[512];
63e12c5d1SDavid du Colombier char index[] = "/sys/games/lib/fortunes.index";
73e12c5d1SDavid du Colombier char fortunes[] = "/sys/games/lib/fortunes";
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier void
103e12c5d1SDavid du Colombier main(int argc, char *argv[])
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier 	int i;
133e12c5d1SDavid du Colombier 	long offs;
143e12c5d1SDavid du Colombier 	uchar off[4];
153e12c5d1SDavid du Colombier 	int ix;
163e12c5d1SDavid du Colombier 	int newindex, oldindex;
173e12c5d1SDavid du Colombier 	char *p;
183e12c5d1SDavid du Colombier 	Dir fbuf, ixbuf;
19*219b2ee8SDavid du Colombier 	Biobuf *f, g;
203e12c5d1SDavid du Colombier 
213e12c5d1SDavid du Colombier 	newindex = 0;
223e12c5d1SDavid du Colombier 	oldindex = 0;
233e12c5d1SDavid du Colombier 	ix = offs = 0;
243e12c5d1SDavid du Colombier 	if((f=Bopen(argc>1?argv[1]:fortunes, OREAD)) == 0){
253e12c5d1SDavid du Colombier 		print("Misfortune!\n");
263e12c5d1SDavid du Colombier 		exits("misfortune");
273e12c5d1SDavid du Colombier 	}
283e12c5d1SDavid du Colombier 	if(argc == 1){
293e12c5d1SDavid du Colombier 		ix = open(index, OREAD);
303e12c5d1SDavid du Colombier 		if(ix>=0){
313e12c5d1SDavid du Colombier 			oldindex = 1;
323e12c5d1SDavid du Colombier 			dirfstat(ix, &ixbuf);
333e12c5d1SDavid du Colombier 			dirfstat(Bfildes(f), &fbuf);
343e12c5d1SDavid du Colombier 			if(fbuf.mtime > ixbuf.mtime){
353e12c5d1SDavid du Colombier 				close(ix);
363e12c5d1SDavid du Colombier 				ix = create(index, OWRITE, 0666);
373e12c5d1SDavid du Colombier 				if(ix >= 0){
383e12c5d1SDavid du Colombier 					newindex = 1;
393e12c5d1SDavid du Colombier 					oldindex = 0;
403e12c5d1SDavid du Colombier 				}
413e12c5d1SDavid du Colombier 			}
423e12c5d1SDavid du Colombier 		}else{
433e12c5d1SDavid du Colombier 			ix = create(index, OWRITE, 0666);
443e12c5d1SDavid du Colombier 			if(ix >= 0)
453e12c5d1SDavid du Colombier 				newindex = 1;
463e12c5d1SDavid du Colombier 		}
473e12c5d1SDavid du Colombier 	}
48*219b2ee8SDavid du Colombier 	srand(time(0));
49*219b2ee8SDavid du Colombier 	i = getpid()&32767;
50*219b2ee8SDavid du Colombier 	while(--i >= 0)
51*219b2ee8SDavid du Colombier 		rand();
523e12c5d1SDavid du Colombier 	if(oldindex){
533e12c5d1SDavid du Colombier 		seek(ix, nrand(ixbuf.length/sizeof(offs))*sizeof(offs), 0);
543e12c5d1SDavid du Colombier 		read(ix, off, sizeof(off));
553e12c5d1SDavid du Colombier 		Bseek(f, off[0]|(off[1]<<8)|(off[2]<<16)|(off[3]<<24), 0);
563e12c5d1SDavid du Colombier 		p = Brdline(f, '\n');
573e12c5d1SDavid du Colombier 		if(p){
583e12c5d1SDavid du Colombier 			p[Blinelen(f)-1] = 0;
593e12c5d1SDavid du Colombier 			strcpy(choice, p);
603e12c5d1SDavid du Colombier 		}else
613e12c5d1SDavid du Colombier 			strcpy(choice, "Misfortune!");
623e12c5d1SDavid du Colombier 	}else{
63*219b2ee8SDavid du Colombier 		Binit(&g, ix, 1);
643e12c5d1SDavid du Colombier 		for(i=1;;i++){
653e12c5d1SDavid du Colombier 			if(newindex)
66*219b2ee8SDavid du Colombier 				offs = Boffset(f);
673e12c5d1SDavid du Colombier 			p = Brdline(f, '\n');
683e12c5d1SDavid du Colombier 			if(p == 0)
693e12c5d1SDavid du Colombier 				break;
703e12c5d1SDavid du Colombier 			p[Blinelen(f)-1] = 0;
713e12c5d1SDavid du Colombier 			if(newindex){
723e12c5d1SDavid du Colombier 				off[0] = offs;
733e12c5d1SDavid du Colombier 				off[1] = offs>>8;
743e12c5d1SDavid du Colombier 				off[2] = offs>>16;
753e12c5d1SDavid du Colombier 				off[3] = offs>>24;
76*219b2ee8SDavid du Colombier 				Bwrite(&g, off, sizeof(off));
773e12c5d1SDavid du Colombier 			}
783e12c5d1SDavid du Colombier 			if(nrand(i)==0)
79*219b2ee8SDavid du Colombier 				strcpy(choice, p);
803e12c5d1SDavid du Colombier 		}
813e12c5d1SDavid du Colombier 	}
823e12c5d1SDavid du Colombier 	print("%s\n", choice);
833e12c5d1SDavid du Colombier 	exits(0);
843e12c5d1SDavid du Colombier }
85