This source file includes following definitions.
- osf1_sys_readv
- osf1_sys_select
- osf1_sys_writev
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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/malloc.h>
68 #include <sys/mman.h>
69 #include <sys/mount.h>
70 #include <sys/syscallargs.h>
71 #include <sys/exec.h>
72
73 #include <compat/osf1/osf1.h>
74 #include <compat/osf1/osf1_syscallargs.h>
75 #include <compat/osf1/osf1_cvt.h>
76
77
78
79
80
81 int
82 osf1_sys_readv(p, v, retval)
83 struct proc *p;
84 void *v;
85 register_t *retval;
86 {
87 struct osf1_sys_readv_args *uap = v;
88 struct sys_readv_args a;
89 struct osf1_iovec *oio;
90 struct iovec *nio;
91 caddr_t sg = stackgap_init(p->p_emul);
92 int error, osize, nsize, i;
93
94 if (SCARG(uap, iovcnt) > (STACKGAPLEN / sizeof (struct iovec)))
95 return (EINVAL);
96
97 osize = SCARG(uap, iovcnt) * sizeof (struct osf1_iovec);
98 nsize = SCARG(uap, iovcnt) * sizeof (struct iovec);
99
100 oio = malloc(osize, M_TEMP, M_WAITOK);
101 nio = malloc(nsize, M_TEMP, M_WAITOK);
102
103 error = 0;
104 if ((error = copyin(SCARG(uap, iovp), oio, osize)))
105 goto punt;
106 for (i = 0; i < SCARG(uap, iovcnt); i++) {
107 nio[i].iov_base = oio[i].iov_base;
108 nio[i].iov_len = oio[i].iov_len;
109 }
110
111 SCARG(&a, fd) = SCARG(uap, fd);
112 SCARG(&a, iovp) = stackgap_alloc(&sg, nsize);
113 SCARG(&a, iovcnt) = SCARG(uap, iovcnt);
114
115 if ((error = copyout(nio, (caddr_t)SCARG(&a, iovp), nsize)))
116 goto punt;
117 error = sys_readv(p, &a, retval);
118
119 punt:
120 free(oio, M_TEMP);
121 free(nio, M_TEMP);
122 return (error);
123 }
124
125 int
126 osf1_sys_select(p, v, retval)
127 struct proc *p;
128 void *v;
129 register_t *retval;
130 {
131 struct osf1_sys_select_args *uap = v;
132 struct sys_select_args a;
133 struct osf1_timeval otv;
134 struct timeval tv;
135 int error;
136 caddr_t sg;
137
138 SCARG(&a, nd) = SCARG(uap, nd);
139 SCARG(&a, in) = SCARG(uap, in);
140 SCARG(&a, ou) = SCARG(uap, ou);
141 SCARG(&a, ex) = SCARG(uap, ex);
142
143 error = 0;
144 if (SCARG(uap, tv) == NULL)
145 SCARG(&a, tv) = NULL;
146 else {
147 sg = stackgap_init(p->p_emul);
148 SCARG(&a, tv) = stackgap_alloc(&sg, sizeof tv);
149
150
151 error = copyin((caddr_t)SCARG(uap, tv),
152 (caddr_t)&otv, sizeof otv);
153 if (error == 0) {
154
155
156 memset(&tv, 0, sizeof tv);
157 tv.tv_sec = otv.tv_sec;
158 tv.tv_usec = otv.tv_usec;
159
160 error = copyout((caddr_t)&tv,
161 (caddr_t)SCARG(&a, tv), sizeof tv);
162 }
163 }
164
165 if (error == 0)
166 error = sys_select(p, &a, retval);
167
168 return (error);
169 }
170
171 int
172 osf1_sys_writev(p, v, retval)
173 struct proc *p;
174 void *v;
175 register_t *retval;
176 {
177 struct osf1_sys_writev_args *uap = v;
178 struct sys_writev_args a;
179 struct osf1_iovec *oio;
180 struct iovec *nio;
181 caddr_t sg = stackgap_init(p->p_emul);
182 int error, osize, nsize, i;
183
184 if (SCARG(uap, iovcnt) > (STACKGAPLEN / sizeof (struct iovec)))
185 return (EINVAL);
186
187 osize = SCARG(uap, iovcnt) * sizeof (struct osf1_iovec);
188 nsize = SCARG(uap, iovcnt) * sizeof (struct iovec);
189
190 oio = malloc(osize, M_TEMP, M_WAITOK);
191 nio = malloc(nsize, M_TEMP, M_WAITOK);
192
193 error = 0;
194 if ((error = copyin(SCARG(uap, iovp), oio, osize)))
195 goto punt;
196 for (i = 0; i < SCARG(uap, iovcnt); i++) {
197 nio[i].iov_base = oio[i].iov_base;
198 nio[i].iov_len = oio[i].iov_len;
199 }
200
201 SCARG(&a, fd) = SCARG(uap, fd);
202 SCARG(&a, iovp) = stackgap_alloc(&sg, nsize);
203 SCARG(&a, iovcnt) = SCARG(uap, iovcnt);
204
205 if ((error = copyout(nio, (caddr_t)SCARG(&a, iovp), nsize)))
206 goto punt;
207 error = sys_writev(p, &a, retval);
208
209 punt:
210 free(oio, M_TEMP);
211 free(nio, M_TEMP);
212 return (error);
213 }