diff options
Diffstat (limited to 'pjdfstest.c')
-rw-r--r-- | pjdfstest.c | 543 |
1 files changed, 369 insertions, 174 deletions
diff --git a/pjdfstest.c b/pjdfstest.c index 046df490e4f7..dffaa2f5d517 100644 --- a/pjdfstest.c +++ b/pjdfstest.c @@ -26,14 +26,19 @@ * $FreeBSD$ */ +/* Needs to be first to twiddle appropriate system configuration/HAVE_* flags */ +#include "config.h" + #include <sys/param.h> -#include <sys/types.h> +#ifdef HAVE_SYS_ACL_H +#include <sys/acl.h> +#endif +#ifdef HAVE_SYS_MKDEV_H +#include <sys/mkdev.h> +#endif #include <sys/stat.h> #include <sys/socket.h> #include <sys/un.h> -#ifndef makedev -#include <sys/mkdev.h> -#endif #include <assert.h> #include <ctype.h> @@ -45,17 +50,14 @@ #include <string.h> #include <unistd.h> -#ifndef HAS_TRUNCATE64 -#define truncate64 truncate -#define ftruncate64 ftruncate +#ifdef __sun__ +#define _USE_STAT64 #endif -#ifndef HAS_STAT64 -#define stat64 stat -#define fstat64 fstat -#define lstat64 lstat -#endif -#ifdef HAS_FREEBSD_ACL -#include <sys/acl.h> + +#ifdef _USE_STAT64 +typedef struct stat64 stat_t; +#else +typedef struct stat stat_t; #endif #ifndef ALLPERMS @@ -64,69 +66,91 @@ enum action { ACTION_OPEN, +#ifdef HAVE_OPENAT ACTION_OPENAT, +#endif ACTION_CREATE, ACTION_UNLINK, +#ifdef HAVE_UNLINKAT ACTION_UNLINKAT, +#endif ACTION_MKDIR, +#ifdef HAVE_MKDIRAT ACTION_MKDIRAT, +#endif ACTION_RMDIR, ACTION_LINK, +#ifdef HAVE_LINKAT ACTION_LINKAT, +#endif ACTION_SYMLINK, +#ifdef HAVE_SYMLINKAT ACTION_SYMLINKAT, +#endif ACTION_RENAME, +#ifdef HAVE_RENAMEAT ACTION_RENAMEAT, +#endif ACTION_MKFIFO, +#ifdef HAVE_MKFIFOAT ACTION_MKFIFOAT, +#endif ACTION_MKNOD, ACTION_MKNODAT, ACTION_BIND, -#ifdef HAS_BINDAT +#ifdef HAVE_BINDAT ACTION_BINDAT, #endif ACTION_CONNECT, -#ifdef HAS_CONNECTAT +#ifdef HAVE_CONNECTAT ACTION_CONNECTAT, #endif ACTION_CHMOD, ACTION_FCHMOD, -#ifdef HAS_LCHMOD +#ifdef HAVE_LCHMOD ACTION_LCHMOD, #endif ACTION_FCHMODAT, ACTION_CHOWN, ACTION_FCHOWN, ACTION_LCHOWN, +#ifdef HAVE_FCHOWNAT ACTION_FCHOWNAT, -#ifdef HAS_CHFLAGS +#endif +#ifdef HAVE_CHFLAGS ACTION_CHFLAGS, #endif -#ifdef HAS_FCHFLAGS +#ifdef HAVE_FCHFLAGS ACTION_FCHFLAGS, #endif -#ifdef HAS_CHFLAGSAT +#ifdef HAVE_CHFLAGSAT ACTION_CHFLAGSAT, #endif -#ifdef HAS_LCHFLAGS +#ifdef HAVE_LCHFLAGS ACTION_LCHFLAGS, #endif ACTION_TRUNCATE, ACTION_FTRUNCATE, +#ifdef HAVE_POSIX_FALLOCATE + ACTION_POSIX_FALLOCATE, +#endif ACTION_STAT, ACTION_FSTAT, ACTION_LSTAT, ACTION_FSTATAT, ACTION_PATHCONF, ACTION_FPATHCONF, -#ifdef HAS_LPATHCONF +#ifdef HAVE_LPATHCONF ACTION_LPATHCONF, #endif -#ifdef HAS_FREEBSD_ACL +#ifdef HAS_NFSV4_ACL_SUPPORT ACTION_PREPENDACL, ACTION_READACL, #endif ACTION_WRITE, +#ifdef HAVE_UTIMENSAT + ACTION_UTIMENSAT, +#endif }; #define TYPE_NONE 0x0000 @@ -147,69 +171,104 @@ struct syscall_desc { static struct syscall_desc syscalls[] = { { "open", ACTION_OPEN, { TYPE_STRING, TYPE_STRING, TYPE_NUMBER | TYPE_OPTIONAL, TYPE_NONE } }, +#ifdef HAVE_OPENAT { "openat", ACTION_OPENAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_NUMBER | TYPE_OPTIONAL, TYPE_NONE } }, +#endif { "create", ACTION_CREATE, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, { "unlink", ACTION_UNLINK, { TYPE_STRING, TYPE_NONE } }, +#ifdef HAVE_UNLINKAT { "unlinkat", ACTION_UNLINKAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_NONE } }, +#endif { "mkdir", ACTION_MKDIR, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, +#ifdef HAVE_MKDIRAT { "mkdirat", ACTION_MKDIRAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, +#endif { "rmdir", ACTION_RMDIR, { TYPE_STRING, TYPE_NONE } }, { "link", ACTION_LINK, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, +#ifdef HAVE_LINKAT { "linkat", ACTION_LINKAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_NONE } }, +#endif { "symlink", ACTION_SYMLINK, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, +#ifdef HAVE_SYMLINKAT { "symlinkat", ACTION_SYMLINKAT, { TYPE_STRING, TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } }, +#endif { "rename", ACTION_RENAME, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, +#ifdef HAVE_RENAMEAT { "renameat", ACTION_RENAMEAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } }, +#endif { "mkfifo", ACTION_MKFIFO, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, +#ifdef HAVE_MKFIFOAT { "mkfifoat", ACTION_MKFIFOAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, +#endif { "mknod", ACTION_MKNOD, { TYPE_STRING, TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE} }, +#ifdef HAVE_MKNODAT { "mknodat", ACTION_MKNODAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE} }, +#endif { "bind", ACTION_BIND, { TYPE_STRING, TYPE_NONE } }, -#ifdef HAS_BINDAT +#ifdef HAVE_BINDAT { "bindat", ACTION_BINDAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } }, #endif { "connect", ACTION_CONNECT, { TYPE_STRING, TYPE_NONE } }, -#ifdef HAS_CONNECTAT +#ifdef HAVE_CONNECTAT { "connectat", ACTION_CONNECTAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } }, #endif { "chmod", ACTION_CHMOD, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, { "fchmod", ACTION_FCHMOD, { TYPE_DESCRIPTOR, TYPE_NUMBER, TYPE_NONE } }, -#ifdef HAS_LCHMOD +#ifdef HAVE_LCHMOD { "lchmod", ACTION_LCHMOD, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, #endif +#ifdef HAVE_FCHMODAT { "fchmodat", ACTION_FCHMODAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NUMBER, TYPE_STRING, TYPE_NONE } }, +#endif { "chown", ACTION_CHOWN, { TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE } }, { "fchown", ACTION_FCHOWN, { TYPE_DESCRIPTOR, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE } }, { "lchown", ACTION_LCHOWN, { TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE } }, +#ifdef HAVE_FCHOWNAT { "fchownat", ACTION_FCHOWNAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_STRING, TYPE_NONE } }, -#ifdef HAS_CHFLAGS +#endif +#ifdef HAVE_CHFLAGS { "chflags", ACTION_CHFLAGS, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, #endif -#ifdef HAS_FCHFLAGS +#ifdef HAVE_FCHFLAGS { "fchflags", ACTION_FCHFLAGS, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } }, #endif -#ifdef HAS_CHFLAGSAT +#ifdef HAVE_CHFLAGSAT { "chflagsat", ACTION_CHFLAGSAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_NONE } }, #endif -#ifdef HAS_LCHFLAGS +#ifdef HAVE_LCHFLAGS { "lchflags", ACTION_LCHFLAGS, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, #endif { "truncate", ACTION_TRUNCATE, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, { "ftruncate", ACTION_FTRUNCATE, { TYPE_DESCRIPTOR, TYPE_NUMBER, TYPE_NONE } }, +#ifdef HAVE_POSIX_FALLOCATE + { "posix_fallocate", ACTION_POSIX_FALLOCATE, { TYPE_DESCRIPTOR, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE } }, +#endif { "stat", ACTION_STAT, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, { "fstat", ACTION_FSTAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } }, { "lstat", ACTION_LSTAT, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, +#ifdef HAVE_FSTATAT { "fstatat", ACTION_FSTATAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_NONE } }, +#endif { "pathconf", ACTION_PATHCONF, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, { "fpathconf", ACTION_FPATHCONF, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } }, -#ifdef HAS_LPATHCONF +#ifdef HAVE_LPATHCONF { "lpathconf", ACTION_LPATHCONF, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, #endif -#ifdef HAS_FREEBSD_ACL +#ifdef HAS_NFSV4_ACL_SUPPORT { "prependacl", ACTION_PREPENDACL, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, { "readacl", ACTION_READACL, { TYPE_STRING, TYPE_NONE } }, #endif { "write", ACTION_WRITE, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } }, +#ifdef HAVE_UTIMENSAT + { "utimensat", ACTION_UTIMENSAT, { + TYPE_DESCRIPTOR, /* Directory */ + TYPE_STRING, /* Relative path */ + TYPE_NUMBER, /* atime seconds */ + TYPE_STRING, /* atime nanoseconds */ + TYPE_NUMBER, /* mtime seconds */ + TYPE_STRING, /* mtime nanoseconds */ + TYPE_STRING, /* flags */}}, +#endif { NULL, -1, { TYPE_NONE } } }; @@ -219,122 +278,136 @@ struct flag { }; static struct flag open_flags[] = { -#ifdef O_RDONLY +#ifdef O_RDONLY { O_RDONLY, "O_RDONLY" }, #endif -#ifdef O_WRONLY +#ifdef O_WRONLY { O_WRONLY, "O_WRONLY" }, #endif -#ifdef O_RDWR +#ifdef O_RDWR { O_RDWR, "O_RDWR" }, #endif -#ifdef O_NONBLOCK +#ifdef O_NONBLOCK { O_NONBLOCK, "O_NONBLOCK" }, #endif -#ifdef O_APPEND +#ifdef O_APPEND { O_APPEND, "O_APPEND" }, #endif -#ifdef O_CREAT +#ifdef O_CREAT { O_CREAT, "O_CREAT" }, #endif -#ifdef O_TRUNC +#ifdef O_TRUNC { O_TRUNC, "O_TRUNC" }, #endif -#ifdef O_EXCL +#ifdef O_EXCL { O_EXCL, "O_EXCL" }, #endif -#ifdef O_SHLOCK +#ifdef O_SHLOCK { O_SHLOCK, "O_SHLOCK" }, #endif -#ifdef O_EXLOCK +#ifdef O_EXLOCK { O_EXLOCK, "O_EXLOCK" }, #endif -#ifdef O_DIRECT +#ifdef O_DIRECT { O_DIRECT, "O_DIRECT" }, #endif -#ifdef O_FSYNC +#ifdef O_FSYNC { O_FSYNC, "O_FSYNC" }, #endif -#ifdef O_SYNC +#ifdef O_SYNC { O_SYNC, "O_SYNC" }, #endif -#ifdef O_NOFOLLOW +#ifdef O_NOFOLLOW { O_NOFOLLOW, "O_NOFOLLOW" }, #endif -#ifdef O_NOCTTY +#ifdef O_NOCTTY { O_NOCTTY, "O_NOCTTY" }, #endif -#ifdef O_DIRECTORY +#ifdef O_DIRECTORY { O_DIRECTORY, "O_DIRECTORY" }, #endif { 0, NULL } }; -#ifdef HAS_CHFLAGS +#ifdef HAVE_CHFLAGS static struct flag chflags_flags[] = { -#ifdef UF_NODUMP +#ifdef UF_NODUMP { UF_NODUMP, "UF_NODUMP" }, #endif -#ifdef UF_IMMUTABLE +#ifdef UF_IMMUTABLE { UF_IMMUTABLE, "UF_IMMUTABLE" }, #endif -#ifdef UF_APPEND +#ifdef UF_APPEND { UF_APPEND, "UF_APPEND" }, #endif -#ifdef UF_NOUNLINK +#ifdef UF_NOUNLINK { UF_NOUNLINK, "UF_NOUNLINK" }, #endif -#ifdef UF_OPAQUE +#ifdef UF_OPAQUE { UF_OPAQUE, "UF_OPAQUE" }, #endif -#ifdef SF_ARCHIVED +#ifdef SF_ARCHIVED { SF_ARCHIVED, "SF_ARCHIVED" }, #endif -#ifdef SF_IMMUTABLE +#ifdef SF_IMMUTABLE { SF_IMMUTABLE, "SF_IMMUTABLE" }, #endif -#ifdef SF_APPEND +#ifdef SF_APPEND { SF_APPEND, "SF_APPEND" }, #endif -#ifdef SF_NOUNLINK +#ifdef SF_NOUNLINK { SF_NOUNLINK, "SF_NOUNLINK" }, #endif -#ifdef SF_SNAPSHOT +#ifdef SF_SNAPSHOT { SF_SNAPSHOT, "SF_SNAPSHOT" }, #endif { 0, NULL } }; #endif +#ifdef HAVE_UNLINKAT static struct flag unlinkat_flags[] = { { AT_REMOVEDIR, "AT_REMOVEDIR" }, { 0, NULL } }; +#endif +#ifdef HAVE_LINKAT static struct flag linkat_flags[] = { +#ifdef AT_SYMLINK_FOLLOW { AT_SYMLINK_FOLLOW, "AT_SYMLINK_FOLLOW" }, +#endif { 0, NULL } }; +#endif +#ifdef HAVE_CHFLAGSAT static struct flag chflagsat_flags[] = { { AT_SYMLINK_NOFOLLOW, "AT_SYMLINK_NOFOLLOW" }, { 0, NULL } }; +#endif +#ifdef HAVE_FCHMODAT static struct flag fchmodat_flags[] = { { AT_SYMLINK_NOFOLLOW, "AT_SYMLINK_NOFOLLOW" }, { 0, NULL } }; +#endif +#ifdef HAVE_FCHOWNAT static struct flag fchownat_flags[] = { { AT_SYMLINK_NOFOLLOW, "AT_SYMLINK_NOFOLLOW" }, { 0, NULL } }; +#endif +#ifdef HAVE_FSTATAT static struct flag fstatat_flags[] = { { AT_SYMLINK_NOFOLLOW, "AT_SYMLINK_NOFOLLOW" }, { 0, NULL } }; +#endif struct name { int n_name; @@ -342,16 +415,16 @@ struct name { }; static struct name pathconf_names[] = { -#ifdef _PC_LINK_MAX +#ifdef _PC_LINK_MAX { _PC_LINK_MAX, "_PC_LINK_MAX" }, #endif -#ifdef _PC_NAME_MAX +#ifdef _PC_NAME_MAX { _PC_NAME_MAX, "_PC_NAME_MAX" }, #endif -#ifdef _PC_PATH_MAX +#ifdef _PC_PATH_MAX { _PC_PATH_MAX, "_PC_PATH_MAX" }, #endif -#ifdef _PC_SYMLINK_MAX +#ifdef _PC_SYMLINK_MAX { _PC_SYMLINK_MAX, "_PC_SYMLINK_MAX" }, #endif { 0, NULL } @@ -394,7 +467,7 @@ str2flags(struct flag *tflags, char *sflags) return (flags); } -#ifdef HAS_CHFLAGS +#ifdef HAVE_CHFLAGS static char * flags2str(struct flag *tflags, long long flags) { @@ -440,7 +513,7 @@ find_syscall(const char *name) } static void -show_stat(struct stat64 *sp, const char *what) +show_stat(stat_t *sp, const char *what) { if (strcmp(what, "mode") == 0) @@ -459,11 +532,51 @@ show_stat(struct stat64 *sp, const char *what) printf("%lld", (long long)sp->st_blocks); else if (strcmp(what, "atime") == 0) printf("%lld", (long long)sp->st_atime); - else if (strcmp(what, "mtime") == 0) - printf("%lld", (long long)sp->st_mtime); +#if defined(HAVE_STRUCT_STAT_ST_ATIM) || \ + defined(HAVE_STRUCT_STAT_ST_ATIMESPEC) + else if (strcmp(what, "atime_ns") == 0) +#ifdef HAVE_STRUCT_STAT_ST_ATIMESPEC + printf("%lld", (long long)sp->st_atimespec.tv_nsec); +#else + printf("%lld", (long long)sp->st_atim.tv_nsec); +#endif +#endif /* st_atim* */ else if (strcmp(what, "ctime") == 0) printf("%lld", (long long)sp->st_ctime); -#ifdef HAS_CHFLAGS +#if defined(HAVE_STRUCT_STAT_ST_CTIM) || \ + defined(HAVE_STRUCT_STAT_ST_CTIMESPEC) + else if (strcmp(what, "ctime_ns") == 0) +#ifdef HAVE_STRUCT_STAT_ST_CTIMESPEC + printf("%lld", (long long)sp->st_ctimespec.tv_nsec); +#else + printf("%lld", (long long)sp->st_ctim.tv_nsec); +#endif +#endif /* st_ctim* */ + else if (strcmp(what, "mtime") == 0) + printf("%lld", (long long)sp->st_mtime); + else if (strcmp(what, "mtime_ns") == 0) +#if defined(HAVE_STRUCT_STAT_ST_MTIM) || \ + defined(HAVE_STRUCT_STAT_ST_MTIMESPEC) +#ifdef HAVE_STRUCT_STAT_ST_MTIMESPEC + printf("%lld", (long long)sp->st_mtimespec.tv_nsec); +#else + printf("%lld", (long long)sp->st_mtim.tv_nsec); +#endif +#endif /* st_mtim* */ +#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME + else if (strcmp(what, "birthtime") == 0) + printf("%lld", (long long)sp->st_birthtime); +#endif /* st_birthtime */ +#if defined(HAVE_STRUCT_STAT_ST_BIRTHTIM) || \ + defined(HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC) + else if (strcmp(what, "birthtime_ns") == 0) +#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC + printf("%lld", (long long)sp->st_birthtimespec.tv_nsec); +#else + printf("%lld", (long long)sp->st_birthtim.tv_nsec); +#endif +#endif /* st_birthtim{,espec} */ +#ifdef HAVE_CHFLAGS else if (strcmp(what, "flags") == 0) printf("%s", flags2str(chflags_flags, (long long)sp->st_flags)); #endif @@ -504,7 +617,7 @@ show_stat(struct stat64 *sp, const char *what) } static void -show_stats(struct stat64 *sp, char *what) +show_stats(stat_t *sp, char *what) { const char *s = ""; char *w; @@ -547,7 +660,11 @@ descriptor_get(int pos) static unsigned int call_syscall(struct syscall_desc *scall, char *argv[]) { - struct stat64 sb; + stat_t sb; +#ifdef HAVE_UTIMENSAT + struct timespec times[2]; + int flag; +#endif long long flags; unsigned int i; char *endp; @@ -556,7 +673,7 @@ call_syscall(struct syscall_desc *scall, char *argv[]) char *str; long long num; } args[MAX_ARGS]; -#ifdef HAS_FREEBSD_ACL +#ifdef HAS_NFSV4_ACL_SUPPORT int entry_id = ACL_FIRST_ENTRY; acl_t acl, newacl; acl_entry_t entry, newentry; @@ -645,6 +762,7 @@ call_syscall(struct syscall_desc *scall, char *argv[]) if (rval >= 0) descriptor_add(rval); break; +#ifdef HAVE_OPENAT case ACTION_OPENAT: flags = str2flags(open_flags, STR(2)); if (flags & O_CREAT) { @@ -664,6 +782,7 @@ call_syscall(struct syscall_desc *scall, char *argv[]) if (rval >= 0) descriptor_add(rval); break; +#endif case ACTION_CREATE: rval = open(STR(0), O_CREAT | O_EXCL, (mode_t)NUM(1)); if (rval >= 0) @@ -672,46 +791,60 @@ call_syscall(struct syscall_desc *scall, char *argv[]) case ACTION_UNLINK: rval = unlink(STR(0)); break; +#ifdef HAVE_UNLINKAT case ACTION_UNLINKAT: rval = unlinkat(NUM(0), STR(1), (int)str2flags(unlinkat_flags, STR(2))); break; +#endif case ACTION_MKDIR: rval = mkdir(STR(0), (mode_t)NUM(1)); break; +#ifdef HAVE_MKDIRAT case ACTION_MKDIRAT: rval = mkdirat(NUM(0), STR(1), (mode_t)NUM(2)); break; +#endif case ACTION_RMDIR: rval = rmdir(STR(0)); break; case ACTION_LINK: rval = link(STR(0), STR(1)); break; +#ifdef HAVE_LINKAT case ACTION_LINKAT: rval = linkat(NUM(0), STR(1), NUM(2), STR(3), (int)str2flags(linkat_flags, STR(4))); break; +#endif case ACTION_SYMLINK: rval = symlink(STR(0), STR(1)); break; +#ifdef HAVE_SYMLINKAT case ACTION_SYMLINKAT: rval = symlinkat(STR(0), NUM(1), STR(2)); break; +#endif case ACTION_RENAME: rval = rename(STR(0), STR(1)); break; +#ifdef HAVE_RENAMEAT case ACTION_RENAMEAT: rval = renameat(NUM(0), STR(1), NUM(2), STR(3)); break; +#endif case ACTION_MKFIFO: rval = mkfifo(STR(0), (mode_t)NUM(1)); break; +#ifdef HAVE_MKFIFOAT case ACTION_MKFIFOAT: rval = mkfifoat(NUM(0), STR(1), (mode_t)NUM(2)); break; +#endif case ACTION_MKNOD: +#ifdef HAVE_MKNODAT case ACTION_MKNODAT: +#endif { mode_t ntype; dev_t dev; @@ -721,9 +854,11 @@ call_syscall(struct syscall_desc *scall, char *argv[]) case ACTION_MKNOD: fa = 0; break; +#ifdef HAVE_MKNODAT case ACTION_MKNODAT: fa = 1; break; +#endif default: abort(); } @@ -747,9 +882,11 @@ call_syscall(struct syscall_desc *scall, char *argv[]) case ACTION_MKNOD: rval = mknod(STR(0), ntype | NUM(2), dev); break; +#ifdef HAVE_MKNODAT case ACTION_MKNODAT: rval = mknodat(NUM(0), STR(1), ntype | NUM(3), dev); break; +#endif default: abort(); } @@ -768,7 +905,7 @@ call_syscall(struct syscall_desc *scall, char *argv[]) rval = bind(rval, (struct sockaddr *)&sunx, sizeof(sunx)); break; } -#ifdef HAS_BINDAT +#ifdef HAVE_BINDAT case ACTION_BINDAT: { struct sockaddr_un sunx; @@ -797,7 +934,7 @@ call_syscall(struct syscall_desc *scall, char *argv[]) rval = connect(rval, (struct sockaddr *)&sunx, sizeof(sunx)); break; } -#ifdef HAS_CONNECTAT +#ifdef HAVE_CONNECTAT case ACTION_CONNECTAT: { struct sockaddr_un sunx; @@ -819,15 +956,17 @@ call_syscall(struct syscall_desc *scall, char *argv[]) case ACTION_FCHMOD: rval = fchmod(NUM(0), (mode_t)NUM(1)); break; -#ifdef HAS_LCHMOD +#ifdef HAVE_LCHMOD case ACTION_LCHMOD: rval = lchmod(STR(0), (mode_t)NUM(1)); break; #endif +#ifdef HAVE_FCHMODAT case ACTION_FCHMODAT: rval = fchmodat(NUM(0), STR(1), (mode_t)NUM(2), str2flags(fchmodat_flags, STR(3))); break; +#endif case ACTION_CHOWN: rval = chown(STR(0), (uid_t)NUM(1), (gid_t)NUM(2)); break; @@ -837,62 +976,94 @@ call_syscall(struct syscall_desc *scall, char *argv[]) case ACTION_LCHOWN: rval = lchown(STR(0), (uid_t)NUM(1), (gid_t)NUM(2)); break; +#ifdef HAVE_FCHOWNAT case ACTION_FCHOWNAT: rval = fchownat(NUM(0), STR(1), (uid_t)NUM(2), (gid_t)NUM(3), (int)str2flags(fchownat_flags, STR(4))); break; -#ifdef HAS_CHFLAGS +#endif +#ifdef HAVE_CHFLAGS case ACTION_CHFLAGS: rval = chflags(STR(0), (unsigned long)str2flags(chflags_flags, STR(1))); break; #endif -#ifdef HAS_FCHFLAGS +#ifdef HAVE_FCHFLAGS case ACTION_FCHFLAGS: rval = fchflags(NUM(0), (unsigned long)str2flags(chflags_flags, STR(1))); break; #endif -#ifdef HAS_CHFLAGSAT +#ifdef HAVE_CHFLAGSAT case ACTION_CHFLAGSAT: rval = chflagsat(NUM(0), STR(1), (unsigned long)str2flags(chflags_flags, STR(2)), (int)str2flags(chflagsat_flags, STR(3))); break; #endif -#ifdef HAS_LCHFLAGS +#ifdef HAVE_LCHFLAGS case ACTION_LCHFLAGS: rval = lchflags(STR(0), (unsigned long)str2flags(chflags_flags, STR(1))); break; #endif case ACTION_TRUNCATE: +#ifdef _USE_STAT64 rval = truncate64(STR(0), NUM(1)); +#else + rval = truncate(STR(0), NUM(1)); +#endif break; case ACTION_FTRUNCATE: +#ifdef _USE_STAT64 rval = ftruncate64(NUM(0), NUM(1)); +#else + rval = ftruncate(NUM(0), NUM(1)); +#endif break; +#ifdef HAVE_POSIX_FALLOCATE + case ACTION_POSIX_FALLOCATE: + rval = posix_fallocate(NUM(0), NUM(1), NUM(2)); + if (rval != 0) { + errno = rval; + rval = -1; + } + break; +#endif case ACTION_STAT: +#ifdef _USE_STAT64 rval = stat64(STR(0), &sb); +#else + rval = stat(STR(0), &sb); +#endif if (rval == 0) { show_stats(&sb, STR(1)); return (i); } break; case ACTION_FSTAT: +#ifdef _USE_STAT64 rval = fstat64(NUM(0), &sb); +#else + rval = fstat(NUM(0), &sb); +#endif if (rval == 0) { show_stats(&sb, STR(1)); return (i); } break; case ACTION_LSTAT: +#ifdef _USE_STAT64 rval = lstat64(STR(0), &sb); +#else + rval = lstat(STR(0), &sb); +#endif if (rval == 0) { show_stats(&sb, STR(1)); return (i); } break; +#ifdef HAVE_FSTATAT case ACTION_FSTATAT: rval = fstatat(NUM(0), STR(1), &sb, (int)str2flags(fstatat_flags, STR(2))); @@ -901,9 +1072,10 @@ call_syscall(struct syscall_desc *scall, char *argv[]) return (i); } break; +#endif case ACTION_PATHCONF: case ACTION_FPATHCONF: -#ifdef HAS_LPATHCONF +#ifdef HAVE_LPATHCONF case ACTION_LPATHCONF: #endif { @@ -922,7 +1094,7 @@ call_syscall(struct syscall_desc *scall, char *argv[]) case ACTION_FPATHCONF: lrval = fpathconf(NUM(0), name); break; -#ifdef HAS_LPATHCONF +#ifdef HAVE_LPATHCONF case ACTION_LPATHCONF: lrval = lpathconf(STR(0), name); break; @@ -940,7 +1112,7 @@ call_syscall(struct syscall_desc *scall, char *argv[]) rval = -1; break; } -#ifdef HAS_FREEBSD_ACL +#ifdef HAS_NFSV4_ACL_SUPPORT case ACTION_PREPENDACL: rval = -1; @@ -975,6 +1147,29 @@ call_syscall(struct syscall_desc *scall, char *argv[]) case ACTION_WRITE: rval = write(NUM(0), STR(1), strlen(STR(1))); break; +#ifdef HAVE_UTIMENSAT + case ACTION_UTIMENSAT: + times[0].tv_sec = NUM(2); + if (strcmp(STR(3), "UTIME_NOW") == 0) + times[0].tv_nsec = UTIME_NOW; + else if (strcmp(STR(3), "UTIME_OMIT") == 0) + times[0].tv_nsec = UTIME_OMIT; + else + times[0].tv_nsec = strtol(STR(3), NULL, 10); + times[1].tv_sec = NUM(4); + if (strcmp(STR(5), "UTIME_NOW") == 0) + times[1].tv_nsec = UTIME_NOW; + else if (strcmp(STR(5), "UTIME_OMIT") == 0) + times[1].tv_nsec = UTIME_OMIT; + else + times[1].tv_nsec = strtol(STR(5), NULL, 10); + if (strcmp(STR(6), "AT_SYMLINK_NOFOLLOW") == 0) + flag = AT_SYMLINK_NOFOLLOW; + else + flag = strtol(STR(6), NULL, 10); + rval = utimensat(NUM(0), STR(1), times, flag); + break; +#endif default: fprintf(stderr, "unsupported syscall\n"); exit(1); @@ -1007,7 +1202,7 @@ set_gids(char *gids) assert(gidset != NULL); for (i = 0, g = strtok(gids, ","); g != NULL; g = strtok(NULL, ","), i++) { - if (i >= ngroups) { + if ((long)i >= ngroups) { fprintf(stderr, "too many gids\n"); exit(1); } @@ -1118,371 +1313,371 @@ err2str(int error) static char errnum[8]; switch (error) { -#ifdef EPERM +#ifdef EPERM case EPERM: return ("EPERM"); #endif -#ifdef ENOENT +#ifdef ENOENT case ENOENT: return ("ENOENT"); #endif -#ifdef ESRCH +#ifdef ESRCH case ESRCH: return ("ESRCH"); #endif -#ifdef EINTR +#ifdef EINTR case EINTR: return ("EINTR"); #endif -#ifdef EIO +#ifdef EIO case EIO: return ("EIO"); #endif -#ifdef ENXIO +#ifdef ENXIO case ENXIO: return ("ENXIO"); #endif -#ifdef E2BIG +#ifdef E2BIG case E2BIG: return ("E2BIG"); #endif -#ifdef ENOEXEC +#ifdef ENOEXEC case ENOEXEC: return ("ENOEXEC"); #endif -#ifdef EBADF +#ifdef EBADF case EBADF: return ("EBADF"); #endif -#ifdef ECHILD +#ifdef ECHILD case ECHILD: return ("ECHILD"); #endif -#ifdef EDEADLK +#ifdef EDEADLK case EDEADLK: return ("EDEADLK"); #endif -#ifdef ENOMEM +#ifdef ENOMEM case ENOMEM: return ("ENOMEM"); #endif -#ifdef EACCES +#ifdef EACCES case EACCES: return ("EACCES"); #endif -#ifdef EFAULT +#ifdef EFAULT case EFAULT: return ("EFAULT"); #endif -#ifdef ENOTBLK +#ifdef ENOTBLK case ENOTBLK: return ("ENOTBLK"); #endif -#ifdef EBUSY +#ifdef EBUSY case EBUSY: return ("EBUSY"); #endif -#ifdef EEXIST +#ifdef EEXIST case EEXIST: return ("EEXIST"); #endif -#ifdef EXDEV +#ifdef EXDEV case EXDEV: return ("EXDEV"); #endif -#ifdef ENODEV +#ifdef ENODEV case ENODEV: return ("ENODEV"); #endif -#ifdef ENOTDIR +#ifdef ENOTDIR case ENOTDIR: return ("ENOTDIR"); #endif -#ifdef EISDIR +#ifdef EISDIR case EISDIR: return ("EISDIR"); #endif -#ifdef EINVAL +#ifdef EINVAL case EINVAL: return ("EINVAL"); #endif -#ifdef ENFILE +#ifdef ENFILE case ENFILE: return ("ENFILE"); #endif -#ifdef EMFILE +#ifdef EMFILE case EMFILE: return ("EMFILE"); #endif -#ifdef ENOTTY +#ifdef ENOTTY case ENOTTY: return ("ENOTTY"); #endif -#ifdef ETXTBSY +#ifdef ETXTBSY case ETXTBSY: return ("ETXTBSY"); #endif -#ifdef EFBIG +#ifdef EFBIG case EFBIG: return ("EFBIG"); #endif -#ifdef ENOSPC +#ifdef ENOSPC case ENOSPC: return ("ENOSPC"); #endif -#ifdef ESPIPE +#ifdef ESPIPE case ESPIPE: return ("ESPIPE"); #endif -#ifdef EROFS +#ifdef EROFS case EROFS: return ("EROFS"); #endif -#ifdef EMLINK +#ifdef EMLINK case EMLINK: return ("EMLINK"); #endif -#ifdef EPIPE +#ifdef EPIPE case EPIPE: return ("EPIPE"); #endif -#ifdef EDOM +#ifdef EDOM case EDOM: return ("EDOM"); #endif -#ifdef ERANGE +#ifdef ERANGE case ERANGE: return ("ERANGE"); #endif -#ifdef EAGAIN +#ifdef EAGAIN case EAGAIN: return ("EAGAIN"); #endif -#ifdef EINPROGRESS +#ifdef EINPROGRESS case EINPROGRESS: return ("EINPROGRESS"); #endif -#ifdef EALREADY +#ifdef EALREADY case EALREADY: return ("EALREADY"); #endif -#ifdef ENOTSOCK +#ifdef ENOTSOCK case ENOTSOCK: return ("ENOTSOCK"); #endif -#ifdef EDESTADDRREQ +#ifdef EDESTADDRREQ case EDESTADDRREQ: return ("EDESTADDRREQ"); #endif -#ifdef EMSGSIZE +#ifdef EMSGSIZE case EMSGSIZE: return ("EMSGSIZE"); #endif -#ifdef EPROTOTYPE +#ifdef EPROTOTYPE case EPROTOTYPE: return ("EPROTOTYPE"); #endif -#ifdef ENOPROTOOPT +#ifdef ENOPROTOOPT case ENOPROTOOPT: return ("ENOPROTOOPT"); #endif -#ifdef EPROTONOSUPPORT +#ifdef EPROTONOSUPPORT case EPROTONOSUPPORT: return ("EPROTONOSUPPORT"); #endif -#ifdef ESOCKTNOSUPPORT +#ifdef ESOCKTNOSUPPORT case ESOCKTNOSUPPORT: return ("ESOCKTNOSUPPORT"); #endif -#ifdef EOPNOTSUPP +#ifdef EOPNOTSUPP case EOPNOTSUPP: return ("EOPNOTSUPP"); #endif -#ifdef EPFNOSUPPORT +#ifdef EPFNOSUPPORT case EPFNOSUPPORT: return ("EPFNOSUPPORT"); #endif -#ifdef EAFNOSUPPORT +#ifdef EAFNOSUPPORT case EAFNOSUPPORT: return ("EAFNOSUPPORT"); #endif -#ifdef EADDRINUSE +#ifdef EADDRINUSE case EADDRINUSE: return ("EADDRINUSE"); #endif -#ifdef EADDRNOTAVAIL +#ifdef EADDRNOTAVAIL case EADDRNOTAVAIL: return ("EADDRNOTAVAIL"); #endif -#ifdef ENETDOWN +#ifdef ENETDOWN case ENETDOWN: return ("ENETDOWN"); #endif -#ifdef ENETUNREACH +#ifdef ENETUNREACH case ENETUNREACH: return ("ENETUNREACH"); #endif -#ifdef ENETRESET +#ifdef ENETRESET case ENETRESET: return ("ENETRESET"); #endif -#ifdef ECONNABORTED +#ifdef ECONNABORTED case ECONNABORTED: return ("ECONNABORTED"); #endif -#ifdef ECONNRESET +#ifdef ECONNRESET case ECONNRESET: return ("ECONNRESET"); #endif -#ifdef ENOBUFS +#ifdef ENOBUFS case ENOBUFS: return ("ENOBUFS"); #endif -#ifdef EISCONN +#ifdef EISCONN case EISCONN: return ("EISCONN"); #endif -#ifdef ENOTCONN +#ifdef ENOTCONN case ENOTCONN: return ("ENOTCONN"); #endif -#ifdef ESHUTDOWN +#ifdef ESHUTDOWN case ESHUTDOWN: return ("ESHUTDOWN"); #endif -#ifdef ETOOMANYREFS +#ifdef ETOOMANYREFS case ETOOMANYREFS: return ("ETOOMANYREFS"); #endif -#ifdef ETIMEDOUT +#ifdef ETIMEDOUT case ETIMEDOUT: return ("ETIMEDOUT"); #endif -#ifdef ECONNREFUSED +#ifdef ECONNREFUSED case ECONNREFUSED: return ("ECONNREFUSED"); #endif -#ifdef ELOOP +#ifdef ELOOP case ELOOP: return ("ELOOP"); #endif -#ifdef ENAMETOOLONG +#ifdef ENAMETOOLONG case ENAMETOOLONG: return ("ENAMETOOLONG"); #endif -#ifdef EHOSTDOWN +#ifdef EHOSTDOWN case EHOSTDOWN: return ("EHOSTDOWN"); #endif -#ifdef EHOSTUNREACH +#ifdef EHOSTUNREACH case EHOSTUNREACH: return ("EHOSTUNREACH"); #endif -#ifdef ENOTEMPTY +#ifdef ENOTEMPTY case ENOTEMPTY: return ("ENOTEMPTY"); #endif -#ifdef EPROCLIM +#ifdef EPROCLIM case EPROCLIM: return ("EPROCLIM"); #endif -#ifdef EUSERS +#ifdef EUSERS case EUSERS: return ("EUSERS"); #endif -#ifdef EDQUOT +#ifdef EDQUOT case EDQUOT: return ("EDQUOT"); #endif -#ifdef ESTALE +#ifdef ESTALE case ESTALE: return ("ESTALE"); #endif -#ifdef EREMOTE +#ifdef EREMOTE case EREMOTE: return ("EREMOTE"); #endif -#ifdef EBADRPC +#ifdef EBADRPC case EBADRPC: return ("EBADRPC"); #endif -#ifdef ERPCMISMATCH +#ifdef ERPCMISMATCH case ERPCMISMATCH: return ("ERPCMISMATCH"); #endif -#ifdef EPROGUNAVAIL +#ifdef EPROGUNAVAIL case EPROGUNAVAIL: return ("EPROGUNAVAIL"); #endif -#ifdef EPROGMISMATCH +#ifdef EPROGMISMATCH case EPROGMISMATCH: return ("EPROGMISMATCH"); #endif -#ifdef EPROCUNAVAIL +#ifdef EPROCUNAVAIL case EPROCUNAVAIL: return ("EPROCUNAVAIL"); #endif -#ifdef ENOLCK +#ifdef ENOLCK case ENOLCK: return ("ENOLCK"); #endif -#ifdef ENOSYS +#ifdef ENOSYS case ENOSYS: return ("ENOSYS"); #endif -#ifdef EFTYPE +#ifdef EFTYPE case EFTYPE: return ("EFTYPE"); #endif -#ifdef EAUTH +#ifdef EAUTH case EAUTH: return ("EAUTH"); #endif -#ifdef ENEEDAUTH +#ifdef ENEEDAUTH case ENEEDAUTH: return ("ENEEDAUTH"); #endif -#ifdef EIDRM +#ifdef EIDRM case EIDRM: return ("EIDRM"); #endif -#ifdef ENOMSG +#ifdef ENOMSG case ENOMSG: return ("ENOMSG"); #endif -#ifdef EOVERFLOW +#ifdef EOVERFLOW case EOVERFLOW: return ("EOVERFLOW"); #endif -#ifdef ECANCELED +#ifdef ECANCELED case ECANCELED: return ("ECANCELED"); #endif -#ifdef EILSEQ +#ifdef EILSEQ case EILSEQ: return ("EILSEQ"); #endif -#ifdef ENOATTR +#ifdef ENOATTR case ENOATTR: return ("ENOATTR"); #endif -#ifdef EDOOFUS +#ifdef EDOOFUS case EDOOFUS: return ("EDOOFUS"); #endif -#ifdef EBADMSG +#ifdef EBADMSG case EBADMSG: return ("EBADMSG"); #endif -#ifdef EMULTIHOP +#ifdef EMULTIHOP case EMULTIHOP: return ("EMULTIHOP"); #endif -#ifdef ENOLINK +#ifdef ENOLINK case ENOLINK: return ("ENOLINK"); #endif -#ifdef EPROTO +#ifdef EPROTO case EPROTO: return ("EPROTO"); #endif |