summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2009-08-14 13:10:09 -0700
committerRoland McGrath <roland@redhat.com>2009-08-14 13:10:09 -0700
commit536127f4ad48c7246b8627bf0e50d97825375a07 (patch)
treeb37074f12b41aff9f26102ccbc426aad10116f8b
parent84664177d2d53b2501724c01a258fb6194ac73b4 (diff)
downloadelfutils-536127f4ad48c7246b8627bf0e50d97825375a07.tar.gz
Use pathconf instead of statfs.
-rw-r--r--src/ChangeLog4
-rw-r--r--src/ar.c36
2 files changed, 27 insertions, 13 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 19e034ae..c0ea003b 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2009-08-14 Roland McGrath <roland@redhat.com>
+
+ * ar.c (do_oper_extract): Use pathconf instead of statfs.
+
2009-08-01 Ulrich Drepper <drepper@redhat.com>
* debugpred.h: Add two most const.
diff --git a/src/ar.c b/src/ar.c
index 2d11b1ef..9be0649f 100644
--- a/src/ar.c
+++ b/src/ar.c
@@ -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)
{