1 commit ba2cfac31ccfd0aa4c93524088d1be4fca3e68f6
3 Date: Mon Nov 10 22:53:02 2008 +0000
5 2008-10-23 Dmitry V. Levin <ldv@altlinux.org>
7 Implement parsers for new linux syscalls.
8 * desc.c (do_dup2, [LINUX] sys_dup3): New functions.
9 (sys_dup2): Use do_dup2.
10 [LINUX] (sys_epoll_create1): New function.
11 [LINUX] (do_eventfd, sys_eventfd2): New functions.
12 [LINUX] (sys_eventfd): Use do_eventfd.
13 * net.c (do_pipe, [LINUX] sys_pipe2): New functions.
14 (sys_pipe): Use do_pipe.
15 * signal.c [LINUX] (do_signalfd, sys_signalfd4): New functions.
16 [LINUX] (sys_signalfd): Use do_signalfd.
17 * linux/syscall.h: Declare new sys_* functions.
18 * linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1,
19 dup3, pipe2, inotify_init1.
20 * linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2,
21 epoll_create1, dup3, pipe2, inotify_init1.
23 diff --git a/desc.c b/desc.c
24 index 8b8a894..222cb2b 100644
27 @@ -242,6 +242,8 @@ int getlk;
31 +extern const struct xlat open_mode_flags[];
34 * low bits of the open(2) flags define access mode,
35 * other bits are real flags.
36 @@ -250,7 +252,6 @@ static const char *
37 sprint_open_modes(mode_t flags)
39 extern const struct xlat open_access_modes[];
40 - extern const struct xlat open_mode_flags[];
41 static char outstr[1024];
42 const char *str = xlookup(open_access_modes, flags & 3);
44 @@ -396,16 +397,33 @@ struct tcb *tcp;
52 +do_dup2(struct tcb *tcp, int flags_arg)
55 tprintf("%ld, %ld", tcp->u_arg[0], tcp->u_arg[1]);
56 + if (flags_arg >= 0) {
58 + printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
65 +sys_dup2(struct tcb *tcp)
67 + return do_dup2(tcp, -1);
72 +sys_dup3(struct tcb *tcp)
74 + return do_dup2(tcp, 2);
78 #if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4)
80 sys_getdtablesize(tcp)
81 @@ -605,14 +623,21 @@ static struct xlat epollevents[] = {
85 -sys_epoll_create(tcp)
87 +sys_epoll_create(struct tcb *tcp)
90 tprintf("%ld", tcp->u_arg[0]);
95 +sys_epoll_create1(struct tcb *tcp)
98 + printflags(open_mode_flags, tcp->u_arg[0], "O_???");
102 #ifdef HAVE_SYS_EPOLL_H
104 print_epoll_event(ev)
105 @@ -889,12 +914,28 @@ sys_pselect6(struct tcb *tcp)
113 +do_eventfd(struct tcb *tcp, int flags_arg)
116 + if (entering(tcp)) {
117 tprintf("%lu", tcp->u_arg[0]);
118 + if (flags_arg >= 0) {
120 + printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
127 +sys_eventfd(struct tcb *tcp)
129 + return do_eventfd(tcp, -1);
133 +sys_eventfd2(struct tcb *tcp)
135 + return do_eventfd(tcp, 1);
138 diff --git a/linux/syscall.h b/linux/syscall.h
139 index 96d6d2f..f8e4f20 100644
140 --- a/linux/syscall.h
141 +++ b/linux/syscall.h
142 @@ -105,6 +105,7 @@ int sys_io_setup(), sys_io_submit(), sys_io_cancel(), sys_io_getevents(), sys_io
143 int sys_utimensat(), sys_epoll_pwait(), sys_signalfd(), sys_timerfd(), sys_eventfd();
145 int sys_fallocate(), sys_timerfd_create(), sys_timerfd_settime(), sys_timerfd_gettime();
146 +int sys_signalfd4(), sys_eventfd2(), sys_epoll_create1(), sys_dup3(), sys_pipe2();
148 /* sys_socketcall subcalls */
150 diff --git a/linux/syscallent.h b/linux/syscallent.h
151 index 59c9a72..53bd9b3 100644
152 --- a/linux/syscallent.h
153 +++ b/linux/syscallent.h
154 @@ -357,12 +357,12 @@
155 { 6, TF, sys_fallocate, "fallocate" }, /* 324 */
156 { 4, TD, sys_timerfd_settime, "timerfd_settime"}, /* 325 */
157 { 2, TD, sys_timerfd_gettime, "timerfd_gettime"}, /* 326 */
158 - { 5, 0, printargs, "SYS_327" }, /* 327 */
159 - { 5, 0, printargs, "SYS_328" }, /* 328 */
160 - { 5, 0, printargs, "SYS_329" }, /* 329 */
161 - { 5, 0, printargs, "SYS_330" }, /* 330 */
162 - { 5, 0, printargs, "SYS_331" }, /* 331 */
163 - { 5, 0, printargs, "SYS_332" }, /* 332 */
164 + { 4, TD|TS, sys_signalfd4, "signalfd4" }, /* 327 */
165 + { 2, TD, sys_eventfd2, "eventfd2" }, /* 328 */
166 + { 1, 0, sys_epoll_create1, "epoll_create1" }, /* 329 */
167 + { 3, TD, sys_dup3, "dup3" }, /* 330 */
168 + { 2, TD, sys_pipe2, "pipe2" }, /* 331 */
169 + { 1, TD, printargs, "inotify_init1" }, /* 332 */
170 { 5, 0, printargs, "SYS_333" }, /* 333 */
171 { 5, 0, printargs, "SYS_334" }, /* 334 */
172 { 5, 0, printargs, "SYS_335" }, /* 335 */
173 diff --git a/linux/x86_64/syscallent.h b/linux/x86_64/syscallent.h
174 index 0b2150b..4b4eaf0 100644
175 --- a/linux/x86_64/syscallent.h
176 +++ b/linux/x86_64/syscallent.h
178 { 6, TF, sys_fallocate, "fallocate" }, /* 285 */
179 { 4, TD, sys_timerfd_settime, "timerfd_settime"}, /* 286 */
180 { 2, TD, sys_timerfd_gettime, "timerfd_gettime"}, /* 287 */
181 + { 6, TN, printargs, "paccept" }, /* 288 */
182 + { 4, TD|TS, sys_signalfd4, "signalfd4" }, /* 289 */
183 + { 2, TD, sys_eventfd2, "eventfd2" }, /* 290 */
184 + { 1, 0, sys_epoll_create1, "epoll_create1" }, /* 291 */
185 + { 3, TD, sys_dup3, "dup3" }, /* 292 */
186 + { 2, TD, sys_pipe2, "pipe2" }, /* 293 */
187 + { 1, TD, printargs, "inotify_init1" }, /* 294 */
188 diff --git a/net.c b/net.c
189 index f5426b2..d5426bd 100644
192 @@ -1463,31 +1463,50 @@
193 return sys_accept(tcp);
201 -#if defined(LINUX) && !defined(SPARC) && !defined(SPARC64) && !defined(SH) && !defined(IA64)
203 +extern const struct xlat open_mode_flags[];
206 +do_pipe(struct tcb *tcp, int flags_arg)
210 tprintf("%#lx", tcp->u_arg[0]);
213 - if (umoven(tcp, tcp->u_arg[0], sizeof fds, (char *) fds) < 0)
216 - tprintf("[%u, %u]", fds[0], fds[1]);
219 +#if defined(LINUX) && !defined(SPARC) && !defined(SPARC64) && !defined(SH) && !defined(IA64)
222 + if (umoven(tcp, tcp->u_arg[0], sizeof fds, (char *) fds) < 0)
225 + tprintf("[%u, %u]", fds[0], fds[1]);
226 #elif defined(SPARC) || defined(SPARC64) || defined(SH) || defined(SVR4) || defined(FREEBSD) || defined(IA64)
228 - tprintf("[%lu, %lu]", tcp->u_rval, getrval2(tcp));
229 + tprintf("[%lu, %lu]", tcp->u_rval, getrval2(tcp));
231 + tprintf("%#lx", tcp->u_arg[0]);
234 + if (flags_arg >= 0) {
236 + printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
243 +sys_pipe(struct tcb *tcp)
245 + return do_pipe(tcp, -1);
250 +sys_pipe2(struct tcb *tcp)
252 + return do_pipe(tcp, 1);
259 diff --git a/signal.c b/signal.c
260 index 12bbac3..0366bb5 100644
263 @@ -2011,15 +2011,32 @@ struct tcb *tcp;
270 +extern const struct xlat open_mode_flags[];
273 +do_signalfd(struct tcb *tcp, int flags_arg)
276 tprintf("%ld, ", tcp->u_arg[0]);
277 print_sigset(tcp, tcp->u_arg[1], 1);
278 tprintf("%lu", tcp->u_arg[2]);
279 + if (flags_arg >= 0) {
281 + printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
288 +sys_signalfd(struct tcb *tcp)
290 + return do_signalfd(tcp, -1);
294 +sys_signalfd4(struct tcb *tcp)
296 + return do_signalfd(tcp, 3);
299 commit feeceab4c8bfde6542d78048854c3bdc7ea9c99b
301 Date: Mon Nov 10 17:21:23 2008 +0000
303 2008-10-22 Dmitry V. Levin <ldv@altlinux.org>
305 Handle socket type flags introduced in linux 2.6.27.
306 * net.c (socktypes): Add SOCK_DCCP.
307 (sock_type_flags): New xlat structure.
308 (tprint_sock_type): New function.
309 (sys_socket, sys_socketpair): Use it to parse socket type and
312 diff --git a/net.c b/net.c
313 index c302b1f..f5426b2 100644
317 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
318 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
325 @@ -320,17 +320,32 @@ static const struct xlat socktypes[] = {
327 { SOCK_RAW, "SOCK_RAW" },
330 + { SOCK_RDM, "SOCK_RDM" },
332 #ifdef SOCK_SEQPACKET
333 { SOCK_SEQPACKET,"SOCK_SEQPACKET"},
336 - { SOCK_RDM, "SOCK_RDM" },
338 + { SOCK_DCCP, "SOCK_DCCP" },
341 { SOCK_PACKET, "SOCK_PACKET" },
345 +const struct xlat sock_type_flags[] = {
347 + { SOCK_CLOEXEC, "SOCK_CLOEXEC" },
349 +#ifdef SOCK_NONBLOCK
350 + { SOCK_NONBLOCK,"SOCK_NONBLOCK" },
354 +#ifndef SOCK_TYPE_MASK
355 +# define SOCK_TYPE_MASK 0xf
357 static const struct xlat socketlayers[] = {
359 { SOL_IP, "SOL_IP" },
360 @@ -1182,14 +1197,33 @@ long addr;
362 #endif /* HAVE_SENDMSG */
365 + * low bits of the socket type define real socket type,
366 + * other bits are socket type flags.
369 +tprint_sock_type(struct tcb *tcp, int flags)
371 + const char *str = xlookup(socktypes, flags & SOCK_TYPE_MASK);
375 + tprintf("%s", str);
376 + flags &= ~SOCK_TYPE_MASK;
381 + printflags(sock_type_flags, flags, "SOCK_???");
387 +sys_socket(struct tcb *tcp)
390 printxval(domains, tcp->u_arg[0], "PF_???");
392 - printxval(socktypes, tcp->u_arg[1], "SOCK_???");
393 + tprint_sock_type(tcp, tcp->u_arg[1]);
395 switch (tcp->u_arg[0]) {
397 @@ -1489,8 +1523,7 @@ struct tcb *tcp;
403 +sys_socketpair(struct tcb *tcp)
407 @@ -1499,7 +1532,7 @@ struct tcb *tcp;
409 printxval(domains, tcp->u_arg[0], "PF_???");
411 - printxval(socktypes, tcp->u_arg[1], "SOCK_???");
412 + tprint_sock_type(tcp, tcp->u_arg[1]);
414 switch (tcp->u_arg[0]) {