]> sourceware.org Git - glibc.git/blobdiff - elf/dlerror.c
handle password file locking.
[glibc.git] / elf / dlerror.c
index 0eed60a45d2ad4bba8b87a3d59aff6a5b6c99e77..663207d708d720ab2e75c159cb4d8ea4edbba7b5 100644 (file)
@@ -1,5 +1,5 @@
 /* dlerror -- Return error detail for failing <dlfcn.h> functions.
 /* dlerror -- Return error detail for failing <dlfcn.h> functions.
-Copyright (C) 1995 Free Software Foundation, Inc.
+Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -23,42 +23,55 @@ Cambridge, MA 02139, USA.  */
 #include <string.h>
 #include <stdlib.h>
 
 #include <string.h>
 #include <stdlib.h>
 
-static int _dl_last_errcode;
-static const char *_dl_last_errstring;
+static int last_errcode;
+static const char *last_errstring;
+static const char *last_object_name;
 
 char *
 dlerror (void)
 {
 
 char *
 dlerror (void)
 {
- char *ret;
+  static char *buf;
+  char *ret;
 
 
-  if (! _dl_last_errstring)
-    return NULL;
-
-  if (_dl_last_errcode)
+  if (buf)
     {
     {
-      static char *buf;
-      if (buf)
-       {
-         free (buf);
-         buf = NULL;
-       }
-      if (asprintf (&buf, "%s: %s",
-                   _dl_last_errstring, strerror (_dl_last_errcode)) == -1)
-       return NULL;
-      else
-       ret = buf;
+      free (buf);
+      buf = NULL;
     }
     }
- else
-   ret = (char *) _dl_last_errstring;
 
 
- /* Reset the error indicator.  */
- _dl_last_errstring = NULL;
- return ret;
+  if (! last_errstring)
+    return NULL;
+
+  if (last_errcode == 0 && ! last_object_name)
+    ret = (char *) last_errstring;
+  else if (last_errcode == 0)
+    ret = (asprintf (&buf, "%s: %s", last_object_name, last_errstring) == -1
+          ? NULL : buf);
+  else if (! last_object_name)
+    ret = (asprintf (&buf, "%s: %s",
+                    last_errstring, strerror (last_errcode)) == -1
+          ? NULL : buf);
+  else
+    ret = (asprintf (&buf, "%s: %s: %s",
+                    last_object_name, last_errstring,
+                    strerror (last_errcode)) == -1
+          ? NULL : buf);
+
+  /* Reset the error indicator.  */
+  free (last_errstring);
+  last_errstring = NULL;
+  return ret;
 }
 
 int
 _dlerror_run (void (*operate) (void))
 {
 }
 
 int
 _dlerror_run (void (*operate) (void))
 {
-  _dl_last_errcode = _dl_catch_error (&_dl_last_errstring, operate);
-  return _dl_last_errstring != NULL;
+  if (last_errstring != NULL)
+    /* Free the error string from the last failed command.  This can
+       happen if `dlerror' was not run after an error was found.  */
+    free (last_errstring);
+
+  last_errcode = _dl_catch_error (&last_errstring, &last_object_name,
+                                 operate);
+  return last_errstring != NULL;
 }
 }
This page took 0.027959 seconds and 5 git commands to generate.