Annotation of sys/compat/osf1/osf1_file.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: osf1_file.c,v 1.1 2000/08/04 15:47:55 ericj Exp $ */
2: /* $NetBSD: osf1_file.c,v 1.6 2000/06/06 19:04:17 soren Exp $ */
3:
4: /*
5: * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: * 3. All advertising materials mentioning features or use of this software
16: * must display the following acknowledgement:
17: * This product includes software developed by Christopher G. Demetriou
18: * for the NetBSD Project.
19: * 4. The name of the author may not be used to endorse or promote products
20: * derived from this software without specific prior written permission
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32: */
33:
34: /*
35: * Copyright (c) 1994, 1995 Carnegie-Mellon University.
36: * All rights reserved.
37: *
38: * Author: Chris G. Demetriou
39: *
40: * Permission to use, copy, modify and distribute this software and
41: * its documentation is hereby granted, provided that both the copyright
42: * notice and this permission notice appear in all copies of the
43: * software, derivative works or modified versions, and any portions
44: * thereof, and that both notices appear in supporting documentation.
45: *
46: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
47: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
48: * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
49: *
50: * Carnegie Mellon requests users of this software to return to
51: *
52: * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
53: * School of Computer Science
54: * Carnegie Mellon University
55: * Pittsburgh PA 15213-3890
56: *
57: * any improvements or extensions that they make and grant Carnegie the
58: * rights to redistribute these changes.
59: */
60:
61: #include <sys/param.h>
62: #include <sys/systm.h>
63: #include <sys/namei.h>
64: #include <sys/proc.h>
65: #include <sys/file.h>
66: #include <sys/stat.h>
67: #include <sys/filedesc.h>
68: #include <sys/kernel.h>
69: #include <sys/malloc.h>
70: #include <sys/mman.h>
71: #include <sys/mount.h>
72: #include <sys/signal.h>
73: #include <sys/signalvar.h>
74: #include <sys/reboot.h>
75: #include <sys/syscallargs.h>
76: #include <sys/exec.h>
77: #include <sys/vnode.h>
78: #include <sys/socketvar.h>
79: #include <sys/resource.h>
80: #include <sys/resourcevar.h>
81: #include <sys/wait.h>
82:
83: #include <compat/osf1/osf1.h>
84: #include <compat/osf1/osf1_syscallargs.h>
85: #include <compat/osf1/osf1_util.h>
86: #include <compat/osf1/osf1_cvt.h>
87:
88: int
89: osf1_sys_access(p, v, retval)
90: struct proc *p;
91: void *v;
92: register_t *retval;
93: {
94: struct osf1_sys_access_args *uap = v;
95: struct sys_access_args a;
96: unsigned long leftovers;
97: caddr_t sg;
98:
99: sg = stackgap_init(p->p_emul);
100: OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
101:
102: SCARG(&a, path) = SCARG(uap, path);
103:
104: /* translate flags */
105: SCARG(&a, flags) = emul_flags_translate(osf1_access_flags_xtab,
106: SCARG(uap, flags), &leftovers);
107: if (leftovers != 0)
108: return (EINVAL);
109:
110: return sys_access(p, &a, retval);
111: }
112:
113: int
114: osf1_sys_execve(p, v, retval)
115: struct proc *p;
116: void *v;
117: register_t *retval;
118: {
119: struct osf1_sys_execve_args *uap = v;
120: struct sys_execve_args ap;
121: caddr_t sg;
122:
123: sg = stackgap_init(p->p_emul);
124: OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
125:
126: SCARG(&ap, path) = SCARG(uap, path);
127: SCARG(&ap, argp) = SCARG(uap, argp);
128: SCARG(&ap, envp) = SCARG(uap, envp);
129:
130: return sys_execve(p, &ap, retval);
131: }
132:
133: /*
134: * Get file status; this version does not follow links.
135: */
136: /* ARGSUSED */
137: int
138: osf1_sys_lstat(p, v, retval)
139: struct proc *p;
140: void *v;
141: register_t *retval;
142: {
143: struct osf1_sys_lstat_args *uap = v;
144: struct stat sb;
145: struct osf1_stat osb;
146: int error;
147: struct nameidata nd;
148: caddr_t sg;
149:
150: sg = stackgap_init(p->p_emul);
151: OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
152:
153: NDINIT(&nd, LOOKUP, NOFOLLOW | LOCKLEAF, UIO_USERSPACE,
154: SCARG(uap, path), p);
155: if ((error = namei(&nd)))
156: return (error);
157: error = vn_stat(nd.ni_vp, &sb, p);
158: vput(nd.ni_vp);
159: if (error)
160: return (error);
161: osf1_cvt_stat_from_native(&sb, &osb);
162: error = copyout((caddr_t)&osb, (caddr_t)SCARG(uap, ub), sizeof (osb));
163: return (error);
164: }
165:
166: int
167: osf1_sys_mknod(p, v, retval)
168: struct proc *p;
169: void *v;
170: register_t *retval;
171: {
172: struct osf1_sys_mknod_args *uap = v;
173: struct sys_mknod_args a;
174: caddr_t sg;
175:
176: sg = stackgap_init(p->p_emul);
177: OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
178:
179: SCARG(&a, path) = SCARG(uap, path);
180: SCARG(&a, mode) = SCARG(uap, mode);
181: SCARG(&a, dev) = osf1_cvt_dev_to_native(SCARG(uap, dev));
182:
183: return sys_mknod(p, &a, retval);
184: }
185:
186: int
187: osf1_sys_open(p, v, retval)
188: struct proc *p;
189: void *v;
190: register_t *retval;
191: {
192: struct osf1_sys_open_args *uap = v;
193: struct sys_open_args a;
194: char *path;
195: caddr_t sg;
196: unsigned long leftovers;
197: #ifdef SYSCALL_DEBUG
198: char pnbuf[1024];
199:
200: if (scdebug &&
201: copyinstr(SCARG(uap, path), pnbuf, sizeof pnbuf, NULL) == 0)
202: printf("osf1_open: open: %s\n", pnbuf);
203: #endif
204:
205: sg = stackgap_init(p->p_emul);
206:
207: /* translate flags */
208: SCARG(&a, flags) = emul_flags_translate(osf1_open_flags_xtab,
209: SCARG(uap, flags), &leftovers);
210: if (leftovers != 0)
211: return (EINVAL);
212:
213: /* copy mode, no translation necessary */
214: SCARG(&a, mode) = SCARG(uap, mode);
215:
216: /* pick appropriate path */
217: path = SCARG(uap, path);
218: if (SCARG(&a, flags) & O_CREAT)
219: OSF1_CHECK_ALT_CREAT(p, &sg, path);
220: else
221: OSF1_CHECK_ALT_EXIST(p, &sg, path);
222: SCARG(&a, path) = path;
223:
224: return sys_open(p, &a, retval);
225: }
226:
227: int
228: osf1_sys_pathconf(p, v, retval)
229: struct proc *p;
230: void *v;
231: register_t *retval;
232: {
233: struct osf1_sys_pathconf_args *uap = v;
234: struct sys_pathconf_args a;
235: caddr_t sg;
236: int error;
237:
238: sg = stackgap_init(p->p_emul);
239:
240: OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
241: SCARG(&a, path) = SCARG(uap, path);
242:
243: error = osf1_cvt_pathconf_name_to_native(SCARG(uap, name),
244: &SCARG(&a, name));
245:
246: if (error == 0)
247: error = sys_pathconf(p, &a, retval);
248:
249: return (error);
250: }
251:
252: /*
253: * Get file status; this version follows links.
254: */
255: /* ARGSUSED */
256: int
257: osf1_sys_stat(p, v, retval)
258: struct proc *p;
259: void *v;
260: register_t *retval;
261: {
262: struct osf1_sys_stat_args *uap = v;
263: struct stat sb;
264: struct osf1_stat osb;
265: int error;
266: struct nameidata nd;
267: caddr_t sg;
268:
269: sg = stackgap_init(p->p_emul);
270: OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
271:
272: NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
273: SCARG(uap, path), p);
274: if ((error = namei(&nd)))
275: return (error);
276: error = vn_stat(nd.ni_vp, &sb, p);
277: vput(nd.ni_vp);
278: if (error)
279: return (error);
280: osf1_cvt_stat_from_native(&sb, &osb);
281: error = copyout((caddr_t)&osb, (caddr_t)SCARG(uap, ub), sizeof (osb));
282: return (error);
283: }
284:
285: int
286: osf1_sys_truncate(p, v, retval)
287: struct proc *p;
288: void *v;
289: register_t *retval;
290: {
291: struct osf1_sys_truncate_args *uap = v;
292: struct sys_truncate_args a;
293: caddr_t sg;
294:
295: sg = stackgap_init(p->p_emul);
296: OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
297:
298: SCARG(&a, path) = SCARG(uap, path);
299: SCARG(&a, pad) = 0;
300: SCARG(&a, length) = SCARG(uap, length);
301:
302: return sys_truncate(p, &a, retval);
303: }
304:
305: int
306: osf1_sys_utimes(p, v, retval)
307: struct proc *p;
308: void *v;
309: register_t *retval;
310: {
311: struct osf1_sys_utimes_args *uap = v;
312: struct sys_utimes_args a;
313: struct osf1_timeval otv;
314: struct timeval tv;
315: caddr_t sg;
316: int error;
317:
318: sg = stackgap_init(p->p_emul);
319:
320: OSF1_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
321: SCARG(&a, path) = SCARG(uap, path);
322:
323: error = 0;
324: if (SCARG(uap, tptr) == NULL)
325: SCARG(&a, tptr) = NULL;
326: else {
327: SCARG(&a, tptr) = stackgap_alloc(&sg, sizeof tv);
328:
329: /* get the OSF/1 timeval argument */
330: error = copyin((caddr_t)SCARG(uap, tptr),
331: (caddr_t)&otv, sizeof otv);
332: if (error == 0) {
333:
334: /* fill in and copy out the NetBSD timeval */
335: memset(&tv, 0, sizeof tv);
336: tv.tv_sec = otv.tv_sec;
337: tv.tv_usec = otv.tv_usec;
338:
339: error = copyout((caddr_t)&tv,
340: (caddr_t)SCARG(&a, tptr), sizeof tv);
341: }
342: }
343:
344: if (error == 0)
345: error = sys_utimes(p, &a, retval);
346:
347: return (error);
348: }
CVSweb