diff options
author | Theo Schlossnagle <jesus@omniti.com> | 2013-06-09 16:07:11 +0000 |
---|---|---|
committer | Gordon Ross <gwr@nexenta.com> | 2013-07-03 17:15:18 -0400 |
commit | b49b27dcb66b2c7f4a23f7bc158e2dde5cd79030 (patch) | |
tree | 04da740797c7f1336a8435a499a1a827fc5d2ab3 | |
parent | 0f94976e74ac54bd0c370887c9aa0838c90b539e (diff) | |
download | illumos-joyent-b49b27dcb66b2c7f4a23f7bc158e2dde5cd79030.tar.gz |
3809 Recent libc change breaks Solaris 10 Branded Zone Support
Reviewed by: Andrzej Szeszo <aszeszo@gmail.com>
Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com>
Approved by: Gordon Ross <gwr@nexenta.com>
-rw-r--r-- | usr/src/lib/brand/solaris10/s10_brand/common/s10_brand.c | 49 | ||||
-rw-r--r-- | usr/src/uts/common/brand/solaris10/s10_brand.c | 4 | ||||
-rw-r--r-- | usr/src/uts/common/brand/solaris10/s10_brand.h | 4 |
3 files changed, 54 insertions, 3 deletions
diff --git a/usr/src/lib/brand/solaris10/s10_brand/common/s10_brand.c b/usr/src/lib/brand/solaris10/s10_brand/common/s10_brand.c index f179a3d44f..eb91f5212d 100644 --- a/usr/src/lib/brand/solaris10/s10_brand/common/s10_brand.c +++ b/usr/src/lib/brand/solaris10/s10_brand/common/s10_brand.c @@ -20,6 +20,7 @@ */ /* + * Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved. * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. */ @@ -59,6 +60,7 @@ #include <sys/lofi.h> #include <atomic.h> #include <sys/acl.h> +#include <sys/socket.h> #include <s10_brand.h> #include <brand_misc.h> @@ -1386,6 +1388,47 @@ s10_issetugid(sysret_t *rval) 0, 0, 0, 0, 0)); } +/* + * S10's socket() syscall does not split type and flags + */ +static int +s10_so_socket(sysret_t *rval, int domain, int type, int protocol, + char *devpath, int version) +{ + if ((type & ~SOCK_TYPE_MASK) != 0) { + errno = EINVAL; + return (-1); + } + return (__systemcall(rval, SYS_so_socket + 1024, domain, type, + protocol, devpath, version)); +} + +/* + * S10's pipe() syscall has a different calling convention + */ +static int +s10_pipe(sysret_t *rval) +{ + int fds[2], err; + if ((err = __systemcall(rval, SYS_pipe + 1024, fds, 0)) != 0) + return (err); + + rval->sys_rval1 = fds[0]; + rval->sys_rval2 = fds[1]; + return (0); +} + +/* + * S10's accept() syscall takes three arguments + */ +static int +s10_accept(sysret_t *rval, int sock, struct sockaddr *addr, uint_t *addrlen, + int version) +{ + return (__systemcall(rval, SYS_accept + 1024, sock, addr, addrlen, + version, 0)); +} + static long s10_uname(sysret_t *rv, uintptr_t p1) { @@ -1900,7 +1943,7 @@ brand_sysent_table_t brand_sysent_table[] = { NOSYS, /* 39 */ NOSYS, /* 40 */ EMULATE(s10_dup, 1 | RV_DEFAULT), /* 41 */ - NOSYS, /* 42 */ + EMULATE(s10_pipe, 0 | RV_32RVAL2), /* 42 */ NOSYS, /* 43 */ NOSYS, /* 44 */ NOSYS, /* 45 */ @@ -2115,11 +2158,11 @@ brand_sysent_table_t brand_sysent_table[] = { EMULATE(s10_zone, 5 | RV_DEFAULT), /* 227 */ NOSYS, /* 228 */ NOSYS, /* 229 */ - NOSYS, /* 230 */ + EMULATE(s10_so_socket, 5 | RV_DEFAULT), /* 230 */ NOSYS, /* 231 */ NOSYS, /* 232 */ NOSYS, /* 233 */ - NOSYS, /* 234 */ + EMULATE(s10_accept, 4 | RV_DEFAULT), /* 234 */ NOSYS, /* 235 */ NOSYS, /* 236 */ NOSYS, /* 237 */ diff --git a/usr/src/uts/common/brand/solaris10/s10_brand.c b/usr/src/uts/common/brand/solaris10/s10_brand.c index 3efc9ef6b3..f24b864eef 100644 --- a/usr/src/uts/common/brand/solaris10/s10_brand.c +++ b/usr/src/uts/common/brand/solaris10/s10_brand.c @@ -20,6 +20,7 @@ */ /* + * Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved. * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. */ @@ -497,6 +498,7 @@ _init(void) s10_emulation_table[S10_SYS_access] = 1; /* 33 */ s10_emulation_table[SYS_kill] = 1; /* 37 */ s10_emulation_table[S10_SYS_dup] = 1; /* 41 */ + s10_emulation_table[S10_SYS_pipe] = 1; /* 42 */ s10_emulation_table[SYS_ioctl] = 1; /* 54 */ s10_emulation_table[SYS_execve] = 1; /* 59 */ s10_emulation_table[SYS_acctctl] = 1; /* 71 */ @@ -554,6 +556,8 @@ _init(void) s10_emulation_table[S10_SYS_creat64] = 1; /* 224 */ s10_emulation_table[S10_SYS_open64] = 1; /* 225 */ s10_emulation_table[SYS_zone] = 1; /* 227 */ + s10_emulation_table[S10_SYS_so_socket] = 1; /* 230 */ + s10_emulation_table[S10_SYS_accept] = 1; /* 234 */ s10_emulation_table[SYS_lwp_mutex_trylock] = 1; /* 251 */ err = mod_install(&modlinkage); diff --git a/usr/src/uts/common/brand/solaris10/s10_brand.h b/usr/src/uts/common/brand/solaris10/s10_brand.h index 0112a783bb..11f9853f48 100644 --- a/usr/src/uts/common/brand/solaris10/s10_brand.h +++ b/usr/src/uts/common/brand/solaris10/s10_brand.h @@ -20,6 +20,7 @@ */ /* + * Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved. * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. */ @@ -119,6 +120,7 @@ enum s10_emulated_features { #define S10_SYS_utime 30 #define S10_SYS_access 33 #define S10_SYS_dup 41 +#define S10_SYS_pipe 42 #define S10_SYS_issetugid 75 #define S10_SYS_fsat 76 #define S10_SYS_rmdir 79 @@ -144,6 +146,8 @@ enum s10_emulated_features { #define S10_SYS_fstat64 217 #define S10_SYS_creat64 224 #define S10_SYS_open64 225 +#define S10_SYS_so_socket 230 +#define S10_SYS_accept 234 /* * solaris10-brand-specific attributes |