]> git.sesse.net Git - vlc/commitdiff
Use %m on GLIBC to work-around strerror_r prototype problems
authorRémi Denis-Courmont <rem@videolan.org>
Mon, 25 Feb 2008 16:29:04 +0000 (16:29 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Mon, 25 Feb 2008 16:29:04 +0000 (16:29 +0000)
src/misc/threads.c

index 8a90155862909b5d041d8226355b63c9c6a18e37..0630b15be365f8314b8deeae4a66c21938a81fbf 100644 (file)
@@ -95,23 +95,35 @@ static inline unsigned long vlc_threadid (void)
 void vlc_pthread_fatal (const char *action, int error,
                         const char *file, unsigned line)
 {
-    char buf[1000];
-    const char *msg;
-
     fprintf (stderr, "LibVLC fatal error %s in thread %lu at %s:%u: %d\n",
              action, vlc_threadid (), file, line, error);
     fflush (stderr);
 
     /* Sometimes strerror_r() crashes too, so make sure we print an error
      * message before we invoke it */
-#ifdef __GLIBC__ && _POSIX_C_SOURCE < 200112L && _XOPEN_SOURCE < 600 && _GNU_SOURCE
-    /* use GNU prototype */
-    msg = strerror_r (error, buf, sizeof (buf));
+#ifdef __GLIBC__
+    /* Avoid the strerror_r() prototype brain damage in glibc */
+    errno = error;
+    fprintf (stderr, " Error message: %m\n");
 #else
-    msg = buf;
-    if (!strerror_r (error, buf, sizeof (buf)))
+    char buf[1000];
+    const char *msg;
+
+    switch (sterror_r (error, buf, sizeof (buf)))
+    {
+        case 0:
+            msg = buf;
+            break;
+        case ERANGE: /* should never happen */
+            msg = "unknwon (too big to display)";
+            break;
+        default:
+            msg = "unknown (invalid error number)";
+            break;
+    }
+    fprintf (stderr, " Error message: %s\n", msg);
 #endif
-        fprintf (stderr, "Error description: \"%s\"\n", msg ? msg : "(null)");
+
     fflush (stderr);
     abort ();
 }