X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Faddext.c;h=7753c608aa350b2e70bee07e2924dfde63363d0d;hb=24a2f092937bbbfdb21a9eedf909fca820154561;hp=a075ea3b1eaf8ea60513319d972909315bf462fd;hpb=1cc6c3e3fc985b64c9b2566015a7d5967d87dd67;p=gnulib.git diff --git a/lib/addext.c b/lib/addext.c index a075ea3b1..7753c608a 100644 --- a/lib/addext.c +++ b/lib/addext.c @@ -1,5 +1,7 @@ /* addext.c -- add an extension to a file name - Copyright (C) 1990, 1997, 1998, 1999 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,16 +31,12 @@ # define HAVE_LONG_FILE_NAMES 0 #endif -#include - -#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 @@ -49,7 +47,13 @@ # include #endif -char *base_name PARAMS ((char const *)); +#include +#ifndef errno +extern int errno; +#endif + +#include "backupfile.h" +#include "dirname.h" /* Append to FILENAME the extension EXT, unless the result would be too long, in which case just append the character E. */ @@ -58,25 +62,34 @@ void addext (char *filename, char const *ext, int e) { char *s = base_name (filename); - size_t slen = strlen (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; - *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) {