inetd.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 646 行 · 第 1/2 页
C
646 行
voidreapchild(){ union wait status; int pid; register struct servtab *sep; for (;;) { pid = wait3(&status, WNOHANG, 0); if (pid <= 0) break; if (debug) fprintf(stderr, "%d reaped\n", pid); for (sep = servtab; sep; sep = sep->se_next) if (sep->se_wait == pid) { if (status.w_status) syslog(LOG_WARNING, "%s: exit status 0x%x", sep->se_server, status); if (debug) fprintf(stderr, "restored %s, fd %d\n", sep->se_service, sep->se_fd); pickbit(allsock, sep->se_fd); sep->se_wait = 1; } }}voidconfig(){ register struct servtab *sep, *cp, **sepp; struct servtab *getconfigent(), *enter(); int omask; int on = 1; if (!setconfig()) { syslog(LOG_ERR, "%s: %m", conffile); return; } for (sep = servtab; sep; sep = sep->se_next) sep->se_checked = 0; while (cp = getconfigent()) { for (sep = servtab; sep; sep = sep->se_next) if (strcmp(sep->se_service, cp->se_service) == 0 && strcmp(sep->se_proto, cp->se_proto) == 0) break; if (sep != 0) { int i; omask = sigblock(mask(SIGCHLD)); sep->se_wait = cp->se_wait;#define SWAP(a, b) { char *c = a; a = b; b = c; } if (cp->se_server) SWAP(sep->se_server, cp->se_server); for (i = 0; i < MAXARGV; i++) SWAP(sep->se_argv[i], cp->se_argv[i]); (void) sigsetmask(omask); freeconfig(cp); } else sep = enter(cp); sep->se_checked = 1; if (sep->se_fd != -1) continue; sp = getservbyname(sep->se_service, sep->se_proto); if (sp == 0) { syslog(LOG_ERR, "%s/%s: unknown service", sep->se_service, sep->se_proto); continue; } sep->se_ctrladdr.sin_port = sp->s_port; if ((sep->se_fd = socket(AF_INET, sep->se_socktype, 0)) < 0) { syslog(LOG_ERR, "%s/%s: socket: %m", sep->se_service, sep->se_proto); continue; }#define turnon(fd, opt) \setsockopt(fd, SOL_SOCKET, opt, (char *)&on, sizeof(on)) if (strcmp(sep->se_proto, "tcp") == 0 && (options & SO_DEBUG) && turnon(sep->se_fd, SO_DEBUG) < 0) syslog(LOG_ERR, "setsockopt (SO_DEBUG): %m"); if (turnon(sep->se_fd, SO_REUSEADDR) < 0) syslog(LOG_ERR, "setsockopt (SO_REUSEADDR): %s %m",sep->se_service);#undef turnon if (bind(sep->se_fd, &sep->se_ctrladdr, sizeof (sep->se_ctrladdr), 0) < 0) { syslog(LOG_ERR, "%s/%s: bind: %m", sep->se_service, sep->se_proto); continue; } if (sep->se_socktype == SOCK_STREAM) (void) listen(sep->se_fd, 10); pickbit(allsock, sep->se_fd); } endconfig(); /* * Purge anything not looked at above. */ omask = sigblock(mask(SIGCHLD)); sepp = &servtab; while (sep = *sepp) { if (sep->se_checked) { sepp = &sep->se_next; continue; } *sepp = sep->se_next; if (sep->se_fd != -1) { clearbit(allsock, sep->se_fd); clearbit(delaysock, sep->se_fd); if (anybit(delaysock, FDWORDS) == 0) { seltimer = NULL; } (void) close(sep->se_fd); } freeconfig(sep); free((char *)sep); } (void) sigsetmask(omask);}struct servtab *enter(cp) struct servtab *cp;{ register struct servtab *sep; int omask; char *strdup(); sep = (struct servtab *)malloc(sizeof (*sep)); if (sep == (struct servtab *)0) { syslog(LOG_ERR, "Out of memory."); exit(-1); } *sep = *cp; sep->se_fd = -1; omask = sigblock(mask(SIGCHLD)); sep->se_next = servtab; servtab = sep; (void) sigsetmask(omask); return (sep);}FILE *fconfig = NULL;struct servtab serv;char line[256];char *skip(), *nextline();setconfig(){ if (fconfig != NULL) { (void) fseek(fconfig, 0, L_SET); return (1); } fconfig = fopen(conffile, "r"); return (fconfig != NULL);}endconfig(){ if (fconfig == NULL) return; (void) fclose(fconfig); fconfig = NULL;}struct servtab *getconfigent(){ register struct servtab *sep = &serv; char *cp, *arg; int argc; while ((cp = nextline(fconfig)) && ((*cp == '#') || (strlen(cp) == 0))) ; if (cp == NULL) return ((struct servtab *)0); sep->se_service = strdup(skip(&cp)); arg = skip(&cp); if (strcmp(arg, "stream") == 0) sep->se_socktype = SOCK_STREAM; else if (strcmp(arg, "dgram") == 0) sep->se_socktype = SOCK_DGRAM; else if (strcmp(arg, "rdm") == 0) sep->se_socktype = SOCK_RDM; else if (strcmp(arg, "seqpacket") == 0) sep->se_socktype = SOCK_SEQPACKET; else if (strcmp(arg, "raw") == 0) sep->se_socktype = SOCK_RAW; else sep->se_socktype = -1; sep->se_proto = strdup(skip(&cp)); arg = skip(&cp); sep->se_wait = strcmp(arg, "wait") == 0; /* * Check next arg to see if its a path. If it is not it must * be a user name and we're in 4.3bsd compatibility mode. */ arg = skip(&cp); if(*arg != '/') { sep->se_user = strdup(arg); arg = skip(&cp); } else sep->se_user = NULL; sep->se_server = strdup(arg); argc = 0; for (arg = skip(&cp); cp; arg = skip(&cp)) if (argc < MAXARGV) sep->se_argv[argc++] = strdup(arg); while (argc <= MAXARGV) sep->se_argv[argc++] = NULL; return (sep);}freeconfig(cp) register struct servtab *cp;{ int i; if (cp->se_service) free(cp->se_service); if (cp->se_proto) free(cp->se_proto); if (cp->se_server) free(cp->se_server); for (i = 0; i < MAXARGV; i++) if (cp->se_argv[i]) free(cp->se_argv[i]);}char *skip(cpp) char **cpp;{ register char *cp = *cpp; char *start;again: while (*cp == ' ' || *cp == '\t') cp++; if (*cp == '\0') { char c; c = getc(fconfig); (void) ungetc(c, fconfig); if (c == ' ' || c == '\t') if (cp = nextline(fconfig)) goto again; *cpp = (char *)0; return ((char *)0); } start = cp; while (*cp && *cp != ' ' && *cp != '\t') cp++; if (*cp != '\0') *cp++ = '\0'; *cpp = cp; return (start);}char *nextline(fd) FILE *fd;{ char *cp; if (fgets(line, sizeof (line), fd) == NULL) return ((char *)0); cp = index(line, '\n'); if (cp) *cp = '\0'; return (line);}char *strdup(cp) char *cp;{ char *new; if (cp == NULL) cp = ""; new = malloc(strlen(cp) + 1); if (new == (char *)0) { syslog(LOG_ERR, "Out of memory."); exit(-1); } (void) strcpy(new, cp); return (new);}anybit(field, count)int *field;int count;{ int index; for (index = 0; index < count; index++) { if (field[index] != 0) { return(-1); } } return(0);}pickbit(field, sbit)int *field;int sbit;{ field[sbit / (NBBY * NBPW)] |= 1 << (sbit % (NBBY * NBPW));}clearbit(field, cbit)int *field;int cbit;{ field[cbit / (NBBY * NBPW)] &= ~(1 << (cbit % (NBBY * NBPW)));}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?