1*52745eefSmrg /* $NetBSD: netbsd32_fd.c,v 1.1 2018/12/24 21:27:05 mrg Exp $ */
2*52745eefSmrg
3*52745eefSmrg /*
4*52745eefSmrg * Copyright (c) 1998, 2001, 2008, 2018 Matthew R. Green
5*52745eefSmrg * All rights reserved.
6*52745eefSmrg *
7*52745eefSmrg * Redistribution and use in source and binary forms, with or without
8*52745eefSmrg * modification, are permitted provided that the following conditions
9*52745eefSmrg * are met:
10*52745eefSmrg * 1. Redistributions of source code must retain the above copyright
11*52745eefSmrg * notice, this list of conditions and the following disclaimer.
12*52745eefSmrg * 2. Redistributions in binary form must reproduce the above copyright
13*52745eefSmrg * notice, this list of conditions and the following disclaimer in the
14*52745eefSmrg * documentation and/or other materials provided with the distribution.
15*52745eefSmrg *
16*52745eefSmrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*52745eefSmrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*52745eefSmrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*52745eefSmrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*52745eefSmrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21*52745eefSmrg * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22*52745eefSmrg * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23*52745eefSmrg * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*52745eefSmrg * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*52745eefSmrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*52745eefSmrg * SUCH DAMAGE.
27*52745eefSmrg *
28*52745eefSmrg * from: NetBSD: netbsd32_netbsd.c,v 1.221 2018/12/24 20:44:39 mrg Exp
29*52745eefSmrg */
30*52745eefSmrg
31*52745eefSmrg #include <sys/cdefs.h>
32*52745eefSmrg __KERNEL_RCSID(0, "$NetBSD: netbsd32_fd.c,v 1.1 2018/12/24 21:27:05 mrg Exp $");
33*52745eefSmrg
34*52745eefSmrg #include <sys/param.h>
35*52745eefSmrg #include <sys/systm.h>
36*52745eefSmrg #include <sys/filedesc.h>
37*52745eefSmrg #include <sys/namei.h>
38*52745eefSmrg #include <sys/vnode.h>
39*52745eefSmrg #include <sys/vfs_syscalls.h>
40*52745eefSmrg #include <sys/kauth.h>
41*52745eefSmrg
42*52745eefSmrg #include <compat/netbsd32/netbsd32.h>
43*52745eefSmrg #include <compat/netbsd32/netbsd32_syscall.h>
44*52745eefSmrg #include <compat/netbsd32/netbsd32_syscallargs.h>
45*52745eefSmrg #include <compat/netbsd32/netbsd32_conv.h>
46*52745eefSmrg
47*52745eefSmrg
48*52745eefSmrg int
netbsd32___getfh30(struct lwp * l,const struct netbsd32___getfh30_args * uap,register_t * retval)49*52745eefSmrg netbsd32___getfh30(struct lwp *l, const struct netbsd32___getfh30_args *uap, register_t *retval)
50*52745eefSmrg {
51*52745eefSmrg /* {
52*52745eefSmrg syscallarg(const netbsd32_charp) fname;
53*52745eefSmrg syscallarg(netbsd32_fhandlep_t) fhp;
54*52745eefSmrg syscallarg(netbsd32_size_tp) fh_size;
55*52745eefSmrg } */
56*52745eefSmrg struct vnode *vp;
57*52745eefSmrg fhandle_t *fh;
58*52745eefSmrg int error;
59*52745eefSmrg struct pathbuf *pb;
60*52745eefSmrg struct nameidata nd;
61*52745eefSmrg netbsd32_size_t usz32, sz32;
62*52745eefSmrg size_t sz;
63*52745eefSmrg
64*52745eefSmrg /*
65*52745eefSmrg * Must be super user
66*52745eefSmrg */
67*52745eefSmrg error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_FILEHANDLE,
68*52745eefSmrg 0, NULL, NULL, NULL);
69*52745eefSmrg if (error)
70*52745eefSmrg return error;
71*52745eefSmrg
72*52745eefSmrg error = pathbuf_copyin(SCARG_P32(uap, fname), &pb);
73*52745eefSmrg if (error) {
74*52745eefSmrg return error;
75*52745eefSmrg }
76*52745eefSmrg
77*52745eefSmrg NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | TRYEMULROOT, pb);
78*52745eefSmrg error = namei(&nd);
79*52745eefSmrg if (error) {
80*52745eefSmrg pathbuf_destroy(pb);
81*52745eefSmrg return error;
82*52745eefSmrg }
83*52745eefSmrg vp = nd.ni_vp;
84*52745eefSmrg pathbuf_destroy(pb);
85*52745eefSmrg
86*52745eefSmrg error = vfs_composefh_alloc(vp, &fh);
87*52745eefSmrg vput(vp);
88*52745eefSmrg if (error != 0) {
89*52745eefSmrg return error;
90*52745eefSmrg }
91*52745eefSmrg error = copyin(SCARG_P32(uap, fh_size), &usz32, sizeof(usz32));
92*52745eefSmrg if (error != 0) {
93*52745eefSmrg goto out;
94*52745eefSmrg }
95*52745eefSmrg sz = FHANDLE_SIZE(fh);
96*52745eefSmrg sz32 = sz;
97*52745eefSmrg
98*52745eefSmrg error = copyout(&sz32, SCARG_P32(uap, fh_size), sizeof(sz32));
99*52745eefSmrg if (error != 0) {
100*52745eefSmrg goto out;
101*52745eefSmrg }
102*52745eefSmrg if (usz32 >= sz32) {
103*52745eefSmrg error = copyout(fh, SCARG_P32(uap, fhp), sz);
104*52745eefSmrg } else {
105*52745eefSmrg error = E2BIG;
106*52745eefSmrg }
107*52745eefSmrg out:
108*52745eefSmrg vfs_composefh_free(fh);
109*52745eefSmrg return error;
110*52745eefSmrg }
111*52745eefSmrg
112*52745eefSmrg int
netbsd32_pipe2(struct lwp * l,const struct netbsd32_pipe2_args * uap,register_t * retval)113*52745eefSmrg netbsd32_pipe2(struct lwp *l, const struct netbsd32_pipe2_args *uap,
114*52745eefSmrg register_t *retval)
115*52745eefSmrg {
116*52745eefSmrg /* {
117*52745eefSmrg syscallarg(netbsd32_intp) fildes;
118*52745eefSmrg syscallarg(int) flags;
119*52745eefSmrg } */
120*52745eefSmrg int fd[2], error;
121*52745eefSmrg
122*52745eefSmrg error = pipe1(l, fd, SCARG(uap, flags));
123*52745eefSmrg if (error != 0)
124*52745eefSmrg return error;
125*52745eefSmrg
126*52745eefSmrg error = copyout(fd, SCARG_P32(uap, fildes), sizeof(fd));
127*52745eefSmrg if (error != 0)
128*52745eefSmrg return error;
129*52745eefSmrg
130*52745eefSmrg retval[0] = 0;
131*52745eefSmrg return 0;
132*52745eefSmrg }
133