diff options
author | Roland McGrath <[email protected]> | 2009-08-14 13:10:09 -0700 |
---|---|---|
committer | Roland McGrath <[email protected]> | 2009-08-14 13:10:09 -0700 |
commit | 536127f4ad48c7246b8627bf0e50d97825375a07 (patch) | |
tree | b37074f12b41aff9f26102ccbc426aad10116f8b /src/ar.c | |
parent | 84664177d2d53b2501724c01a258fb6194ac73b4 (diff) |
Use pathconf instead of statfs.
Diffstat (limited to 'src/ar.c')
-rw-r--r-- | src/ar.c | 36 |
1 files changed, 23 insertions, 13 deletions
@@ -45,7 +45,6 @@ #include <time.h> #include <unistd.h> #include <sys/mman.h> -#include <sys/statfs.h> #include <sys/time.h> #include <system.h> @@ -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) { |