X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Faddext.c;h=7753c608aa350b2e70bee07e2924dfde63363d0d;hb=0e3c27e0d9f27e890e6a3a0d768c7408dedda702;hp=edd56c3dd96cd6ea94ab3a1cbe9f246ba96dae51;hpb=94ce07b03b34361c3e8ce68867af8bd224e72f07;p=gnulib.git diff --git a/lib/addext.c b/lib/addext.c index edd56c3dd..7753c608a 100644 --- a/lib/addext.c +++ b/lib/addext.c @@ -1,5 +1,7 @@ /* addext.c -- add an extension to a file name - Copyright 1990, 1997, 1998, 1999, 2001 Free Software Foundation, Inc. + + Copyright (C) 1990, 1997, 1998, 1999, 2001, 2003 Free Software + Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,14 +31,12 @@ # define HAVE_LONG_FILE_NAMES 0 #endif -#if HAVE_LIMITS_H -# include -#endif +#include #ifndef _POSIX_NAME_MAX # define _POSIX_NAME_MAX 14 #endif -#include +#include #if HAVE_STRING_H # include #else @@ -47,6 +47,11 @@ # include #endif +#include +#ifndef errno +extern int errno; +#endif + #include "backupfile.h" #include "dirname.h" @@ -57,26 +62,34 @@ 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) + { + long size = slen_max = name_max; + if (name_max != size) + slen_max = -1; + } } #endif - if (slen_max < 0) - slen_max = HAVE_LONG_FILE_NAMES ? 255 : 14; if (HAVE_DOS_FILE_NAMES && slen_max <= 12) {