2006-05-10 Paul Eggert <eggert@cs.ucla.edu>
[gnulib.git] / lib / getlogin_r.c
index 5683504..371164a 100644 (file)
 
 /* written by Paul Eggert and Derek Price */
 
-#include <config.h>
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
 
 #include "getlogin_r.h"
 
 #include <errno.h>
 #include <string.h>
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
+#include <unistd.h>
 
 #if !HAVE_DECL_GETLOGIN
 char *getlogin (void);
@@ -38,22 +37,22 @@ int
 getlogin_r (char *name, size_t size)
 {
   char *n;
-  int save_errno = errno;
+  size_t nlen;
 
   errno = 0;
   n = getlogin ();
-  if (n)
-    {
-      size_t nlen = strlen (n);
-      if (nlen < size)
-        {
-          memcpy (name, n, nlen + 1);
-          return 0;
-        }
-      errno = ERANGE;
-    }
-
-  if (errno) return errno;
-  errno = save_errno;
-  return -1;
+
+  /* A system function like getlogin_r is never supposed to set errno
+     to zero, so make sure errno is nonzero here.  ENOENT is a
+     reasonable errno value if getlogin returns NULL.  */
+  if (!errno)
+    errno = ENOENT;
+
+  if (!n)
+    return errno;
+  nlen = strlen (n);
+  if (size <= nlen)
+    return ERANGE;
+  memcpy (name, n, nlen + 1);
+  return 0;
 }