Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 14 Jun 2000 07:14:09 +0000 (07:14 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 14 Jun 2000 07:14:09 +0000 (07:14 +0000)
2000-06-14  Ulrich Drepper  <drepper@redhat.com>

* misc/syslog.c (vsyslog): Allow open_memstream to fail without
crashing the application.  Emit some simple error message.
Reported by mju@panasas.com [PR libc/1769].

ChangeLog
NEWS
misc/syslog.c

index 8d892c9..fae15e5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2000-06-14  Ulrich Drepper  <drepper@redhat.com>
+
+       * misc/syslog.c (vsyslog): Allow open_memstream to fail without
+       crashing the application.  Emit some simple error message.
+       Reported by mju@panasas.com [PR libc/1769].
+
 2000-06-13  Ulrich Drepper  <drepper@redhat.com>
 
        * malloc/Makefile (distribute): Add memprof.sh and memprofstat.c.
diff --git a/NEWS b/NEWS
index b90e7db..fe2aec0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -47,6 +47,12 @@ Version 2.2
 * A port to Hitachi SH3 and SH4 has been contributed by Kazumoto Kojima
   and Yutaka Niibe.
 
+* POSIX clocks and timers implemented by Kaz Kylheku and Ulrich Drepper.
+
+* POSIX spawn function family implemented by Ulrich Drepper.
+
+* POSIX spinlocks are now available.
+
 \f
 Version 2.1.3
 
index 29cd266..c44f941 100644 (file)
@@ -120,6 +120,7 @@ vsyslog(pri, fmt, ap)
        struct sigaction *oldaction_ptr = NULL;
        int sigpipe;
        int saved_errno = errno;
+       char failbuf[3 * sizeof (pid_t) + sizeof "out of memory []"];
 
 #define        INTERNALLOG     LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID
        /* Check for invalid bits. */
@@ -139,36 +140,61 @@ vsyslog(pri, fmt, ap)
 
        /* Build the message in a memory-buffer stream.  */
        f = open_memstream (&buf, &bufsize);
-       prioff = fprintf (f, "<%d>", pri);
-       (void) time (&now);
+       if (f == NULL)
+         {
+           /* We cannot get a stream.  There is not much we can do but
+              emitting an error messages.  */
+           char numbuf[3 * sizeof (pid_t)];
+           char *nump;
+           char *endp = __stpcpy (failbuf, "out of memory [");
+           pid_t pid = __getpid ();
+
+           nump = numbuf + sizeof (numbuf);
+           /* The PID can never be zero.  */
+           do
+             *--nump = '0' + pid % 10;
+           while ((pid /= 10) != 0);
+
+           endp = __mempcpy (endp, nump, (nump + sizeof (numbuf)) - nump);
+           *endp++ = ']';
+           *endp = '\0';
+           buf = failbuf;
+           bufsize = endp - failbuf;
+         }
+       else
+         {
+           prioff = fprintf (f, "<%d>", pri);
+           (void) time (&now);
 #ifdef USE_IN_LIBIO
-        f->_IO_write_ptr += strftime (f->_IO_write_ptr,
-                                      f->_IO_write_end - f->_IO_write_ptr,
-                                      "%h %e %T ",
-                                     __localtime_r (&now, &now_tm));
+           f->_IO_write_ptr += strftime (f->_IO_write_ptr,
+                                         f->_IO_write_end - f->_IO_write_ptr,
+                                         "%h %e %T ",
+                                         __localtime_r (&now, &now_tm));
 #else
-       f->__bufp += strftime (f->__bufp, f->__put_limit - f->__bufp,
-                              "%h %e %T ", __localtime_r (&now, &now_tm));
+           f->__bufp += strftime (f->__bufp, f->__put_limit - f->__bufp,
+                                  "%h %e %T ", __localtime_r (&now, &now_tm));
 #endif
-       msgoff = ftell (f);
-       if (LogTag == NULL)
-         LogTag = __progname;
-       if (LogTag != NULL)
-         fputs_unlocked (LogTag, f);
-       if (LogStat & LOG_PID)
-         fprintf (f, "[%d]", __getpid ());
-       if (LogTag != NULL)
-         putc_unlocked (':', f), putc_unlocked (' ', f);
-
-       /* Restore errno for %m format.  */
-       __set_errno (saved_errno);
-
-       /* We have the header.  Print the user's format into the buffer.  */
-       vfprintf (f, fmt, ap);
-
-       /* Close the memory stream; this will finalize the data
-          into a malloc'd buffer in BUF.  */
-       fclose (f);
+           msgoff = ftell (f);
+           if (LogTag == NULL)
+             LogTag = __progname;
+           if (LogTag != NULL)
+             fputs_unlocked (LogTag, f);
+           if (LogStat & LOG_PID)
+             fprintf (f, "[%d]", __getpid ());
+           if (LogTag != NULL)
+             putc_unlocked (':', f), putc_unlocked (' ', f);
+
+           /* Restore errno for %m format.  */
+           __set_errno (saved_errno);
+
+           /* We have the header.  Print the user's format into the
+               buffer.  */
+           vfprintf (f, fmt, ap);
+
+           /* Close the memory stream; this will finalize the data
+              into a malloc'd buffer in BUF.  */
+           fclose (f);
+         }
 
        /* Output to stderr if requested. */
        if (LogStat & LOG_PERROR) {
@@ -326,7 +352,7 @@ closelog ()
   closelog_internal ();
   LogTag = NULL;
   LogType = SOCK_DGRAM; /* this is the default */
-  
+
   /* Free the lock.  */
   __libc_cleanup_region_end (1);
 }