xref: /netbsd-src/sys/compat/netbsd32/netbsd32_fd.c (revision 52745eef3f637c02d4aa0e342d6efda310f5318a)
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