* tests/getrlimit.c: New file.
* tests/setrlimit.c: Likewise.
* tests/ugetrlimit.c: Likewise.
* tests/xgetrlimit.c: Likewise.
* tests/getrlimit.test: New test.
* tests/setrlimit.test: Likewise.
* tests/ugetrlimit.test: Likewise.
* tests/.gitignore: Add getrlimit, setrlimit, and ugetrlimit.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add getrlimit.test, setrlimit.test,
and ugetrlimit.test.
(EXTRA_DIST): Add xgetrlimit.c.
getresgid32
getresuid
getresuid32
+getrlimit
getrusage
getsid
getuid
setresuid32
setreuid
setreuid32
+setrlimit
setuid
setuid32
shmxt
times-fail
truncate
truncate64
+ugetrlimit
uio
umask
umount
getresgid32 \
getresuid \
getresuid32 \
+ getrlimit \
getrusage \
getsid \
getuid \
setresuid32 \
setreuid \
setreuid32 \
+ setrlimit \
setuid \
setuid32 \
shmxt \
times-fail \
truncate \
truncate64 \
+ ugetrlimit \
uio \
umask \
umount \
getresgid32.test \
getresuid.test \
getresuid32.test \
+ getrlimit.test \
getrusage.test \
getsid.test \
getuid.test \
setresuid32.test \
setreuid.test \
setreuid32.test \
+ setrlimit.test \
setuid.test \
setuid32.test \
shmxt.test \
times.test \
truncate.test \
truncate64.test \
+ ugetrlimit.test \
uio.test \
umask.test \
umount.test \
umovestr.expected \
wait.expected \
xchownx.c \
+ xgetrlimit.c \
xselect.c \
xstatfs.c \
xstatfs64.c \
--- /dev/null
+#include "tests.h"
+#include <sys/syscall.h>
+
+#ifdef __NR_getrlimit
+
+# define NR_GETRLIMIT __NR_getrlimit
+# define STR_GETRLIMIT "getrlimit"
+# include "xgetrlimit.c"
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_getrlimit")
+
+#endif
--- /dev/null
+#!/bin/sh
+
+# Check decoding of getrlimit syscall.
+
+. "${srcdir=.}/setrlimit.test"
--- /dev/null
+/*
+ * Check decoding of setrlimit syscall.
+ *
+ * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.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.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+#include "tests.h"
+#include <sys/syscall.h>
+
+#ifdef __NR_setrlimit
+
+# include "xgetrlimit.c"
+
+int
+main(void)
+{
+ kernel_ulong_t *const rlimit = tail_alloc(sizeof(*rlimit) * 2);
+ const struct xlat *xlat;
+
+ for (xlat = resources; xlat->str; ++xlat) {
+ unsigned long res = 0xfacefeed00000000 | xlat->val;
+ long rc = syscall(__NR_setrlimit, res, 0);
+ printf("setrlimit(%s, NULL) = %ld %s (%m)\n",
+ xlat->str, rc, errno2name());
+
+ struct rlimit libc_rlim = {};
+ if (getrlimit((int) res, &libc_rlim))
+ continue;
+ rlimit[0] = libc_rlim.rlim_cur;
+ rlimit[1] = libc_rlim.rlim_max;
+
+ rc = syscall(__NR_setrlimit, res, rlimit);
+ int saved_errno = errno;
+ printf("setrlimit(%s, {rlim_cur=%s, rlim_max=%s})",
+ xlat->str,
+ sprint_rlim(rlimit[0]), sprint_rlim(rlimit[1]));
+ if (rc) {
+ errno = saved_errno;
+ printf(" = %ld %s (%m)\n", rc, errno2name());
+ } else {
+ printf(" = 0\n");
+ }
+ }
+
+ puts("+++ exited with 0 +++");
+ return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_setrlimit")
+
+#endif
--- /dev/null
+#!/bin/sh
+
+# Check decoding of getrlimit/ugetrlimit/setrlimit syscall.
+
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a27
--- /dev/null
+#include "tests.h"
+#include <sys/syscall.h>
+
+#ifdef __NR_ugetrlimit
+
+# define NR_GETRLIMIT __NR_ugetrlimit
+# define STR_GETRLIMIT "ugetrlimit"
+# include "xgetrlimit.c"
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_ugetrlimit")
+
+#endif
--- /dev/null
+#!/bin/sh
+
+# Check decoding of ugetrlimit syscall.
+
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a28
--- /dev/null
+/*
+ * Check decoding of getrlimit/ugetrlimit syscall.
+ *
+ * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.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.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <sys/resource.h>
+#include <unistd.h>
+
+#include "kernel_types.h"
+#include "xlat.h"
+#include "xlat/resources.h"
+
+const char *
+sprint_rlim(kernel_ulong_t lim)
+{
+ if (sizeof(lim) == sizeof(uint64_t)) {
+ if (lim == -1ULL)
+ return "RLIM64_INFINITY";
+ } else {
+ if (lim == -1U)
+ return "RLIM_INFINITY";
+ }
+
+ static char buf[2][sizeof(lim)*3 + sizeof("*1024")];
+ static int i;
+ i &= 1;
+ if (lim > 1024 && lim % 1024 == 0)
+ sprintf(buf[i], "%llu*1024", (unsigned long long) lim / 1024);
+ else
+ sprintf(buf[i], "%llu", (unsigned long long) lim);
+
+ return buf[i++];
+}
+
+#ifdef NR_GETRLIMIT
+
+int
+main(void)
+{
+ kernel_ulong_t *const rlimit = tail_alloc(sizeof(*rlimit) * 2);
+ const struct xlat *xlat;
+
+ for (xlat = resources; xlat->str; ++xlat) {
+ unsigned long res = 0xfacefeed00000000 | xlat->val;
+ long rc = syscall(NR_GETRLIMIT, res, 0);
+ if (rc && ENOSYS == errno)
+ perror_msg_and_skip(STR_GETRLIMIT);
+ printf("%s(%s, NULL) = %ld %s (%m)\n",
+ STR_GETRLIMIT, xlat->str, rc, errno2name());
+
+ rc = syscall(NR_GETRLIMIT, res, rlimit);
+ if (rc)
+ printf("%s(%s, NULL) = %ld %s (%m)\n",
+ STR_GETRLIMIT, xlat->str, rc, errno2name());
+ else
+ printf("%s(%s, {rlim_cur=%s, rlim_max=%s})"
+ " = 0\n", STR_GETRLIMIT, xlat->str,
+ sprint_rlim(rlimit[0]), sprint_rlim(rlimit[1]));
+ }
+
+ puts("+++ exited with 0 +++");
+ return 0;
+}
+
+#endif /* NR_GETRLIMIT */