chiark / gitweb /
Make run_directory.c stat the place it is going to try to run.
[elogind.git] / klibc / klibc / syslog.c
index b031d4f0e7946ac45356220445ca9df7df3f7153..0cd296ab8580753e89e19c8e754c178f3cfad70a 100644 (file)
 #define LOGDEV "/dev/kmsg"
 
 /* Max length of ID string */
-#define MAXID 31
+#define MAXID 31               /* MAXID+5 must be < BUFLEN */
 
 int __syslog_fd = -1;
 static char id[MAXID+1];
+static int syslog_flags = 0;
 
 void openlog(const char *ident, int option, int facility)
 {
@@ -36,39 +37,51 @@ void openlog(const char *ident, int option, int facility)
     fcntl(fd, F_SETFD, (long)FD_CLOEXEC);
   }
   
+  syslog_flags = option;
+
   strncpy(id, ident?ident:"", MAXID);
-  id[MAXID] = '\0';            /* Make sure it's null-terminated */
 }
 
-void syslog(int prio, const char *format, ...)
+void vsyslog(int prio, const char *format, va_list ap)
 {
-  va_list ap;
   char buf[BUFLEN];
-  int rv, len;
+  int 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 )
+  if ( syslog_flags & LOG_PID )
+    len += sprintf(buf+3, "%s[%u]: ", id, getpid());
+  else 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;
+  len += vsnprintf(buf+len, BUFLEN-len, format, ap);
+
   if ( len > BUFLEN-1 ) len = BUFLEN-1;
-  buf[len] = '\n';
+  if (buf[len-1] != '\n')
+    buf[len++] = '\n';
+
+  fd = __syslog_fd;
+  if ( fd == -1 )
+    fd = 2;                    /* Failed to open log, write to stderr */
+
+  write(fd, buf, len);
+
+  if ( syslog_flags & LOG_PERROR )
+    _fwrite(buf+3, len-3, stderr);
+}
 
-  write(fd, buf, len+1);
+void syslog(int prio, const char *format, ...)
+{
+  va_list ap;
+
+  va_start(ap, format);
+  vsyslog(prio, format, ap);
+  va_end(ap);
 }