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