[rtems-libbsd commit] Add syslog functionality from old TCP/IP stack.

Joel Sherrill joel at rtems.org
Fri Aug 3 13:36:47 UTC 2012


Module:    rtems-libbsd
Branch:    master
Commit:    a4713c61c72461e0c584a5dfbcfa371731bd1cd0
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=a4713c61c72461e0c584a5dfbcfa371731bd1cd0

Author:    Joel Sherrill <joel.sherrill at oarcorp.com>
Date:      Sat Jul 28 06:39:41 2012 -0500

Add syslog functionality from old TCP/IP stack.

---

 freebsd-userspace/Makefile                         |    6 +
 .../{sys => rtems/include}/sys/syslog.h            |    4 +-
 freebsd-userspace/rtems/syslog.c                   |  192 ++++++++++++++++++++
 3 files changed, 200 insertions(+), 2 deletions(-)

diff --git a/freebsd-userspace/Makefile b/freebsd-userspace/Makefile
index 3de3258..fb84e88 100644
--- a/freebsd-userspace/Makefile
+++ b/freebsd-userspace/Makefile
@@ -79,7 +79,9 @@ C_FILES += lib/libc/resolv/res_query.c
 # C_FILES += lib/libc/resolv/res_update.c
 C_FILES += lib/libc/string/strsep.c
 
+# RTEMS Specific Files
 C_FILES += rtems/rtems-net-setup.c
+C_FILES += rtems/syslog.c
 
 C_O_FILES = $(C_FILES:%.c=%.o)
 C_D_FILES = $(C_FILES:%.c=%.d)
@@ -102,6 +104,10 @@ install: $(LIB)
 	  install -c -m 644 -D "$$i" "$(INSTALL_BASE)/include/$$i" ; done
 	cd rtems/include; for i in `find . -name '*.h'` ; do \
 	  install -c -m 644 -D "$$i" "$(INSTALL_BASE)/include/$$i" ; done
+	cd local; for i in `find . -name '*.h'` ; do \
+	  install -c -m 644 -D "$$i" "$(INSTALL_BASE)/include/$$i" ; done
+	cd sys; for i in `find . -name '*.h'` ; do \
+	  install -c -m 644 -D "$$i" "$(INSTALL_BASE)/include/$$i" ; done
 	install -c -m 644 $(LIB) $(INSTALL_BASE)
 
 clean:
diff --git a/freebsd-userspace/sys/sys/syslog.h b/freebsd-userspace/rtems/include/sys/syslog.h
similarity index 98%
rename from freebsd-userspace/sys/sys/syslog.h
rename to freebsd-userspace/rtems/include/sys/syslog.h
index 6f12831..a4aba4a 100644
--- a/freebsd-userspace/sys/sys/syslog.h
+++ b/freebsd-userspace/rtems/include/sys/syslog.h
@@ -192,9 +192,9 @@ __BEGIN_DECLS
 void	closelog(void);
 void	openlog(const char *, int, int);
 int	setlogmask(int);
-void	syslog(int, const char *, ...) __printflike(2, 3);
+void	syslog(int, const char *, ...); /* JRS __printflike(2, 3); */
 #if __BSD_VISIBLE
-void	vsyslog(int, const char *, __va_list) __printflike(2, 0);
+void	vsyslog(int, const char *, __va_list); /* JRS __printflike(2, 0); */
 #endif
 __END_DECLS
 
diff --git a/freebsd-userspace/rtems/syslog.c b/freebsd-userspace/rtems/syslog.c
new file mode 100644
index 0000000..10a75a6
--- /dev/null
+++ b/freebsd-userspace/rtems/syslog.c
@@ -0,0 +1,192 @@
+/*
+ * RTEMS version of syslog and associated routines
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#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	514
+
+void
+syslog (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.
+ */
+void
+vsyslog (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);
+}
+
+void
+openlog (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 semaphore: %d\n", sc);
+		close (LogFd);
+		LogFd = -1;
+	}
+}
+
+void
+closelog(void)
+{
+	if (LogFd >= 0) {
+		close (LogFd);
+		LogFd = -1;
+		rtems_semaphore_delete (LogSemaphore);
+	}
+}
+
+int
+setlogmask (int pmask)
+{
+	int omask;
+
+	omask = LogMask;
+	if (pmask != 0)
+		LogMask = pmask;
+	return (omask);
+}




More information about the vc mailing list