]> git.wh0rd.org - patches.git/blame - scanelf-cache-stat.patch
more random patches. who knows.
[patches.git] / scanelf-cache-stat.patch
CommitLineData
b53d1f41
MF
1Index: scanelf.c
2===================================================================
3RCS file: /var/cvsroot/gentoo-projects/pax-utils/scanelf.c,v
4retrieving revision 1.159
5diff -u -p -r1.159 scanelf.c
6--- scanelf.c 29 Oct 2006 16:20:54 -0000 1.159
7+++ scanelf.c 28 Nov 2006 01:03:30 -0000
8@@ -29,7 +29,7 @@ static int file_matches_list(const char
9 static int scanelf_elfobj(elfobj *elf);
10 static int scanelf_elf(const char *filename, int fd, size_t len);
11 static int scanelf_archive(const char *filename, int fd, size_t len);
12-static void scanelf_file(const char *filename);
13+static void scanelf_file(const char *filename, const struct stat *st_cache);
14 static void scanelf_dir(const char *path);
15 static void scanelf_ldpath(void);
16 static void scanelf_envpath(void);
17@@ -1231,23 +1231,30 @@ static int scanelf_archive(const char *f
18 return 0;
19 }
20 /* scan a file which may be an elf or an archive or some other magical beast */
21-static void scanelf_file(const char *filename)
22+static void scanelf_file(const char *filename, const struct stat *st_cache)
23 {
24- struct stat st;
25+ const struct stat *st;
26+ struct stat my_st;
27 int fd;
28
29- /* make sure 'filename' exists */
30- if (lstat(filename, &st) == -1) {
31- if (be_verbose > 2) printf("%s: does not exist\n", filename);
32- return;
33- }
34+ /* use stat cache if we have one */
35+ if (!st_cache) {
36+ /* make sure 'filename' exists */
37+ if (lstat(filename, &my_st) == -1) {
38+ if (be_verbose > 2) printf("%s: does not exist\n", filename);
39+ return;
40+ }
41+ st = &my_st;
42+ } else
43+ st = st_cache;
44
45 /* always handle regular files and handle symlinked files if no -y */
46- if (S_ISLNK(st.st_mode)) {
47+ if (S_ISLNK(st->st_mode)) {
48 if (!scan_symlink) return;
49- stat(filename, &st);
50+ stat(filename, &my_st);
51+ st = &my_st;
52 }
53- if (!S_ISREG(st.st_mode)) {
54+ if (!S_ISREG(st->st_mode)) {
55 if (be_verbose > 2) printf("%s: skipping non-file\n", filename);
56 return;
57 }
58@@ -1255,9 +1262,9 @@ static void scanelf_file(const char *fil
59 if ((fd=open(filename, (fix_elf ? O_RDWR : O_RDONLY))) == -1)
60 return;
61
62- if (scanelf_elf(filename, fd, st.st_size) == 1 && scan_archives)
63+ if (scanelf_elf(filename, fd, st->st_size) == 1 && scan_archives)
64 /* if it isn't an ELF, maybe it's an .a archive */
65- scanelf_archive(filename, fd, st.st_size);
66+ scanelf_archive(filename, fd, st->st_size);
67
68 close(fd);
69 }
70@@ -1279,7 +1286,7 @@ static void scanelf_dir(const char *path
71
72 /* ok, if it isn't a directory, assume we can open it */
73 if (!S_ISDIR(st_top.st_mode)) {
74- scanelf_file(path);
75+ scanelf_file(path, &st_top);
76 return;
77 }
78
79@@ -1303,7 +1310,7 @@ static void scanelf_dir(const char *path
80 snprintf(buf, sizeof(buf), "%s%s%s", path, (path[pathlen-1] == '/') ? "" : "/", dentry->d_name);
81 if (lstat(buf, &st) != -1) {
82 if (S_ISREG(st.st_mode))
83- scanelf_file(buf);
84+ scanelf_file(buf, &st);
85 else if (dir_recurse && S_ISDIR(st.st_mode)) {
86 if (dir_crossmount || (st_top.st_dev == st.st_dev))
87 scanelf_dir(buf);