void readalljobs(void) { User *u; Dir *d, *du; char file[128]; int i, n, fd; fd = open("/cron", OREAD); if(fd < 0) fatal("can't open /cron: %r"); while((n = dirread(fd, &d)) > 0){ for(i = 0; i < n; i++){ if(strcmp(d[i].name, "log") == 0 || !(d[i].qid.type & QTDIR)) continue; if(strcmp(d[i].name, d[i].uid) != 0){ syslog(1, CRONLOG, "cron for %s owned by %s", d[i].name, d[i].uid); continue; } u = newuser(d[i].name); snprint(file, sizeof file, "/cron/%s/cron", d[i].name); du = dirstat(file); if(du == nil || qidcmp(u->lastqid, du->qid) != 0){ freejobs(u->jobs); u->jobs = readjobs(file, u); } free(du); } free(d); } close(fd); }
static int xdirread0(char **path, int (*namecmp)(char *, char *), Dir **d) { XDir *x, *p; int fd, n; Dir *t; t = nil; for(p = nil, x = xdirlist; x; p=x, x=x->next){ if(namecmp(x->path, *path)) continue; if(x == xdirlist) xdirlist = x->next; else p->next = x->next; while(t = dirstat(x->path)){ if(qidcmp(&t->qid, &x->qid)) break; free(t); x->next = xdirlist; xdirlist = x; if(strcmp(x->path, *path)){ free(*path); *path = strdup(x->path); } if(d) *d = x->dir; return x->ndir; } xdircount--; freexdir(x); break; } if((fd = open(*path, OREAD)) < 0){ free(t); if(t = xdirstat0(path, namecmp, "directory entry not found")) fd = open(*path, OREAD); } else if(t == nil) t = dirfstat(fd); n = -1; if(fd < 0 || t == nil) goto out; if((t->qid.type & QTDIR) == 0){ werrstr("not a directory"); goto out; } if((n = dirreadall(fd, d)) < 0) goto out; if(xdircount >= 8){ xdircount--; for(p = xdirlist, x = xdirlist->next; x->next; p = x, x = x->next) ; p->next = nil; freexdir(x); } x = mallocz(sizeof(*x), 1); x->qid = t->qid; x->path = strdup(*path); x->ndir = n; x->dir = *d; x->next = xdirlist; xdirlist = x; xdircount++; out: if(fd >= 0) close(fd); free(t); return n; }