summaryrefslogtreecommitdiff
path: root/lib/addext.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2001-08-13 06:30:10 +0000
committerJim Meyering <jim@meyering.net>2001-08-13 06:30:10 +0000
commit7fda17ac4f46fbab7cf7375f6362787124a388a6 (patch)
tree3eb6bc44918f1ec841a224230b873831a6d3ddd5 /lib/addext.c
parent242256b45dc1bc40a8352e5f323b5564c7f25dd6 (diff)
downloadcoreutils-7fda17ac4f46fbab7cf7375f6362787124a388a6.tar.xz
(<errno.h>): Include.
(errno): Declare if not defined. (addext): Work correctly when pathconf returns -1 and leaves errno alone because there is no limit. Also, work even if pathconf returns a value greater than SIZE_MAX.
Diffstat (limited to 'lib/addext.c')
-rw-r--r--lib/addext.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/lib/addext.c b/lib/addext.c
index edd56c3dd..571e3c2db 100644
--- a/lib/addext.c
+++ b/lib/addext.c
@@ -47,6 +47,11 @@
# 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)
{