void runqueuer () { FILE *fd, *tfd; register long beg, next; int ident; char name [100]; char from [256], *fromptr; fd = fopen (MAILBOX, "r"); if (! fd) { syslog (LOG_ERR, "cannot read %s", MAILBOX); return; } beg = findfrom (fd, 0L, &fromptr); strcpy (from, fromptr); for (;;) { next = findfrom (fd, beg+1, &fromptr); if (next < 0) break; /* get next free queue ident */ ident = getident (); /* make queue file name */ sprintf (name, "%s/queue/q%d", SERVDIR, ident); /* create queue file */ tfd = fopen (name, "w"); if (! tfd) { syslog (LOG_ERR, "cannot open %s, aborted", name); exit (-1); } /* save query into queue file */ fseek (fd, beg, 0); ffncopy (fd, tfd, next - beg); if (ferror (tfd)) { syslog (LOG_ERR, "error writing to %s, aborted", name); exit (-1); } fclose (tfd); /* append name of query to queue active file */ enqueue (name); syslog (LOG_INFO, "queued %d from %s", ident, from); beg = next; strcpy (from, fromptr); } fclose (fd); if (close (creat (MAILBOX, 0600)) < 0) { syslog (LOG_ERR, "cannot rewrite %s, aborted", MAILBOX); exit (-1); } }
void threadmain(int argc, char **argv) { char *p, *q; Dir *d; Window *w; ARGBEGIN{ case 'D': debug++; break; case 'd': dir = EARGF(usage()); break; default: usage(); break; }ARGEND if(argc != 1) usage(); from = findfrom(); group = estrdup(argv[0]); /* someone will be cute */ while(q=strchr(group, '/')) *q = '.'; p = estrdup(argv[0]); while(q=strchr(p, '.')) *q = '/'; p = estrstrstrdup(dir, "/", p); cleanname(p); if((d = dirstat(p)) == nil){ /* maybe it is a new group */ if((d = dirstat(dir)) == nil){ fprint(2, "dirstat(%s) fails: %r\n", dir); threadexitsall(nil); } if((d->mode&DMDIR)==0){ fprint(2, "%s not a directory\n", dir); threadexitsall(nil); } free(d); if((d = dirstat(p)) == nil){ fprint(2, "stat %s: %r\n", p); threadexitsall(nil); } } if((d->mode&DMDIR)==0){ fprint(2, "%s not a directory\n", dir); threadexitsall(nil); } free(d); dir = estrstrdup(p, "/"); q = estrstrdup(dir, "post"); canpost = access(q, AWRITE)==0; w = newwindow(); root = w; proccreate(wineventproc, w, STACK); proccreate(timerproc, w, STACK); winname(w, dir); if(canpost) wintagwrite(w, "Newpost ", 8); wintagwrite(w, "More ", 5); dirwindow(w); threadcreate(dirthread, w, STACK); threadexits(nil); }