chiark / gitweb /
add ata_id to read serial numbers from ATA drives
[elogind.git] / klibc / klibc / syslog.c
index d40d8633d1cd2e39d1a118ac202fbed24ff2d2dc..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,38 +37,44 @@ 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 vsyslog(int prio, const char *format, 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);
-  
-  rv = vsnprintf(buf+len, BUFLEN-len, format, 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);
 
-  write(fd, buf, len+1);
+  if ( syslog_flags & LOG_PERROR )
+    _fwrite(buf+3, len-3, stderr);
 }
 
 void syslog(int prio, const char *format, ...)