2
* Portable xxxat() functions.
4
* Copyright (C) 2010 Karel Zak <kzak@redhat.com>
13
int fstat_at(int dir, const char *dirname, const char *filename,
14
struct stat *st, int nofollow)
17
return fstatat(dir, filename, st,
18
nofollow ? AT_SYMLINK_NOFOLLOW : 0);
23
len = snprintf(path, sizeof(path), "%s/%s", dirname, filename);
24
if (len < 0 || len + 1 > sizeof(path))
27
return nofollow ? lstat(path, st) : stat(path, st);
31
int open_at(int dir, const char *dirname, const char *filename, int flags)
34
return openat(dir, filename, flags);
39
len = snprintf(path, sizeof(path), "%s/%s", dirname, filename);
40
if (len < 0 || len + 1 > sizeof(path))
43
return open(path, flags);
47
FILE *fopen_at(int dir, const char *dirname, const char *filename, int flags,
50
int fd = open_at(dir, dirname, filename, flags);
55
return fdopen(fd, mode);
61
#include <sys/types.h>
65
int main(int argc, char *argv[])
72
fprintf(stderr, "usage: %s <directory>\n", argv[0]);
77
dir = opendir(dirname);
79
err(EXIT_FAILURE, "%s: open failed", dirname);
81
while ((d = readdir(dir))) {
85
printf("%32s ", d->d_name);
87
if (fstat_at(dirfd(dir), dirname, d->d_name, &st, 0) == 0)
88
printf("%16jd bytes ", st.st_size);
90
printf("%16s bytes ", "???");
92
f = fopen_at(dirfd(dir), dirname, d->d_name, O_RDONLY, "r");
93
printf(" %s\n", f ? "OK" : strerror(errno));