summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimo Teras <timo.teras@iki.fi>2009-08-05 13:13:52 +0300
committerTimo Teras <timo.teras@iki.fi>2009-08-05 13:13:52 +0300
commit46e93295688385af6b4b5d17f97675087a90aba4 (patch)
tree4af28531ab57f08a5ba58841fa9d385a93cdb3ab
parent856181a0325d39e7d26566f118bc4219e3837a4b (diff)
downloadapk-tools-46e93295688385af6b4b5d17f97675087a90aba4.tar.bz2
apk-tools-46e93295688385af6b4b5d17f97675087a90aba4.tar.xz
io: flag for following symlinks on fstat
usually we are interested on the actual file's length. but audit is interested about the link. so add a flag for this and use it in audit.
-rw-r--r--src/apk_io.h4
-rw-r--r--src/audit.c4
-rw-r--r--src/io.c8
3 files changed, 11 insertions, 5 deletions
diff --git a/src/apk_io.h b/src/apk_io.h
index 759bec4..53b91b3 100644
--- a/src/apk_io.h
+++ b/src/apk_io.h
@@ -88,7 +88,9 @@ size_t apk_ostream_write_string(struct apk_ostream *ostream, const char *string)
apk_blob_t apk_blob_from_istream(struct apk_istream *istream, size_t size);
apk_blob_t apk_blob_from_file(int atfd, const char *file);
-int apk_file_get_info(int atfd, const char *filename, int checksum,
+#define APK_FI_NOFOLLOW 0x80000000
+
+int apk_file_get_info(int atfd, const char *filename, unsigned int flags,
struct apk_file_info *fi);
int apk_url_download(const char *url, int atfd, const char *file);
const char *apk_url_local_file(const char *url);
diff --git a/src/audit.c b/src/audit.c
index a7cf2f6..d61b321 100644
--- a/src/audit.c
+++ b/src/audit.c
@@ -27,7 +27,7 @@ static int audit_file(struct apk_database *db, struct apk_db_file *dbf,
{
struct apk_file_info fi;
- if (apk_file_get_info(db->root_fd, name, dbf->csum.type, &fi) != 0)
+ if (apk_file_get_info(db->root_fd, name, APK_FI_NOFOLLOW | dbf->csum.type, &fi) != 0)
return 1;
if (dbf->csum.type != APK_CHECKSUM_NONE &&
@@ -62,7 +62,7 @@ static int audit_directory(apk_hash_item item, void *ctx)
snprintf(tmp, sizeof(tmp), "%s/%s", dbd->name, de->d_name);
- if (apk_file_get_info(db->root_fd, tmp, APK_CHECKSUM_NONE, &fi) < 0)
+ if (apk_file_get_info(db->root_fd, tmp, APK_FI_NOFOLLOW, &fi) < 0)
continue;
if ((dbd->flags & APK_DBDIRF_SYMLINKS_ONLY) &&
diff --git a/src/io.c b/src/io.c
index a6cdd4d..50da3da 100644
--- a/src/io.c
+++ b/src/io.c
@@ -463,13 +463,17 @@ err_fd:
return APK_BLOB_NULL;
}
-int apk_file_get_info(int atfd, const char *filename, int checksum,
+int apk_file_get_info(int atfd, const char *filename, unsigned int flags,
struct apk_file_info *fi)
{
struct stat64 st;
struct apk_bstream *bs;
+ int checksum = flags & 0xffff, atflags = 0;
- if (fstatat64(atfd, filename, &st, AT_SYMLINK_NOFOLLOW) != 0)
+ if (flags & APK_FI_NOFOLLOW)
+ atflags |= AT_SYMLINK_NOFOLLOW;
+
+ if (fstatat64(atfd, filename, &st, atflags) != 0)
return -errno;
*fi = (struct apk_file_info) {