Annotation of sys/compat/osf1/osf1_cvt.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: osf1_cvt.c,v 1.3 2006/02/16 20:32:33 miod Exp $ */
2: /* $NetBSD: osf1_cvt.c,v 1.7 1999/06/26 01:23:23 cgd 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: #include <uvm/uvm_extern.h> /* XXX see mmap emulation */
83:
84: #include <nfs/rpcv2.h>
85: #include <nfs/nfsproto.h>
86: #include <nfs/nfs.h>
87: #include <nfs/nfsmount.h>
88:
89: #include <compat/osf1/osf1.h>
90: #include <compat/osf1/osf1_util.h>
91: #include <compat/osf1/osf1_cvt.h>
92:
93: const struct emul_flags_xtab osf1_access_flags_xtab[] = {
94: #if 0 /* pseudo-flag */
95: { OSF1_F_OK, OSF1_F_OK, F_OK },
96: #endif
97: { OSF1_X_OK, OSF1_X_OK, X_OK },
98: { OSF1_W_OK, OSF1_W_OK, W_OK },
99: { OSF1_R_OK, OSF1_R_OK, R_OK },
100: { 0 }
101: };
102:
103: const struct emul_flags_xtab osf1_fcntl_getsetfd_flags_rxtab[] = {
104: { FD_CLOEXEC, FD_CLOEXEC, OSF1_FD_CLOEXEC },
105: { 0 }
106: };
107:
108: const struct emul_flags_xtab osf1_fcntl_getsetfd_flags_xtab[] = {
109: { OSF1_FD_CLOEXEC, OSF1_FD_CLOEXEC, FD_CLOEXEC },
110: { 0 }
111: };
112:
113: /* flags specific to GETFL/SETFL; also uses open rxtab */
114: const struct emul_flags_xtab osf1_fcntl_getsetfl_flags_rxtab[] = {
115: { FASYNC, FASYNC, OSF1_FASYNC },
116: { 0 }
117: };
118:
119: /* flags specific to GETFL/SETFL; also uses open xtab */
120: const struct emul_flags_xtab osf1_fcntl_getsetfl_flags_xtab[] = {
121: { OSF1_FASYNC, OSF1_FASYNC, FASYNC },
122: { 0 }
123: };
124:
125: const struct emul_flags_xtab osf1_mmap_flags_xtab[] = {
126: { OSF1_MAP_SHARED, OSF1_MAP_SHARED, MAP_SHARED },
127: { OSF1_MAP_PRIVATE, OSF1_MAP_PRIVATE, MAP_PRIVATE },
128: { OSF1_MAP_TYPE, OSF1_MAP_FILE, MAP_FILE },
129: { OSF1_MAP_TYPE, OSF1_MAP_ANON, MAP_ANON },
130: { OSF1_MAP_FIXED, OSF1_MAP_FIXED, MAP_FIXED },
131: #if 0 /* pseudo-flag, and the default */
132: { OSF1_MAP_VARIABLE, OSF1_MAP_VARIABLE, 0 },
133: #endif
134: { OSF1_MAP_HASSEMAPHORE, OSF1_MAP_HASSEMAPHORE, MAP_HASSEMAPHORE },
135: { OSF1_MAP_INHERIT, OSF1_MAP_INHERIT, MAP_INHERIT },
136: #if 0 /* no equivalent +++ */
137: { OSF1_MAP_UNALIGNED, OSF1_MAP_UNALIGNED, ??? },
138: #endif
139: { 0 }
140: };
141:
142: const struct emul_flags_xtab osf1_mmap_prot_xtab[] = {
143: #if 0 /* pseudo-flag */
144: { OSF1_PROT_NONE, OSF1_PROT_NONE, PROT_NONE },
145: #endif
146: { OSF1_PROT_READ, OSF1_PROT_READ, PROT_READ },
147: { OSF1_PROT_WRITE, OSF1_PROT_WRITE, PROT_READ|PROT_WRITE },
148: { OSF1_PROT_EXEC, OSF1_PROT_EXEC, PROT_READ|PROT_EXEC },
149: { 0 }
150: };
151:
152: const struct emul_flags_xtab osf1_nfs_mount_flags_xtab[] = {
153: { OSF1_NFSMNT_SOFT, OSF1_NFSMNT_SOFT, NFSMNT_SOFT, },
154: { OSF1_NFSMNT_WSIZE, OSF1_NFSMNT_WSIZE, NFSMNT_WSIZE, },
155: { OSF1_NFSMNT_RSIZE, OSF1_NFSMNT_RSIZE, NFSMNT_RSIZE, },
156: { OSF1_NFSMNT_TIMEO, OSF1_NFSMNT_TIMEO, NFSMNT_TIMEO, },
157: { OSF1_NFSMNT_RETRANS, OSF1_NFSMNT_RETRANS, NFSMNT_RETRANS, },
158: #if 0 /* no equivalent; needs special handling, see below */
159: { OSF1_NFSMNT_HOSTNAME, OSF1_NFSMNT_HOSTNAME, ???, },
160: #endif
161: { OSF1_NFSMNT_INT, OSF1_NFSMNT_INT, NFSMNT_INT, },
162: { OSF1_NFSMNT_NOCONN, OSF1_NFSMNT_NOCONN, NFSMNT_NOCONN, },
163: #if 0 /* no equivalents */
164: { OSF1_NFSMNT_NOAC, OSF1_NFSMNT_NOAC, ???, },
165: { OSF1_NFSMNT_ACREGMIN, OSF1_NFSMNT_ACREGMIN, ???, },
166: { OSF1_NFSMNT_ACREGMAX, OSF1_NFSMNT_ACREGMAX, ???, },
167: { OSF1_NFSMNT_ACDIRMIN, OSF1_NFSMNT_ACDIRMIN, ???, },
168: { OSF1_NFSMNT_ACDIRMAX, OSF1_NFSMNT_ACDIRMAX, ???, },
169: { OSF1_NFSMNT_NOCTO, OSF1_NFSMNT_NOCTO, ???, },
170: { OSF1_NFSMNT_POSIX, OSF1_NFSMNT_POSIX, ???, },
171: { OSF1_NFSMNT_AUTO, OSF1_NFSMNT_AUTO, ???, },
172: { OSF1_NFSMNT_SEC, OSF1_NFSMNT_SEC, ???, },
173: { OSF1_NFSMNT_TCP, OSF1_NFSMNT_TCP, ???, },
174: { OSF1_NFSMNT_PROPLIST, OSF1_NFSMNT_PROPLIST, ???, },
175: #endif
176: { 0 }
177: };
178:
179: const struct emul_flags_xtab osf1_open_flags_rxtab[] = {
180: { O_ACCMODE, O_RDONLY, OSF1_O_RDONLY },
181: { O_ACCMODE, O_WRONLY, OSF1_O_WRONLY },
182: { O_ACCMODE, O_RDWR, OSF1_O_RDWR },
183: { O_NONBLOCK, O_NONBLOCK, OSF1_O_NONBLOCK },
184: { O_APPEND, O_APPEND, OSF1_O_APPEND },
185: #if 0 /* no equivalent +++ */
186: { ???, ???, O_DEFER },
187: #endif
188: { O_CREAT, O_CREAT, OSF1_O_CREAT },
189: { O_TRUNC, O_TRUNC, OSF1_O_TRUNC },
190: { O_EXCL, O_EXCL, OSF1_O_EXCL },
191: { O_NOCTTY, O_NOCTTY, OSF1_O_NOCTTY },
192: { O_SYNC, O_SYNC, OSF1_O_SYNC },
193: { O_NDELAY, O_NDELAY, OSF1_O_NDELAY },
194: #if 0 /* no equivalent, also same value as O_NDELAY! */
195: { ???, ???, O_DRD },
196: #endif
197: { O_DSYNC, O_DSYNC, OSF1_O_DSYNC },
198: { O_RSYNC, O_RSYNC, OSF1_O_RSYNC },
199: { 0 }
200: };
201:
202: const struct emul_flags_xtab osf1_open_flags_xtab[] = {
203: { OSF1_O_ACCMODE, OSF1_O_RDONLY, O_RDONLY },
204: { OSF1_O_ACCMODE, OSF1_O_WRONLY, O_WRONLY },
205: { OSF1_O_ACCMODE, OSF1_O_RDWR, O_RDWR },
206: { OSF1_O_NONBLOCK, OSF1_O_NONBLOCK, O_NONBLOCK },
207: { OSF1_O_APPEND, OSF1_O_APPEND, O_APPEND },
208: #if 0 /* no equivalent +++ */
209: { OSF1_O_DEFER, OSF1_O_DEFER, ??? },
210: #endif
211: { OSF1_O_CREAT, OSF1_O_CREAT, O_CREAT },
212: { OSF1_O_TRUNC, OSF1_O_TRUNC, O_TRUNC },
213: { OSF1_O_EXCL, OSF1_O_EXCL, O_EXCL },
214: { OSF1_O_NOCTTY, OSF1_O_NOCTTY, O_NOCTTY },
215: { OSF1_O_SYNC, OSF1_O_SYNC, O_SYNC },
216: { OSF1_O_NDELAY, OSF1_O_NDELAY, O_NDELAY },
217: #if 0 /* no equivalent, also same value as O_NDELAY! */
218: { OSF1_O_DRD, OSF1_O_DRD, ??? },
219: #endif
220: { OSF1_O_DSYNC, OSF1_O_DSYNC, O_DSYNC },
221: { OSF1_O_RSYNC, OSF1_O_RSYNC, O_RSYNC },
222: { 0 }
223: };
224:
225: const struct emul_flags_xtab osf1_reboot_opt_xtab[] = {
226: #if 0 /* pseudo-flag */
227: { OSF1_RB_AUTOBOOT, OSF1_RB_AUTOBOOT, RB_AUTOBOOT },
228: #endif
229: { OSF1_RB_ASKNAME, OSF1_RB_ASKNAME, RB_ASKNAME },
230: { OSF1_RB_SINGLE, OSF1_RB_SINGLE, RB_SINGLE },
231: { OSF1_RB_NOSYNC, OSF1_RB_NOSYNC, RB_NOSYNC },
232: #if 0 /* same value as O_NDELAY, only used at boot time? */
233: { OSF1_RB_KDB, OSF1_RB_KDB, RB_KDB },
234: #endif
235: { OSF1_RB_HALT, OSF1_RB_HALT, RB_HALT },
236: { OSF1_RB_INITNAME, OSF1_RB_INITNAME, RB_INITNAME },
237: { OSF1_RB_DFLTROOT, OSF1_RB_DFLTROOT, RB_DFLTROOT },
238: #if 0 /* no equivalents +++ */
239: { OSF1_RB_ALTBOOT, OSF1_RB_ALTBOOT, ??? },
240: { OSF1_RB_UNIPROC, OSF1_RB_UNIPROC, ??? },
241: { OSF1_RB_PARAM, OSF1_RB_PARAM, ??? },
242: #endif
243: { OSF1_RB_DUMP, OSF1_RB_DUMP, RB_DUMP },
244: { 0 }
245: };
246:
247: const struct emul_flags_xtab osf1_sendrecv_msg_flags_xtab[] = {
248: { OSF1_MSG_OOB, OSF1_MSG_OOB, MSG_OOB },
249: { OSF1_MSG_PEEK, OSF1_MSG_PEEK, MSG_PEEK },
250: { OSF1_MSG_DONTROUTE, OSF1_MSG_DONTROUTE, MSG_DONTROUTE },
251: { OSF1_MSG_EOR, OSF1_MSG_EOR, MSG_EOR },
252: { OSF1_MSG_TRUNC, OSF1_MSG_TRUNC, MSG_TRUNC },
253: { OSF1_MSG_CTRUNC, OSF1_MSG_CTRUNC, MSG_CTRUNC },
254: { OSF1_MSG_WAITALL, OSF1_MSG_WAITALL, MSG_WAITALL },
255: { 0 }
256: };
257:
258: const struct emul_flags_xtab osf1_sigaction_flags_rxtab[] = {
259: { SA_ONSTACK, SA_ONSTACK, OSF1_SA_ONSTACK },
260: { SA_RESTART, SA_RESTART, OSF1_SA_RESTART },
261: { SA_NOCLDSTOP, SA_NOCLDSTOP, OSF1_SA_NOCLDSTOP },
262: { SA_NODEFER, SA_NODEFER, OSF1_SA_NODEFER },
263: { SA_RESETHAND, SA_RESETHAND, OSF1_SA_RESETHAND },
264: { SA_NOCLDWAIT, SA_NOCLDWAIT, OSF1_SA_NOCLDWAIT },
265: #if 0 /* XXX not yet */
266: { SA_SIGINFO, SA_SIGINFO, OSF1_SA_SIGINFO },
267: #endif
268: { 0 },
269: };
270:
271: const struct emul_flags_xtab osf1_sigaction_flags_xtab[] = {
272: { OSF1_SA_ONSTACK, OSF1_SA_ONSTACK, SA_ONSTACK },
273: { OSF1_SA_RESTART, OSF1_SA_RESTART, SA_RESTART },
274: { OSF1_SA_NOCLDSTOP, OSF1_SA_NOCLDSTOP, SA_NOCLDSTOP },
275: { OSF1_SA_NODEFER, OSF1_SA_NODEFER, SA_NODEFER },
276: { OSF1_SA_RESETHAND, OSF1_SA_RESETHAND, SA_RESETHAND },
277: { OSF1_SA_NOCLDWAIT, OSF1_SA_NOCLDWAIT, SA_NOCLDWAIT },
278: #if 0 /* XXX not yet */
279: { OSF1_SA_SIGINFO, OSF1_SA_SIGINFO, SA_SIGINFO },
280: #endif
281: { 0 },
282: };
283:
284: const struct emul_flags_xtab osf1_sigaltstack_flags_rxtab[] = {
285: { SS_ONSTACK, SS_ONSTACK, OSF1_SS_ONSTACK },
286: { SS_DISABLE, SS_DISABLE, OSF1_SS_DISABLE },
287: #if 0 /* XXX no equivalents */
288: { ???, ???, OSF1_SS_NOMASK },
289: { ???, ???, OSF1_SS_UCONTEXT },
290: #endif
291: { 0 },
292: };
293:
294: const struct emul_flags_xtab osf1_sigaltstack_flags_xtab[] = {
295: { OSF1_SS_ONSTACK, OSF1_SS_ONSTACK, SS_ONSTACK },
296: { OSF1_SS_DISABLE, OSF1_SS_DISABLE, SS_DISABLE },
297: #if 0 /* XXX no equivalents */
298: { OSF1_SS_NOMASK, OSF1_SS_NOMASK, ??? },
299: { OSF1_SS_UCONTEXT, OSF1_SS_UCONTEXT, ??? },
300: #endif
301: { 0 },
302: };
303:
304: const struct emul_flags_xtab osf1_wait_options_xtab[] = {
305: { OSF1_WNOHANG, OSF1_WNOHANG, WNOHANG },
306: { OSF1_WUNTRACED, OSF1_WUNTRACED, WUNTRACED },
307: { 0 }
308: };
309:
310: void
311: osf1_cvt_flock_from_native(nf, of)
312: const struct flock *nf;
313: struct osf1_flock *of;
314: {
315:
316: memset(of, 0, sizeof *of);
317:
318: of->l_start = nf->l_start;
319: of->l_len = nf->l_len;
320: of->l_pid = nf->l_pid;
321:
322: switch (nf->l_type) {
323: case F_RDLCK:
324: of->l_type = OSF1_F_RDLCK;
325: break;
326:
327: case F_WRLCK:
328: of->l_type = OSF1_F_WRLCK;
329: break;
330:
331: case F_UNLCK:
332: of->l_type = OSF1_F_UNLCK;
333: break;
334: }
335:
336: switch (nf->l_whence) {
337: case SEEK_SET:
338: of->l_whence = OSF1_SEEK_SET;
339: break;
340:
341: case SEEK_CUR:
342: of->l_whence = OSF1_SEEK_CUR;
343: break;
344:
345: case SEEK_END:
346: of->l_whence = OSF1_SEEK_END;
347: break;
348: }
349: }
350:
351: int
352: osf1_cvt_flock_to_native(of, nf)
353: const struct osf1_flock *of;
354: struct flock *nf;
355: {
356:
357: memset(nf, 0, sizeof *nf);
358:
359: nf->l_start = of->l_start;
360: nf->l_len = of->l_len;
361: nf->l_pid = of->l_pid;
362:
363: switch (of->l_type) {
364: case OSF1_F_RDLCK:
365: nf->l_type = F_RDLCK;
366: break;
367:
368: case OSF1_F_WRLCK:
369: nf->l_type = F_WRLCK;
370: break;
371:
372: case OSF1_F_UNLCK:
373: nf->l_type = F_UNLCK;
374: break;
375:
376: default:
377: return (EINVAL);
378: }
379:
380: switch (of->l_whence) {
381: case OSF1_SEEK_SET:
382: nf->l_whence = SEEK_SET;
383: break;
384:
385: case OSF1_SEEK_CUR:
386: nf->l_whence = SEEK_CUR;
387: break;
388:
389: case OSF1_SEEK_END:
390: nf->l_whence = SEEK_END;
391: break;
392:
393: default:
394: return (EINVAL);
395: }
396:
397: return (0);
398: }
399:
400: int
401: osf1_cvt_msghdr_xopen_to_native(omh, bmh)
402: const struct osf1_msghdr_xopen *omh;
403: struct msghdr *bmh;
404: {
405: unsigned long leftovers;
406:
407: memset(bmh, 0, sizeof *bmh);
408: bmh->msg_name = omh->msg_name; /* XXX sockaddr translation */
409: bmh->msg_namelen = omh->msg_namelen;
410: bmh->msg_iov = NULL; /* iovec xlation separate */
411: bmh->msg_iovlen = omh->msg_iovlen;
412:
413: /* XXX we don't translate control messages (yet) */
414: if (bmh->msg_control != NULL || bmh->msg_controllen != 0)
415: {
416: printf("osf1_cvt_msghdr_xopen_to_native: control\n");
417: return (EINVAL);
418: }
419:
420: /* translate flags */
421: bmh->msg_flags = emul_flags_translate(osf1_sendrecv_msg_flags_xtab,
422: omh->msg_flags, &leftovers);
423: if (leftovers != 0)
424: {
425: printf("osf1_cvt_msghdr_xopen_to_native: leftovers 0x%lx\n", leftovers);
426: return (EINVAL);
427: }
428:
429: return (0);
430: }
431:
432: int
433: osf1_cvt_pathconf_name_to_native(oname, bnamep)
434: int oname, *bnamep;
435: {
436: int error;
437:
438: error = 0;
439: switch (oname) {
440: case OSF1__PC_CHOWN_RESTRICTED:
441: *bnamep = _PC_CHOWN_RESTRICTED;
442: break;
443:
444: case OSF1__PC_LINK_MAX:
445: *bnamep = _PC_LINK_MAX;
446: break;
447:
448: case OSF1__PC_MAX_CANON:
449: *bnamep = _PC_MAX_CANON;
450: break;
451:
452: case OSF1__PC_MAX_INPUT:
453: *bnamep = _PC_MAX_INPUT;
454: break;
455:
456: case OSF1__PC_NAME_MAX:
457: *bnamep = _PC_NAME_MAX;
458: break;
459:
460: case OSF1__PC_NO_TRUNC:
461: *bnamep = _PC_NO_TRUNC;
462: break;
463:
464: case OSF1__PC_PATH_MAX:
465: *bnamep = _PC_PATH_MAX;
466: break;
467:
468: case OSF1__PC_PIPE_BUF:
469: *bnamep = _PC_PIPE_BUF;
470: break;
471:
472: case OSF1__PC_VDISABLE:
473: *bnamep = _PC_VDISABLE;
474: break;
475:
476: default:
477: error = EINVAL;
478: break;
479: }
480:
481: return (error);
482: }
483:
484: /*
485: * Convert from as rusage structure to an osf1 rusage structure.
486: */
487: void
488: osf1_cvt_rusage_from_native(ru, oru)
489: const struct rusage *ru;
490: struct osf1_rusage *oru;
491: {
492:
493: oru->ru_utime.tv_sec = ru->ru_utime.tv_sec;
494: oru->ru_utime.tv_usec = ru->ru_utime.tv_usec;
495:
496: oru->ru_stime.tv_sec = ru->ru_stime.tv_sec;
497: oru->ru_stime.tv_usec = ru->ru_stime.tv_usec;
498:
499: oru->ru_maxrss = ru->ru_maxrss;
500: oru->ru_ixrss = ru->ru_ixrss;
501: oru->ru_idrss = ru->ru_idrss;
502: oru->ru_isrss = ru->ru_isrss;
503: oru->ru_minflt = ru->ru_minflt;
504: oru->ru_majflt = ru->ru_majflt;
505: oru->ru_nswap = ru->ru_nswap;
506: oru->ru_inblock = ru->ru_inblock;
507: oru->ru_oublock = ru->ru_oublock;
508: oru->ru_msgsnd = ru->ru_msgsnd;
509: oru->ru_msgrcv = ru->ru_msgrcv;
510: oru->ru_nsignals = ru->ru_nsignals;
511: oru->ru_nvcsw = ru->ru_nvcsw;
512: oru->ru_nivcsw = ru->ru_nivcsw;
513: }
514:
515: /*
516: * XXX: Only a subset of the flags is currently implemented.
517: */
518: void
519: osf1_cvt_sigaction_from_native(bsa, osa)
520: const struct sigaction *bsa;
521: struct osf1_sigaction *osa;
522: {
523: osa->sa__handler = bsa->sa_handler;
524: osf1_cvt_sigset_from_native(&bsa->sa_mask, &osa->sa_mask);
525: osa->sa_flags = 0;
526:
527: /* Translate by hand */
528: if ((bsa->sa_flags & SA_ONSTACK) != 0)
529: osa->sa_flags |= OSF1_SA_ONSTACK;
530: if ((bsa->sa_flags & SA_RESTART) != 0)
531: osa->sa_flags |= OSF1_SA_RESTART;
532: if ((bsa->sa_flags & SA_NOCLDSTOP) != 0)
533: osa->sa_flags |= OSF1_SA_NOCLDSTOP;
534: if ((bsa->sa_flags & SA_NOCLDWAIT) != 0)
535: osa->sa_flags |= OSF1_SA_NOCLDWAIT;
536: if ((bsa->sa_flags & SA_NODEFER) != 0)
537: osa->sa_flags |= OSF1_SA_NODEFER;
538: if ((bsa->sa_flags & SA_RESETHAND) != 0)
539: osa->sa_flags |= OSF1_SA_RESETHAND;
540: if ((bsa->sa_flags & SA_SIGINFO) != 0)
541: osa->sa_flags |= OSF1_SA_SIGINFO;
542: }
543:
544: int
545: osf1_cvt_sigaction_to_native(osa, bsa)
546: const struct osf1_sigaction *osa;
547: struct sigaction *bsa;
548: {
549: bsa->sa_handler = osa->sa__handler;
550: osf1_cvt_sigset_to_native(&osa->sa_mask, &bsa->sa_mask);
551: bsa->sa_flags = 0;
552:
553: /* Translate by hand */
554: if ((osa->sa_flags & OSF1_SA_ONSTACK) != 0)
555: bsa->sa_flags |= SA_ONSTACK;
556: if ((osa->sa_flags & OSF1_SA_RESTART) != 0)
557: bsa->sa_flags |= SA_RESTART;
558: if ((osa->sa_flags & OSF1_SA_RESETHAND) != 0)
559: bsa->sa_flags |= SA_RESETHAND;
560: if ((osa->sa_flags & OSF1_SA_NOCLDSTOP) != 0)
561: bsa->sa_flags |= SA_NOCLDSTOP;
562: if ((osa->sa_flags & OSF1_SA_NOCLDWAIT) != 0)
563: bsa->sa_flags |= SA_NOCLDWAIT;
564: if ((osa->sa_flags & OSF1_SA_NODEFER) != 0)
565: bsa->sa_flags |= SA_NODEFER;
566: if ((osa->sa_flags & OSF1_SA_SIGINFO) != 0)
567: bsa->sa_flags |= SA_SIGINFO;
568:
569: return(0);
570: }
571:
572: void
573: osf1_cvt_sigaltstack_from_native(bss, oss)
574: const struct sigaltstack *bss;
575: struct osf1_sigaltstack *oss;
576: {
577:
578: oss->ss_sp = bss->ss_sp;
579: oss->ss_size = bss->ss_size;
580:
581: /* translate flags */
582: oss->ss_flags = emul_flags_translate(osf1_sigaltstack_flags_rxtab,
583: bss->ss_flags, NULL);
584: }
585:
586: int
587: osf1_cvt_sigaltstack_to_native(oss, bss)
588: const struct osf1_sigaltstack *oss;
589: struct sigaltstack *bss;
590: {
591: unsigned long leftovers;
592:
593: bss->ss_sp = oss->ss_sp;
594: bss->ss_size = oss->ss_size;
595:
596: /* translate flags */
597: bss->ss_flags = emul_flags_translate(osf1_sigaltstack_flags_xtab,
598: oss->ss_flags, &leftovers);
599:
600: if (leftovers != 0) {
601: printf("osf1_cvt_sigaltstack_to_native: leftovers = 0x%lx\n",
602: leftovers);
603: return (EINVAL);
604: }
605:
606: return (0);
607: }
608:
609: void
610: osf1_cvt_sigset_from_native(bss, oss)
611: const sigset_t *bss;
612: osf1_sigset_t *oss;
613: {
614: int i, newsig;
615:
616: osf1_sigemptyset(oss);
617: for (i = 1; i < NSIG; i++) {
618: if (sigismember(bss, i)) {
619: newsig = osf1_signal_rxlist[i];
620: if (newsig)
621: osf1_sigaddset(oss, newsig);
622: }
623: }
624: }
625:
626: int
627: osf1_cvt_sigset_to_native(oss, bss)
628: const osf1_sigset_t *oss;
629: sigset_t *bss;
630: {
631: int i, newsig;
632:
633: sigemptyset(bss);
634: for (i = 1; i < OSF1_NSIG; i++) {
635: if (osf1_sigismember(oss, i)) {
636: newsig = osf1_signal_xlist[i];
637: if (newsig)
638: sigaddset(bss, newsig);
639: }
640: }
641: return (0);
642: }
643:
644: /*
645: * Convert from a stat structure to an osf1 stat structure.
646: */
647: void
648: osf1_cvt_stat_from_native(st, ost)
649: const struct stat *st;
650: struct osf1_stat *ost;
651: {
652:
653: ost->st_dev = osf1_cvt_dev_from_native(st->st_dev);
654: ost->st_ino = st->st_ino;
655: ost->st_mode = st->st_mode;
656: ost->st_nlink = st->st_nlink;
657: ost->st_uid = st->st_uid == -2 ? (u_int16_t) -2 : st->st_uid;
658: ost->st_gid = st->st_gid == -2 ? (u_int16_t) -2 : st->st_gid;
659: ost->st_rdev = osf1_cvt_dev_from_native(st->st_rdev);
660: ost->st_size = st->st_size;
661: ost->st_atime_sec = st->st_atime;
662: ost->st_spare1 = 0;
663: ost->st_mtime_sec = st->st_mtime;
664: ost->st_spare2 = 0;
665: ost->st_ctime_sec = st->st_ctime;
666: ost->st_spare3 = 0;
667: ost->st_blksize = st->st_blksize;
668: ost->st_blocks = st->st_blocks;
669: ost->st_flags = st->st_flags;
670: ost->st_gen = st->st_gen;
671: }
672:
673: void
674: osf1_cvt_statfs_from_native(bsfs, osfs)
675: const struct statfs *bsfs;
676: struct osf1_statfs *osfs;
677: {
678:
679: memset(osfs, 0, sizeof (struct osf1_statfs));
680: if (!strncmp(MOUNT_FFS, bsfs->f_fstypename, MFSNAMELEN))
681: osfs->f_type = OSF1_MOUNT_UFS;
682: else if (!strncmp(MOUNT_NFS, bsfs->f_fstypename, MFSNAMELEN))
683: osfs->f_type = OSF1_MOUNT_NFS;
684: else if (!strncmp(MOUNT_MFS, bsfs->f_fstypename, MFSNAMELEN))
685: osfs->f_type = OSF1_MOUNT_MFS;
686: else
687: /* uh oh... XXX = PC, CDFS, PROCFS, etc. */
688: osfs->f_type = OSF1_MOUNT_ADDON;
689: osfs->f_flags = bsfs->f_flags; /* XXX translate */
690: osfs->f_fsize = bsfs->f_bsize;
691: osfs->f_bsize = bsfs->f_iosize;
692: osfs->f_blocks = bsfs->f_blocks;
693: osfs->f_bfree = bsfs->f_bfree;
694: osfs->f_bavail = bsfs->f_bavail;
695: osfs->f_files = bsfs->f_files;
696: osfs->f_ffree = bsfs->f_ffree;
697: memcpy(&osfs->f_fsid, &bsfs->f_fsid,
698: max(sizeof bsfs->f_fsid, sizeof osfs->f_fsid));
699: /* osfs->f_spare zeroed above */
700: memcpy(osfs->f_mntonname, bsfs->f_mntonname,
701: max(sizeof bsfs->f_mntonname, sizeof osfs->f_mntonname));
702: memcpy(osfs->f_mntfromname, bsfs->f_mntfromname,
703: max(sizeof bsfs->f_mntfromname, sizeof osfs->f_mntfromname));
704: /* XXX osfs->f_xxx should be filled in... */
705: }
CVSweb