.
[gnulib.git] / lib / addext.c
index edd56c3..571e3c2 100644 (file)
 # include <unistd.h>
 #endif
 
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
 #include "backupfile.h"
 #include "dirname.h"
 
@@ -57,26 +62,30 @@ void
 addext (char *filename, char const *ext, int e)
 {
   char *s = base_name (filename);
-  size_t slen = base_len (s), extlen = strlen (ext);
-  long slen_max = -1;
+  size_t slen = base_len (s);
+  size_t extlen = strlen (ext);
+  size_t slen_max = HAVE_LONG_FILE_NAMES ? 255 : _POSIX_NAME_MAX;
 
 #if HAVE_PATHCONF && defined _PC_NAME_MAX
-  if (slen + extlen <= _POSIX_NAME_MAX && ! HAVE_DOS_FILE_NAMES)
-    /* The file name is so short there's no need to call pathconf.  */
-    slen_max = _POSIX_NAME_MAX;
-  else if (s == filename)
-    slen_max = pathconf (".", _PC_NAME_MAX);
-  else
+  if (_POSIX_NAME_MAX < slen + extlen || HAVE_DOS_FILE_NAMES)
     {
-      char c = *s;
-      if (! ISSLASH (c))
-       *s = 0;
-      slen_max = pathconf (filename, _PC_NAME_MAX);
-      *s = c;
+      /* The new base name is long enough to require a pathconf check.  */
+      long name_max;
+      errno = 0;
+      if (s == filename)
+       name_max = pathconf (".", _PC_NAME_MAX);
+      else
+       {
+         char c = *s;
+         if (! ISSLASH (c))
+           *s = 0;
+         name_max = pathconf (filename, _PC_NAME_MAX);
+         *s = c;
+       }
+      if (0 <= name_max || errno == 0)
+       slen_max = name_max == (size_t) name_max ? name_max : -1;
     }
 #endif
-  if (slen_max < 0)
-    slen_max = HAVE_LONG_FILE_NAMES ? 255 : 14;
 
   if (HAVE_DOS_FILE_NAMES && slen_max <= 12)
     {