Exemplo n.º 1
0
Arquivo: cron.c Projeto: 99years/plan9
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);
}
Exemplo n.º 2
0
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;
}