diff options
Diffstat (limited to 'klibc/klibc/syslog.c')
-rw-r--r-- | klibc/klibc/syslog.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/klibc/klibc/syslog.c b/klibc/klibc/syslog.c new file mode 100644 index 0000000000..b031d4f0e7 --- /dev/null +++ b/klibc/klibc/syslog.c @@ -0,0 +1,74 @@ +/* + * syslog.c + * + * Issue syslog messages via the kernel printk queue. + */ + +#include <stdio.h> +#include <string.h> +#include <stdarg.h> +#include <syslog.h> +#include <unistd.h> +#include <fcntl.h> + +/* Maximum size for a kernel message */ +#define BUFLEN 1024 + +/* Logging node */ +#define LOGDEV "/dev/kmsg" + +/* Max length of ID string */ +#define MAXID 31 + +int __syslog_fd = -1; +static char id[MAXID+1]; + +void openlog(const char *ident, int option, int facility) +{ + int fd; + + (void)option; (void)facility; /* Unused */ + + if ( __syslog_fd == -1 ) { + __syslog_fd = fd = open(LOGDEV, O_WRONLY); + if ( fd == -1 ) + return; + fcntl(fd, F_SETFD, (long)FD_CLOEXEC); + } + + strncpy(id, ident?ident:"", MAXID); + id[MAXID] = '\0'; /* Make sure it's null-terminated */ +} + +void syslog(int prio, const char *format, ...) +{ + va_list ap; + char buf[BUFLEN]; + int rv, len; + int fd; + + if ( __syslog_fd == -1 ) + openlog(NULL, 0, 0); + + fd = __syslog_fd; + if ( fd == -1 ) + fd = 2; /* Failed to open log, write to stderr */ + + buf[0] = '<'; + buf[1] = LOG_PRI(prio)+'0'; + buf[2] = '>'; + len = 3; + + if ( *id ) + len += sprintf(buf+3, "%s: ", id); + + va_start(ap, format); + rv = vsnprintf(buf+len, BUFLEN-len, format, ap); + va_end(ap); + + len += rv; + if ( len > BUFLEN-1 ) len = BUFLEN-1; + buf[len] = '\n'; + + write(fd, buf, len+1); +} |