Annotation of sys/compat/ultrix/ultrix_pathname.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: ultrix_pathname.c,v 1.9 2003/06/02 23:28:01 millert Exp $ */
! 2: /* $NetBSD: ultrix_pathname.c,v 1.2 1996/04/07 17:23:07 jonathan Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1992, 1993
! 6: * The Regents of the University of California. All rights reserved.
! 7: *
! 8: * This software was developed by the Computer Systems Engineering group
! 9: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
! 10: * contributed to Berkeley.
! 11: *
! 12: * All advertising materials mentioning features or use of this software
! 13: * must display the following acknowledgement:
! 14: * This product includes software developed by the University of
! 15: * California, Lawrence Berkeley Laboratory.
! 16: *
! 17: * Redistribution and use in source and binary forms, with or without
! 18: * modification, are permitted provided that the following conditions
! 19: * are met:
! 20: * 1. Redistributions of source code must retain the above copyright
! 21: * notice, this list of conditions and the following disclaimer.
! 22: * 2. Redistributions in binary form must reproduce the above copyright
! 23: * notice, this list of conditions and the following disclaimer in the
! 24: * documentation and/or other materials provided with the distribution.
! 25: * 3. Neither the name of the University nor the names of its contributors
! 26: * may be used to endorse or promote products derived from this software
! 27: * without specific prior written permission.
! 28: *
! 29: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 30: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 31: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 32: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 33: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 34: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 35: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 36: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 37: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 38: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 39: * SUCH DAMAGE.
! 40: *
! 41: *
! 42: * @(#)sun_misc.c 8.1 (Berkeley) 6/18/93
! 43: *
! 44: * from: Header: sun_misc.c,v 1.16 93/04/07 02:46:27 torek Exp
! 45: */
! 46:
! 47:
! 48: /*
! 49: * Ultrix emulation filesystem-namespace compatibility module.
! 50: *
! 51: * Ultrix system calls that examine the filesysten namespace
! 52: * are implemented here. Each system call has a wrapper that
! 53: * first checks if the given file exists at a special `emulation'
! 54: * pathname: the given path, prefixex with '/emul/ultrix', and
! 55: * if that pathname exists, it is used instead of the providd pathname.
! 56: *
! 57: * Used to locate OS-specific files (shared libraries, config files,
! 58: * etc) used by emul processes at their `normal' pathnames, without
! 59: * polluting, or conflicting with, the native filesysten namespace.
! 60: */
! 61:
! 62: #include <sys/param.h>
! 63: #include <sys/systm.h>
! 64: #include <sys/namei.h>
! 65: #include <sys/file.h>
! 66: #include <sys/filedesc.h>
! 67: #include <sys/ioctl.h>
! 68: #include <sys/mount.h>
! 69: #include <sys/stat.h>
! 70: #include <sys/vnode.h>
! 71: #include <sys/syscallargs.h>
! 72:
! 73: #include <compat/ultrix/ultrix_syscallargs.h>
! 74: #include <compat/ultrix/ultrix_util.h>
! 75:
! 76: const char ultrix_emul_path[] = "/emul/ultrix";
! 77:
! 78: int
! 79: ultrix_sys_creat(p, v, retval)
! 80: struct proc *p;
! 81: void *v;
! 82: register_t *retval;
! 83: {
! 84: struct ultrix_sys_creat_args *uap = v;
! 85: struct sys_open_args ouap;
! 86:
! 87: caddr_t sg = stackgap_init(p->p_emul);
! 88: ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! 89:
! 90: SCARG(&ouap, path) = SCARG(uap, path);
! 91: SCARG(&ouap, flags) = O_WRONLY | O_CREAT | O_TRUNC;
! 92: SCARG(&ouap, mode) = SCARG(uap, mode);
! 93:
! 94: return (sys_open(p, &ouap, retval));
! 95: }
! 96:
! 97:
! 98: int
! 99: ultrix_sys_access(p, v, retval)
! 100: struct proc *p;
! 101: void *v;
! 102: register_t *retval;
! 103: {
! 104: struct ultrix_sys_access_args *uap = v;
! 105: caddr_t sg = stackgap_init(p->p_emul);
! 106: ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! 107:
! 108: return (sys_access(p, uap, retval));
! 109: }
! 110:
! 111: int
! 112: ultrix_sys_stat(p, v, retval)
! 113: struct proc *p;
! 114: void *v;
! 115: register_t *retval;
! 116: {
! 117: struct ultrix_sys_stat_args *uap = v;
! 118: caddr_t sg = stackgap_init(p->p_emul);
! 119: ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! 120:
! 121: return (compat_43_sys_stat(p, uap, retval));
! 122: }
! 123:
! 124: int
! 125: ultrix_sys_lstat(p, v, retval)
! 126: struct proc *p;
! 127: void *v;
! 128: register_t *retval;
! 129: {
! 130: struct ultrix_sys_lstat_args *uap = v;
! 131: caddr_t sg = stackgap_init(p->p_emul);
! 132: ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! 133:
! 134: return (compat_43_sys_lstat(p, uap, retval));
! 135: }
! 136:
! 137: int
! 138: ultrix_sys_execv(p, v, retval)
! 139: struct proc *p;
! 140: void *v;
! 141: register_t *retval;
! 142: {
! 143: struct ultrix_sys_execv_args *uap = v;
! 144: struct sys_execve_args ouap;
! 145:
! 146: caddr_t sg = stackgap_init(p->p_emul);
! 147: ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! 148:
! 149: SCARG(&ouap, path) = SCARG(uap, path);
! 150: SCARG(&ouap, argp) = SCARG(uap, argp);
! 151: SCARG(&ouap, envp) = NULL;
! 152:
! 153: return (sys_execve(p, &ouap, retval));
! 154: }
! 155:
! 156: int
! 157: ultrix_sys_open(p, v, retval)
! 158: struct proc *p;
! 159: void *v;
! 160: register_t *retval;
! 161: {
! 162: struct ultrix_sys_open_args *uap = v;
! 163: int l, r;
! 164: int noctty;
! 165: int ret;
! 166:
! 167: caddr_t sg = stackgap_init(p->p_emul);
! 168: ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! 169:
! 170: /* convert open flags into NetBSD flags */
! 171: l = SCARG(uap, flags);
! 172: noctty = l & 0x8000;
! 173: r = (l & (0x0001 | 0x0002 | 0x0008 | 0x0040 | 0x0200 | 0x0400 | 0x0800));
! 174: r |= ((l & (0x0004 | 0x1000 | 0x4000)) ? O_NONBLOCK : 0);
! 175: r |= ((l & 0x0080) ? O_SHLOCK : 0);
! 176: r |= ((l & 0x0100) ? O_EXLOCK : 0);
! 177: r |= ((l & 0x2000) ? O_SYNC : 0);
! 178:
! 179: SCARG(uap, flags) = r;
! 180: ret = sys_open(p, (struct sys_open_args *)uap, retval);
! 181:
! 182: if (!ret && !noctty && SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) {
! 183: struct filedesc *fdp = p->p_fd;
! 184: struct file *fp;
! 185:
! 186: if ((fd = fd_getfile(fdp, *retval)) == NULL)
! 187: return (EBADF);
! 188: FREF(fp);
! 189: /* ignore any error, just give it a try */
! 190: if (fp->f_type == DTYPE_VNODE)
! 191: (fp->f_ops->fo_ioctl)(fp, TIOCSCTTY, (caddr_t)0, p);
! 192: FRELE(fp);
! 193: }
! 194: return ret;
! 195: }
! 196:
! 197:
! 198: struct ultrix_statfs {
! 199: long f_type; /* type of info, zero for now */
! 200: long f_bsize; /* fundamental file system block size */
! 201: long f_blocks; /* total blocks in file system */
! 202: long f_bfree; /* free blocks */
! 203: long f_bavail; /* free blocks available to non-super-user */
! 204: long f_files; /* total file nodes in file system */
! 205: long f_ffree; /* free file nodes in fs */
! 206: fsid_t f_fsid; /* file system id */
! 207: long f_spare[7]; /* spare for later */
! 208: };
! 209:
! 210: /*
! 211: * Custruct ultrix statfs result from native.
! 212: * XXX should this be the same as returned by Ultrix getmnt(2)?
! 213: * XXX Ultrix predates DEV_BSIZE. Is conversion of disk space from 1k
! 214: * block units to DEV_BSIZE necessary?
! 215: */
! 216: static int
! 217: ultrixstatfs(sp, buf)
! 218: struct statfs *sp;
! 219: caddr_t buf;
! 220: {
! 221: struct ultrix_statfs ssfs;
! 222:
! 223: bzero(&ssfs, sizeof ssfs);
! 224: ssfs.f_type = 0;
! 225: ssfs.f_bsize = sp->f_bsize;
! 226: ssfs.f_blocks = sp->f_blocks;
! 227: ssfs.f_bfree = sp->f_bfree;
! 228: ssfs.f_bavail = sp->f_bavail;
! 229: ssfs.f_files = sp->f_files;
! 230: ssfs.f_ffree = sp->f_ffree;
! 231: ssfs.f_fsid = sp->f_fsid;
! 232: return copyout((caddr_t)&ssfs, buf, sizeof ssfs);
! 233: }
! 234:
! 235:
! 236: int
! 237: ultrix_sys_statfs(p, v, retval)
! 238: struct proc *p;
! 239: void *v;
! 240: register_t *retval;
! 241: {
! 242: struct ultrix_sys_statfs_args *uap = v;
! 243: register struct mount *mp;
! 244: register struct statfs *sp;
! 245: int error;
! 246: struct nameidata nd;
! 247:
! 248: caddr_t sg = stackgap_init(p->p_emul);
! 249: ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! 250:
! 251: NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p);
! 252: if ((error = namei(&nd)) != 0)
! 253: return (error);
! 254:
! 255: mp = nd.ni_vp->v_mount;
! 256: sp = &mp->mnt_stat;
! 257: vrele(nd.ni_vp);
! 258: if ((error = VFS_STATFS(mp, sp, p)) != 0)
! 259: return (error);
! 260: sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
! 261: return ultrixstatfs(sp, (caddr_t)SCARG(uap, buf));
! 262: }
! 263:
! 264: /*
! 265: * sys_fstatfs() takes an fd, not a path, and so needs no emul
! 266: * pathname processing; but it's similar enough to sys_statfs() that
! 267: * it goes here anyway.
! 268: */
! 269: int
! 270: ultrix_sys_fstatfs(p, v, retval)
! 271: struct proc *p;
! 272: void *v;
! 273: register_t *retval;
! 274: {
! 275: struct ultrix_sys_fstatfs_args *uap = v;
! 276: struct file *fp;
! 277: struct mount *mp;
! 278: register struct statfs *sp;
! 279: int error;
! 280:
! 281: if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0)
! 282: return (error);
! 283:
! 284: mp = ((struct vnode *)fp->f_data)->v_mount;
! 285: sp = &mp->mnt_stat;
! 286: error = VFS_STATFS(mp, sp, p);
! 287: FRELE(fp);
! 288: if (error)
! 289: return (error);
! 290: sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
! 291: return ultrixstatfs(sp, (caddr_t)SCARG(uap, buf));
! 292: }
! 293:
! 294: int
! 295: ultrix_sys_mknod(p, v, retval)
! 296: struct proc *p;
! 297: void *v;
! 298: register_t *retval;
! 299: {
! 300: struct ultrix_sys_mknod_args *uap = v;
! 301:
! 302: caddr_t sg = stackgap_init(p->p_emul);
! 303: ULTRIX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
! 304:
! 305: if (S_ISFIFO(SCARG(uap, mode)))
! 306: return sys_mkfifo(p, uap, retval);
! 307:
! 308: return sys_mknod(p, (struct sys_mknod_args *)uap, retval);
! 309: }
CVSweb