svn commit: r271294 - in vendor/pjdfstest: . dist dist/tests dist/tests/chflags dist/tests/chmod dist/tests/chown dist/tests/ftruncate dist/tests/granular dist/tests/link dist/tests/mkdir dist/test...
Garrett Cooper
ngie at FreeBSD.org
Tue Sep 9 02:50:11 UTC 2014
Author: ngie
Date: Tue Sep 9 02:50:09 2014
New Revision: 271294
URL: http://svnweb.freebsd.org/changeset/base/271294
Log:
Add vendor import for pjdfstest
This vendor import code was obtained from
https://github.com/pjd/pjdfstest/commit/abf03c3a47745d4521b0e4aa141317553ca48f91
Approved by: rpaulo (mentor)
Phabric: D743
Sponsored by: EMC / Isilon Storage Division
Added:
vendor/pjdfstest/
vendor/pjdfstest/dist/
vendor/pjdfstest/dist/LICENSE
vendor/pjdfstest/dist/Makefile (contents, props changed)
vendor/pjdfstest/dist/README
vendor/pjdfstest/dist/pjdfstest.c (contents, props changed)
vendor/pjdfstest/dist/tests/
vendor/pjdfstest/dist/tests/chflags/
vendor/pjdfstest/dist/tests/chflags/00.t
vendor/pjdfstest/dist/tests/chflags/01.t
vendor/pjdfstest/dist/tests/chflags/02.t
vendor/pjdfstest/dist/tests/chflags/03.t
vendor/pjdfstest/dist/tests/chflags/04.t
vendor/pjdfstest/dist/tests/chflags/05.t
vendor/pjdfstest/dist/tests/chflags/06.t
vendor/pjdfstest/dist/tests/chflags/07.t
vendor/pjdfstest/dist/tests/chflags/08.t
vendor/pjdfstest/dist/tests/chflags/09.t
vendor/pjdfstest/dist/tests/chflags/10.t
vendor/pjdfstest/dist/tests/chflags/11.t
vendor/pjdfstest/dist/tests/chflags/12.t
vendor/pjdfstest/dist/tests/chflags/13.t
vendor/pjdfstest/dist/tests/chmod/
vendor/pjdfstest/dist/tests/chmod/00.t
vendor/pjdfstest/dist/tests/chmod/01.t
vendor/pjdfstest/dist/tests/chmod/02.t
vendor/pjdfstest/dist/tests/chmod/03.t
vendor/pjdfstest/dist/tests/chmod/04.t
vendor/pjdfstest/dist/tests/chmod/05.t
vendor/pjdfstest/dist/tests/chmod/06.t
vendor/pjdfstest/dist/tests/chmod/07.t
vendor/pjdfstest/dist/tests/chmod/08.t
vendor/pjdfstest/dist/tests/chmod/09.t
vendor/pjdfstest/dist/tests/chmod/10.t
vendor/pjdfstest/dist/tests/chmod/11.t
vendor/pjdfstest/dist/tests/chmod/12.t
vendor/pjdfstest/dist/tests/chmod/foo (contents, props changed)
vendor/pjdfstest/dist/tests/chown/
vendor/pjdfstest/dist/tests/chown/00.t
vendor/pjdfstest/dist/tests/chown/01.t
vendor/pjdfstest/dist/tests/chown/02.t
vendor/pjdfstest/dist/tests/chown/03.t
vendor/pjdfstest/dist/tests/chown/04.t
vendor/pjdfstest/dist/tests/chown/05.t
vendor/pjdfstest/dist/tests/chown/06.t
vendor/pjdfstest/dist/tests/chown/07.t
vendor/pjdfstest/dist/tests/chown/08.t
vendor/pjdfstest/dist/tests/chown/09.t
vendor/pjdfstest/dist/tests/chown/10.t
vendor/pjdfstest/dist/tests/conf
vendor/pjdfstest/dist/tests/ftruncate/
vendor/pjdfstest/dist/tests/ftruncate/00.t
vendor/pjdfstest/dist/tests/ftruncate/01.t
vendor/pjdfstest/dist/tests/ftruncate/02.t
vendor/pjdfstest/dist/tests/ftruncate/03.t
vendor/pjdfstest/dist/tests/ftruncate/04.t
vendor/pjdfstest/dist/tests/ftruncate/05.t
vendor/pjdfstest/dist/tests/ftruncate/06.t
vendor/pjdfstest/dist/tests/ftruncate/07.t
vendor/pjdfstest/dist/tests/ftruncate/08.t
vendor/pjdfstest/dist/tests/ftruncate/09.t
vendor/pjdfstest/dist/tests/ftruncate/10.t
vendor/pjdfstest/dist/tests/ftruncate/11.t
vendor/pjdfstest/dist/tests/ftruncate/12.t
vendor/pjdfstest/dist/tests/ftruncate/13.t
vendor/pjdfstest/dist/tests/ftruncate/14.t
vendor/pjdfstest/dist/tests/granular/
vendor/pjdfstest/dist/tests/granular/00.t
vendor/pjdfstest/dist/tests/granular/01.t
vendor/pjdfstest/dist/tests/granular/02.t
vendor/pjdfstest/dist/tests/granular/03.t
vendor/pjdfstest/dist/tests/granular/04.t
vendor/pjdfstest/dist/tests/granular/05.t
vendor/pjdfstest/dist/tests/link/
vendor/pjdfstest/dist/tests/link/00.t
vendor/pjdfstest/dist/tests/link/01.t
vendor/pjdfstest/dist/tests/link/02.t
vendor/pjdfstest/dist/tests/link/03.t
vendor/pjdfstest/dist/tests/link/04.t
vendor/pjdfstest/dist/tests/link/05.t
vendor/pjdfstest/dist/tests/link/06.t
vendor/pjdfstest/dist/tests/link/07.t
vendor/pjdfstest/dist/tests/link/08.t
vendor/pjdfstest/dist/tests/link/09.t
vendor/pjdfstest/dist/tests/link/10.t
vendor/pjdfstest/dist/tests/link/11.t
vendor/pjdfstest/dist/tests/link/12.t
vendor/pjdfstest/dist/tests/link/13.t
vendor/pjdfstest/dist/tests/link/14.t
vendor/pjdfstest/dist/tests/link/15.t
vendor/pjdfstest/dist/tests/link/16.t
vendor/pjdfstest/dist/tests/link/17.t
vendor/pjdfstest/dist/tests/misc.sh (contents, props changed)
vendor/pjdfstest/dist/tests/mkdir/
vendor/pjdfstest/dist/tests/mkdir/00.t
vendor/pjdfstest/dist/tests/mkdir/01.t
vendor/pjdfstest/dist/tests/mkdir/02.t
vendor/pjdfstest/dist/tests/mkdir/03.t
vendor/pjdfstest/dist/tests/mkdir/04.t
vendor/pjdfstest/dist/tests/mkdir/05.t
vendor/pjdfstest/dist/tests/mkdir/06.t
vendor/pjdfstest/dist/tests/mkdir/07.t
vendor/pjdfstest/dist/tests/mkdir/08.t
vendor/pjdfstest/dist/tests/mkdir/09.t
vendor/pjdfstest/dist/tests/mkdir/10.t
vendor/pjdfstest/dist/tests/mkdir/11.t
vendor/pjdfstest/dist/tests/mkdir/12.t
vendor/pjdfstest/dist/tests/mkfifo/
vendor/pjdfstest/dist/tests/mkfifo/00.t
vendor/pjdfstest/dist/tests/mkfifo/01.t
vendor/pjdfstest/dist/tests/mkfifo/02.t
vendor/pjdfstest/dist/tests/mkfifo/03.t
vendor/pjdfstest/dist/tests/mkfifo/04.t
vendor/pjdfstest/dist/tests/mkfifo/05.t
vendor/pjdfstest/dist/tests/mkfifo/06.t
vendor/pjdfstest/dist/tests/mkfifo/07.t
vendor/pjdfstest/dist/tests/mkfifo/08.t
vendor/pjdfstest/dist/tests/mkfifo/09.t
vendor/pjdfstest/dist/tests/mkfifo/10.t
vendor/pjdfstest/dist/tests/mkfifo/11.t
vendor/pjdfstest/dist/tests/mkfifo/12.t
vendor/pjdfstest/dist/tests/mknod/
vendor/pjdfstest/dist/tests/mknod/00.t
vendor/pjdfstest/dist/tests/mknod/01.t
vendor/pjdfstest/dist/tests/mknod/02.t
vendor/pjdfstest/dist/tests/mknod/03.t
vendor/pjdfstest/dist/tests/mknod/04.t
vendor/pjdfstest/dist/tests/mknod/05.t
vendor/pjdfstest/dist/tests/mknod/06.t
vendor/pjdfstest/dist/tests/mknod/07.t
vendor/pjdfstest/dist/tests/mknod/08.t
vendor/pjdfstest/dist/tests/mknod/09.t
vendor/pjdfstest/dist/tests/mknod/10.t
vendor/pjdfstest/dist/tests/mknod/11.t
vendor/pjdfstest/dist/tests/open/
vendor/pjdfstest/dist/tests/open/00.t
vendor/pjdfstest/dist/tests/open/01.t
vendor/pjdfstest/dist/tests/open/02.t
vendor/pjdfstest/dist/tests/open/03.t
vendor/pjdfstest/dist/tests/open/04.t
vendor/pjdfstest/dist/tests/open/05.t
vendor/pjdfstest/dist/tests/open/06.t
vendor/pjdfstest/dist/tests/open/07.t
vendor/pjdfstest/dist/tests/open/08.t
vendor/pjdfstest/dist/tests/open/09.t
vendor/pjdfstest/dist/tests/open/10.t
vendor/pjdfstest/dist/tests/open/11.t
vendor/pjdfstest/dist/tests/open/12.t
vendor/pjdfstest/dist/tests/open/13.t
vendor/pjdfstest/dist/tests/open/14.t
vendor/pjdfstest/dist/tests/open/15.t
vendor/pjdfstest/dist/tests/open/16.t
vendor/pjdfstest/dist/tests/open/17.t
vendor/pjdfstest/dist/tests/open/18.t
vendor/pjdfstest/dist/tests/open/19.t
vendor/pjdfstest/dist/tests/open/20.t
vendor/pjdfstest/dist/tests/open/21.t
vendor/pjdfstest/dist/tests/open/22.t
vendor/pjdfstest/dist/tests/open/23.t
vendor/pjdfstest/dist/tests/open/24.t
vendor/pjdfstest/dist/tests/rename/
vendor/pjdfstest/dist/tests/rename/00.t
vendor/pjdfstest/dist/tests/rename/01.t
vendor/pjdfstest/dist/tests/rename/02.t
vendor/pjdfstest/dist/tests/rename/03.t
vendor/pjdfstest/dist/tests/rename/04.t
vendor/pjdfstest/dist/tests/rename/05.t
vendor/pjdfstest/dist/tests/rename/06.t
vendor/pjdfstest/dist/tests/rename/07.t
vendor/pjdfstest/dist/tests/rename/08.t
vendor/pjdfstest/dist/tests/rename/09.t
vendor/pjdfstest/dist/tests/rename/10.t
vendor/pjdfstest/dist/tests/rename/11.t
vendor/pjdfstest/dist/tests/rename/12.t
vendor/pjdfstest/dist/tests/rename/13.t
vendor/pjdfstest/dist/tests/rename/14.t
vendor/pjdfstest/dist/tests/rename/15.t
vendor/pjdfstest/dist/tests/rename/16.t
vendor/pjdfstest/dist/tests/rename/17.t
vendor/pjdfstest/dist/tests/rename/18.t
vendor/pjdfstest/dist/tests/rename/19.t
vendor/pjdfstest/dist/tests/rename/20.t
vendor/pjdfstest/dist/tests/rename/21.t
vendor/pjdfstest/dist/tests/rmdir/
vendor/pjdfstest/dist/tests/rmdir/00.t
vendor/pjdfstest/dist/tests/rmdir/01.t
vendor/pjdfstest/dist/tests/rmdir/02.t
vendor/pjdfstest/dist/tests/rmdir/03.t
vendor/pjdfstest/dist/tests/rmdir/04.t
vendor/pjdfstest/dist/tests/rmdir/05.t
vendor/pjdfstest/dist/tests/rmdir/06.t
vendor/pjdfstest/dist/tests/rmdir/07.t
vendor/pjdfstest/dist/tests/rmdir/08.t
vendor/pjdfstest/dist/tests/rmdir/09.t
vendor/pjdfstest/dist/tests/rmdir/10.t
vendor/pjdfstest/dist/tests/rmdir/11.t
vendor/pjdfstest/dist/tests/rmdir/12.t
vendor/pjdfstest/dist/tests/rmdir/13.t
vendor/pjdfstest/dist/tests/rmdir/14.t
vendor/pjdfstest/dist/tests/rmdir/15.t
vendor/pjdfstest/dist/tests/symlink/
vendor/pjdfstest/dist/tests/symlink/00.t
vendor/pjdfstest/dist/tests/symlink/01.t
vendor/pjdfstest/dist/tests/symlink/02.t
vendor/pjdfstest/dist/tests/symlink/03.t
vendor/pjdfstest/dist/tests/symlink/04.t
vendor/pjdfstest/dist/tests/symlink/05.t
vendor/pjdfstest/dist/tests/symlink/06.t
vendor/pjdfstest/dist/tests/symlink/07.t
vendor/pjdfstest/dist/tests/symlink/08.t
vendor/pjdfstest/dist/tests/symlink/09.t
vendor/pjdfstest/dist/tests/symlink/10.t
vendor/pjdfstest/dist/tests/symlink/11.t
vendor/pjdfstest/dist/tests/symlink/12.t
vendor/pjdfstest/dist/tests/truncate/
vendor/pjdfstest/dist/tests/truncate/00.t
vendor/pjdfstest/dist/tests/truncate/01.t
vendor/pjdfstest/dist/tests/truncate/02.t
vendor/pjdfstest/dist/tests/truncate/03.t
vendor/pjdfstest/dist/tests/truncate/04.t
vendor/pjdfstest/dist/tests/truncate/05.t
vendor/pjdfstest/dist/tests/truncate/06.t
vendor/pjdfstest/dist/tests/truncate/07.t
vendor/pjdfstest/dist/tests/truncate/08.t
vendor/pjdfstest/dist/tests/truncate/09.t
vendor/pjdfstest/dist/tests/truncate/10.t
vendor/pjdfstest/dist/tests/truncate/11.t
vendor/pjdfstest/dist/tests/truncate/12.t
vendor/pjdfstest/dist/tests/truncate/13.t
vendor/pjdfstest/dist/tests/truncate/14.t
vendor/pjdfstest/dist/tests/unlink/
vendor/pjdfstest/dist/tests/unlink/00.t
vendor/pjdfstest/dist/tests/unlink/01.t
vendor/pjdfstest/dist/tests/unlink/02.t
vendor/pjdfstest/dist/tests/unlink/03.t
vendor/pjdfstest/dist/tests/unlink/04.t
vendor/pjdfstest/dist/tests/unlink/05.t
vendor/pjdfstest/dist/tests/unlink/06.t
vendor/pjdfstest/dist/tests/unlink/07.t
vendor/pjdfstest/dist/tests/unlink/08.t
vendor/pjdfstest/dist/tests/unlink/09.t
vendor/pjdfstest/dist/tests/unlink/10.t
vendor/pjdfstest/dist/tests/unlink/11.t
vendor/pjdfstest/dist/tests/unlink/12.t
vendor/pjdfstest/dist/tests/unlink/13.t
Added: vendor/pjdfstest/dist/LICENSE
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ vendor/pjdfstest/dist/LICENSE Tue Sep 9 02:50:09 2014 (r271294)
@@ -0,0 +1,27 @@
+$FreeBSD: head/tools/regression/pjdfstest/LICENSE 211354 2010-08-15 21:29:03Z pjd $
+
+License for all regression tests available with pjdfstest:
+
+Copyright (c) 2006-2012 Pawel Jakub Dawidek <pawel at dawidek.net>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
Added: vendor/pjdfstest/dist/Makefile
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ vendor/pjdfstest/dist/Makefile Tue Sep 9 02:50:09 2014 (r271294)
@@ -0,0 +1,26 @@
+# $FreeBSD$
+
+PROG= pjdfstest
+
+${PROG}: ${PROG}.c
+ @OSTYPE=`uname`; \
+ CFLAGS=-D__OS_$${OSTYPE}__; \
+ if [ $$OSTYPE = "FreeBSD" ]; then \
+ CFLAGS="$$CFLAGS -DHAS_LCHMOD -DHAS_CHFLAGS -DHAS_FCHFLAGS -DHAS_CHFLAGSAT -DHAS_LCHFLAGS -DHAS_FREEBSD_ACL -DHAS_BINDAT -DHAS_CONNECTAT -DHAS_LPATHCONF"; \
+ elif [ $$OSTYPE = "SunOS" ]; then \
+ CFLAGS="$$CFLAGS -DHAS_TRUNCATE64 -DHAS_STAT64"; \
+ CFLAGS="$$CFLAGS -lsocket"; \
+ elif [ $$OSTYPE = "Darwin" ]; then \
+ CFLAGS="$$CFLAGS -DHAS_LCHMOD -DHAS_CHFLAGS -DHAS_LCHFLAGS"; \
+ elif [ $$OSTYPE == "Linux" ]; then \
+ CFLAGS="$$CFLAGS -D_GNU_SOURCE"; \
+ else \
+ echo "Unsupported operating system: ${OSTYPE}."; \
+ exit 1; \
+ fi; \
+ cmd="gcc -Wall $$CFLAGS ${PROG}.c -o ${PROG}"; \
+ echo $$cmd; \
+ $$cmd
+
+clean:
+ rm -f ${PROG}
Added: vendor/pjdfstest/dist/README
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ vendor/pjdfstest/dist/README Tue Sep 9 02:50:09 2014 (r271294)
@@ -0,0 +1,22 @@
+$FreeBSD: head/tools/regression/pjdfstest/README 211354 2010-08-15 21:29:03Z pjd $
+
+Few notes on how to use pjdfstest in short steps:
+
+ # cd pjdfstest
+ # vi tests/conf
+ Change 'fs' to file system type you want to test (UFS or ZFS).
+ # vi Makefile
+ You need to manually tweak few things by editing CFLAGS lines
+ at the top of the file.
+ # make
+ It will compile pjdfstest utility which is used by regression tests.
+ # cd /path/to/file/system/you/want/to/test/
+ # prove -r /path/to/pjdfstest/tests
+
+That's all. Enjoy.
+
+Currently supported operating systems: FreeBSD, Solaris.
+Currently supported file system types: UFS, ZFS.
+
+--
+Pawel Jakub Dawidek <pawel at dawidek.net>
Added: vendor/pjdfstest/dist/pjdfstest.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ vendor/pjdfstest/dist/pjdfstest.c Tue Sep 9 02:50:09 2014 (r271294)
@@ -0,0 +1,1493 @@
+/*-
+ * Copyright (c) 2006-2010 Pawel Jakub Dawidek <pjd at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/types.h>
+#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>
+#include <errno.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifndef HAS_TRUNCATE64
+#define truncate64 truncate
+#define ftruncate64 ftruncate
+#endif
+#ifndef HAS_STAT64
+#define stat64 stat
+#define fstat64 fstat
+#define lstat64 lstat
+#endif
+#ifdef HAS_FREEBSD_ACL
+#include <sys/acl.h>
+#endif
+
+#ifndef ALLPERMS
+#define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)
+#endif
+
+enum action {
+ ACTION_OPEN,
+ ACTION_OPENAT,
+ ACTION_CREATE,
+ ACTION_UNLINK,
+ ACTION_UNLINKAT,
+ ACTION_MKDIR,
+ ACTION_MKDIRAT,
+ ACTION_RMDIR,
+ ACTION_LINK,
+ ACTION_LINKAT,
+ ACTION_SYMLINK,
+ ACTION_SYMLINKAT,
+ ACTION_RENAME,
+ ACTION_RENAMEAT,
+ ACTION_MKFIFO,
+ ACTION_MKFIFOAT,
+ ACTION_MKNOD,
+ ACTION_MKNODAT,
+ ACTION_BIND,
+#ifdef HAS_BINDAT
+ ACTION_BINDAT,
+#endif
+ ACTION_CONNECT,
+#ifdef HAS_CONNECTAT
+ ACTION_CONNECTAT,
+#endif
+ ACTION_CHMOD,
+ ACTION_FCHMOD,
+#ifdef HAS_LCHMOD
+ ACTION_LCHMOD,
+#endif
+ ACTION_FCHMODAT,
+ ACTION_CHOWN,
+ ACTION_FCHOWN,
+ ACTION_LCHOWN,
+ ACTION_FCHOWNAT,
+#ifdef HAS_CHFLAGS
+ ACTION_CHFLAGS,
+#endif
+#ifdef HAS_FCHFLAGS
+ ACTION_FCHFLAGS,
+#endif
+#ifdef HAS_CHFLAGSAT
+ ACTION_CHFLAGSAT,
+#endif
+#ifdef HAS_LCHFLAGS
+ ACTION_LCHFLAGS,
+#endif
+ ACTION_TRUNCATE,
+ ACTION_FTRUNCATE,
+ ACTION_STAT,
+ ACTION_FSTAT,
+ ACTION_LSTAT,
+ ACTION_FSTATAT,
+ ACTION_PATHCONF,
+ ACTION_FPATHCONF,
+#ifdef HAS_LPATHCONF
+ ACTION_LPATHCONF,
+#endif
+#ifdef HAS_FREEBSD_ACL
+ ACTION_PREPENDACL,
+ ACTION_READACL,
+#endif
+ ACTION_WRITE,
+};
+
+#define TYPE_NONE 0x0000
+#define TYPE_STRING 0x0001
+#define TYPE_NUMBER 0x0002
+#define TYPE_DESCRIPTOR 0x0003
+#define TYPE_MASK 0x000f
+
+#define TYPE_OPTIONAL 0x0100
+
+#define MAX_ARGS 8
+
+struct syscall_desc {
+ const char *sd_name;
+ enum action sd_action;
+ int sd_args[MAX_ARGS];
+};
+
+static struct syscall_desc syscalls[] = {
+ { "open", ACTION_OPEN, { TYPE_STRING, TYPE_STRING, TYPE_NUMBER | TYPE_OPTIONAL, TYPE_NONE } },
+ { "openat", ACTION_OPENAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_NUMBER | TYPE_OPTIONAL, TYPE_NONE } },
+ { "create", ACTION_CREATE, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } },
+ { "unlink", ACTION_UNLINK, { TYPE_STRING, TYPE_NONE } },
+ { "unlinkat", ACTION_UNLINKAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_NONE } },
+ { "mkdir", ACTION_MKDIR, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } },
+ { "mkdirat", ACTION_MKDIRAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NUMBER, TYPE_NONE } },
+ { "rmdir", ACTION_RMDIR, { TYPE_STRING, TYPE_NONE } },
+ { "link", ACTION_LINK, { TYPE_STRING, TYPE_STRING, TYPE_NONE } },
+ { "linkat", ACTION_LINKAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_NONE } },
+ { "symlink", ACTION_SYMLINK, { TYPE_STRING, TYPE_STRING, TYPE_NONE } },
+ { "symlinkat", ACTION_SYMLINKAT, { TYPE_STRING, TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } },
+ { "rename", ACTION_RENAME, { TYPE_STRING, TYPE_STRING, TYPE_NONE } },
+ { "renameat", ACTION_RENAMEAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } },
+ { "mkfifo", ACTION_MKFIFO, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } },
+ { "mkfifoat", ACTION_MKFIFOAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NUMBER, TYPE_NONE } },
+ { "mknod", ACTION_MKNOD, { TYPE_STRING, TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE} },
+ { "mknodat", ACTION_MKNODAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE} },
+ { "bind", ACTION_BIND, { TYPE_STRING, TYPE_NONE } },
+#ifdef HAS_BINDAT
+ { "bindat", ACTION_BINDAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } },
+#endif
+ { "connect", ACTION_CONNECT, { TYPE_STRING, TYPE_NONE } },
+#ifdef HAS_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
+ { "lchmod", ACTION_LCHMOD, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } },
+#endif
+ { "fchmodat", ACTION_FCHMODAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NUMBER, TYPE_STRING, TYPE_NONE } },
+ { "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 } },
+ { "fchownat", ACTION_FCHOWNAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_STRING, TYPE_NONE } },
+#ifdef HAS_CHFLAGS
+ { "chflags", ACTION_CHFLAGS, { TYPE_STRING, TYPE_STRING, TYPE_NONE } },
+#endif
+#ifdef HAS_FCHFLAGS
+ { "fchflags", ACTION_FCHFLAGS, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } },
+#endif
+#ifdef HAS_CHFLAGSAT
+ { "chflagsat", ACTION_CHFLAGSAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_NONE } },
+#endif
+#ifdef HAS_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 } },
+ { "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 } },
+ { "fstatat", ACTION_FSTATAT, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_NONE } },
+ { "pathconf", ACTION_PATHCONF, { TYPE_STRING, TYPE_STRING, TYPE_NONE } },
+ { "fpathconf", ACTION_FPATHCONF, { TYPE_DESCRIPTOR, TYPE_STRING, TYPE_NONE } },
+#ifdef HAS_LPATHCONF
+ { "lpathconf", ACTION_LPATHCONF, { TYPE_STRING, TYPE_STRING, TYPE_NONE } },
+#endif
+#ifdef HAS_FREEBSD_ACL
+ { "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 } },
+ { NULL, -1, { TYPE_NONE } }
+};
+
+struct flag {
+ long long f_flag;
+ const char *f_str;
+};
+
+static struct flag open_flags[] = {
+#ifdef O_RDONLY
+ { O_RDONLY, "O_RDONLY" },
+#endif
+#ifdef O_WRONLY
+ { O_WRONLY, "O_WRONLY" },
+#endif
+#ifdef O_RDWR
+ { O_RDWR, "O_RDWR" },
+#endif
+#ifdef O_NONBLOCK
+ { O_NONBLOCK, "O_NONBLOCK" },
+#endif
+#ifdef O_APPEND
+ { O_APPEND, "O_APPEND" },
+#endif
+#ifdef O_CREAT
+ { O_CREAT, "O_CREAT" },
+#endif
+#ifdef O_TRUNC
+ { O_TRUNC, "O_TRUNC" },
+#endif
+#ifdef O_EXCL
+ { O_EXCL, "O_EXCL" },
+#endif
+#ifdef O_SHLOCK
+ { O_SHLOCK, "O_SHLOCK" },
+#endif
+#ifdef O_EXLOCK
+ { O_EXLOCK, "O_EXLOCK" },
+#endif
+#ifdef O_DIRECT
+ { O_DIRECT, "O_DIRECT" },
+#endif
+#ifdef O_FSYNC
+ { O_FSYNC, "O_FSYNC" },
+#endif
+#ifdef O_SYNC
+ { O_SYNC, "O_SYNC" },
+#endif
+#ifdef O_NOFOLLOW
+ { O_NOFOLLOW, "O_NOFOLLOW" },
+#endif
+#ifdef O_NOCTTY
+ { O_NOCTTY, "O_NOCTTY" },
+#endif
+#ifdef O_DIRECTORY
+ { O_DIRECTORY, "O_DIRECTORY" },
+#endif
+ { 0, NULL }
+};
+
+#ifdef HAS_CHFLAGS
+static struct flag chflags_flags[] = {
+#ifdef UF_NODUMP
+ { UF_NODUMP, "UF_NODUMP" },
+#endif
+#ifdef UF_IMMUTABLE
+ { UF_IMMUTABLE, "UF_IMMUTABLE" },
+#endif
+#ifdef UF_APPEND
+ { UF_APPEND, "UF_APPEND" },
+#endif
+#ifdef UF_NOUNLINK
+ { UF_NOUNLINK, "UF_NOUNLINK" },
+#endif
+#ifdef UF_OPAQUE
+ { UF_OPAQUE, "UF_OPAQUE" },
+#endif
+#ifdef SF_ARCHIVED
+ { SF_ARCHIVED, "SF_ARCHIVED" },
+#endif
+#ifdef SF_IMMUTABLE
+ { SF_IMMUTABLE, "SF_IMMUTABLE" },
+#endif
+#ifdef SF_APPEND
+ { SF_APPEND, "SF_APPEND" },
+#endif
+#ifdef SF_NOUNLINK
+ { SF_NOUNLINK, "SF_NOUNLINK" },
+#endif
+#ifdef SF_SNAPSHOT
+ { SF_SNAPSHOT, "SF_SNAPSHOT" },
+#endif
+ { 0, NULL }
+};
+#endif
+
+static struct flag unlinkat_flags[] = {
+ { AT_REMOVEDIR, "AT_REMOVEDIR" },
+ { 0, NULL }
+};
+
+static struct flag linkat_flags[] = {
+ { AT_SYMLINK_FOLLOW, "AT_SYMLINK_FOLLOW" },
+ { 0, NULL }
+};
+
+static struct flag chflagsat_flags[] = {
+ { AT_SYMLINK_NOFOLLOW, "AT_SYMLINK_NOFOLLOW" },
+ { 0, NULL }
+};
+
+static struct flag fchmodat_flags[] = {
+ { AT_SYMLINK_NOFOLLOW, "AT_SYMLINK_NOFOLLOW" },
+ { 0, NULL }
+};
+
+static struct flag fchownat_flags[] = {
+ { AT_SYMLINK_NOFOLLOW, "AT_SYMLINK_NOFOLLOW" },
+ { 0, NULL }
+};
+
+static struct flag fstatat_flags[] = {
+ { AT_SYMLINK_NOFOLLOW, "AT_SYMLINK_NOFOLLOW" },
+ { 0, NULL }
+};
+
+struct name {
+ int n_name;
+ const char *n_str;
+};
+
+static struct name pathconf_names[] = {
+#ifdef _PC_LINK_MAX
+ { _PC_LINK_MAX, "_PC_LINK_MAX" },
+#endif
+#ifdef _PC_NAME_MAX
+ { _PC_NAME_MAX, "_PC_NAME_MAX" },
+#endif
+#ifdef _PC_PATH_MAX
+ { _PC_PATH_MAX, "_PC_PATH_MAX" },
+#endif
+#ifdef _PC_SYMLINK_MAX
+ { _PC_SYMLINK_MAX, "_PC_SYMLINK_MAX" },
+#endif
+ { 0, NULL }
+};
+
+static const char *err2str(int error);
+
+static int *descriptors;
+static int ndescriptors;
+
+static void
+usage(void)
+{
+
+ fprintf(stderr, "usage: pjdfstest [-U umask] [-u uid] [-g gid1[,gid2[...]]] syscall args ...\n");
+ exit(1);
+}
+
+static long long
+str2flags(struct flag *tflags, char *sflags)
+{
+ long long flags = 0;
+ unsigned int i;
+ char *f;
+
+ /* 'none' or '0' means no flags */
+ if (strcmp(sflags, "none") == 0 || strcmp(sflags, "0") == 0)
+ return (0);
+ for (f = strtok(sflags, ",|"); f != NULL; f = strtok(NULL, ",|")) {
+ for (i = 0; tflags[i].f_str != NULL; i++) {
+ if (strcmp(tflags[i].f_str, f) == 0)
+ break;
+ }
+ if (tflags[i].f_str == NULL) {
+ fprintf(stderr, "unknown flag '%s'\n", f);
+ exit(1);
+ }
+ flags |= tflags[i].f_flag;
+ }
+ return (flags);
+}
+
+#ifdef HAS_CHFLAGS
+static char *
+flags2str(struct flag *tflags, long long flags)
+{
+ static char sflags[1024];
+ unsigned int i;
+
+ sflags[0] = '\0';
+ for (i = 0; tflags[i].f_str != NULL; i++) {
+ if (flags & tflags[i].f_flag) {
+ if (sflags[0] != '\0')
+ strlcat(sflags, ",", sizeof(sflags));
+ strlcat(sflags, tflags[i].f_str, sizeof(sflags));
+ }
+ }
+ if (sflags[0] == '\0')
+ strlcpy(sflags, "none", sizeof(sflags));
+ return (sflags);
+}
+#endif
+
+static int
+str2name(struct name *names, char *name)
+{
+ unsigned int i;
+
+ for (i = 0; names[i].n_str != NULL; i++) {
+ if (strcmp(names[i].n_str, name) == 0)
+ return (names[i].n_name);
+ }
+ return (-1);
+}
+
+static struct syscall_desc *
+find_syscall(const char *name)
+{
+ int i;
+
+ for (i = 0; syscalls[i].sd_name != NULL; i++) {
+ if (strcmp(syscalls[i].sd_name, name) == 0)
+ return (&syscalls[i]);
+ }
+ return (NULL);
+}
+
+static void
+show_stat(struct stat64 *sp, const char *what)
+{
+
+ if (strcmp(what, "mode") == 0)
+ printf("0%o", (unsigned int)(sp->st_mode & ALLPERMS));
+ else if (strcmp(what, "inode") == 0)
+ printf("%lld", (long long)sp->st_ino);
+ else if (strcmp(what, "nlink") == 0)
+ printf("%lld", (long long)sp->st_nlink);
+ else if (strcmp(what, "uid") == 0)
+ printf("%d", (int)sp->st_uid);
+ else if (strcmp(what, "gid") == 0)
+ printf("%d", (int)sp->st_gid);
+ else if (strcmp(what, "size") == 0)
+ printf("%lld", (long long)sp->st_size);
+ else if (strcmp(what, "blocks") == 0)
+ 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);
+ else if (strcmp(what, "ctime") == 0)
+ printf("%lld", (long long)sp->st_ctime);
+#ifdef HAS_CHFLAGS
+ else if (strcmp(what, "flags") == 0)
+ printf("%s", flags2str(chflags_flags, (long long)sp->st_flags));
+#endif
+ else if (strcmp(what, "major") == 0)
+ printf("%u", (unsigned int)major(sp->st_rdev));
+ else if (strcmp(what, "minor") == 0)
+ printf("%u", (unsigned int)minor(sp->st_rdev));
+ else if (strcmp(what, "type") == 0) {
+ switch (sp->st_mode & S_IFMT) {
+ case S_IFIFO:
+ printf("fifo");
+ break;
+ case S_IFCHR:
+ printf("char");
+ break;
+ case S_IFDIR:
+ printf("dir");
+ break;
+ case S_IFBLK:
+ printf("block");
+ break;
+ case S_IFREG:
+ printf("regular");
+ break;
+ case S_IFLNK:
+ printf("symlink");
+ break;
+ case S_IFSOCK:
+ printf("socket");
+ break;
+ default:
+ printf("unknown");
+ break;
+ }
+ } else {
+ printf("unknown");
+ }
+}
+
+static void
+show_stats(struct stat64 *sp, char *what)
+{
+ const char *s = "";
+ char *w;
+
+ for (w = strtok(what, ","); w != NULL; w = strtok(NULL, ",")) {
+ printf("%s", s);
+ show_stat(sp, w);
+ s = ",";
+ }
+ printf("\n");
+}
+
+static void
+descriptor_add(int fd)
+{
+
+ ndescriptors++;
+ if (descriptors == NULL) {
+ descriptors = malloc(sizeof(descriptors[0]) * ndescriptors);
+ } else {
+ descriptors = realloc(descriptors,
+ sizeof(descriptors[0]) * ndescriptors);
+ }
+ assert(descriptors != NULL);
+ descriptors[ndescriptors - 1] = fd;
+}
+
+static int
+descriptor_get(int pos)
+{
+
+ if (pos < 0 || pos >= ndescriptors) {
+ fprintf(stderr, "invalid descriptor %d\n", pos);
+ exit(1);
+ }
+
+ return (descriptors[pos]);
+}
+
+static unsigned int
+call_syscall(struct syscall_desc *scall, char *argv[])
+{
+ struct stat64 sb;
+ long long flags;
+ unsigned int i;
+ char *endp;
+ int name, rval;
+ union {
+ char *str;
+ long long num;
+ } args[MAX_ARGS];
+#ifdef HAS_FREEBSD_ACL
+ int entry_id = ACL_FIRST_ENTRY;
+ acl_t acl, newacl;
+ acl_entry_t entry, newentry;
+#endif
+
+ /*
+ * Verify correctness of the arguments.
+ */
+ for (i = 0; i < sizeof(args)/sizeof(args[0]); i++) {
+ if (scall->sd_args[i] == TYPE_NONE) {
+ if (argv[i] == NULL || strcmp(argv[i], ":") == 0)
+ break;
+ fprintf(stderr, "too many arguments [%s]\n", argv[i]);
+ exit(1);
+ } else {
+ if (argv[i] == NULL || strcmp(argv[i], ":") == 0) {
+ if (scall->sd_args[i] & TYPE_OPTIONAL)
+ break;
+ fprintf(stderr, "too few arguments\n");
+ exit(1);
+ }
+ if ((scall->sd_args[i] & TYPE_MASK) == TYPE_STRING) {
+ if (strcmp(argv[i], "NULL") == 0)
+ args[i].str = NULL;
+ else if (strcmp(argv[i], "DEADCODE") == 0)
+ args[i].str = (void *)0xdeadc0de;
+ else
+ args[i].str = argv[i];
+ } else if ((scall->sd_args[i] & TYPE_MASK) ==
+ TYPE_NUMBER) {
+ args[i].num = strtoll(argv[i], &endp, 0);
+ if (*endp != '\0' &&
+ !isspace((unsigned char)*endp)) {
+ fprintf(stderr,
+ "invalid argument %u, number expected [%s]\n",
+ i, endp);
+ exit(1);
+ }
+ } else if ((scall->sd_args[i] & TYPE_MASK) ==
+ TYPE_DESCRIPTOR) {
+ if (strcmp(argv[i], "AT_FDCWD") == 0) {
+ args[i].num = AT_FDCWD;
+ } else if (strcmp(argv[i], "BADFD") == 0) {
+ /* In case AT_FDCWD is -1 on some systems... */
+ if (AT_FDCWD == -1)
+ args[i].num = -2;
+ else
+ args[i].num = -1;
+ } else {
+ int pos;
+
+ pos = strtoll(argv[i], &endp, 0);
+ if (*endp != '\0' &&
+ !isspace((unsigned char)*endp)) {
+ fprintf(stderr,
+ "invalid argument %u, number expected [%s]\n",
+ i, endp);
+ exit(1);
+ }
+ args[i].num = descriptor_get(pos);
+ }
+ }
+ }
+ }
+ /*
+ * Call the given syscall.
+ */
+#define NUM(n) (args[(n)].num)
+#define STR(n) (args[(n)].str)
+ switch (scall->sd_action) {
+ case ACTION_OPEN:
+ flags = str2flags(open_flags, STR(1));
+ if (flags & O_CREAT) {
+ if (i == 2) {
+ fprintf(stderr, "too few arguments\n");
+ exit(1);
+ }
+ rval = open(STR(0), (int)flags, (mode_t)NUM(2));
+ } else {
+ if (i == 3) {
+ fprintf(stderr, "too many arguments\n");
+ exit(1);
+ }
+ rval = open(STR(0), (int)flags);
+ }
+ if (rval >= 0)
+ descriptor_add(rval);
+ break;
+ case ACTION_OPENAT:
+ flags = str2flags(open_flags, STR(2));
+ if (flags & O_CREAT) {
+ if (i == 3) {
+ fprintf(stderr, "too few arguments\n");
+ exit(1);
+ }
+ rval = openat(NUM(0), STR(1), (int)flags,
+ (mode_t)NUM(3));
+ } else {
+ if (i == 4) {
+ fprintf(stderr, "too many arguments\n");
+ exit(1);
+ }
+ rval = openat(NUM(0), STR(1), (int)flags);
+ }
+ if (rval >= 0)
+ descriptor_add(rval);
+ break;
+ case ACTION_CREATE:
+ rval = open(STR(0), O_CREAT | O_EXCL, (mode_t)NUM(1));
+ if (rval >= 0)
+ close(rval);
+ break;
+ case ACTION_UNLINK:
+ rval = unlink(STR(0));
+ break;
+ case ACTION_UNLINKAT:
+ rval = unlinkat(NUM(0), STR(1),
+ (int)str2flags(unlinkat_flags, STR(2)));
+ break;
+ case ACTION_MKDIR:
+ rval = mkdir(STR(0), (mode_t)NUM(1));
+ break;
+ case ACTION_MKDIRAT:
+ rval = mkdirat(NUM(0), STR(1), (mode_t)NUM(2));
+ break;
+ case ACTION_RMDIR:
+ rval = rmdir(STR(0));
+ break;
+ case ACTION_LINK:
+ rval = link(STR(0), STR(1));
+ break;
+ case ACTION_LINKAT:
+ rval = linkat(NUM(0), STR(1), NUM(2), STR(3),
+ (int)str2flags(linkat_flags, STR(4)));
+ break;
+ case ACTION_SYMLINK:
+ rval = symlink(STR(0), STR(1));
+ break;
+ case ACTION_SYMLINKAT:
+ rval = symlinkat(STR(0), NUM(1), STR(2));
+ break;
+ case ACTION_RENAME:
+ rval = rename(STR(0), STR(1));
+ break;
+ case ACTION_RENAMEAT:
+ rval = renameat(NUM(0), STR(1), NUM(2), STR(3));
+ break;
+ case ACTION_MKFIFO:
+ rval = mkfifo(STR(0), (mode_t)NUM(1));
+ break;
+ case ACTION_MKFIFOAT:
+ rval = mkfifoat(NUM(0), STR(1), (mode_t)NUM(2));
+ break;
+ case ACTION_MKNOD:
+ case ACTION_MKNODAT:
+ {
+ mode_t ntype;
+ dev_t dev;
+ int fa;
+
+ switch (scall->sd_action) {
+ case ACTION_MKNOD:
+ fa = 0;
+ break;
+ case ACTION_MKNODAT:
+ fa = 1;
+ break;
+ default:
+ abort();
+ }
+
+ dev = makedev(NUM(fa + 3), NUM(fa + 4));
+ if (strcmp(STR(fa + 1), "c") == 0) /* character device */
+ ntype = S_IFCHR;
+ else if (strcmp(STR(fa + 1), "b") == 0) /* block device */
+ ntype = S_IFBLK;
+ else if (strcmp(STR(fa + 1), "f") == 0) /* fifo special */
+ ntype = S_IFIFO;
+ else if (strcmp(STR(fa + 1), "d") == 0) /* directory */
+ ntype = S_IFDIR;
+ else if (strcmp(STR(fa + 1), "o") == 0) /* regular file */
+ ntype = S_IFREG;
+ else {
+ fprintf(stderr, "wrong argument 1\n");
+ exit(1);
+ }
+ switch (scall->sd_action) {
+ case ACTION_MKNOD:
+ rval = mknod(STR(0), ntype | NUM(2), dev);
+ break;
+ case ACTION_MKNODAT:
+ rval = mknodat(NUM(0), STR(1), ntype | NUM(3), dev);
+ break;
+ default:
+ abort();
+ }
+ break;
+ }
+ case ACTION_BIND:
+ {
+ struct sockaddr_un sunx;
+
+ sunx.sun_family = AF_UNIX;
+ strncpy(sunx.sun_path, STR(0), sizeof(sunx.sun_path) - 1);
+ sunx.sun_path[sizeof(sunx.sun_path) - 1] = '\0';
+ rval = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (rval < 0)
+ break;
+ rval = bind(rval, (struct sockaddr *)&sunx, sizeof(sunx));
+ break;
+ }
+#ifdef HAS_BINDAT
+ case ACTION_BINDAT:
+ {
+ struct sockaddr_un sunx;
+
+ sunx.sun_family = AF_UNIX;
+ strncpy(sunx.sun_path, STR(1), sizeof(sunx.sun_path) - 1);
+ sunx.sun_path[sizeof(sunx.sun_path) - 1] = '\0';
+ rval = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (rval < 0)
+ break;
+ rval = bindat(NUM(0), rval, (struct sockaddr *)&sunx,
+ sizeof(sunx));
+ break;
+ }
+#endif
+ case ACTION_CONNECT:
+ {
+ struct sockaddr_un sunx;
+
+ sunx.sun_family = AF_UNIX;
+ strncpy(sunx.sun_path, STR(0), sizeof(sunx.sun_path) - 1);
+ sunx.sun_path[sizeof(sunx.sun_path) - 1] = '\0';
+ rval = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (rval < 0)
+ break;
+ rval = connect(rval, (struct sockaddr *)&sunx, sizeof(sunx));
+ break;
+ }
+#ifdef HAS_CONNECTAT
+ case ACTION_CONNECTAT:
+ {
+ struct sockaddr_un sunx;
+
+ sunx.sun_family = AF_UNIX;
+ strncpy(sunx.sun_path, STR(1), sizeof(sunx.sun_path) - 1);
+ sunx.sun_path[sizeof(sunx.sun_path) - 1] = '\0';
+ rval = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (rval < 0)
+ break;
+ rval = connectat(NUM(0), rval, (struct sockaddr *)&sunx,
+ sizeof(sunx));
+ break;
+ }
+#endif
+ case ACTION_CHMOD:
+ rval = chmod(STR(0), (mode_t)NUM(1));
+ break;
+ case ACTION_FCHMOD:
+ rval = fchmod(NUM(0), (mode_t)NUM(1));
+ break;
+#ifdef HAS_LCHMOD
+ case ACTION_LCHMOD:
+ rval = lchmod(STR(0), (mode_t)NUM(1));
+ break;
+#endif
+ case ACTION_FCHMODAT:
+ rval = fchmodat(NUM(0), STR(1), (mode_t)NUM(2),
+ str2flags(fchmodat_flags, STR(3)));
+ break;
+ case ACTION_CHOWN:
+ rval = chown(STR(0), (uid_t)NUM(1), (gid_t)NUM(2));
+ break;
+ case ACTION_FCHOWN:
+ rval = fchown(NUM(0), (uid_t)NUM(1), (gid_t)NUM(2));
+ break;
+ case ACTION_LCHOWN:
+ rval = lchown(STR(0), (uid_t)NUM(1), (gid_t)NUM(2));
+ break;
+ 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
+ case ACTION_CHFLAGS:
+ rval = chflags(STR(0),
+ (unsigned long)str2flags(chflags_flags, STR(1)));
+ break;
+#endif
+#ifdef HAS_FCHFLAGS
+ case ACTION_FCHFLAGS:
+ rval = fchflags(NUM(0),
+ (unsigned long)str2flags(chflags_flags, STR(1)));
+ break;
+#endif
+#ifdef HAS_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
+ case ACTION_LCHFLAGS:
+ rval = lchflags(STR(0),
+ (unsigned long)str2flags(chflags_flags, STR(1)));
+ break;
+#endif
+ case ACTION_TRUNCATE:
+ rval = truncate64(STR(0), NUM(1));
+ break;
+ case ACTION_FTRUNCATE:
+ rval = ftruncate64(NUM(0), NUM(1));
+ break;
+ case ACTION_STAT:
+ rval = stat64(STR(0), &sb);
+ if (rval == 0) {
+ show_stats(&sb, STR(1));
+ return (i);
+ }
+ break;
+ case ACTION_FSTAT:
+ rval = fstat64(NUM(0), &sb);
+ if (rval == 0) {
+ show_stats(&sb, STR(1));
+ return (i);
+ }
+ break;
+ case ACTION_LSTAT:
+ rval = lstat64(STR(0), &sb);
+ if (rval == 0) {
+ show_stats(&sb, STR(1));
+ return (i);
+ }
+ break;
+ case ACTION_FSTATAT:
+ rval = fstatat(NUM(0), STR(1), &sb,
+ (int)str2flags(fstatat_flags, STR(2)));
+ if (rval == 0) {
+ show_stats(&sb, STR(3));
+ return (i);
+ }
+ break;
+ case ACTION_PATHCONF:
+ case ACTION_FPATHCONF:
+#ifdef HAS_LPATHCONF
+ case ACTION_LPATHCONF:
+#endif
+ {
+ long lrval;
+
+ name = str2name(pathconf_names, STR(1));
+ if (name == -1) {
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-all
mailing list