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 + -
显示快捷键?