summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2016-08-22 18:48:03 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2016-08-22 20:24:38 +0000
commitc7aa3802c43f81fcbd89a7d0a2d795572741710c (patch)
treefb30bbf9e98f4cdc362e2f99ba989f2436918c4a
parentd0de416eba4efacef1c1fc99a50645dfe855b4e0 (diff)
downloadillumos-joyent-c7aa3802c43f81fcbd89a7d0a2d795572741710c.tar.gz
OS-5607 lxbrand move unixbench syscalls to IKE
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
-rw-r--r--usr/src/lib/brand/lx/lx_brand/common/fcntl.c30
-rw-r--r--usr/src/lib/brand/lx/lx_brand/common/id.c209
-rw-r--r--usr/src/lib/brand/lx/lx_brand/common/lx_brand.c76
-rw-r--r--usr/src/lib/brand/lx/lx_brand/common/misc.c72
-rw-r--r--usr/src/lib/brand/lx/lx_brand/sys/lx_syscall.h24
-rw-r--r--usr/src/uts/common/brand/lx/os/lx_syscall.c76
-rw-r--r--usr/src/uts/common/brand/lx/sys/lx_syscalls.h24
-rw-r--r--usr/src/uts/common/brand/lx/syscall/lx_dup.c53
-rw-r--r--usr/src/uts/common/brand/lx/syscall/lx_id.c215
-rw-r--r--usr/src/uts/common/brand/lx/syscall/lx_umask.c25
-rw-r--r--usr/src/uts/intel/Makefile.files2
11 files changed, 378 insertions, 428 deletions
diff --git a/usr/src/lib/brand/lx/lx_brand/common/fcntl.c b/usr/src/lib/brand/lx/lx_brand/common/fcntl.c
index 7b6cd4d5f2..93738bf84f 100644
--- a/usr/src/lib/brand/lx/lx_brand/common/fcntl.c
+++ b/usr/src/lib/brand/lx/lx_brand/common/fcntl.c
@@ -40,36 +40,6 @@
#include <sys/lx_misc.h>
#include <sys/lx_syscall.h>
-long
-lx_dup2(uintptr_t p1, uintptr_t p2)
-{
- int oldfd = (int)p1;
- int newfd = (int)p2;
- int rc;
-
- rc = fcntl(oldfd, F_DUP2FD, newfd);
- return ((rc == -1) ? -errno : rc);
-}
-
-long
-lx_dup3(uintptr_t p1, uintptr_t p2, uintptr_t p3)
-{
- int oldfd = (int)p1;
- int newfd = (int)p2;
- int flags = (int)p3;
- int rc;
-
- /* The only valid flag is O_CLOEXEC. */
- if (flags & ~LX_O_CLOEXEC)
- return (-EINVAL);
-
- if (oldfd == newfd)
- return (-EINVAL);
-
- rc = fcntl(oldfd, (flags == 0) ? F_DUP2FD : F_DUP2FD_CLOEXEC, newfd);
- return ((rc == -1) ? -errno : rc);
-}
-
/*
* flock() applies or removes an advisory lock on the file
* associated with the file descriptor fd.
diff --git a/usr/src/lib/brand/lx/lx_brand/common/id.c b/usr/src/lib/brand/lx/lx_brand/common/id.c
index cd5baefa7d..9ab923270d 100644
--- a/usr/src/lib/brand/lx/lx_brand/common/id.c
+++ b/usr/src/lib/brand/lx/lx_brand/common/id.c
@@ -22,215 +22,12 @@
/*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
- * Copyright 2014 Joyent, Inc. All rights reserved.
+ * Copyright 2016 Joyent, Inc.
*/
#include <sys/types.h>
-#include <fcntl.h>
-#include <procfs.h>
-#include <sys/systm.h>
-#include <sys/errno.h>
-#include <sys/zone.h>
#include <sys/lx_types.h>
-#include <sys/lx_syscall.h>
-#include <sys/cred_impl.h>
-#include <sys/policy.h>
-#include <sys/ucred.h>
-#include <sys/syscall.h>
-#include <alloca.h>
-#include <errno.h>
-#include <ucred.h>
#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/lx_misc.h>
-
-
-long
-lx_setuid16(uintptr_t uid)
-{
- return ((setuid(LX_UID16_TO_UID32((lx_uid16_t)uid))) ? -errno : 0);
-}
-
-long
-lx_getuid16(void)
-{
- return ((int)LX_UID32_TO_UID16(getuid()));
-}
-
-long
-lx_setgid16(uintptr_t gid)
-{
- return ((setgid(LX_GID16_TO_GID32((lx_gid16_t)gid))) ? -errno : 0);
-}
-
-long
-lx_getgid16(void)
-{
- return ((int)LX_GID32_TO_GID16(getgid()));
-}
-
-long
-lx_geteuid16(void)
-{
- return ((int)LX_UID32_TO_UID16(geteuid()));
-}
-
-long
-lx_getegid16(void)
-{
- return ((int)LX_GID32_TO_GID16(getegid()));
-}
-
-long
-lx_geteuid(void)
-{
- return ((int)geteuid());
-}
-
-long
-lx_getegid(void)
-{
- return ((int)getegid());
-}
-
-long
-lx_getresuid(uintptr_t ruid, uintptr_t euid, uintptr_t suid)
-{
- lx_uid_t lx_ruid, lx_euid, lx_suid;
- ucred_t *cr;
- size_t sz;
-
- /*
- * We allocate a ucred_t ourselves rather than call ucred_get(3C)
- * because ucred_get() calls malloc(3C), which the brand library cannot
- * use. Because we allocate the space with SAFE_ALLOCA(), there's
- * no need to free it when we're done.
- */
- sz = ucred_size();
- cr = (ucred_t *)SAFE_ALLOCA(sz);
- if (cr == NULL)
- return (-ENOMEM);
-
- if (syscall(SYS_ucredsys, UCREDSYS_UCREDGET, P_MYID, cr) != 0)
- return (-errno);
-
- if (((lx_ruid = (lx_uid_t)ucred_getruid(cr)) == (lx_uid_t)-1) ||
- ((lx_euid = (lx_uid_t)ucred_geteuid(cr)) == (lx_uid_t)-1) ||
- ((lx_suid = (lx_uid_t)ucred_getsuid(cr)) == (lx_uid_t)-1)) {
- return (-errno);
- }
-
- if (uucopy(&lx_ruid, (void *)ruid, sizeof (lx_uid_t)) != 0)
- return (-errno);
-
- if (uucopy(&lx_euid, (void *)euid, sizeof (lx_uid_t)) != 0)
- return (-errno);
-
- return ((uucopy(&lx_suid, (void *)suid, sizeof (lx_uid_t)) != 0)
- ? -errno : 0);
-}
-
-long
-lx_getresuid16(uintptr_t ruid16, uintptr_t euid16, uintptr_t suid16)
-{
- lx_uid_t lx_ruid, lx_euid, lx_suid;
- lx_uid16_t lx_ruid16, lx_euid16, lx_suid16;
- int rv;
-
- if ((rv = lx_getresuid((uintptr_t)&lx_ruid, (uintptr_t)&lx_euid,
- (uintptr_t)&lx_suid)) != 0)
- return (rv);
-
- lx_ruid16 = LX_UID32_TO_UID16(lx_ruid);
- lx_euid16 = LX_UID32_TO_UID16(lx_euid);
- lx_suid16 = LX_UID32_TO_UID16(lx_suid);
-
- if (uucopy(&lx_ruid16, (void *)ruid16, sizeof (lx_uid16_t)) != 0)
- return (-errno);
-
- if (uucopy(&lx_euid16, (void *)euid16, sizeof (lx_uid16_t)) != 0)
- return (-errno);
-
- return ((uucopy(&lx_suid16, (void *)suid16, sizeof (lx_uid16_t)) != 0)
- ? -errno : 0);
-}
-
-long
-lx_getresgid(uintptr_t rgid, uintptr_t egid, uintptr_t sgid)
-{
- ucred_t *cr;
- lx_gid_t lx_rgid, lx_egid, lx_sgid;
- size_t sz;
-
- /*
- * We allocate a ucred_t ourselves rather than call ucred_get(3C)
- * because ucred_get() calls malloc(3C), which the brand library cannot
- * use. Because we allocate the space with SAFE_ALLOCA(), there's
- * no need to free it when we're done.
- */
- sz = ucred_size();
- cr = (ucred_t *)SAFE_ALLOCA(sz);
- if (cr == NULL)
- return (-ENOMEM);
-
- if (syscall(SYS_ucredsys, UCREDSYS_UCREDGET, P_MYID, cr) != 0)
- return (-errno);
-
- if (((lx_rgid = (lx_gid_t)ucred_getrgid(cr)) == (lx_gid_t)-1) ||
- ((lx_egid = (lx_gid_t)ucred_getegid(cr)) == (lx_gid_t)-1) ||
- ((lx_sgid = (lx_gid_t)ucred_getsgid(cr)) == (lx_gid_t)-1)) {
- return (-errno);
- }
-
- if (uucopy(&lx_rgid, (void *)rgid, sizeof (lx_gid_t)) != 0)
- return (-errno);
-
- if (uucopy(&lx_egid, (void *)egid, sizeof (lx_gid_t)) != 0)
- return (-errno);
-
- return ((uucopy(&lx_sgid, (void *)sgid, sizeof (lx_gid_t)) != 0)
- ? -errno : 0);
-}
-
-long
-lx_getresgid16(uintptr_t rgid16, uintptr_t egid16, uintptr_t sgid16)
-{
- lx_gid_t lx_rgid, lx_egid, lx_sgid;
- lx_gid16_t lx_rgid16, lx_egid16, lx_sgid16;
- int rv;
-
- if ((rv = lx_getresgid((uintptr_t)&lx_rgid, (uintptr_t)&lx_egid,
- (uintptr_t)&lx_sgid)) != 0)
- return (rv);
-
- lx_rgid16 = LX_UID32_TO_UID16(lx_rgid);
- lx_egid16 = LX_UID32_TO_UID16(lx_egid);
- lx_sgid16 = LX_UID32_TO_UID16(lx_sgid);
-
- if (uucopy(&lx_rgid16, (void *)rgid16, sizeof (lx_gid16_t)) != 0)
- return (-errno);
-
- if (uucopy(&lx_egid16, (void *)egid16, sizeof (lx_gid16_t)) != 0)
- return (-errno);
-
- return ((uucopy(&lx_sgid16, (void *)sgid16, sizeof (lx_gid16_t)) != 0)
- ? -errno : 0);
-}
-
-long
-lx_setreuid16(uintptr_t ruid, uintptr_t euid)
-{
- return ((setreuid(LX_UID16_TO_UID32((lx_uid16_t)ruid),
- LX_UID16_TO_UID32((lx_uid16_t)euid))) ? -errno : 0);
-}
-
-long
-lx_setregid16(uintptr_t rgid, uintptr_t egid)
-{
- return ((setregid(LX_UID16_TO_UID32((lx_gid16_t)rgid),
- LX_UID16_TO_UID32((lx_gid16_t)egid))) ? -errno : 0);
-}
/*
* The lx brand cannot support the setfs[ug]id16/setfs[ug]id calls as that
@@ -246,14 +43,14 @@ lx_setregid16(uintptr_t rgid, uintptr_t egid)
long
lx_setfsuid16(uintptr_t fsuid16)
{
- return (lx_geteuid16());
+ return ((int)LX_UID32_TO_UID16(geteuid()));
}
/*ARGSUSED*/
long
lx_setfsgid16(uintptr_t fsgid16)
{
- return (lx_getegid16());
+ return ((int)LX_GID32_TO_GID16(getegid()));
}
/*ARGSUSED*/
diff --git a/usr/src/lib/brand/lx/lx_brand/common/lx_brand.c b/usr/src/lib/brand/lx/lx_brand/common/lx_brand.c
index 274d5435a4..92771c3f71 100644
--- a/usr/src/lib/brand/lx/lx_brand/common/lx_brand.c
+++ b/usr/src/lib/brand/lx/lx_brand/common/lx_brand.c
@@ -1043,8 +1043,8 @@ static lx_syscall_handler_t lx_handlers[] = {
lx_shmget, /* 29: shmget */
lx_shmat, /* 30: shmat */
lx_shmctl, /* 31: shmctl */
- lx_dup, /* 32: dup */
- lx_dup2, /* 33: dup2 */
+ NULL, /* 32: dup */
+ NULL, /* 33: dup2 */
lx_pause, /* 34: pause */
NULL, /* 35: nanosleep */
lx_getitimer, /* 36: getitimer */
@@ -1106,32 +1106,32 @@ static lx_syscall_handler_t lx_handlers[] = {
NULL, /* 92: chown */
NULL, /* 93: fchown */
NULL, /* 94: lchown */
- lx_umask, /* 95: umask */
+ NULL, /* 95: umask */
NULL, /* 96: gettimeofday */
NULL, /* 97: getrlimit */
lx_getrusage, /* 98: getrusage */
NULL, /* 99: sysinfo */
lx_times, /* 100: times */
NULL, /* 101: ptrace */
- lx_getuid, /* 102: getuid */
+ NULL, /* 102: getuid */
lx_syslog, /* 103: syslog */
- lx_getgid, /* 104: getgid */
- lx_setuid, /* 105: setuid */
- lx_setgid, /* 106: setgid */
- lx_geteuid, /* 107: geteuid */
- lx_getegid, /* 108: getegid */
+ NULL, /* 104: getgid */
+ NULL, /* 105: setuid */
+ NULL, /* 106: setgid */
+ NULL, /* 107: geteuid */
+ NULL, /* 108: getegid */
lx_setpgid, /* 109: setpgid */
NULL, /* 110: getppid */
lx_getpgrp, /* 111: getpgrp */
lx_setsid, /* 112: setsid */
- lx_setreuid, /* 113: setreuid */
- lx_setregid, /* 114: setregid */
+ NULL, /* 113: setreuid */
+ NULL, /* 114: setregid */
lx_getgroups, /* 115: getgroups */
lx_setgroups, /* 116: setgroups */
NULL, /* 117: setresuid */
- lx_getresuid, /* 118: getresuid */
+ NULL, /* 118: getresuid */
NULL, /* 119: setresgid */
- lx_getresgid, /* 120: getresgid */
+ NULL, /* 120: getresgid */
lx_getpgid, /* 121: getpgid */
lx_setfsuid, /* 122: setfsuid */
lx_setfsgid, /* 123: setfsgid */
@@ -1303,7 +1303,7 @@ static lx_syscall_handler_t lx_handlers[] = {
lx_signalfd4, /* 289: signalfd4 */
lx_eventfd2, /* 290: eventfd2 */
NULL, /* 291: epoll_create1 */
- lx_dup3, /* 292: dup3 */
+ NULL, /* 292: dup3 */
NULL, /* 293: pipe2 */
lx_inotify_init1, /* 294: inotify_init1 */
NULL, /* 295: preadv */
@@ -1365,8 +1365,8 @@ static lx_syscall_handler_t lx_handlers[] = {
NULL, /* 20: getpid */
lx_mount, /* 21: mount */
NULL, /* 22: umount */
- lx_setuid16, /* 23: setuid16 */
- lx_getuid16, /* 24: getuid16 */
+ NULL, /* 23: setuid16 */
+ NULL, /* 24: getuid16 */
lx_stime, /* 25: stime */
NULL, /* 26: ptrace */
lx_alarm, /* 27: alarm */
@@ -1383,16 +1383,16 @@ static lx_syscall_handler_t lx_handlers[] = {
lx_rename, /* 38: rename */
NULL, /* 39: mkdir */
lx_rmdir, /* 40: rmdir */
- lx_dup, /* 41: dup */
+ NULL, /* 41: dup */
NULL, /* 42: pipe */
lx_times, /* 43: times */
NULL, /* 44: prof */
NULL, /* 45: brk */
- lx_setgid16, /* 46: setgid16 */
- lx_getgid16, /* 47: getgid16 */
+ NULL, /* 46: setgid16 */
+ NULL, /* 47: getgid16 */
lx_signal, /* 48: signal */
- lx_geteuid16, /* 49: geteuid16 */
- lx_getegid16, /* 50: getegid16 */
+ NULL, /* 49: geteuid16 */
+ NULL, /* 50: getegid16 */
NULL, /* 51: acct */
NULL, /* 52: umount2 */
NULL, /* 53: lock */
@@ -1402,18 +1402,18 @@ static lx_syscall_handler_t lx_handlers[] = {
lx_setpgid, /* 57: setpgid */
NULL, /* 58: ulimit */
NULL, /* 59: olduname */
- lx_umask, /* 60: umask */
+ NULL, /* 60: umask */
lx_chroot, /* 61: chroot */
NULL, /* 62: ustat */
- lx_dup2, /* 63: dup2 */
+ NULL, /* 63: dup2 */
NULL, /* 64: getppid */
lx_getpgrp, /* 65: getpgrp */
lx_setsid, /* 66: setsid */
lx_sigaction, /* 67: sigaction */
NULL, /* 68: sgetmask */
NULL, /* 69: ssetmask */
- lx_setreuid16, /* 70: setreuid16 */
- lx_setregid16, /* 71: setregid16 */
+ NULL, /* 70: setreuid16 */
+ NULL, /* 71: setregid16 */
lx_sigsuspend, /* 72: sigsuspend */
lx_sigpending, /* 73: sigpending */
lx_sethostname, /* 74: sethostname */
@@ -1507,13 +1507,13 @@ static lx_syscall_handler_t lx_handlers[] = {
NULL, /* 162: nanosleep */
lx_remap, /* 163: mremap */
NULL, /* 164: setresuid16 */
- lx_getresuid16, /* 165: getresuid16 */
+ NULL, /* 165: getresuid16 */
NULL, /* 166: vm86 */
lx_query_module, /* 167: query_module */
NULL, /* 168: poll */
NULL, /* 169: nfsservctl */
NULL, /* 170: setresgid16 */
- lx_getresgid16, /* 171: getresgid16 */
+ NULL, /* 171: getresgid16 */
NULL, /* 172: prctl */
lx_rt_sigreturn, /* 173: rt_sigreturn */
lx_rt_sigaction, /* 174: rt_sigaction */
@@ -1541,22 +1541,22 @@ static lx_syscall_handler_t lx_handlers[] = {
NULL, /* 196: lstat64 */
NULL, /* 197: fstat64 */
NULL, /* 198: lchown */
- lx_getuid, /* 199: getuid */
- lx_getgid, /* 200: getgid */
- lx_geteuid, /* 201: geteuid */
- lx_getegid, /* 202: getegid */
- lx_setreuid, /* 203: setreuid */
- lx_setregid, /* 204: setregid */
+ NULL, /* 199: getuid */
+ NULL, /* 200: getgid */
+ NULL, /* 201: geteuid */
+ NULL, /* 202: getegid */
+ NULL, /* 203: setreuid */
+ NULL, /* 204: setregid */
lx_getgroups, /* 205: getgroups */
lx_setgroups, /* 206: setgroups */
NULL, /* 207: fchown */
NULL, /* 208: setresuid */
- lx_getresuid, /* 209: getresuid */
+ NULL, /* 209: getresuid */
NULL, /* 210: setresgid */
- lx_getresgid, /* 211: getresgid */
+ NULL, /* 211: getresgid */
NULL, /* 212: chown */
- lx_setuid, /* 213: setuid */
- lx_setgid, /* 214: setgid */
+ NULL, /* 213: setuid */
+ NULL, /* 214: setgid */
lx_setfsuid, /* 215: setfsuid */
lx_setfsgid, /* 216: setfsgid */
NULL, /* 217: pivot_root */
@@ -1672,7 +1672,7 @@ static lx_syscall_handler_t lx_handlers[] = {
lx_signalfd4, /* 327: signalfd4 */
lx_eventfd2, /* 328: eventfd2 */
NULL, /* 329: epoll_create1 */
- lx_dup3, /* 330: dup3 */
+ NULL, /* 330: dup3 */
NULL, /* 331: pipe2 */
lx_inotify_init1, /* 332: inotify_init1 */
NULL, /* 333: preadv */
diff --git a/usr/src/lib/brand/lx/lx_brand/common/misc.c b/usr/src/lib/brand/lx/lx_brand/common/misc.c
index 49ac90608b..795c63144a 100644
--- a/usr/src/lib/brand/lx/lx_brand/common/misc.c
+++ b/usr/src/lib/brand/lx/lx_brand/common/misc.c
@@ -507,15 +507,6 @@ lx_creat(const char *path, mode_t mode)
}
long
-lx_dup(int fildes)
-{
- int r;
-
- r = dup(fildes);
- return ((r == -1) ? -errno : r);
-}
-
-long
lx_fchdir(int fildes)
{
int r;
@@ -525,15 +516,6 @@ lx_fchdir(int fildes)
}
long
-lx_getgid(void)
-{
- int r;
-
- r = getgid();
- return (r);
-}
-
-long
lx_getgroups(int gidsetsize, gid_t *grouplist)
{
int r;
@@ -552,15 +534,6 @@ lx_getitimer(int which, struct itimerval *value)
}
long
-lx_getuid(void)
-{
- int r;
-
- r = getuid();
- return (r);
-}
-
-long
lx_inotify_add_watch(int fd, const char *pathname, uint32_t mask)
{
int r;
@@ -642,42 +615,6 @@ lx_pause(void)
}
long
-lx_setgid(gid_t gid)
-{
- int r;
-
- r = setgid(gid);
- return ((r == -1) ? -errno : r);
-}
-
-long
-lx_setuid(uid_t uid)
-{
- int r;
-
- r = setuid(uid);
- return ((r == -1) ? -errno : r);
-}
-
-long
-lx_setregid(gid_t rgid, gid_t egid)
-{
- int r;
-
- r = setregid(rgid, egid);
- return ((r == -1) ? -errno : r);
-}
-
-long
-lx_setreuid(uid_t ruid, uid_t euid)
-{
- int r;
-
- r = setreuid(ruid, euid);
- return ((r == -1) ? -errno : r);
-}
-
-long
lx_shmdt(char *shmaddr)
{
int r;
@@ -705,15 +642,6 @@ lx_symlink(const char *name1, const char *name2)
}
long
-lx_umask(mode_t cmask)
-{
- int r;
-
- r = umask(cmask);
- return ((r == -1) ? -errno : r);
-}
-
-long
lx_utimes(const char *path, const struct timeval times[2])
{
int r;
diff --git a/usr/src/lib/brand/lx/lx_brand/sys/lx_syscall.h b/usr/src/lib/brand/lx/lx_brand/sys/lx_syscall.h
index b1cdba338f..fe28dc7a05 100644
--- a/usr/src/lib/brand/lx/lx_brand/sys/lx_syscall.h
+++ b/usr/src/lib/brand/lx/lx_brand/sys/lx_syscall.h
@@ -65,8 +65,6 @@ extern long lx_flock(uintptr_t, uintptr_t);
extern long lx_readlink(uintptr_t, uintptr_t, uintptr_t);
extern long lx_readdir(uintptr_t, uintptr_t, uintptr_t);
extern long lx_execve(uintptr_t, uintptr_t, uintptr_t);
-extern long lx_dup2(uintptr_t, uintptr_t);
-extern long lx_dup3(uintptr_t, uintptr_t, uintptr_t);
extern long lx_ioctl(uintptr_t, uintptr_t, uintptr_t);
extern long lx_vhangup(void);
extern long lx_fadvise64(uintptr_t, off64_t, uintptr_t, uintptr_t);
@@ -82,23 +80,9 @@ extern long lx_setpgid(uintptr_t, uintptr_t);
extern long lx_getsid(uintptr_t);
extern long lx_setsid(void);
-extern long lx_getuid16(void);
-extern long lx_getgid16(void);
-extern long lx_geteuid16(void);
-extern long lx_getegid16(void);
-extern long lx_geteuid(void);
-extern long lx_getegid(void);
-extern long lx_getresuid16(uintptr_t, uintptr_t, uintptr_t);
-extern long lx_getresgid16(uintptr_t, uintptr_t, uintptr_t);
-extern long lx_getresuid(uintptr_t, uintptr_t, uintptr_t);
-extern long lx_getresgid(uintptr_t, uintptr_t, uintptr_t);
extern long lx_capget(uintptr_t, uintptr_t);
extern long lx_capset(uintptr_t, uintptr_t);
-extern long lx_setuid16(uintptr_t);
-extern long lx_setreuid16(uintptr_t, uintptr_t);
-extern long lx_setregid16(uintptr_t, uintptr_t);
-extern long lx_setgid16(uintptr_t);
extern long lx_setfsuid16(uintptr_t);
extern long lx_setfsgid16(uintptr_t);
@@ -241,14 +225,11 @@ extern long lx_close(int);
extern long lx_chdir(const char *);
extern long lx_chroot(const char *);
extern long lx_creat(const char *, mode_t);
-extern long lx_dup(int);
extern long lx_eventfd(unsigned int);
extern long lx_eventfd2(unsigned int, int);
extern long lx_fchdir(int);
-extern long lx_getgid(void);
extern long lx_getgroups(int, gid_t *);
extern long lx_getitimer(int, struct itimerval *);
-extern long lx_getuid(void);
extern long lx_inotify_add_watch(int, const char *, uint32_t);
extern long lx_inotify_init(void);
extern long lx_inotify_init1(int);
@@ -257,10 +238,6 @@ extern long lx_mincore(caddr_t, size_t, char *);
extern long lx_munmap(void *, size_t);
extern long lx_nice(int);
extern long lx_pause(void);
-extern long lx_setgid(gid_t);
-extern long lx_setuid(uid_t);
-extern long lx_setregid(gid_t, gid_t);
-extern long lx_setreuid(uid_t, uid_t);
extern long lx_shmdt(char *);
extern long lx_signalfd(int, uintptr_t, size_t);
extern long lx_signalfd4(int, uintptr_t, size_t, int);
@@ -271,7 +248,6 @@ extern long lx_timerfd_create(int, int);
extern long lx_timerfd_settime(int, int,
const struct itimerspec *, struct itimerspec *);
extern long lx_timerfd_gettime(int, struct itimerspec *);
-extern long lx_umask(mode_t);
extern long lx_utimes(const char *, const struct timeval *);
#endif /* !defined(_ASM) */
diff --git a/usr/src/uts/common/brand/lx/os/lx_syscall.c b/usr/src/uts/common/brand/lx/os/lx_syscall.c
index 5d4b10a012..bbd1ad9e22 100644
--- a/usr/src/uts/common/brand/lx/os/lx_syscall.c
+++ b/usr/src/uts/common/brand/lx/os/lx_syscall.c
@@ -544,8 +544,8 @@ lx_sysent_t lx_sysent32[] = {
{"getpid", lx_getpid, 0, 0}, /* 20 */
{"mount", lx_mount, 0, 5}, /* 21 */
{"umount", lx_umount, 0, 1}, /* 22 */
- {"setuid16", NULL, 0, 1}, /* 23 */
- {"getuid16", NULL, 0, 0}, /* 24 */
+ {"setuid16", lx_setuid16, 0, 1}, /* 23 */
+ {"getuid16", lx_getuid16, 0, 0}, /* 24 */
{"stime", NULL, 0, 1}, /* 25 */
{"ptrace", lx_ptrace, 0, 4}, /* 26 */
{"alarm", NULL, 0, 1}, /* 27 */
@@ -562,16 +562,16 @@ lx_sysent_t lx_sysent32[] = {
{"rename", NULL, 0, 2}, /* 38 */
{"mkdir", lx_mkdir, 0, 2}, /* 39 */
{"rmdir", NULL, 0, 1}, /* 40 */
- {"dup", NULL, 0, 1}, /* 41 */
+ {"dup", lx_dup, 0, 1}, /* 41 */
{"pipe", lx_pipe, 0, 1}, /* 42 */
{"times", NULL, 0, 1}, /* 43 */
{"prof", NULL, NOSYS_OBSOLETE, 0}, /* 44 */
{"brk", lx_brk, 0, 1}, /* 45 */
- {"setgid16", NULL, 0, 1}, /* 46 */
- {"getgid16", NULL, 0, 0}, /* 47 */
+ {"setgid16", lx_setgid16, 0, 1}, /* 46 */
+ {"getgid16", lx_getgid16, 0, 0}, /* 47 */
{"signal", NULL, 0, 2}, /* 48 */
- {"geteuid16", NULL, 0, 0}, /* 49 */
- {"getegid16", NULL, 0, 0}, /* 50 */
+ {"geteuid16", lx_geteuid16, 0, 0}, /* 49 */
+ {"getegid16", lx_getegid16, 0, 0}, /* 50 */
{"acct", NULL, NOSYS_NO_EQUIV, 0}, /* 51 */
{"umount2", lx_umount2, 0, 2}, /* 52 */
{"lock", NULL, NOSYS_OBSOLETE, 0}, /* 53 */
@@ -581,18 +581,18 @@ lx_sysent_t lx_sysent32[] = {
{"setpgid", NULL, 0, 2}, /* 57 */
{"ulimit", NULL, NOSYS_OBSOLETE, 0}, /* 58 */
{"olduname", NULL, NOSYS_OBSOLETE, 0}, /* 59 */
- {"umask", NULL, 0, 1}, /* 60 */
+ {"umask", lx_umask, 0, 1}, /* 60 */
{"chroot", NULL, 0, 1}, /* 61 */
{"ustat", NULL, NOSYS_OBSOLETE, 2}, /* 62 */
- {"dup2", NULL, 0, 2}, /* 63 */
+ {"dup2", lx_dup2, 0, 2}, /* 63 */
{"getppid", lx_getppid, 0, 0}, /* 64 */
{"getpgrp", NULL, 0, 0}, /* 65 */
{"setsid", NULL, 0, 0}, /* 66 */
{"sigaction", NULL, 0, 3}, /* 67 */
{"sgetmask", NULL, NOSYS_OBSOLETE, 0}, /* 68 */
{"ssetmask", NULL, NOSYS_OBSOLETE, 0}, /* 69 */
- {"setreuid16", NULL, 0, 2}, /* 70 */
- {"setregid16", NULL, 0, 2}, /* 71 */
+ {"setreuid16", lx_setreuid16, 0, 2}, /* 70 */
+ {"setregid16", lx_setregid16, 0, 2}, /* 71 */
{"sigsuspend", NULL, 0, 1}, /* 72 */
{"sigpending", NULL, 0, 1}, /* 73 */
{"sethostname", NULL, 0, 2}, /* 74 */
@@ -686,13 +686,13 @@ lx_sysent_t lx_sysent32[] = {
{"nanosleep", lx_nanosleep, 0, 2}, /* 162 */
{"mremap", NULL, 0, 5}, /* 163 */
{"setresuid16", lx_setresuid16, 0, 3}, /* 164 */
- {"getresuid16", NULL, 0, 3}, /* 165 */
+ {"getresuid16", lx_getresuid16, 0, 3}, /* 165 */
{"vm86", NULL, NOSYS_NO_EQUIV, 0}, /* 166 */
{"query_module", NULL, 0, 5}, /* 167 */
{"poll", lx_poll, 0, 3}, /* 168 */
{"nfsservctl", NULL, NOSYS_KERNEL, 0}, /* 169 */
{"setresgid16", lx_setresgid16, 0, 3}, /* 170 */
- {"getresgid16", NULL, 0, 3}, /* 171 */
+ {"getresgid16", lx_getresgid16, 0, 3}, /* 171 */
{"prctl", lx_prctl, 0, 5}, /* 172 */
{"rt_sigreturn", NULL, 0, 0}, /* 173 */
{"rt_sigaction", NULL, 0, 4}, /* 174 */
@@ -720,22 +720,22 @@ lx_sysent_t lx_sysent32[] = {
{"lstat64", lx_lstat64, 0, 2}, /* 196 */
{"fstat64", lx_fstat64, 0, 2}, /* 197 */
{"lchown", lx_lchown, 0, 3}, /* 198 */
- {"getuid", NULL, 0, 0}, /* 199 */
- {"getgid", NULL, 0, 0}, /* 200 */
- {"geteuid", NULL, 0, 0}, /* 201 */
- {"getegid", NULL, 0, 0}, /* 202 */
- {"setreuid", NULL, 0, 0}, /* 203 */
- {"setregid", NULL, 0, 0}, /* 204 */
+ {"getuid", lx_getuid, 0, 0}, /* 199 */
+ {"getgid", lx_getgid, 0, 0}, /* 200 */
+ {"geteuid", lx_geteuid, 0, 0}, /* 201 */
+ {"getegid", lx_getegid, 0, 0}, /* 202 */
+ {"setreuid", lx_setreuid, 0, 0}, /* 203 */
+ {"setregid", lx_setregid, 0, 0}, /* 204 */
{"getgroups", NULL, 0, 2}, /* 205 */
{"setgroups", NULL, 0, 2}, /* 206 */
{"fchown", lx_fchown, 0, 3}, /* 207 */
{"setresuid", lx_setresuid, 0, 3}, /* 208 */
- {"getresuid", NULL, 0, 3}, /* 209 */
+ {"getresuid", lx_getresuid, 0, 3}, /* 209 */
{"setresgid", lx_setresgid, 0, 3}, /* 210 */
- {"getresgid", NULL, 0, 3}, /* 211 */
+ {"getresgid", lx_getresgid, 0, 3}, /* 211 */
{"chown", lx_chown, 0, 3}, /* 212 */
- {"setuid", NULL, 0, 1}, /* 213 */
- {"setgid", NULL, 0, 1}, /* 214 */
+ {"setuid", lx_setuid, 0, 1}, /* 213 */
+ {"setgid", lx_setgid, 0, 1}, /* 214 */
{"setfsuid", NULL, 0, 1}, /* 215 */
{"setfsgid", NULL, 0, 1}, /* 216 */
{"pivot_root", NULL, NOSYS_KERNEL, 0}, /* 217 */
@@ -855,7 +855,7 @@ lx_sysent_t lx_sysent32[] = {
{"signalfd4", NULL, 0, 4}, /* 327 */
{"eventfd2", NULL, 0, 2}, /* 328 */
{"epoll_create1", lx_epoll_create1, 0, 1}, /* 329 */
- {"dup3", NULL, 0, 3}, /* 330 */
+ {"dup3", lx_dup3, 0, 3}, /* 330 */
{"pipe2", lx_pipe2, 0, 2}, /* 331 */
{"inotify_init1", NULL, 0, 1}, /* 332 */
{"preadv", lx_preadv32, 0, 5}, /* 333 */
@@ -924,8 +924,8 @@ lx_sysent_t lx_sysent64[] = {
{"shmget", NULL, 0, 3}, /* 29 */
{"shmat", NULL, 0, 4}, /* 30 */
{"shmctl", NULL, 0, 3}, /* 31 */
- {"dup", NULL, 0, 1}, /* 32 */
- {"dup2", NULL, 0, 2}, /* 33 */
+ {"dup", lx_dup, 0, 1}, /* 32 */
+ {"dup2", lx_dup2, 0, 2}, /* 33 */
{"pause", NULL, 0, 0}, /* 34 */
{"nanosleep", lx_nanosleep, 0, 2}, /* 35 */
{"getitimer", NULL, 0, 2}, /* 36 */
@@ -987,32 +987,32 @@ lx_sysent_t lx_sysent64[] = {
{"chown", lx_chown, 0, 3}, /* 92 */
{"fchown", lx_fchown, 0, 3}, /* 93 */
{"lchown", lx_lchown, 0, 3}, /* 94 */
- {"umask", NULL, 0, 1}, /* 95 */
+ {"umask", lx_umask, 0, 1}, /* 95 */
{"gettimeofday", lx_gettimeofday, 0, 2}, /* 96 */
{"getrlimit", lx_getrlimit, 0, 2}, /* 97 */
{"getrusage", NULL, 0, 2}, /* 98 */
{"sysinfo", lx_sysinfo64, 0, 1}, /* 99 */
{"times", NULL, 0, 1}, /* 100 */
{"ptrace", lx_ptrace, 0, 4}, /* 101 */
- {"getuid", NULL, 0, 0}, /* 102 */
+ {"getuid", lx_getuid, 0, 0}, /* 102 */
{"syslog", NULL, 0, 3}, /* 103 */
- {"getgid", NULL, 0, 0}, /* 104 */
- {"setuid", NULL, 0, 1}, /* 105 */
- {"setgid", NULL, 0, 1}, /* 106 */
- {"geteuid", NULL, 0, 0}, /* 107 */
- {"getegid", NULL, 0, 0}, /* 108 */
+ {"getgid", lx_getgid, 0, 0}, /* 104 */
+ {"setuid", lx_setuid, 0, 1}, /* 105 */
+ {"setgid", lx_setgid, 0, 1}, /* 106 */
+ {"geteuid", lx_geteuid, 0, 0}, /* 107 */
+ {"getegid", lx_getegid, 0, 0}, /* 108 */
{"setpgid", NULL, 0, 2}, /* 109 */
{"getppid", lx_getppid, 0, 0}, /* 110 */
{"getpgrp", NULL, 0, 0}, /* 111 */
{"setsid", NULL, 0, 0}, /* 112 */
- {"setreuid", NULL, 0, 0}, /* 113 */
- {"setregid", NULL, 0, 0}, /* 114 */
+ {"setreuid", lx_setreuid, 0, 0}, /* 113 */
+ {"setregid", lx_setregid, 0, 0}, /* 114 */
{"getgroups", NULL, 0, 2}, /* 115 */
{"setgroups", NULL, 0, 2}, /* 116 */
{"setresuid", lx_setresuid, 0, 3}, /* 117 */
- {"getresuid", NULL, 0, 3}, /* 118 */
+ {"getresuid", lx_getresuid, 0, 3}, /* 118 */
{"setresgid", lx_setresgid, 0, 3}, /* 119 */
- {"getresgid", NULL, 0, 3}, /* 120 */
+ {"getresgid", lx_getresgid, 0, 3}, /* 120 */
{"getpgid", NULL, 0, 1}, /* 121 */
{"setfsuid", NULL, 0, 1}, /* 122 */
{"setfsgid", NULL, 0, 1}, /* 123 */
@@ -1184,7 +1184,7 @@ lx_sysent_t lx_sysent64[] = {
{"signalfd4", NULL, 0, 4}, /* 289 */
{"eventfd2", NULL, 0, 2}, /* 290 */
{"epoll_create1", lx_epoll_create1, 0, 1}, /* 291 */
- {"dup3", NULL, 0, 3}, /* 292 */
+ {"dup3", lx_dup3, 0, 3}, /* 292 */
{"pipe2", lx_pipe2, 0, 2}, /* 293 */
{"inotify_init1", NULL, 0, 1}, /* 294 */
{"preadv", lx_preadv, 0, 4}, /* 295 */
diff --git a/usr/src/uts/common/brand/lx/sys/lx_syscalls.h b/usr/src/uts/common/brand/lx/sys/lx_syscalls.h
index 2c0d982bd6..32442538d1 100644
--- a/usr/src/uts/common/brand/lx/sys/lx_syscalls.h
+++ b/usr/src/uts/common/brand/lx/sys/lx_syscalls.h
@@ -48,6 +48,9 @@ extern long lx_clock_gettime();
extern long lx_clock_settime();
extern long lx_close();
extern long lx_connect();
+extern long lx_dup();
+extern long lx_dup2();
+extern long lx_dup3();
extern long lx_epoll_create();
extern long lx_epoll_create1();
extern long lx_epoll_ctl();
@@ -78,15 +81,27 @@ extern long lx_getcwd();
extern long lx_getdents_32();
extern long lx_getdents_64();
extern long lx_getdents64();
+extern long lx_getegid();
+extern long lx_getegid16();
+extern long lx_geteuid();
+extern long lx_geteuid16();
+extern long lx_getgid();
+extern long lx_getgid16();
extern long lx_getpeername();
extern long lx_getsockname();
extern long lx_getpid();
extern long lx_getppid();
extern long lx_getrandom();
+extern long lx_getresgid();
+extern long lx_getresgid16();
+extern long lx_getresuid();
+extern long lx_getresuid16();
extern long lx_getrlimit();
extern long lx_getsockopt();
extern long lx_gettid();
extern long lx_gettimeofday();
+extern long lx_getuid();
+extern long lx_getuid16();
extern long lx_getxattr();
extern long lx_io_setup();
extern long lx_ioctl();
@@ -151,11 +166,19 @@ extern long lx_sendto();
extern long lx_set_robust_list();
extern long lx_set_thread_area();
extern long lx_set_tid_address();
+extern long lx_setgid();
+extern long lx_setgid16();
+extern long lx_setregid();
+extern long lx_setregid16();
extern long lx_setresgid();
extern long lx_setresgid16();
extern long lx_setresuid();
extern long lx_setresuid16();
+extern long lx_setreuid();
+extern long lx_setreuid16();
extern long lx_setrlimit();
+extern long lx_setuid();
+extern long lx_setuid16();
extern long lx_setxattr();
extern long lx_setsockopt();
extern long lx_shutdown();
@@ -172,6 +195,7 @@ extern long lx_removexattr();
extern long lx_tgkill();
extern long lx_time();
extern long lx_tkill();
+extern long lx_umask();
extern long lx_umount();
extern long lx_umount2();
extern long lx_uname();
diff --git a/usr/src/uts/common/brand/lx/syscall/lx_dup.c b/usr/src/uts/common/brand/lx/syscall/lx_dup.c
new file mode 100644
index 0000000000..d0f513753c
--- /dev/null
+++ b/usr/src/uts/common/brand/lx/syscall/lx_dup.c
@@ -0,0 +1,53 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source. A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2016 Joyent, Inc.
+ */
+
+#include <sys/types.h>
+#include <sys/filio.h>
+#include <sys/fcntl.h>
+#include <sys/stat.h>
+#include <sys/lx_fcntl.h>
+#include <sys/lx_misc.h>
+
+/* From usr/src/uts/common/syscall/fcntl.c */
+extern int fcntl(int, int, intptr_t);
+
+long
+lx_dup(int fd)
+{
+ return (fcntl(fd, F_DUPFD, 0));
+}
+
+long
+lx_dup2(int oldfd, int newfd)
+{
+ return (fcntl(oldfd, F_DUP2FD, newfd));
+}
+
+long
+lx_dup3(int oldfd, int newfd, int flags)
+{
+ int rc;
+
+ /* The only valid flag is O_CLOEXEC. */
+ if (flags & ~LX_O_CLOEXEC)
+ return (set_errno(EINVAL));
+
+ /* Only DUP2FD_CLOEXEC returns EINVAL on the same fd's */
+ if (oldfd == newfd)
+ return (set_errno(EINVAL));
+
+ rc = fcntl(oldfd, (flags == 0) ? F_DUP2FD : F_DUP2FD_CLOEXEC, newfd);
+ return (rc);
+}
diff --git a/usr/src/uts/common/brand/lx/syscall/lx_id.c b/usr/src/uts/common/brand/lx/syscall/lx_id.c
index f940b9763a..9bcd2dc8ad 100644
--- a/usr/src/uts/common/brand/lx/syscall/lx_id.c
+++ b/usr/src/uts/common/brand/lx/syscall/lx_id.c
@@ -30,30 +30,125 @@
#include <sys/systm.h>
#include <sys/errno.h>
#include <sys/zone.h>
+#include <sys/cred.h>
#include <sys/cred_impl.h>
#include <sys/policy.h>
+#include <sys/lx_types.h>
-typedef ushort_t l_uid16_t;
-typedef ushort_t l_gid16_t;
-typedef uint_t l_uid_t;
-typedef uint_t l_gid_t;
-
-#define LINUX_UID16_TO_UID32(uid16) \
- (((uid16) == (l_uid16_t)-1) ? ((l_uid_t)-1) : (l_uid_t)(uid16))
+#define LX_NGROUPS_MAX 32
-#define LINUX_GID16_TO_GID32(gid16) \
- (((gid16) == (l_gid16_t)-1) ? ((l_gid_t)-1) : (l_gid_t)(gid16))
+/* From usr/src/uts/common/syscall/gid.c & uid.c */
+extern int setgid(gid_t);
+extern int setregid(gid_t, gid_t);
+extern int setreuid(uid_t, uid_t);
+extern int setuid(uid_t);
-#define LX_NGROUPS_MAX 32
+/* From usr/src/uts/common/syscall/groups.c */
extern int setgroups(int, gid_t *);
+long
+lx_getegid(void)
+{
+ return (crgetgid(CRED()));
+}
+
+long
+lx_getegid16(void)
+{
+ return ((int)LX_GID32_TO_GID16(crgetgid(CRED())));
+}
+
+long
+lx_geteuid(void)
+{
+ return (crgetuid(CRED()));
+}
+
+long
+lx_geteuid16(void)
+{
+ return ((int)LX_UID32_TO_UID16(crgetuid(CRED())));
+}
+
+long
+lx_getgid(void)
+{
+ return (crgetrgid(CRED()));
+}
+
+long
+lx_getgid16(void)
+{
+ return ((int)LX_GID32_TO_GID16(crgetrgid(CRED())));
+}
+
+long
+lx_getuid(void)
+{
+ return (crgetruid(CRED()));
+}
+
+long
+lx_getuid16(void)
+{
+ return ((int)LX_UID32_TO_UID16(crgetruid(CRED())));
+}
+
+long
+lx_setgid(gid_t gid)
+{
+ return (setgid(gid));
+}
+
+long
+lx_setgid16(lx_gid16_t gid)
+{
+ return (setgid(LX_GID16_TO_GID32(gid)));
+}
+
+long
+lx_setregid(gid_t rgid, gid_t egid)
+{
+ return (setregid(rgid, egid));
+}
+
+long
+lx_setregid16(lx_gid16_t rgid, lx_gid16_t egid)
+{
+ return (setregid(LX_UID16_TO_UID32(rgid), LX_UID16_TO_UID32(egid)));
+}
+
+long
+lx_setreuid(uid_t ruid, uid_t euid)
+{
+ return (setreuid(ruid, euid));
+}
+
+long
+lx_setreuid16(lx_uid16_t ruid, lx_uid16_t euid)
+{
+ return (setreuid(LX_UID16_TO_UID32(ruid), LX_UID16_TO_UID32(euid)));
+}
+
+long
+lx_setuid(uid_t uid)
+{
+ return (setuid(uid));
+}
+
+long
+lx_setuid16(lx_uid16_t uid)
+{
+ return (setuid(LX_UID16_TO_UID32(uid)));
+}
+
/*
* This function is based on setreuid in common/syscall/uid.c and exists
* because illumos does not have a way to explicitly set the saved uid (suid)
* from any other system call.
*/
long
-lx_setresuid(l_uid_t ruid, l_uid_t euid, l_uid_t suid)
+lx_setresuid(lx_uid_t ruid, lx_uid_t euid, lx_uid_t suid)
{
proc_t *p;
int error = 0;
@@ -173,14 +268,14 @@ done:
}
long
-lx_setresuid16(l_uid16_t ruid16, l_uid16_t euid16, l_uid16_t suid16)
+lx_setresuid16(lx_uid16_t ruid16, lx_uid16_t euid16, lx_uid16_t suid16)
{
long rval;
rval = lx_setresuid(
- LINUX_UID16_TO_UID32(ruid16),
- LINUX_UID16_TO_UID32(euid16),
- LINUX_UID16_TO_UID32(suid16));
+ LX_UID16_TO_UID32(ruid16),
+ LX_UID16_TO_UID32(euid16),
+ LX_UID16_TO_UID32(suid16));
return (rval);
}
@@ -189,7 +284,7 @@ lx_setresuid16(l_uid16_t ruid16, l_uid16_t euid16, l_uid16_t suid16)
* This function is based on setregid in common/syscall/gid.c
*/
long
-lx_setresgid(l_gid_t rgid, l_gid_t egid, l_gid_t sgid)
+lx_setresgid(lx_gid_t rgid, lx_gid_t egid, lx_gid_t sgid)
{
proc_t *p;
int error = 0;
@@ -268,14 +363,14 @@ done:
}
long
-lx_setresgid16(l_gid16_t rgid16, l_gid16_t egid16, l_gid16_t sgid16)
+lx_setresgid16(lx_gid16_t rgid16, lx_gid16_t egid16, lx_gid16_t sgid16)
{
long rval;
rval = lx_setresgid(
- LINUX_GID16_TO_GID32(rgid16),
- LINUX_GID16_TO_GID32(egid16),
- LINUX_GID16_TO_GID32(sgid16));
+ LX_GID16_TO_GID32(rgid16),
+ LX_GID16_TO_GID32(egid16),
+ LX_GID16_TO_GID32(sgid16));
return (rval);
}
@@ -294,3 +389,83 @@ lx_helper_setgroups(int ngroups, gid_t *grouplist)
return (setgroups(ngroups, grouplist));
}
+
+long
+lx_getresuid(lx_uid_t *ruid, lx_uid_t *euid, lx_uid_t *suid)
+{
+ lx_uid_t lx_ruid, lx_euid, lx_suid;
+ cred_t *cr = CRED();
+
+ lx_ruid = (lx_uid_t)crgetruid(cr);
+ lx_euid = (lx_uid_t)crgetuid(cr);
+ lx_suid = (lx_uid_t)crgetsuid(cr);
+
+ if (copyout(&lx_ruid, (void *)ruid, sizeof (lx_uid_t)) != 0)
+ return (set_errno(EFAULT));
+ if (copyout(&lx_euid, (void *)euid, sizeof (lx_uid_t)) != 0)
+ return (set_errno(EFAULT));
+ if (copyout(&lx_suid, (void *)suid, sizeof (lx_uid_t)) != 0)
+ return (set_errno(EFAULT));
+
+ return (0);
+}
+
+long
+lx_getresuid16(lx_uid16_t *ruid16, lx_uid16_t *euid16, lx_uid16_t *suid16)
+{
+ lx_uid16_t lx_ruid16, lx_euid16, lx_suid16;
+ cred_t *cr = CRED();
+
+ lx_ruid16 = LX_UID32_TO_UID16((lx_uid_t)crgetruid(cr));
+ lx_euid16 = LX_UID32_TO_UID16((lx_uid_t)crgetuid(cr));
+ lx_suid16 = LX_UID32_TO_UID16((lx_uid_t)crgetsuid(cr));
+
+ if (copyout(&lx_ruid16, (void *)ruid16, sizeof (lx_uid16_t)) != 0)
+ return (set_errno(EFAULT));
+ if (copyout(&lx_euid16, (void *)euid16, sizeof (lx_uid16_t)) != 0)
+ return (set_errno(EFAULT));
+ if (copyout(&lx_suid16, (void *)suid16, sizeof (lx_uid16_t)) != 0)
+ return (set_errno(EFAULT));
+
+ return (0);
+}
+
+long
+lx_getresgid(lx_gid_t *rgid, lx_gid_t *egid, lx_gid_t *sgid)
+{
+ lx_gid_t lx_rgid, lx_egid, lx_sgid;
+ cred_t *cr = CRED();
+
+ lx_rgid = (lx_gid_t)crgetrgid(cr);
+ lx_egid = (lx_gid_t)crgetgid(cr);
+ lx_sgid = (lx_gid_t)crgetsgid(cr);
+
+ if (copyout(&lx_rgid, (void *)rgid, sizeof (lx_gid_t)) != 0)
+ return (set_errno(EFAULT));
+ if (copyout(&lx_egid, (void *)egid, sizeof (lx_gid_t)) != 0)
+ return (set_errno(EFAULT));
+ if (copyout(&lx_sgid, (void *)sgid, sizeof (lx_gid_t)) != 0)
+ return (set_errno(EFAULT));
+
+ return (0);
+}
+
+long
+lx_getresgid16(lx_gid16_t *rgid16, lx_gid16_t *egid16, lx_gid16_t *sgid16)
+{
+ lx_gid16_t lx_rgid16, lx_egid16, lx_sgid16;
+ cred_t *cr = CRED();
+
+ lx_rgid16 = LX_GID32_TO_GID16((lx_gid_t)crgetrgid(cr));
+ lx_egid16 = LX_GID32_TO_GID16((lx_gid_t)crgetgid(cr));
+ lx_sgid16 = LX_GID32_TO_GID16((lx_gid_t)crgetsgid(cr));
+
+ if (copyout(&lx_rgid16, (void *)rgid16, sizeof (lx_gid16_t)) != 0)
+ return (set_errno(EFAULT));
+ if (copyout(&lx_egid16, (void *)egid16, sizeof (lx_gid16_t)) != 0)
+ return (set_errno(EFAULT));
+ if (copyout(&lx_sgid16, (void *)sgid16, sizeof (lx_gid16_t)) != 0)
+ return (set_errno(EFAULT));
+
+ return (0);
+}
diff --git a/usr/src/uts/common/brand/lx/syscall/lx_umask.c b/usr/src/uts/common/brand/lx/syscall/lx_umask.c
new file mode 100644
index 0000000000..130af6c776
--- /dev/null
+++ b/usr/src/uts/common/brand/lx/syscall/lx_umask.c
@@ -0,0 +1,25 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source. A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2016 Joyent, Inc.
+ */
+
+#include <sys/types.h>
+
+/* From usr/src/uts/common/syscall/umask.c */
+extern int umask(int);
+
+long
+lx_umask(mode_t cmask)
+{
+ return (umask(cmask));
+}
diff --git a/usr/src/uts/intel/Makefile.files b/usr/src/uts/intel/Makefile.files
index 3f8865ff1c..ff375b0c72 100644
--- a/usr/src/uts/intel/Makefile.files
+++ b/usr/src/uts/intel/Makefile.files
@@ -317,6 +317,7 @@ LX_BRAND_OBJS = \
lx_clone.o \
lx_close.o \
lx_cpu.o \
+ lx_dup.o \
lx_errno.o \
lx_epoll.o \
lx_fallocate.o \
@@ -355,6 +356,7 @@ LX_BRAND_OBJS = \
lx_sysinfo.o \
lx_thread_area.o \
lx_timer.o \
+ lx_umask.o \
lx_uname.o \
lx_wait.o \
lx_xattr.o