This source file includes following definitions.
- compat_35_sys_shmget
- compat_35_sys_semop
- msqid_copyin
- msqid_copyout
- compat_35_sys_msgctl
- semid_copyin
- semid_copyout
- compat_35_sys___semctl
- shmid_copyin
- shmid_copyout
- compat_35_sys_shmctl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <sys/param.h>
20 #include <sys/systm.h>
21 #include <sys/kernel.h>
22 #include <sys/proc.h>
23 #include <sys/msg.h>
24 #include <sys/sem.h>
25 #include <sys/shm.h>
26
27 #include <sys/mount.h>
28 #include <sys/syscallargs.h>
29
30 #ifdef SYSVMSG
31
32
33
34 int
35 compat_35_sys_shmget(struct proc *p, void *v, register_t *retval)
36 {
37 struct compat_35_sys_shmget_args
38
39
40
41 *uap = v;
42 struct sys_shmget_args
43
44
45
46 shmget_args;
47
48 SCARG(&shmget_args, key) = SCARG(uap, key);
49 SCARG(&shmget_args, size) = (size_t)SCARG(uap, size);
50 SCARG(&shmget_args, shmflg) = SCARG(uap, shmflg);
51
52 return (sys_shmget(p, &shmget_args, retval));
53 }
54 #endif
55
56 #ifdef SYSVSEM
57
58
59
60 int
61 compat_35_sys_semop(struct proc *p, void *v, register_t *retval)
62 {
63 struct compat_35_sys_semop_args
64
65
66
67 *uap = v;
68 struct sys_semop_args
69
70
71
72 semop_args;
73
74 SCARG(&semop_args, semid) = SCARG(uap, semid);
75 SCARG(&semop_args, sops) = SCARG(uap, sops);
76 SCARG(&semop_args, nsops) = (size_t)SCARG(uap, nsops);
77
78 return (sys_semop(p, &semop_args, retval));
79 }
80 #endif
81
82
83
84
85 #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
86 #define cvt_ds(to, from, type, base) do { \
87 (to)->type##_perm.cuid = (from)->type##_perm.cuid; \
88 (to)->type##_perm.cgid = (from)->type##_perm.cgid; \
89 (to)->type##_perm.uid = (from)->type##_perm.uid; \
90 (to)->type##_perm.gid = (from)->type##_perm.gid; \
91 (to)->type##_perm.mode = (from)->type##_perm.mode & 0xffffU; \
92 (to)->type##_perm.seq = (from)->type##_perm.seq; \
93 (to)->type##_perm.key = (from)->type##_perm.key; \
94 bcopy((caddr_t)&(from)->base, (caddr_t)&(to)->base, \
95 sizeof(*(to)) - ((caddr_t)&(to)->base - (caddr_t)to)); \
96 } while (0)
97 #endif
98
99 #ifdef SYSVMSG
100
101
102
103 static int
104 msqid_copyin(const void *uaddr, void *kaddr, size_t len)
105 {
106 struct msqid_ds *msqbuf = kaddr;
107 struct msqid_ds35 omsqbuf;
108 int error;
109
110 if (len != sizeof(struct msqid_ds))
111 return (EFAULT);
112 if ((error = copyin(uaddr, &omsqbuf, sizeof(omsqbuf))) == 0)
113 cvt_ds(msqbuf, &omsqbuf, msg, msg_first);
114 return (error);
115 }
116
117
118
119
120 static int
121 msqid_copyout(const void *kaddr, void *uaddr, size_t len)
122 {
123 const struct msqid_ds *msqbuf = kaddr;
124 struct msqid_ds35 omsqbuf;
125
126 if (len != sizeof(struct msqid_ds))
127 return (EFAULT);
128 cvt_ds(&omsqbuf, msqbuf, msg, msg_first);
129 return (copyout(&omsqbuf, uaddr, sizeof(omsqbuf)));
130 }
131
132
133
134
135 int
136 compat_35_sys_msgctl(struct proc *p, void *v, register_t *retval)
137 {
138 struct compat_35_sys_msgctl_args
139
140
141
142 *uap = v;
143
144 return (msgctl1(p, SCARG(uap, msqid), SCARG(uap, cmd),
145 (caddr_t)SCARG(uap, buf), msqid_copyin, msqid_copyout));
146 }
147 #endif
148
149 #ifdef SYSVSEM
150
151
152
153 static int
154 semid_copyin(const void *uaddr, void *kaddr, size_t len)
155 {
156 struct semid_ds *sembuf = kaddr;
157 struct semid_ds35 osembuf;
158 int error;
159
160 if (len != sizeof(struct semid_ds))
161 return (EFAULT);
162 if ((error = copyin(uaddr, &osembuf, sizeof(osembuf))) == 0)
163 cvt_ds(sembuf, &osembuf, sem, sem_base);
164 return (error);
165 }
166
167
168
169
170 static int
171 semid_copyout(const void *kaddr, void *uaddr, size_t len)
172 {
173 const struct semid_ds *sembuf = kaddr;
174 struct semid_ds35 osembuf;
175
176 if (len != sizeof(struct semid_ds))
177 return (EFAULT);
178 cvt_ds(&osembuf, sembuf, sem, sem_base);
179 return (copyout(&osembuf, uaddr, sizeof(osembuf)));
180 }
181
182
183
184
185 int
186 compat_35_sys___semctl(struct proc *p, void *v, register_t *retval)
187 {
188 struct compat_35_sys___semctl_args
189
190
191
192
193 *uap = v;
194 union semun arg;
195 int error = 0, cmd = SCARG(uap, cmd);
196
197 switch (cmd) {
198 case IPC_SET:
199 case IPC_STAT:
200 case GETALL:
201 case SETVAL:
202 case SETALL:
203 error = copyin(SCARG(uap, arg), &arg, sizeof(arg));
204 break;
205 }
206 if (error == 0) {
207 error = semctl1(p, SCARG(uap, semid), SCARG(uap, semnum),
208 cmd, &arg, retval, semid_copyin, semid_copyout);
209 }
210 return (error);
211 }
212 #endif
213
214 #ifdef SYSVSHM
215
216
217
218 static int
219 shmid_copyin(const void *uaddr, void *kaddr, size_t len)
220 {
221 struct shmid_ds *shmbuf = kaddr;
222 struct shmid_ds35 oshmbuf;
223 int error;
224
225 if (len != sizeof(struct shmid_ds))
226 return (EFAULT);
227 if ((error = copyin(uaddr, &oshmbuf, sizeof(oshmbuf))) == 0)
228 cvt_ds(shmbuf, &oshmbuf, shm, shm_segsz);
229 return (error);
230 }
231
232
233
234
235 static int
236 shmid_copyout(const void *kaddr, void *uaddr, size_t len)
237 {
238 const struct shmid_ds *shmbuf = kaddr;
239 struct shmid_ds35 oshmbuf;
240
241 if (len != sizeof(struct shmid_ds))
242 return (EFAULT);
243 cvt_ds(&oshmbuf, shmbuf, shm, shm_segsz);
244 return (copyout(&oshmbuf, uaddr, sizeof(oshmbuf)));
245 }
246
247
248
249
250 int
251 compat_35_sys_shmctl(struct proc *p, void *v, register_t *retval)
252 {
253 struct compat_35_sys_shmctl_args
254
255
256
257 *uap = v;
258
259 return (shmctl1(p, SCARG(uap, shmid), SCARG(uap, cmd),
260 (caddr_t)SCARG(uap, buf), shmid_copyin, shmid_copyout));
261 }
262 #endif