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

📄 syslog.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/* * RTEMS version of syslog and associated routines * * $Id: syslog.c,v 1.3 2002/10/28 13:55:58 joel Exp $ */#include <rtems.h>#include <stdio.h>#include <stdarg.h>#include <errno.h>#include <syslog.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>#include <unistd.h>static int LogStatus = LOG_CONS;static const char *LogTag = "syslog";static int LogFacility = LOG_USER;static int LogMask = 0xff;static int LogFd = -1;static rtems_id LogSemaphore;extern struct in_addr rtems_bsdnet_log_host_address;#define SYSLOG_PORT	514voidsyslog (int pri, const char *fmt, ...){	va_list ap;	va_start (ap, fmt);	vsyslog (pri, fmt, ap);	va_end (ap);}/* * FIXME: Should cbuf be static?  It could be if we put the mutex *        around the entire body of this routine.  Then we wouldn't *        have to worry about blowing stacks with a local variable *        that large.  Could make cbuf bigger, too. */voidvsyslog (int pri, const char *fmt, va_list ap){	int cnt;	char *cp;	char *msgp, cbuf[200];	int sent;	if (pri & ~(LOG_PRIMASK|LOG_FACMASK)) {		syslog (LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID,								"syslog: unknown facility/priority: %#x", pri);		pri &= LOG_PRIMASK|LOG_FACMASK;	}	if (!LOG_MASK(LOG_PRI(pri)) & LogMask)		return;	if ((pri & LOG_FACMASK) == 0)		pri |= LogFacility;	cnt = sprintf (cbuf, "<%d>", pri);	cp = msgp = cbuf + cnt;	if (LogTag) {		const char *lp = LogTag;		while ((*cp = *lp++) != '\0')			cp++;	}	if (LogStatus & LOG_PID) {		rtems_id tid;		rtems_task_ident (RTEMS_SELF, 0, &tid);		cnt = sprintf (cp, "[%#lx]", (unsigned long)tid);		cp += cnt;	}	if (LogTag) {		*cp++ = ':';		*cp++ = ' ';	}	cnt = vsprintf (cp, fmt, ap);	cnt += cp - cbuf;	if (cbuf[cnt-1] == '\n')		cbuf[--cnt] = '\0';	if (LogStatus & LOG_PERROR)		printf ("%s\n", cbuf);	/*	 * Grab the mutex	 */	sent = 0;	if ((rtems_bsdnet_log_host_address.s_addr != INADDR_ANY)	 && (LogFd >= 0)	 && (rtems_semaphore_obtain (LogSemaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT) == RTEMS_SUCCESSFUL)) {		/*		 * Set the destination address/port		 */		struct sockaddr_in farAddress;		farAddress.sin_family = AF_INET;		farAddress.sin_port = htons (SYSLOG_PORT);		farAddress.sin_addr = rtems_bsdnet_log_host_address;		memset (farAddress.sin_zero, '\0', sizeof farAddress.sin_zero);		/*		 * Send the message		 */		if (sendto (LogFd, cbuf, cnt, 0, (struct sockaddr *)&farAddress, sizeof farAddress) >= 0)			sent = 1;		rtems_semaphore_release (LogSemaphore);	}	if (!sent && (LogStatus & LOG_CONS) && !(LogStatus & LOG_PERROR))		printf ("%s\n", msgp);}voidopenlog (const char *ident, int logstat, int logfac){	rtems_status_code sc;	struct sockaddr_in myAddress;	if (ident != NULL)		LogTag = ident;	LogStatus = logstat;	if (logfac != 0 && (logfac & ~LOG_FACMASK) == 0)		LogFacility = logfac;	/*	 * Create the socket	 */	if ((LogFd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {		printf ("Can't create syslog socket: %d\n", errno);		return;	}	/*	 * Bind socket to name	 */	myAddress.sin_family = AF_INET;	myAddress.sin_addr.s_addr = INADDR_ANY;	myAddress.sin_port = 0;	memset (myAddress.sin_zero, '\0', sizeof myAddress.sin_zero);	if (bind (LogFd, (struct sockaddr *)&myAddress, sizeof (myAddress)) < 0) {		close (LogFd);		LogFd = -1;		printf ("Can't bind syslog socket: %d\n", errno);		return;	}	/*	 * Create the mutex	 */	sc = rtems_semaphore_create (rtems_build_name('s', 'L', 'o', 'g'),					1,					RTEMS_PRIORITY |						RTEMS_BINARY_SEMAPHORE |						RTEMS_INHERIT_PRIORITY |						RTEMS_NO_PRIORITY_CEILING |						RTEMS_LOCAL,					0,					&LogSemaphore);	if (sc != RTEMS_SUCCESSFUL) {		printf ("Can't create syslog seamphore: %d\n", sc);		close (LogFd);		LogFd = -1;	}}voidcloselog(void){	if (LogFd >= 0) {		close (LogFd);		LogFd = -1;		rtems_semaphore_delete (LogSemaphore);	}}intsetlogmask (int pmask){	int omask;	omask = LogMask;	if (pmask != 0)		LogMask = pmask;	return (omask);}

⌨️ 快捷键说明

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