xref: /freebsd/sys/compat/linux/linux_util.c (revision 25771ec2)
1898b0535SWarner Losh /*-
2d66a5066SPeter Wemm  * Copyright (c) 1994 Christos Zoulas
3d66a5066SPeter Wemm  * Copyright (c) 1995 Frank van der Linden
4d66a5066SPeter Wemm  * Copyright (c) 1995 Scott Bartram
5d66a5066SPeter Wemm  * All rights reserved.
6d66a5066SPeter Wemm  *
7d66a5066SPeter Wemm  * Redistribution and use in source and binary forms, with or without
8d66a5066SPeter Wemm  * modification, are permitted provided that the following conditions
9d66a5066SPeter Wemm  * are met:
10d66a5066SPeter Wemm  * 1. Redistributions of source code must retain the above copyright
11d66a5066SPeter Wemm  *    notice, this list of conditions and the following disclaimer.
12d66a5066SPeter Wemm  * 2. Redistributions in binary form must reproduce the above copyright
13d66a5066SPeter Wemm  *    notice, this list of conditions and the following disclaimer in the
14d66a5066SPeter Wemm  *    documentation and/or other materials provided with the distribution.
15d66a5066SPeter Wemm  * 3. The name of the author may not be used to endorse or promote products
16d66a5066SPeter Wemm  *    derived from this software without specific prior written permission
17d66a5066SPeter Wemm  *
18d66a5066SPeter Wemm  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19d66a5066SPeter Wemm  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20d66a5066SPeter Wemm  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21d66a5066SPeter Wemm  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22d66a5066SPeter Wemm  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23d66a5066SPeter Wemm  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24d66a5066SPeter Wemm  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25d66a5066SPeter Wemm  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26d66a5066SPeter Wemm  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27d66a5066SPeter Wemm  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28d66a5066SPeter Wemm  *
29d66a5066SPeter Wemm  *	from: svr4_util.c,v 1.5 1995/01/22 23:44:50 christos Exp
30d66a5066SPeter Wemm  */
31d66a5066SPeter Wemm 
3216dbc7f2SDavid E. O'Brien #include <sys/cdefs.h>
3316dbc7f2SDavid E. O'Brien __FBSDID("$FreeBSD$");
3416dbc7f2SDavid E. O'Brien 
35d66a5066SPeter Wemm #include <sys/param.h>
36d4364109SBruce Evans #include <sys/lock.h>
37d4364109SBruce Evans #include <sys/malloc.h>
38d4364109SBruce Evans #include <sys/mutex.h>
39d66a5066SPeter Wemm #include <sys/namei.h>
40d66a5066SPeter Wemm #include <sys/proc.h>
4125771ec2SJohn Baldwin #include <sys/syscallsubr.h>
42d4364109SBruce Evans #include <sys/systm.h>
43d66a5066SPeter Wemm #include <sys/vnode.h>
44d66a5066SPeter Wemm 
45e15583ceSAlfred Perlstein #include <machine/stdarg.h>
46e15583ceSAlfred Perlstein 
47ac951e62SMarcel Moolenaar #include <compat/linux/linux_util.h>
48762e6b85SEivind Eklund 
49d66a5066SPeter Wemm const char      linux_emul_path[] = "/compat/linux";
50d66a5066SPeter Wemm 
51d66a5066SPeter Wemm /*
52d66a5066SPeter Wemm  * Search an alternate path before passing pathname arguments on
531a6e52d0SJeroen Ruigrok van der Werven  * to system calls. Useful for keeping a separate 'emulation tree'.
54d66a5066SPeter Wemm  *
55d66a5066SPeter Wemm  * If cflag is set, we check if an attempt can be made to create
56d66a5066SPeter Wemm  * the named file, i.e. we check if the directory it should
57d66a5066SPeter Wemm  * be in exists.
58d66a5066SPeter Wemm  */
59d66a5066SPeter Wemm int
60a08d68deSDag-Erling Smørgrav linux_emul_find(td, sgp, path, pbuf, cflag)
61b40ce416SJulian Elischer 	struct thread	 *td;
62d66a5066SPeter Wemm 	caddr_t		 *sgp;		/* Pointer to stackgap memory */
63d66a5066SPeter Wemm 	char		 *path;
64d66a5066SPeter Wemm 	char		**pbuf;
65d66a5066SPeter Wemm 	int		  cflag;
66d66a5066SPeter Wemm {
67ff766321SIan Dowse 	char *newpath;
68ff766321SIan Dowse 	size_t sz;
69ff766321SIan Dowse 	int error;
70ff766321SIan Dowse 
71ff766321SIan Dowse 	error = linux_emul_convpath(td, path, (sgp == NULL) ? UIO_SYSSPACE :
72ff766321SIan Dowse 	    UIO_USERSPACE, &newpath, cflag);
73ff766321SIan Dowse 	if (newpath == NULL)
74ff766321SIan Dowse 		return (error);
75ff766321SIan Dowse 
76ff766321SIan Dowse 	if (sgp == NULL) {
77ff766321SIan Dowse 		*pbuf = newpath;
78ff766321SIan Dowse 		return (error);
79ff766321SIan Dowse 	}
80ff766321SIan Dowse 
81ff766321SIan Dowse 	sz = strlen(newpath);
82ff766321SIan Dowse 	*pbuf = stackgap_alloc(sgp, sz + 1);
83ff766321SIan Dowse 	if (*pbuf != NULL)
84ff766321SIan Dowse 		error = copyout(newpath, *pbuf, sz + 1);
85ff766321SIan Dowse 	else
86ff766321SIan Dowse 		error = ENAMETOOLONG;
87ff766321SIan Dowse 	free(newpath, M_TEMP);
88ff766321SIan Dowse 
89ff766321SIan Dowse 	return (error);
90ff766321SIan Dowse }
91ff766321SIan Dowse 
92ff766321SIan Dowse int
93ff766321SIan Dowse linux_emul_convpath(td, path, pathseg, pbuf, cflag)
94ff766321SIan Dowse 	struct thread	 *td;
95ff766321SIan Dowse 	char		 *path;
96ff766321SIan Dowse 	enum uio_seg	  pathseg;
97ff766321SIan Dowse 	char		**pbuf;
98ff766321SIan Dowse 	int		  cflag;
99ff766321SIan Dowse {
100d66a5066SPeter Wemm 
10125771ec2SJohn Baldwin 	return (kern_alternate_path(td, linux_emul_path, path, pathseg, pbuf,
10225771ec2SJohn Baldwin 		cflag));
103d66a5066SPeter Wemm }
104e15583ceSAlfred Perlstein 
105e15583ceSAlfred Perlstein void
106e15583ceSAlfred Perlstein linux_msg(const struct thread *td, const char *fmt, ...)
107e15583ceSAlfred Perlstein {
108e15583ceSAlfred Perlstein 	va_list ap;
109e15583ceSAlfred Perlstein 	struct proc *p;
110e15583ceSAlfred Perlstein 
111e15583ceSAlfred Perlstein 	p = td->td_proc;
112e15583ceSAlfred Perlstein 	printf("linux: pid %d (%s): ", (int)p->p_pid, p->p_comm);
113e15583ceSAlfred Perlstein 	va_start(ap, fmt);
114e15583ceSAlfred Perlstein 	vprintf(fmt, ap);
115e15583ceSAlfred Perlstein 	va_end(ap);
116e15583ceSAlfred Perlstein 	printf("\n");
117e15583ceSAlfred Perlstein }
118