#include #include #include #include #include #include #include #include #include #include #include "m.h" #if Lbug ino_t inode; #endif FILE * out; char * froot; b32 MaxBc; char * suppr = "CL"; uchar name[Nsize]; static void rd(char C * C q, int C l, int C n) {C b32 sbn = GBlc; C int F = !strchr(suppr, 'F'); Stat(); if(F) {int x=l; fprintf(out,"F"); while(x--) fprintf(out,"|");} if(F) fprintf(out,"Name is: %s, ", qs(q)); errno=0; if (q[0] != '.' || !l) {C int nl = strlen(q); if(nl+n>Nsize-2) printf (cen("N:The name, %s/%s, has become too long.\n"), qs(name), qs(q)); else {memcpy(name+n, q, nl+1); {struct stat Ss; if(lstat(name, &Ss)) printf (cen("S:Access denied to lstat for file: %s.\n" "errno = %d\n"), qs(name), errno); else {if(S_ISDIR(Ss.st_mode)) {DIR * C nf = opendir(name); if(!nf) switch(errno){ case ENOTDIR: bitch("lstat says this is a direc but opendir says not!\n"); case ENOENT: ex(fprintf(out,"which opendir can't find!%s\n", qs(name))); case EMFILE: case ENFILE: bitch(" but too deep for opendir logic.\n"); case EACCES: {if(F) fprintf(out,"which I cannot access.\n"); else fprintf (out,cen("A:Access to directory %s denied.\n"), qs(name));} default: ex(fprintf(out,"error = %d on file:%s\n", errno, qs(name)));} else {if(F) fprintf(out,"a directory.\n"); name[n+nl] = '/'; {struct dirent * d; C char * clc = log_crsr; int dc=0; while((d = readdir(nf))) {static int lc = 0; rd(d->d_name, l+1, n+nl+1); if(!(++lc&63)) fprintf(out,cen("n:%s\n"),qs(name)); ++dc;} w_log(log_crsr - clc); w_log(dc); w_log(-1); closedir(nf);}}} else if(S_ISREG(Ss.st_mode) && (Ss.st_nlink==1 || New(Ss.st_ino))) {FILE * in = fopen(name, "r"); #if Lbug inode = Ss.st_ino; #endif if(in) {fl(in, Ss.st_size); fclose(in); ++fcnt; Stat();} else if(errno == EACCES) fprintf(out,cen("A:Access to file %s denied.\n"), qs(name)); else ex(fprintf(out,"No file open: errno = %d, %s\n", errno, qs(name)));}}}}} if(F) fprintf(out,"\n"); w_log(GBlc-sbn);} static b32 ns(){while(1){C b32 v = r_log(); if(~v) return v; r_log(); log_crsr -= r_log();}} int locate(fport * C w, sx C m, fport C * C dp) {int n = strlen(froot); b32 v = MaxBc; C b32 x = m.Bl; b32 fbo = x; w->giBlc = 0; log_crsr = file_hook; memcpy(name, froot, n+1); assert(x<=r_log()); while(1){DIR * C nf = opendir(name); if(nf) {assert(!~r_log()); {b32 dec = r_log(); r_log(); while(1){C b32 nv = v - ns(); if(nv<=x) {fbo = x - nv; w->giBlc = nv; break;} v=nv; --dec;} {struct dirent C * d; while(dec--) assert(d = readdir(nf)); {C int nl = strlen(d->d_name); name[n] = '/'; memcpy(name+n+1, d->d_name, nl+1); closedir(nf); assert((n += nl+1)in = fopen(name, "r"))) { fprintf(out, cen("E:File %s evaporated!\n"), qs(name)); if(constant) return 0;} strcpy(w->name, name); #if Lbug {struct stat Ss; if(stat(name, &Ss)) fprintf(out,"Zamm!\n"); if(Ss.st_ino != m.inode) {fprintf(out,"File Map Fault!!\n"); exit(-31);}} #endif w->sig = m.sig; return vernier(w, fbo, dp);} int main(int argc, char * args[]){out = stdout; init(); open_p(); {struct rlimit rl; getrlimit(RLIMIT_DATA, &rl); fprintf(out,"Maximum RAM limits are %ld, %ld.\n", (long)rl.rlim_max, (long)rl.rlim_cur);} {int ac=1; while(ac= argc) bitch("No file name included.\n"); rd(args[ac], 0, 0); MaxBc = GBlc; froot = args[ac];} close_p(); file_hook = log_crsr; finish(); return 0;}