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; }
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; }
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; }