From: Roland McGrath Date: Fri, 14 Aug 2009 20:10:09 +0000 (-0700) Subject: Use pathconf instead of statfs. X-Git-Tag: elfutils-0.143~30 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=536127f4ad48c7246b8627bf0e50d97825375a07;p=thirdparty%2Felfutils.git Use pathconf instead of statfs. --- diff --git a/src/ChangeLog b/src/ChangeLog index 19e034ae1..c0ea003b6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2009-08-14 Roland McGrath + + * ar.c (do_oper_extract): Use pathconf instead of statfs. + 2009-08-01 Ulrich Drepper * debugpred.h: Add two most const. diff --git a/src/ar.c b/src/ar.c index 2d11b1ef8..9be0649ff 100644 --- a/src/ar.c +++ b/src/ar.c @@ -45,7 +45,6 @@ #include #include #include -#include #include #include @@ -459,8 +458,21 @@ do_oper_extract (int oper, const char *arfname, char **argv, int argc, bool found[argc]; memset (found, '\0', sizeof (found)); - struct statfs f; - f.f_namelen = 0; + size_t name_max = 0; + inline bool should_truncate_fname (void) + { + if (errno == ENAMETOOLONG && allow_truncate_fname) + { + if (name_max == 0) + { + long int len = pathconf (".", _PC_NAME_MAX); + if (len > 0) + name_max = len; + } + return name_max != 0; + } + return false; + } off_t index_off = -1; size_t index_size = 0; @@ -611,15 +623,14 @@ do_oper_extract (int oper, const char *arfname, char **argv, int argc, { int printlen = INT_MAX; - if (errno == ENAMETOOLONG && allow_truncate_fname - && (f.f_namelen != 0 || statfs (".", &f) == 0)) + if (should_truncate_fname ()) { /* Try to truncate the name. First find out by how much. */ - printlen = f.f_namelen; - char truncfname[f.f_namelen + 1]; + printlen = name_max; + char truncfname[name_max + 1]; *((char *) mempcpy (truncfname, arhdr->ar_name, - f.f_namelen)) = '\0'; + name_max)) = '\0'; xfd = open (truncfname, flags, 0600); } @@ -701,15 +712,14 @@ do_oper_extract (int oper, const char *arfname, char **argv, int argc, { int printlen = INT_MAX; - if (errno == ENAMETOOLONG && allow_truncate_fname - && (f.f_namelen != 0 || statfs (".", &f) == 0)) + if (should_truncate_fname ()) { /* Try to truncate the name. First find out by how much. */ - printlen = f.f_namelen; - char truncfname[f.f_namelen + 1]; + printlen = name_max; + char truncfname[name_max + 1]; *((char *) mempcpy (truncfname, arhdr->ar_name, - f.f_namelen)) = '\0'; + name_max)) = '\0'; if (dont_replace_existing) {