Print this page
sysinfo emulation

*** 35,44 **** --- 35,45 ---- #include <sys/inttypes.h> #include <sys/lwp.h> #include <sys/syscall.h> #include <sys/systm.h> #include <sys/utsname.h> + #include <sys/systeminfo.h> #include <sys/zone.h> #include <sys/stat.h> #include <sys/mntent.h> #include <sys/ctfs.h> #include <sys/priv.h>
*** 643,652 **** --- 644,705 ---- return (EFAULT); return (0); } + int + s10_sysinfo(sysret_t *rv, int command, char *buf, long count) + { + char *value; + int err, len; + + /* + * We must interpose on the sysinfo(2) commands SI_RELEASE and + * SI_VERSION; all others get passed to the native sysinfo(2) + * command. + */ + switch (command) { + case SI_RELEASE: + value = S10_UTS_RELEASE; + break; + + case SI_VERSION: + value = S10_UTS_VERSION; + break; + + default: + /* + * The default action is to pass the command to the + * native sysinfo(2) syscall. + */ + if ((err = __systemcall(rv, SYS_systeminfo + 1024, + command, buf, count)) != 0) + return (err); + + return (0); + } + + len = strlen(value) + 1; + if (count > 0) { + if (s10_uucopystr(value, buf, count) != 0) + return (EFAULT); + + /* Assure NULL termination of buf as s10_uucopystr() doesn't. */ + if (len > count && s10_uucopy("\0", buf + (count - 1), 1) != 0) + return (EFAULT); + } + + /* + * On success, sysinfo(2) returns the size of buffer required to hold + * the complete value plus its terminating NULL byte. + */ + rv->sys_rval1 = len; + rv->sys_rval2 = 0; + S10_TRUSS_POINT_3(rv, SYS_systeminfo, 0, command, buf, count); + return (0); + } + /* * If the emul_global_zone flag is set then emulate some aspects of the * zone system call. In particular, emulate the global zone ID on the * ZONE_LOOKUP subcommand and emulate some of the global zone attributes * on the ZONE_GETATTR subcommand. If the flag is not set or we're performing
*** 1129,1139 **** NOSYS, /* 134 */ EMULATE(s10_uname, 1 | RV_DEFAULT), /* 135 */ NOSYS, /* 136 */ NOSYS, /* 137 */ NOSYS, /* 138 */ ! NOSYS, /* 139 */ NOSYS, /* 140 */ NOSYS, /* 141 */ NOSYS, /* 142 */ NOSYS, /* 143 */ NOSYS, /* 144 */ --- 1182,1192 ---- NOSYS, /* 134 */ EMULATE(s10_uname, 1 | RV_DEFAULT), /* 135 */ NOSYS, /* 136 */ NOSYS, /* 137 */ NOSYS, /* 138 */ ! EMULATE(s10_sysinfo, 3 | RV_DEFAULT), /* 139 */ NOSYS, /* 140 */ NOSYS, /* 141 */ NOSYS, /* 142 */ NOSYS, /* 143 */ NOSYS, /* 144 */