Beispiel #1
0
main()
{
	register char *p1, *p2;
	FILE *df;

	dem_setup();
	LDIRNAM = 0;		/*calculate length of directory name. MRW*/
	while(dfname[LDIRNAM])  LDIRNAM++;
	LCHAR = LDIRNAM + 2;
	LPID = LDIRNAM + 3;

again:
	snsum = 0;
	if(access(lock, 0) < 0){
		logerr("Lock has disappeared.");
		dem_dis();
		exit(1);
	}
	df = fopen(dpd, "r");
	if (df) {
		do {
			if(fread((char *)&dbuf, sizeof dbuf, 1, df) < 1){
				dem_dis();	/*disconnect phone line. MRW*/
				unlink(lock);
				exit(0);
			}
		} while (dbuf.d_ino==0 || dbuf.d_name[0]!='d' || dbuf.d_name[1]!='f');
		fclose(df);
	}
	p1 = dbuf.d_name;
	p2 = &dfname[LDIRNAM];
	while (p1 < &dbuf.d_name[DIRSIZ])
		*p2++ = *p1++;
	if (trysend() == 0) {
		waittm = 60;
		nwait = 0;
		goto again;
		}
#if PHONE
	if(nwait > 10){		/*after 3 hours try fresh daemon. MRW*/
		unlink(lock);
		execl("/usr/lib/dpd", "dpd", (char *)0);
		execl("/etc/dpd", "dpd", (char *)0);
		logerr("Can't find dpd.");
		exit(1);
	}
#endif
	sleep(waittm);
#if PHONE || SPIDER
#ifndef DEBUG
	if (waittm <= 8*60)
		waittm *= 2;
	else
		nwait++;
#endif
#endif
	goto again;
}
Beispiel #2
0
static int
cmd_process(struct silly_socket *ss)
{
        int close = 0;
        while (hascmd(ss)) {
                int err;
                struct cmdpacket cmd;
                err = pipe_blockread(ss->ctrlrecvfd, &cmd);
                if (err < 0)
                        continue;
                switch (cmd.type) {
                case 'L':
                        trylisten(ss, &cmd);
                        break;
                case 'B':
                        tryudpbind(ss, &cmd);
                        break;
                case 'C':
                        tryconnect(ss, &cmd);
                        break;
                case 'O':
                        tryudpconnect(ss, &cmd);
                        break;
                case 'K':
                        if (tryclose(ss, &cmd) == 0)
                                close = 1;
                        break;
                case 'S':
                        if (trysend(ss, &cmd) < 0)
                                close = 1;
                        break;
                case 'U':
                        tryudpsend(ss, &cmd);   //udp socket can only be closed active
                        break;
                case 'T':       //just to return from sp_wait
                        close = -1;
                        break;
                default:
                        fprintf(stderr, "[socket] cmd_process:unkonw operation:%d\n", cmd.type);
                        assert(!"oh, no!");
                        break;
                }
        }
        return close;
}
Beispiel #3
0
main(argc, argv)
{
	register char *p1, *p2;
	register int df;
	register FILE *dp;
	struct stat stb;

	signal(SIGHUP, SIG_IGN);
	signal(SIGINT, SIG_IGN);
	signal(SIGQUIT, SIG_IGN);
	signal(SIGTERM, SIG_IGN);
/*
 * Close all files, open root as 0, 1, 2
 * to assure standard environment
 */
	for (df=0; df<=15; df++)
		close(df);
	open("/", 0);
	dup(0);
	dup(0);
	if (stat("/usr/spool/lpd/lock", &stb) >= 0)
		exit(0);
	if ((df=creat("/usr/spool/lpd/lock", 0)) < 0)
		exit(0);
	close(df);
	if (fork())
		exit(0);
again:
	dp = fopen("/usr/spool/lpd", "r");
	do {
		if (fread(&dbuf, sizeof dbuf, 1, dp) != 1) {
			feedpage();
			unlink("/usr/spool/lpd/lock");
			exit(0);
		}
	} while (dbuf.d_ino==0 || dbuf.d_name[0]!='d' || dbuf.d_name[1]!='f');
	fclose(dp);
	strcpy(dfname, "/usr/spool/lpd/");
	strcatn(dfname, dbuf.d_name, DIRSIZ);
	if (trysend(dfname) == 0)
		goto again;
	sleep(waittm);
	goto again;
}