|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * Copyright (c) 1997 by Apple Computer, Inc., all rights reserved
24: * Copyright (c) 1993 NeXT Computer, Inc.
25: *
26: */
27:
28: #include <sys/param.h>
29: #include <sys/systm.h>
30: #include <sys/buf.h>
31: #include <sys/ioctl.h>
32: #include <sys/tty.h>
33: #include <sys/conf.h>
34: #include <sys/proc.h>
35: #include <sys/user.h>
36: #include <kern/thread.h>
37: #include <kern/thread_act.h>
38: #include <kern/task.h>
39: #include <vm/vm_map.h>
40:
41:
42: /*
43: * copy a null terminated string from the kernel address space into
44: * the user address space.
45: * - if the user is denied write access, return EFAULT.
46: * - if the end of string isn't found before
47: * maxlen bytes are copied, return ENAMETOOLONG,
48: * indicating an incomplete copy.
49: * - otherwise, return 0, indicating success.
50: * the number of bytes copied is always returned in lencopied.
51: */
52: int
53: copyoutstr(from, to, maxlen, lencopied)
54: void * from, * to;
55: size_t maxlen, *lencopied;
56: {
57: int slen,len,error=0;
58:
59: /* XXX Must optimize this */
60:
61: slen = strlen(from) + 1;
62: if (slen > maxlen)
63: error = ENAMETOOLONG;
64:
65: len = min(maxlen,slen);
66: if (copyout(from, to, len))
67: error = EFAULT;
68: *lencopied = len;
69:
70: return error;
71: }
72:
73:
74: /*
75: * copy a null terminated string from one point to another in
76: * the kernel address space.
77: * - no access checks are performed.
78: * - if the end of string isn't found before
79: * maxlen bytes are copied, return ENAMETOOLONG,
80: * indicating an incomplete copy.
81: * - otherwise, return 0, indicating success.
82: * the number of bytes copied is always returned in lencopied.
83: */
84: /* from ppc/fault_copy.c -Titan1T4 VERSION */
85: int
86: copystr(vfrom, vto, maxlen, lencopied)
87: register void * vfrom, *vto;
88: size_t maxlen, *lencopied;
89: {
90: register unsigned l;
91: int error;
92: caddr_t from, to;
93:
94: from = vfrom;
95: to = vto;
96: for (l = 0; l < maxlen; l++)
97: if ((*to++ = *from++) == '\0') {
98: if (lencopied)
99: *lencopied = l + 1;
100: return 0;
101: }
102: if (lencopied)
103: *lencopied = maxlen;
104: return ENAMETOOLONG;
105: }
106:
107: int copywithin(src, dst, count)
108: void * src, *dst;
109: size_t count;
110: {
111: bcopy(src,dst,count);
112: return 0;
113: }
114:
115: struct unix_syscallargs {
116: int flavor;
117: int r3;
118: int arg1, arg2,arg3,arg4,arg5,arg6,arg7;
119: };
120:
121: set_bsduthreadargs(thread_t th, void * pcb, struct unix_syscallargs * sarg)
122: {
123: struct uthread * ut;
124:
125: ut = get_bsdthread_info(th);
126: ut->uu_ar0 = (int *)pcb;
127:
128: if (sarg->flavor)
129: {
130: ut->uu_arg[0] = sarg->arg1;
131: ut->uu_arg[1] = sarg->arg2;
132: ut->uu_arg[2] = sarg->arg3;
133: ut->uu_arg[3] = sarg->arg4;
134: ut->uu_arg[4] = sarg->arg5;
135: ut->uu_arg[5] = sarg->arg6;
136: ut->uu_arg[7] = sarg->arg7;
137: }
138: else
139: {
140: ut->uu_arg[0] = sarg->r3;
141: ut->uu_arg[1] = sarg->arg1;
142: ut->uu_arg[2] = sarg->arg2;
143: ut->uu_arg[3] = sarg->arg3;
144: ut->uu_arg[4] = sarg->arg4;
145: ut->uu_arg[5] = sarg->arg5;
146: ut->uu_arg[6] = sarg->arg6;
147: ut->uu_arg[7] = sarg->arg7;
148: }
149:
150: return(1);
151: }
152:
153: void *
154: get_bsduthreadarg(thread_t th)
155: {
156: struct uthread *ut;
157: ut = get_bsdthread_info(th);
158: return((void *)(ut->uu_arg));
159: }
160:
161: int *
162: get_bsduthreadrval(thread_act_t th)
163: {
164: struct uthread *ut;
165: ut = get_bsdthread_info(th);
166: return(&ut->uu_rval[0]);
167: }
168:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.