示例#1
0
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);
	}
}
示例#2
0
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);
}