⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syslogd.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	(void)sigsetmask(omask);}voidfprintlog(f, flags, msg)	struct filed *f;	int flags;	char *msg;{	struct iovec iov[6];	struct iovec *v;	int l;	char line[MAXLINE + 1], repbuf[80], greetings[200];	v = iov;	if (f->f_type == F_WALL) {		v->iov_base = greetings;		v->iov_len = sprintf(greetings,		    "\r\n\7Message from syslogd@%s at %.24s ...\r\n",		    f->f_prevhost, ctime(&now));		v++;		v->iov_base = "";		v->iov_len = 0;		v++;	} else {		v->iov_base = f->f_lasttime;		v->iov_len = 15;		v++;		v->iov_base = " ";		v->iov_len = 1;		v++;	}	v->iov_base = f->f_prevhost;	v->iov_len = strlen(v->iov_base);	v++;	v->iov_base = " ";	v->iov_len = 1;	v++;	if (msg) {		v->iov_base = msg;		v->iov_len = strlen(msg);	} else if (f->f_prevcount > 1) {		v->iov_base = repbuf;		v->iov_len = sprintf(repbuf, "last message repeated %d times",		    f->f_prevcount);	} else {		v->iov_base = f->f_prevline;		v->iov_len = f->f_prevlen;	}	v++;	dprintf("Logging to %s", TypeNames[f->f_type]);	f->f_time = now;	switch (f->f_type) {	case F_UNUSED:		dprintf("\n");		break;	case F_FORW:		dprintf(" %s\n", f->f_un.f_forw.f_hname);		l = sprintf(line, "<%d>%.15s %s", f->f_prevpri,		    iov[0].iov_base, iov[4].iov_base);		if (l > MAXLINE)			l = MAXLINE;		if (sendto(finet, line, l, 0,		    (struct sockaddr *)&f->f_un.f_forw.f_addr,		    sizeof(f->f_un.f_forw.f_addr)) != l) {			int e = errno;			(void)close(f->f_file);			f->f_type = F_UNUSED;			errno = e;			logerror("sendto");		}		break;	case F_CONSOLE:		if (flags & IGN_CONS) {			dprintf(" (ignored)\n");			break;		}		/* FALLTHROUGH */	case F_TTY:	case F_FILE:		dprintf(" %s\n", f->f_un.f_fname);		if (f->f_type != F_FILE) {			v->iov_base = "\r\n";			v->iov_len = 2;		} else {			v->iov_base = "\n";			v->iov_len = 1;		}	again:		if (writev(f->f_file, iov, 6) < 0) {			int e = errno;			(void)close(f->f_file);			/*			 * Check for errors on TTY's due to loss of tty			 */			if ((e == EIO || e == EBADF) && f->f_type != F_FILE) {				f->f_file = open(f->f_un.f_fname,				    O_WRONLY|O_APPEND, 0);				if (f->f_file < 0) {					f->f_type = F_UNUSED;					logerror(f->f_un.f_fname);				} else					goto again;			} else {				f->f_type = F_UNUSED;				errno = e;				logerror(f->f_un.f_fname);			}		} else if (flags & SYNC_FILE)			(void)fsync(f->f_file);		break;	case F_USERS:	case F_WALL:		dprintf("\n");		v->iov_base = "\r\n";		v->iov_len = 2;		wallmsg(f, iov);		break;	}	f->f_prevcount = 0;}/* *  WALLMSG -- Write a message to the world at large * *	Write the specified message to either the entire *	world, or a list of approved users. */voidwallmsg(f, iov)	struct filed *f;	struct iovec *iov;{	static int reenter;			/* avoid calling ourselves */	FILE *uf;	struct utmp ut;	int i;	char *p;	char line[sizeof(ut.ut_line) + 1];	if (reenter++)		return;	if ((uf = fopen(_PATH_UTMP, "r")) == NULL) {		logerror(_PATH_UTMP);		reenter = 0;		return;	}	/* NOSTRICT */	while (fread((char *)&ut, sizeof(ut), 1, uf) == 1) {		if (ut.ut_name[0] == '\0')			continue;		strncpy(line, ut.ut_line, sizeof(ut.ut_line));		line[sizeof(ut.ut_line)] = '\0';		if (f->f_type == F_WALL) {			if ((p = ttymsg(iov, 6, line, 60*5)) != NULL) {				errno = 0;	/* already in msg */				logerror(p);			}			continue;		}		/* should we send the message to this user? */		for (i = 0; i < MAXUNAMES; i++) {			if (!f->f_un.f_uname[i][0])				break;			if (!strncmp(f->f_un.f_uname[i], ut.ut_name,			    UT_NAMESIZE)) {				if ((p = ttymsg(iov, 6, line, 60*5)) != NULL) {					errno = 0;	/* already in msg */					logerror(p);				}				break;			}		}	}	(void)fclose(uf);	reenter = 0;}voidreapchild(signo)	int signo;{	union wait status;	while (wait3((int *)&status, WNOHANG, (struct rusage *)NULL) > 0)		;}/* * Return a printable representation of a host address. */char *cvthname(f)	struct sockaddr_in *f;{	struct hostent *hp;	char *p;	dprintf("cvthname(%s)\n", inet_ntoa(f->sin_addr));	if (f->sin_family != AF_INET) {		dprintf("Malformed from address\n");		return ("???");	}	hp = gethostbyaddr((char *)&f->sin_addr,	    sizeof(struct in_addr), f->sin_family);	if (hp == 0) {		dprintf("Host name for your address (%s) unknown\n",			inet_ntoa(f->sin_addr));		return (inet_ntoa(f->sin_addr));	}	if ((p = strchr(hp->h_name, '.')) && strcmp(p + 1, LocalDomain) == 0)		*p = '\0';	return (hp->h_name);}voiddomark(signo)	int signo;{	struct filed *f;	now = time((time_t *)NULL);	MarkSeq += TIMERINTVL;	if (MarkSeq >= MarkInterval) {		logmsg(LOG_INFO, "-- MARK --", LocalHostName, ADDDATE|MARK);		MarkSeq = 0;	}	for (f = Files; f; f = f->f_next) {		if (f->f_prevcount && now >= REPEATTIME(f)) {			dprintf("flush %s: repeated %d times, %d sec.\n",			    TypeNames[f->f_type], f->f_prevcount,			    repeatinterval[f->f_repeatcount]);			fprintlog(f, 0, (char *)NULL);			BACKOFF(f);		}	}	(void)alarm(TIMERINTVL);}/* * Print syslogd errors some place. */voidlogerror(type)	char *type;{	char buf[100];	if (errno)		(void)snprintf(buf,		    sizeof(buf), "syslogd: %s: %s", type, strerror(errno));	else		(void)snprintf(buf, sizeof(buf), "syslogd: %s", type);	errno = 0;	dprintf("%s\n", buf);	logmsg(LOG_SYSLOG|LOG_ERR, buf, LocalHostName, ADDDATE);}voiddie(signo)	int signo;{	struct filed *f;	char buf[100];	for (f = Files; f != NULL; f = f->f_next) {		/* flush any pending output */		if (f->f_prevcount)			fprintlog(f, 0, (char *)NULL);	}	if (signo) {		dprintf("syslogd: exiting on signal %d\n", signo);		(void)sprintf(buf, "exiting on signal %d", signo);		errno = 0;		logerror(buf);	}	(void)unlink(LogName);	exit(0);}/* *  INIT -- Initialize syslogd from configuration table */voidinit(signo)	int signo;{	int i;	FILE *cf;	struct filed *f, *next, **nextp;	char *p;	char cline[LINE_MAX];	dprintf("init\n");	/*	 *  Close all open log files.	 */	Initialized = 0;	for (f = Files; f != NULL; f = next) {		/* flush any pending output */		if (f->f_prevcount)			fprintlog(f, 0, (char *)NULL);		switch (f->f_type) {		case F_FILE:		case F_TTY:		case F_CONSOLE:		case F_FORW:			(void)close(f->f_file);			break;		}		next = f->f_next;		free((char *)f);	}	Files = NULL;	nextp = &Files;	/* open the configuration file */	if ((cf = fopen(ConfFile, "r")) == NULL) {		dprintf("cannot open %s\n", ConfFile);		*nextp = (struct filed *)calloc(1, sizeof(*f));		cfline("*.ERR\t/dev/console", *nextp);		(*nextp)->f_next = (struct filed *)calloc(1, sizeof(*f));		cfline("*.PANIC\t*", (*nextp)->f_next);		Initialized = 1;		return;	}	/*	 *  Foreach line in the conf table, open that file.	 */	f = NULL;	while (fgets(cline, sizeof(cline), cf) != NULL) {		/*		 * check for end-of-section, comments, strip off trailing		 * spaces and newline character.		 */		for (p = cline; isspace(*p); ++p)			continue;		if (*p == NULL || *p == '#')			continue;		for (p = strchr(cline, '\0'); isspace(*--p);)			continue;		*++p = '\0';		f = (struct filed *)calloc(1, sizeof(*f));		*nextp = f;		nextp = &f->f_next;		cfline(cline, f);	}	/* close the configuration file */	(void)fclose(cf);	Initialized = 1;	if (Debug) {		for (f = Files; f; f = f->f_next) {			for (i = 0; i <= LOG_NFACILITIES; i++)				if (f->f_pmask[i] == INTERNAL_NOPRI)					printf("X ");				else					printf("%d ", f->f_pmask[i]);			printf("%s: ", TypeNames[f->f_type]);			switch (f->f_type) {			case F_FILE:			case F_TTY:			case F_CONSOLE:				printf("%s", f->f_un.f_fname);				break;			case F_FORW:				printf("%s", f->f_un.f_forw.f_hname);				break;			case F_USERS:				for (i = 0; i < MAXUNAMES && *f->f_un.f_uname[i]; i++)					printf("%s, ", f->f_un.f_uname[i]);				break;			}			printf("\n");		}	}	logmsg(LOG_SYSLOG|LOG_INFO, "syslogd: restart", LocalHostName, ADDDATE);	dprintf("syslogd: restarted\n");}/* * Crack a configuration file line */voidcfline(line, f)	char *line;	struct filed *f;{	struct hostent *hp;	int i, pri;	char *bp, *p, *q;	char buf[MAXLINE], ebuf[100];	dprintf("cfline(%s)\n", line);	errno = 0;	/* keep strerror() stuff out of logerror messages */	/* clear out file entry */	memset(f, 0, sizeof(*f));	for (i = 0; i <= LOG_NFACILITIES; i++)		f->f_pmask[i] = INTERNAL_NOPRI;	/* scan through the list of selectors */	for (p = line; *p && *p != '\t';) {		/* find the end of this facility name list */		for (q = p; *q && *q != '\t' && *q++ != '.'; )			continue;		/* collect priority name */		for (bp = buf; *q && !strchr("\t,;", *q); )			*bp++ = *q++;		*bp = '\0';		/* skip cruft */		while (strchr(", ;", *q))			q++;		/* decode priority name */		if (*buf == '*')			pri = LOG_PRIMASK + 1;		else {			pri = decode(buf, prioritynames);			if (pri < 0) {				(void)sprintf(ebuf,				    "unknown priority name \"%s\"", buf);				logerror(ebuf);				return;			}		}		/* scan facilities */		while (*p && !strchr("\t.;", *p)) {			for (bp = buf; *p && !strchr("\t,;.", *p); )				*bp++ = *p++;			*bp = '\0';			if (*buf == '*')				for (i = 0; i < LOG_NFACILITIES; i++)					f->f_pmask[i] = pri;			else {				i = decode(buf, facilitynames);				if (i < 0) {					(void)sprintf(ebuf,					    "unknown facility name \"%s\"",					    buf);					logerror(ebuf);					return;				}				f->f_pmask[i >> 3] = pri;			}			while (*p == ',' || *p == ' ')				p++;		}		p = q;	}	/* skip to action part */	while (*p == '\t')		p++;	switch (*p)	{	case '@':		if (!InetInuse)			break;		(void)strcpy(f->f_un.f_forw.f_hname, ++p);		hp = gethostbyname(p);		if (hp == NULL) {			extern int h_errno;			logerror(hstrerror(h_errno));			break;		}		memset(&f->f_un.f_forw.f_addr, 0,			 sizeof(f->f_un.f_forw.f_addr));		f->f_un.f_forw.f_addr.sin_family = AF_INET;		f->f_un.f_forw.f_addr.sin_port = LogPort;		memmove(&f->f_un.f_forw.f_addr.sin_addr, hp->h_addr, hp->h_length);		f->f_type = F_FORW;		break;	case '/':		(void)strcpy(f->f_un.f_fname, p);		if ((f->f_file = open(p, O_WRONLY|O_APPEND, 0)) < 0) {			f->f_file = F_UNUSED;			logerror(p);			break;		}		if (isatty(f->f_file))			f->f_type = F_TTY;		else			f->f_type = F_FILE;		if (strcmp(p, ctty) == 0)			f->f_type = F_CONSOLE;		break;	case '*':		f->f_type = F_WALL;		break;	default:		for (i = 0; i < MAXUNAMES && *p; i++) {			for (q = p; *q && *q != ','; )				q++;			(void)strncpy(f->f_un.f_uname[i], p, UT_NAMESIZE);			if ((q - p) > UT_NAMESIZE)				f->f_un.f_uname[i][UT_NAMESIZE] = '\0';			else				f->f_un.f_uname[i][q - p] = '\0';			while (*q == ',' || *q == ' ')				q++;			p = q;		}		f->f_type = F_USERS;		break;	}}/* *  Decode a symbolic name to a numeric value */intdecode(name, codetab)	const char *name;	CODE *codetab;{	CODE *c;	char *p, buf[40];	if (isdigit(*name))		return (atoi(name));	for (p = buf; *name && p < &buf[sizeof(buf) - 1]; p++, name++) {		if (isupper(*name))			*p = tolower(*name);		else			*p = *name;	}	*p = '\0';	for (c = codetab; c->c_name; c++)		if (!strcmp(buf, c->c_name))			return (c->c_val);	return (-1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -