diff options
Diffstat (limited to 'sys/compat/osf1/osf1_misc.c')
-rw-r--r-- | sys/compat/osf1/osf1_misc.c | 1025 |
1 files changed, 194 insertions, 831 deletions
diff --git a/sys/compat/osf1/osf1_misc.c b/sys/compat/osf1/osf1_misc.c index 272308b3272..0800adcce1b 100644 --- a/sys/compat/osf1/osf1_misc.c +++ b/sys/compat/osf1/osf1_misc.c @@ -1,5 +1,35 @@ -/* $OpenBSD: osf1_misc.c,v 1.11 1999/11/10 15:55:23 mickey Exp $ */ -/* $NetBSD: osf1_misc.c,v 1.7 1995/10/07 06:53:04 mycroft Exp $ */ +/* $OpenBSD: osf1_misc.c,v 1.12 2000/08/04 15:47:55 ericj Exp $ */ +/* $NetBSD: osf1_misc.c,v 1.55 2000/06/28 15:39:33 mrg Exp $ */ + +/* + * Copyright (c) 1999 Christopher G. Demetriou. 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christopher G. Demetriou + * for the NetBSD Project. + * 4. 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. + */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -41,949 +71,282 @@ #include <sys/mount.h> #include <sys/signal.h> #include <sys/signalvar.h> -#include <sys/socketvar.h> #include <sys/reboot.h> #include <sys/syscallargs.h> +#include <sys/exec.h> #include <sys/vnode.h> +#include <sys/socketvar.h> +#include <sys/resource.h> +#include <sys/resourcevar.h> +#include <sys/wait.h> -#include <compat/osf1/osf1_syscall.h> +#include <compat/osf1/osf1.h> #include <compat/osf1/osf1_syscallargs.h> #include <compat/osf1/osf1_util.h> - -#include <vm/vm.h> +#include <compat/osf1/osf1_cvt.h> #ifdef SYSCALL_DEBUG extern int scdebug; -extern char *osf1_syscallnames[]; -#endif - -extern struct sysent osf1_sysent[]; -extern void cpu_exec_ecoff_setregs __P((struct proc *, struct exec_package *, - u_long, register_t *)); - -extern char sigcode[], esigcode[]; - -void cvtstat2osf1 __P((struct stat *, struct osf1_stat *)); - -struct emul emul_osf1 = { - "osf1", - NULL, - sendsig, - OSF1_SYS_syscall, - OSF1_SYS_MAXSYSCALL, - osf1_sysent, -#ifdef SYSCALL_DEBUG - osf1_syscallnames, -#else - NULL, -#endif - 0, - copyargs, - cpu_exec_ecoff_setregs, - NULL, - sigcode, - esigcode, -}; - -int -osf1_sys_open(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_open_args /* { - syscallarg(char *) path; - syscallarg(int) flags; - syscallarg(int) mode; - } */ *uap = v; - struct sys_open_args /* { - syscallarg(char *) path; - syscallarg(int) flags; - syscallarg(int) mode; - } */ a; -#ifdef SYSCALL_DEBUG - char pnbuf[1024]; - - if (scdebug && - copyinstr(SCARG(uap, path), pnbuf, sizeof pnbuf, NULL) == 0) - printf("osf1_open: open: %s\n", pnbuf); #endif - SCARG(&a, path) = SCARG(uap, path); - SCARG(&a, flags) = SCARG(uap, flags); /* XXX translate */ - SCARG(&a, mode) = SCARG(uap, mode); - - return sys_open(p, &a, retval); -} +const char osf1_emul_path[] = "/emul/osf1"; int -osf1_sys_setsysinfo(p, v, retval) +osf1_sys_classcntl(p, v, retval) struct proc *p; void *v; register_t *retval; { -#if 0 - struct osf1_setsysinfo_args /* { - syscallarg(u_long) op; - syscallarg(caddr_t) buffer; - syscallarg(u_long) nbytes; - syscallarg(caddr_t) arg; - syscallarg(u_long) flag; - } */ *uap = v; -#endif; - return (0); + /* XXX */ + return (ENOSYS); } -#define OSF1_RLIMIT_LASTCOMMON 5 /* last one that's common */ -#define OSF1_RLIMIT_NOFILE 6 /* OSF1's RLIMIT_NOFILE */ -#define OSF1_RLIMIT_NLIMITS 8 /* Number of OSF1 rlimits */ - int -osf1_sys_getrlimit(p, v, retval) +osf1_sys_reboot(p, v, retval) struct proc *p; void *v; register_t *retval; { - struct osf1_sys_getrlimit_args /* { - syscallarg(u_int) which; - syscallarg(struct rlimit *) rlp; - } */ *uap = v; - struct sys_getrlimit_args /* { - syscallarg(u_int) which; - syscallarg(struct rlimit *) rlp; - } */ a; - - if (SCARG(uap, which) >= OSF1_RLIMIT_NLIMITS) - return (EINVAL); - - if (SCARG(uap, which) <= OSF1_RLIMIT_LASTCOMMON) - SCARG(&a, which) = SCARG(uap, which); - else if (SCARG(uap, which) == OSF1_RLIMIT_NOFILE) - SCARG(&a, which) = RLIMIT_NOFILE; - else - return (0); - SCARG(&a, rlp) = SCARG(uap, rlp); - - return sys_getrlimit(p, &a, retval); -} + struct osf1_sys_reboot_args *uap = v; + struct sys_reboot_args a; + unsigned long leftovers; -int -osf1_sys_setrlimit(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_setrlimit_args /* { - syscallarg(u_int) which; - syscallarg(struct rlimit *) rlp; - } */ *uap = v; - struct sys_setrlimit_args /* { - syscallarg(u_int) which; - syscallarg(struct rlimit *) rlp; - } */ a; - - if (SCARG(uap, which) >= OSF1_RLIMIT_NLIMITS) + /* translate opt */ + SCARG(&a, opt) = emul_flags_translate(osf1_reboot_opt_xtab, + SCARG(uap, opt), &leftovers); + if (leftovers != 0) return (EINVAL); - if (SCARG(uap, which) <= OSF1_RLIMIT_LASTCOMMON) - SCARG(&a, which) = SCARG(uap, which); - else if (SCARG(uap, which) == OSF1_RLIMIT_NOFILE) - SCARG(&a, which) = RLIMIT_NOFILE; - else - return (0); - SCARG(&a, rlp) = SCARG(uap, rlp); - - return sys_setrlimit(p, &a, retval); -} - -#define OSF1_MAP_SHARED 0x001 -#define OSF1_MAP_PRIVATE 0x002 -#define OSF1_MAP_ANONYMOUS 0x010 -#define OSF1_MAP_FILE 0x000 -#define OSF1_MAP_TYPE 0x0f0 -#define OSF1_MAP_FIXED 0x100 -#define OSF1_MAP_HASSEMAPHORE 0x200 -#define OSF1_MAP_INHERIT 0x400 -#define OSF1_MAP_UNALIGNED 0x800 - -int -osf1_sys_mmap(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_mmap_args /* { - syscallarg(caddr_t) addr; - syscallarg(size_t) len; - syscallarg(int) prot; - syscallarg(int) flags; - syscallarg(int) fd; - syscallarg(off_t) pos; - } */ *uap = v; - struct sys_mmap_args /* { - syscallarg(caddr_t) addr; - syscallarg(size_t) len; - syscallarg(int) prot; - syscallarg(int) flags; - syscallarg(int) fd; - syscallarg(long) pad; - syscallarg(off_t) pos; - } */ a; - - SCARG(&a, addr) = SCARG(uap, addr); - SCARG(&a, len) = SCARG(uap, len); - SCARG(&a, prot) = SCARG(uap, prot); - SCARG(&a, fd) = SCARG(uap, fd); - SCARG(&a, pad) = 0; - SCARG(&a, pos) = SCARG(uap, pos); - - SCARG(&a, flags) = 0; - if (SCARG(uap, flags) & OSF1_MAP_SHARED) - SCARG(&a, flags) |= MAP_SHARED; - if (SCARG(uap, flags) & OSF1_MAP_PRIVATE) - SCARG(&a, flags) |= MAP_PRIVATE; - switch (SCARG(uap, flags) & OSF1_MAP_TYPE) { - case OSF1_MAP_ANONYMOUS: - SCARG(&a, flags) |= MAP_ANON; - break; - case OSF1_MAP_FILE: - SCARG(&a, flags) |= MAP_FILE; - break; - default: - return (EINVAL); - } - if (SCARG(uap, flags) & OSF1_MAP_FIXED) - SCARG(&a, flags) |= MAP_FIXED; - if (SCARG(uap, flags) & OSF1_MAP_HASSEMAPHORE) - SCARG(&a, flags) |= MAP_HASSEMAPHORE; - if (SCARG(uap, flags) & OSF1_MAP_INHERIT) - SCARG(&a, flags) |= MAP_INHERIT; - if (SCARG(uap, flags) & OSF1_MAP_UNALIGNED) - return (EINVAL); + /* SCARG(&a, bootstr) = NULL; */ - return sys_mmap(p, &a, retval); + return sys_reboot(p, &a, retval); } int -osf1_sys_usleep_thread(p, v, retval) +osf1_sys_set_program_attributes(p, v, retval) struct proc *p; void *v; register_t *retval; { - struct osf1_sys_usleep_thread_args /* { - syscallarg(struct timeval *) sleep; - syscallarg(struct timeval *) slept; - } */ *uap = v; - struct timeval tv, endtv; - u_long ticks; - int error, s; - - if ((error = copyin(SCARG(uap, sleep), &tv, sizeof tv)) != 0) - return (error); + struct osf1_sys_set_program_attributes_args *uap = v; + segsz_t tsize, dsize; - ticks = ((u_long)tv.tv_sec * 1000000 + tv.tv_usec) / tick; - s = splclock(); - tv = time; - splx(s); + tsize = btoc(SCARG(uap, tsize)); + dsize = btoc(SCARG(uap, dsize)); - tsleep(p, PUSER|PCATCH, "OSF/1", ticks); /* XXX */ + if (dsize > p->p_rlimit[RLIMIT_DATA].rlim_cur) + return (ENOMEM); + if (tsize > MAXTSIZ) + return (ENOMEM); - if (SCARG(uap, slept) != NULL) { - s = splclock(); - timersub(&time, &tv, &endtv); - splx(s); - if (tv.tv_sec < 0 || tv.tv_usec < 0) - tv.tv_sec = tv.tv_usec = 0; + p->p_vmspace->vm_taddr = SCARG(uap, taddr); + p->p_vmspace->vm_tsize = tsize; + p->p_vmspace->vm_daddr = SCARG(uap, daddr); + p->p_vmspace->vm_dsize = dsize; - error = copyout(&endtv, SCARG(uap, slept), sizeof endtv); - } - return (error); -} - -struct osf1_stat { - int32_t st_dev; - u_int32_t st_ino; - u_int32_t st_mode; - u_int16_t st_nlink; - u_int32_t st_uid; - u_int32_t st_gid; - int32_t st_rdev; - u_int64_t st_size; - int32_t st_atime_sec; - int32_t st_spare1; - int32_t st_mtime_sec; - int32_t st_spare2; - int32_t st_ctime_sec; - int32_t st_spare3; - u_int32_t st_blksize; - int32_t st_blocks; - u_int32_t st_flags; - u_int32_t st_gen; -}; - -/* - * Get file status; this version follows links. - */ -/* ARGSUSED */ -int -osf1_sys_stat(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - register struct osf1_sys_stat_args /* { - syscallarg(char *) path; - syscallarg(struct osf1_stat *) ub; - } */ *uap = v; - struct stat sb; - struct osf1_stat osb; - int error; - struct nameidata nd; - - NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, - SCARG(uap, path), p); - if ((error = namei(&nd)) != 0) - return (error); - error = vn_stat(nd.ni_vp, &sb, p); - vput(nd.ni_vp); - if (error) - return (error); - cvtstat2osf1(&sb, &osb); - error = copyout((caddr_t)&osb, (caddr_t)SCARG(uap, ub), sizeof (osb)); - return (error); + return (0); } -/* - * Get file status; this version does not follow links. - */ -/* ARGSUSED */ int -osf1_sys_lstat(p, v, retval) +osf1_sys_setsysinfo(p, v, retval) struct proc *p; void *v; register_t *retval; { - register struct osf1_sys_lstat_args /* { - syscallarg(char *) path; - syscallarg(struct osf1_stat *) ub; - } */ *uap = v; - struct stat sb; - struct osf1_stat osb; - int error; - struct nameidata nd; - NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF, UIO_USERSPACE, - SCARG(uap, path), p); - if ((error = namei(&nd)) != 0) - return (error); - error = vn_stat(nd.ni_vp, &sb, p); - vput(nd.ni_vp); - if (error) - return (error); - cvtstat2osf1(&sb, &osb); - error = copyout((caddr_t)&osb, (caddr_t)SCARG(uap, ub), sizeof (osb)); - return (error); + /* XXX */ + return (0); } -/* - * Return status information about a file descriptor. - */ int -osf1_sys_fstat(p, v, retval) +osf1_sys_sysinfo(p, v, retval) struct proc *p; void *v; register_t *retval; { - register struct osf1_sys_fstat_args /* { - syscallarg(int) fd; - syscallarg(struct osf1_stat *) sb; - } */ *uap = v; - register struct filedesc *fdp = p->p_fd; - register struct file *fp; - struct stat ub; - struct osf1_stat oub; + struct osf1_sys_sysinfo_args *uap = v; + const char *string; int error; - if ((unsigned)SCARG(uap, fd) >= fdp->fd_nfiles || - (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL) - return (EBADF); - switch (fp->f_type) { - - case DTYPE_VNODE: - error = vn_stat((struct vnode *)fp->f_data, &ub, p); + error = 0; + switch (SCARG(uap, cmd)) { + case OSF1_SI_SYSNAME: + goto should_handle; + /* string = ostype; */ break; - case DTYPE_SOCKET: - error = soo_stat((struct socket *)fp->f_data, &ub); + case OSF1_SI_HOSTNAME: + string = hostname; break; - default: - panic("ofstat"); - /*NOTREACHED*/ - } - cvtstat2osf1(&ub, &oub); - if (error == 0) - error = copyout((caddr_t)&oub, (caddr_t)SCARG(uap, sb), - sizeof (oub)); - return (error); -} - -#define bsd2osf_dev(dev) (major(dev) << 20 | minor(dev)) -#define osf2bsd_dev(dev) makedev((dev >> 20) & 0xfff, dev & 0xfffff) - -/* - * Convert from a stat structure to an osf1 stat structure. - */ -void -cvtstat2osf1(st, ost) - struct stat *st; - struct osf1_stat *ost; -{ - - ost->st_dev = bsd2osf_dev(st->st_dev); - ost->st_ino = st->st_ino; - ost->st_mode = st->st_mode; - ost->st_nlink = st->st_nlink; - ost->st_uid = st->st_uid == -2 ? (u_int16_t) -2 : st->st_uid; - ost->st_gid = st->st_gid == -2 ? (u_int16_t) -2 : st->st_gid; - ost->st_rdev = bsd2osf_dev(st->st_rdev); - ost->st_size = st->st_size; - ost->st_atime_sec = st->st_atime; - ost->st_spare1 = 0; - ost->st_mtime_sec = st->st_mtime; - ost->st_spare2 = 0; - ost->st_ctime_sec = st->st_ctime; - ost->st_spare3 = 0; - ost->st_blksize = st->st_blksize; - ost->st_blocks = st->st_blocks; - ost->st_flags = st->st_flags; - ost->st_gen = st->st_gen; -} - -int -osf1_sys_mknod(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_mknod_args /* { - syscallarg(char *) path; - syscallarg(int) mode; - syscallarg(int) dev; - } */ *uap = v; - struct sys_mknod_args a; - - SCARG(&a, path) = SCARG(uap, path); - SCARG(&a, mode) = SCARG(uap, mode); - SCARG(&a, dev) = osf2bsd_dev(SCARG(uap, dev)); - - return sys_mknod(p, &a, retval); -} - -#define OSF1_F_DUPFD 0 -#define OSF1_F_GETFD 1 -#define OSF1_F_SETFD 2 -#define OSF1_F_GETFL 3 -#define OSF1_F_SETFL 4 - -#define OSF1_FAPPEND 0x00008 /* XXX OSF1_O_APPEND */ -#define OSF1_FNONBLOCK 0x00004 /* XXX OSF1_O_NONBLOCK */ -#define OSF1_FASYNC 0x00040 -#define OSF1_FSYNC 0x04000 /* XXX OSF1_O_SYNC */ - -int -osf1_sys_fcntl(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_fcntl_args /* { - syscallarg(int) fd; - syscallarg(int) cmd; - syscallarg(void *) arg; - } */ *uap = v; - struct sys_fcntl_args a; - long tmp; - int error; + case OSF1_SI_RELEASE: + string = version; + break; - SCARG(&a, fd) = SCARG(uap, fd); + case OSF1_SI_VERSION: + goto should_handle; - switch (SCARG(uap, cmd)) { - case OSF1_F_DUPFD: - SCARG(&a, cmd) = F_DUPFD; - SCARG(&a, arg) = SCARG(uap, arg); + case OSF1_SI_MACHINE: + string = MACHINE; break; - case OSF1_F_GETFD: - SCARG(&a, cmd) = F_GETFD; - SCARG(&a, arg) = SCARG(uap, arg); + case OSF1_SI_ARCHITECTURE: + string = MACHINE_ARCH; break; - case OSF1_F_SETFD: - SCARG(&a, cmd) = F_SETFD; - SCARG(&a, arg) = SCARG(uap, arg); + case OSF1_SI_HW_SERIAL: + string = "666"; /* OSF/1 emulation? YES! */ break; - case OSF1_F_GETFL: - SCARG(&a, cmd) = F_GETFL; - SCARG(&a, arg) = SCARG(uap, arg); /* ignored */ + case OSF1_SI_HW_PROVIDER: + string = "unknown"; break; - case OSF1_F_SETFL: - SCARG(&a, cmd) = F_SETFL; - tmp = 0; - if ((long)SCARG(uap, arg) & OSF1_FAPPEND) - tmp |= FAPPEND; - if ((long)SCARG(uap, arg) & OSF1_FNONBLOCK) - tmp |= FNONBLOCK; - if ((long)SCARG(uap, arg) & OSF1_FASYNC) - tmp |= FASYNC; - if ((long)SCARG(uap, arg) & OSF1_FSYNC) - tmp |= FFSYNC; - SCARG(&a, arg) = (void *)tmp; - break; + case OSF1_SI_SRPC_DOMAIN: + goto dont_care; - default: /* XXX other cases */ - return (EINVAL); - } + case OSF1_SI_SET_HOSTNAME: + goto should_handle; - error = sys_fcntl(p, &a, retval); + case OSF1_SI_SET_SYSNAME: + goto should_handle; - if (error) - return error; + case OSF1_SI_SET_SRPC_DOMAIN: + goto dont_care; - switch (SCARG(uap, cmd)) { - case OSF1_F_GETFL: - /* XXX */ + default: +should_handle: + printf("osf1_sys_sysinfo(%d, %p, 0x%lx)\n", SCARG(uap, cmd), + SCARG(uap, buf), SCARG(uap,len)); +dont_care: + error = EINVAL; break; - } - - return error; -} + }; -int -osf1_sys_poll(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - register struct osf1_sys_poll_args /* { - syscallarg(struct pollfd *) fds; - syscallarg(unsigned int) nfds; - syscallarg(int) timeout; - } */ *uap = v; - struct sys_poll_args a; - - SCARG(&a, fds) = SCARG(uap, fds); - SCARG(&a, nfds) = SCARG(uap, nfds); - SCARG(&a, timeout) = SCARG(uap, timeout); - - return sys_poll(p, &a, retval); -} - -int -osf1_sys_socket(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - register struct osf1_sys_socket_args /* { - syscallarg(int) domain; - syscallarg(int) type; - syscallarg(int) protocol; - } */ *uap = v; - struct sys_socket_args a; - - if (SCARG(uap, type) > AF_LINK) - return (EINVAL); /* XXX After AF_LINK, divergence. */ - - SCARG(&a, domain) = SCARG(uap, domain); - SCARG(&a, type) = SCARG(uap, type); - SCARG(&a, protocol) = SCARG(uap, protocol); + if (error == 0) + error = copyoutstr(string, SCARG(uap, buf), SCARG(uap, len), + NULL); - return sys_socket(p, &a, retval); + return (error); } int -osf1_sys_sendto(p, v, retval) +osf1_sys_uname(p, v, retval) struct proc *p; void *v; register_t *retval; { - register struct osf1_sys_sendto_args /* { - syscallarg(int) s; - syscallarg(const void *) buf; - syscallarg(size_t) len; - syscallarg(int) flags; - syscallarg(const struct sockaddr *) to; - syscallarg(int) tolen; - } */ *uap = v; - struct sys_sendto_args a; - - if (SCARG(uap, flags) & ~0x7f) /* unsupported flags */ - return (EINVAL); - - SCARG(&a, s) = SCARG(uap, s); - SCARG(&a, buf) = SCARG(uap, buf); - SCARG(&a, len) = SCARG(uap, len); - SCARG(&a, flags) = SCARG(uap, flags); - SCARG(&a, to) = SCARG(uap, to); - SCARG(&a, tolen) = SCARG(uap, tolen); - - return sys_sendto(p, &a, retval); + struct osf1_sys_uname_args *uap = v; + struct osf1_utsname u; + const char *cp; + char *dp, *ep; + + /* XXX would use stackgap, but our struct utsname is too big! */ + /* + * strncpy(u.sysname, ostype, sizeof(u.sysname)); + */ + strncpy(u.sysname, "OpenBSD", sizeof(u.sysname)); + strncpy(u.nodename, hostname, sizeof(u.nodename)); + strncpy(u.release, version, sizeof(u.release)); + dp = u.version; + ep = &u.version[sizeof(u.version) - 1]; + for (cp = version; *cp && *cp != '('; cp++) + ; + for (cp++; *cp && *cp != ')' && dp < ep; cp++) + *dp++ = *cp; + for (; *cp && *cp != '#'; cp++) + ; + for (; *cp && *cp != ':' && dp < ep; cp++) + *dp++ = *cp; + *dp = '\0'; + strncpy(u.machine, MACHINE, sizeof(u.machine)); + return (copyout((caddr_t)&u, (caddr_t)SCARG(uap, name), sizeof u)); } -#define OSF1_RB_ASKNAME 0x001 -#define OSF1_RB_SINGLE 0x002 -#define OSF1_RB_NOSYNC 0x004 -#define OSF1_RB_HALT 0x008 -#define OSF1_RB_INITNAME 0x010 -#define OSF1_RB_DFLTROOT 0x020 -#define OSF1_RB_ALTBOOT 0x040 -#define OSF1_RB_UNIPROC 0x080 -#define OSF1_RB_ALLFLAGS 0x0ff /* all of the above */ - int -osf1_sys_reboot(p, v, retval) +osf1_sys_usleep_thread(p, v, retval) struct proc *p; void *v; register_t *retval; { - struct osf1_sys_reboot_args /* { - syscallarg(int) opt; - } */ *uap = v; - struct sys_reboot_args a; + struct osf1_sys_usleep_thread_args *uap = v; + struct osf1_timeval otv, endotv; + struct timeval tv, endtv; + u_long ticks; + int error, s; - if (SCARG(uap, opt) & ~OSF1_RB_ALLFLAGS && - SCARG(uap, opt) & (OSF1_RB_ALTBOOT|OSF1_RB_UNIPROC)) - return (EINVAL); + if ((error = copyin(SCARG(uap, sleep), &otv, sizeof otv))) + return (error); + tv.tv_sec = otv.tv_sec; + tv.tv_usec = otv.tv_usec; - SCARG(&a, opt) = 0; - if (SCARG(uap, opt) & OSF1_RB_ASKNAME) - SCARG(&a, opt) |= RB_ASKNAME; - if (SCARG(uap, opt) & OSF1_RB_SINGLE) - SCARG(&a, opt) |= RB_SINGLE; - if (SCARG(uap, opt) & OSF1_RB_NOSYNC) - SCARG(&a, opt) |= RB_NOSYNC; - if (SCARG(uap, opt) & OSF1_RB_HALT) - SCARG(&a, opt) |= RB_HALT; - if (SCARG(uap, opt) & OSF1_RB_INITNAME) - SCARG(&a, opt) |= RB_INITNAME; - if (SCARG(uap, opt) & OSF1_RB_DFLTROOT) - SCARG(&a, opt) |= RB_DFLTROOT; + ticks = howmany((u_long)tv.tv_sec * 1000000 + tv.tv_usec, tick); + if (ticks == 0) + ticks = 1; - return sys_reboot(p, &a, retval); -} + s = splclock(); + tv = time; + splx(s); -int -osf1_sys_lseek(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_lseek_args /* { - syscallarg(int) fd; - syscallarg(off_t) offset; - syscallarg(int) whence; - } */ *uap = v; - struct sys_lseek_args a; - - SCARG(&a, fd) = SCARG(uap, fd); - SCARG(&a, pad) = 0; - SCARG(&a, offset) = SCARG(uap, offset); - SCARG(&a, whence) = SCARG(uap, whence); - - return sys_lseek(p, &a, retval); -} + tsleep(p, PUSER|PCATCH, "uslpthrd", ticks); /* XXX */ -/* - * OSF/1 defines _POSIX_SAVED_IDS, which means that our normal - * setuid() won't work. - * - * Instead, by P1003.1b-1993, setuid() is supposed to work like: - * If the process has appropriate [super-user] priviledges, the - * setuid() function sets the real user ID, effective user - * ID, and the saved set-user-ID to uid. - * If the process does not have appropriate priviledges, but uid - * is equal to the real user ID or the saved set-user-ID, the - * setuid() function sets the effective user ID to uid; the - * real user ID and saved set-user-ID remain unchanged by - * this function call. - */ -int -osf1_sys_setuid(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_setuid_args /* { - syscallargs(uid_t) uid; - } */ *uap = v; - register struct pcred *pc = p->p_cred; - uid_t uid = SCARG(uap, uid); - int error; - - if ((error = suser(pc->pc_ucred, &p->p_acflag)) != 0 && - uid != pc->p_ruid && uid != pc->p_svuid) - return (error); + if (SCARG(uap, slept) != NULL) { + s = splclock(); + timersub(&time, &tv, &endtv); + splx(s); + if (endtv.tv_sec < 0 || endtv.tv_usec < 0) + endtv.tv_sec = endtv.tv_usec = 0; - pc->pc_ucred = crcopy(pc->pc_ucred); - pc->pc_ucred->cr_uid = uid; - if (error == 0) { - (void)chgproccnt(pc->p_ruid, -1); - (void)chgproccnt(uid, 1); - pc->p_ruid = uid; - pc->p_svuid = uid; + endotv.tv_sec = endtv.tv_sec; + endotv.tv_usec = endtv.tv_usec; + error = copyout(&endotv, SCARG(uap, slept), sizeof endotv); } - p->p_flag |= P_SUGID; - return (0); + return (error); } -/* - * OSF/1 defines _POSIX_SAVED_IDS, which means that our normal - * setgid() won't work. - * - * If you change "uid" to "gid" in the discussion, above, about - * setuid(), you'll get a correct description of setgid(). - */ int -osf1_sys_setgid(p, v, retval) +osf1_sys_wait4(p, v, retval) struct proc *p; void *v; register_t *retval; { - struct osf1_sys_setgid_args /* { - syscallargs(gid_t) gid; - } */ *uap = v; - register struct pcred *pc = p->p_cred; - gid_t gid = SCARG(uap, gid); + struct osf1_sys_wait4_args *uap = v; + struct sys_wait4_args a; + struct osf1_rusage osf1_rusage; + struct rusage netbsd_rusage; + unsigned long leftovers; + caddr_t sg; int error; - if ((error = suser(pc->pc_ucred, &p->p_acflag)) != 0 && - gid != pc->p_rgid && gid != pc->p_svgid) - return (error); - - pc->pc_ucred = crcopy(pc->pc_ucred); - pc->pc_ucred->cr_gid = gid; - if (error == 0) { - pc->p_rgid = gid; - pc->p_svgid = gid; - } - p->p_flag |= P_SUGID; - return (0); -} - -/* - * The structures end up being the same... but we can't be sure that - * the other word of our iov_len is zero! - */ -struct osf1_iovec { - char *iov_base; - int iov_len; -}; + SCARG(&a, pid) = SCARG(uap, pid); + SCARG(&a, status) = SCARG(uap, status); -int -osf1_sys_readv(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_readv_args /* { - syscallarg(int) fd; - syscallarg(struct osf1_iovec *) iovp; - syscallarg(u_int) iovcnt; - } */ *uap = v; - struct sys_readv_args /* { - syscallarg(int) fd; - syscallarg(struct iovec *) iovp; - syscallarg(u_int) iovcnt; - } */ a; - struct emul *e = p->p_emul; - struct osf1_iovec *oio; - struct iovec *nio; - int error, i; - - if (SCARG(uap, iovcnt) > (STACKGAPLEN / sizeof (struct iovec))) + /* translate options */ + SCARG(&a, options) = emul_flags_translate(osf1_wait_options_xtab, + SCARG(uap, options), &leftovers); + if (leftovers != 0) return (EINVAL); - oio = (struct osf1_iovec *) - malloc(SCARG(uap, iovcnt)*sizeof (struct osf1_iovec), - M_TEMP, M_WAITOK); - nio = (struct iovec *)malloc(SCARG(uap, iovcnt)*sizeof (struct iovec), - M_TEMP, M_WAITOK); - - error = 0; - if ((error = copyin(SCARG(uap, iovp), oio, - SCARG(uap, iovcnt) * sizeof (struct osf1_iovec))) != 0) - goto punt; - for (i = 0; i < SCARG(uap, iovcnt); i++) { - nio[i].iov_base = oio[i].iov_base; - nio[i].iov_len = oio[i].iov_len; + if (SCARG(uap, rusage) == NULL) + SCARG(&a, rusage) = NULL; + else { + sg = stackgap_init(p->p_emul); + SCARG(&a, rusage) = stackgap_alloc(&sg, sizeof netbsd_rusage); } - SCARG(&a, fd) = SCARG(uap, fd); - SCARG(&a, iovp) = (struct iovec *)STACKGAPBASE; - SCARG(&a, iovcnt) = SCARG(uap, iovcnt); - - if ((error = copyout(nio, (caddr_t)SCARG(&a, iovp), - SCARG(uap, iovcnt) * sizeof (struct iovec))) != 0) - goto punt; - error = sys_readv(p, &a, retval); - -punt: - free(oio, M_TEMP); - free(nio, M_TEMP); - return (error); -} - -int -osf1_sys_writev(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_writev_args /* { - syscallarg(int) fd; - syscallarg(struct osf1_iovec *) iovp; - syscallarg(u_int) iovcnt; - } */ *uap = v; - struct sys_writev_args /* { - syscallarg(int) fd; - syscallarg(struct iovec *) iovp; - syscallarg(u_int) iovcnt; - } */ a; - struct emul *e = p->p_emul; - struct osf1_iovec *oio; - struct iovec *nio; - int error, i; - - if (SCARG(uap, iovcnt) > (STACKGAPLEN / sizeof (struct iovec))) - return (EINVAL); - - oio = (struct osf1_iovec *) - malloc(SCARG(uap, iovcnt)*sizeof (struct osf1_iovec), - M_TEMP, M_WAITOK); - nio = (struct iovec *)malloc(SCARG(uap, iovcnt)*sizeof (struct iovec), - M_TEMP, M_WAITOK); - - error = 0; - if ((error = copyin(SCARG(uap, iovp), oio, - SCARG(uap, iovcnt) * sizeof (struct osf1_iovec))) != 0) - goto punt; - for (i = 0; i < SCARG(uap, iovcnt); i++) { - nio[i].iov_base = oio[i].iov_base; - nio[i].iov_len = oio[i].iov_len; + error = sys_wait4(p, &a, retval); + + if (error == 0 && SCARG(&a, rusage) != NULL) { + error = copyin((caddr_t)SCARG(&a, rusage), + (caddr_t)&netbsd_rusage, sizeof netbsd_rusage); + if (error == 0) { + osf1_cvt_rusage_from_native(&netbsd_rusage, + &osf1_rusage); + error = copyout((caddr_t)&osf1_rusage, + (caddr_t)SCARG(uap, rusage), sizeof osf1_rusage); + } } - SCARG(&a, fd) = SCARG(uap, fd); - SCARG(&a, iovp) = (struct iovec *)STACKGAPBASE; - SCARG(&a, iovcnt) = SCARG(uap, iovcnt); - - if ((error = copyout(nio, (caddr_t)SCARG(&a, iovp), - SCARG(uap, iovcnt) * sizeof (struct iovec))) != 0) - goto punt; - error = sys_writev(p, &a, retval); - -punt: - free(oio, M_TEMP); - free(nio, M_TEMP); return (error); } - -/* More of the stupid off_t padding! */ -int -osf1_sys_truncate(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_truncate_args /* { - syscallarg(char *) path; - syscallarg(off_t) length; - } */ *uap = v; - struct sys_truncate_args a; - - SCARG(&a, path) = SCARG(uap, path); - SCARG(&a, pad) = 0; - SCARG(&a, length) = SCARG(uap, length); - - return sys_truncate(p, &a, retval); -} - -int -osf1_sys_ftruncate(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_ftruncate_args /* { - syscallarg(int) fd; - syscallarg(off_t) length; - } */ *uap = v; - struct sys_ftruncate_args a; - - SCARG(&a, fd) = SCARG(uap, fd); - SCARG(&a, pad) = 0; - SCARG(&a, length) = SCARG(uap, length); - - return sys_ftruncate(p, &a, retval); -} - -int -osf1_sys_getsid(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_getsid_args /* { - syscallarg(pid_t) pid; - } */ *uap = v; - struct proc *t; - - if (SCARG(uap, pid) == 0) - t = p; - else if ((t = pfind(SCARG(uap, pid))) == NULL) - return (ESRCH); - - *retval = t->p_session->s_leader->p_pid; - return (0); -} - -int -osf1_sys_getrusage(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - - /* XXX */ - return EINVAL; -} - -int -osf1_sys_madvise(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - - /* XXX */ - return EINVAL; -} - -int -osf1_sys_execve(p, v, retval) - struct proc *p; - void *v; - register_t *retval; -{ - struct osf1_sys_execve_args *uap = v; -#if 0 - caddr_t sg = stackgap_init(p->p_emul); - - OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); -#endif - - return (sys_execve(p, (struct sys_execve_args *)&uap, retval)); -} |