syscall.c (5cd4393b14b68a4e80a3ffa74c04efff2b9590a5) syscall.c (7854b05654b49c2197faef358e3ec1a7559797b9)
1/*
2 * Linux syscalls
3 *
4 * Copyright (c) 2003 Fabrice Bellard
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or

--- 12 unchanged lines hidden (view full) ---

21#include <stdio.h>
22#include <stdarg.h>
23#include <string.h>
24#include <elf.h>
25#include <endian.h>
26#include <errno.h>
27#include <unistd.h>
28#include <fcntl.h>
1/*
2 * Linux syscalls
3 *
4 * Copyright (c) 2003 Fabrice Bellard
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or

--- 12 unchanged lines hidden (view full) ---

21#include <stdio.h>
22#include <stdarg.h>
23#include <string.h>
24#include <elf.h>
25#include <endian.h>
26#include <errno.h>
27#include <unistd.h>
28#include <fcntl.h>
29#include <time.h>
29#include <sys/types.h>
30#include <sys/wait.h>
31#include <sys/time.h>
32#include <sys/stat.h>
33#include <sys/mount.h>
34#include <sys/resource.h>
35#include <sys/mman.h>
36#include <sys/swap.h>
37#include <signal.h>
38#include <sched.h>
39#include <sys/socket.h>
40#include <sys/uio.h>
41#include <sys/poll.h>
42//#include <sys/user.h>
30#include <sys/types.h>
31#include <sys/wait.h>
32#include <sys/time.h>
33#include <sys/stat.h>
34#include <sys/mount.h>
35#include <sys/resource.h>
36#include <sys/mman.h>
37#include <sys/swap.h>
38#include <signal.h>
39#include <sched.h>
40#include <sys/socket.h>
41#include <sys/uio.h>
42#include <sys/poll.h>
43//#include <sys/user.h>
44#include <netinet/tcp.h>
43
44#define termios host_termios
45#define winsize host_winsize
46#define termio host_termio
47#define sgttyb host_sgttyb /* same as target */
48#define tchars host_tchars /* same as target */
49#define ltchars host_ltchars /* same as target */
50

--- 110 unchanged lines hidden (view full) ---

161 target_brk = new_brk;
162 return (long)target_brk;
163 }
164}
165
166static inline fd_set *target_to_host_fds(fd_set *fds,
167 target_long *target_fds, int n)
168{
45
46#define termios host_termios
47#define winsize host_winsize
48#define termio host_termio
49#define sgttyb host_sgttyb /* same as target */
50#define tchars host_tchars /* same as target */
51#define ltchars host_ltchars /* same as target */
52

--- 110 unchanged lines hidden (view full) ---

163 target_brk = new_brk;
164 return (long)target_brk;
165 }
166}
167
168static inline fd_set *target_to_host_fds(fd_set *fds,
169 target_long *target_fds, int n)
170{
169#if !defined(BSWP_NEEDED) && !defined(WORD_BIGENDIAN)
171#if !defined(BSWAP_NEEDED) && !defined(WORDS_BIGENDIAN)
170 return (fd_set *)target_fds;
171#else
172 int i, b;
173 if (target_fds) {
174 FD_ZERO(fds);
175 for(i = 0;i < n; i++) {
176 b = (tswapl(target_fds[i / TARGET_LONG_BITS]) >>
177 (i & (TARGET_LONG_BITS - 1))) & 1;

--- 5 unchanged lines hidden (view full) ---

183 return NULL;
184 }
185#endif
186}
187
188static inline void host_to_target_fds(target_long *target_fds,
189 fd_set *fds, int n)
190{
172 return (fd_set *)target_fds;
173#else
174 int i, b;
175 if (target_fds) {
176 FD_ZERO(fds);
177 for(i = 0;i < n; i++) {
178 b = (tswapl(target_fds[i / TARGET_LONG_BITS]) >>
179 (i & (TARGET_LONG_BITS - 1))) & 1;

--- 5 unchanged lines hidden (view full) ---

185 return NULL;
186 }
187#endif
188}
189
190static inline void host_to_target_fds(target_long *target_fds,
191 fd_set *fds, int n)
192{
191#if !defined(BSWP_NEEDED) && !defined(WORD_BIGENDIAN)
193#if !defined(BSWAP_NEEDED) && !defined(WORDS_BIGENDIAN)
192 /* nothing to do */
193#else
194 int i, nw, j, k;
195 target_long v;
196
197 if (target_fds) {
198 nw = n / TARGET_LONG_BITS;
199 k = 0;

--- 51 unchanged lines hidden (view full) ---

251
252 if (target_tv) {
253 host_to_target_timeval(target_tv, &tv);
254 }
255 }
256 return ret;
257}
258
194 /* nothing to do */
195#else
196 int i, nw, j, k;
197 target_long v;
198
199 if (target_fds) {
200 nw = n / TARGET_LONG_BITS;
201 k = 0;

--- 51 unchanged lines hidden (view full) ---

253
254 if (target_tv) {
255 host_to_target_timeval(target_tv, &tv);
256 }
257 }
258 return ret;
259}
260
259static long do_socketcall(int num, long *vptr)
261static inline void target_to_host_sockaddr(struct sockaddr *addr,
262 struct target_sockaddr *target_addr,
263 socklen_t len)
260{
264{
265 memcpy(addr, target_addr, len);
266 addr->sa_family = tswap16(target_addr->sa_family);
267}
268
269static inline void host_to_target_sockaddr(struct target_sockaddr *target_addr,
270 struct sockaddr *addr,
271 socklen_t len)
272{
273 memcpy(target_addr, addr, len);
274 target_addr->sa_family = tswap16(addr->sa_family);
275}
276
277static inline void target_to_host_cmsg(struct msghdr *msgh,
278 struct target_msghdr *target_msgh)
279{
280 struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh);
281 struct target_cmsghdr *target_cmsg = TARGET_CMSG_FIRSTHDR(target_msgh);
282 socklen_t space = 0;
283
284 while (cmsg && target_cmsg) {
285 void *data = CMSG_DATA(cmsg);
286 void *target_data = TARGET_CMSG_DATA(target_cmsg);
287
288 int len = tswapl(target_cmsg->cmsg_len)
289 - TARGET_CMSG_ALIGN(sizeof (struct target_cmsghdr));
290
291 space += CMSG_SPACE(len);
292 if (space > msgh->msg_controllen) {
293 space -= CMSG_SPACE(len);
294 gemu_log("Host cmsg overflow");
295 break;
296 }
297
298 cmsg->cmsg_level = tswap32(target_cmsg->cmsg_level);
299 cmsg->cmsg_type = tswap32(target_cmsg->cmsg_type);
300 cmsg->cmsg_len = CMSG_LEN(len);
301
302 if (cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) {
303 gemu_log("Unsupported ancillary data: %d/%d\n", cmsg->cmsg_level, cmsg->cmsg_type);
304 memcpy(data, target_data, len);
305 } else {
306 int *fd = (int *)data;
307 int *target_fd = (int *)target_data;
308 int i, numfds = len / sizeof(int);
309
310 for (i = 0; i < numfds; i++)
311 fd[i] = tswap32(target_fd[i]);
312 }
313
314 cmsg = CMSG_NXTHDR(msgh, cmsg);
315 target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg);
316 }
317
318 msgh->msg_controllen = space;
319}
320
321static inline void host_to_target_cmsg(struct target_msghdr *target_msgh,
322 struct msghdr *msgh)
323{
324 struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh);
325 struct target_cmsghdr *target_cmsg = TARGET_CMSG_FIRSTHDR(target_msgh);
326 socklen_t space = 0;
327
328 while (cmsg && target_cmsg) {
329 void *data = CMSG_DATA(cmsg);
330 void *target_data = TARGET_CMSG_DATA(target_cmsg);
331
332 int len = cmsg->cmsg_len - CMSG_ALIGN(sizeof (struct cmsghdr));
333
334 space += TARGET_CMSG_SPACE(len);
335 if (space > tswapl(target_msgh->msg_controllen)) {
336 space -= TARGET_CMSG_SPACE(len);
337 gemu_log("Target cmsg overflow");
338 break;
339 }
340
341 target_cmsg->cmsg_level = tswap32(cmsg->cmsg_level);
342 target_cmsg->cmsg_type = tswap32(cmsg->cmsg_type);
343 target_cmsg->cmsg_len = tswapl(TARGET_CMSG_LEN(len));
344
345 if (cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) {
346 gemu_log("Unsupported ancillary data: %d/%d\n", cmsg->cmsg_level, cmsg->cmsg_type);
347 memcpy(target_data, data, len);
348 } else {
349 int *fd = (int *)data;
350 int *target_fd = (int *)target_data;
351 int i, numfds = len / sizeof(int);
352
353 for (i = 0; i < numfds; i++)
354 target_fd[i] = tswap32(fd[i]);
355 }
356
357 cmsg = CMSG_NXTHDR(msgh, cmsg);
358 target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg);
359 }
360
361 msgh->msg_controllen = tswapl(space);
362}
363
364static long do_setsockopt(int sockfd, int level, int optname,
365 void *optval, socklen_t optlen)
366{
367 if (level == SOL_TCP) {
368 /* TCP options all take an 'int' value. */
369 int val;
370
371 if (optlen < sizeof(uint32_t))
372 return -EINVAL;
373
374 val = tswap32(*(uint32_t *)optval);
375 return get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
376 }
377
378 else if (level != SOL_SOCKET) {
379 gemu_log("Unsupported setsockopt level: %d\n", level);
380 return -ENOSYS;
381 }
382
383 switch (optname) {
384 /* Options with 'int' argument. */
385 case SO_DEBUG:
386 case SO_REUSEADDR:
387 case SO_TYPE:
388 case SO_ERROR:
389 case SO_DONTROUTE:
390 case SO_BROADCAST:
391 case SO_SNDBUF:
392 case SO_RCVBUF:
393 case SO_KEEPALIVE:
394 case SO_OOBINLINE:
395 case SO_NO_CHECK:
396 case SO_PRIORITY:
397 case SO_BSDCOMPAT:
398 case SO_PASSCRED:
399 case SO_TIMESTAMP:
400 case SO_RCVLOWAT:
401 case SO_RCVTIMEO:
402 case SO_SNDTIMEO:
403 {
404 int val;
405 if (optlen < sizeof(uint32_t))
406 return -EINVAL;
407 val = tswap32(*(uint32_t *)optval);
408 return get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
409 }
410
411 default:
412 gemu_log("Unsupported setsockopt SOL_SOCKET option: %d\n", optname);
413 return -ENOSYS;
414 }
415}
416
417static long do_getsockopt(int sockfd, int level, int optname,
418 void *optval, socklen_t *optlen)
419{
420 gemu_log("getsockopt not yet supported\n");
421 return -ENOSYS;
422}
423
424static long do_socketcall(int num, int32_t *vptr)
425{
261 long ret;
262
263 switch(num) {
264 case SOCKOP_socket:
426 long ret;
427
428 switch(num) {
429 case SOCKOP_socket:
265 ret = get_errno(socket(vptr[0], vptr[1], vptr[2]));
430 {
431 int domain = tswap32(vptr[0]);
432 int type = tswap32(vptr[1]);
433 int protocol = tswap32(vptr[2]);
434
435 ret = get_errno(socket(domain, type, protocol));
436 }
266 break;
267 case SOCKOP_bind:
437 break;
438 case SOCKOP_bind:
268 ret = get_errno(bind(vptr[0], (struct sockaddr *)vptr[1], vptr[2]));
439 {
440 int sockfd = tswap32(vptr[0]);
441 void *target_addr = (void *)tswap32(vptr[1]);
442 socklen_t addrlen = tswap32(vptr[2]);
443 void *addr = alloca(addrlen);
444
445 target_to_host_sockaddr(addr, target_addr, addrlen);
446 ret = get_errno(bind(sockfd, addr, addrlen));
447 }
269 break;
270 case SOCKOP_connect:
448 break;
449 case SOCKOP_connect:
271 ret = get_errno(connect(vptr[0], (struct sockaddr *)vptr[1], vptr[2]));
450 {
451 int sockfd = tswap32(vptr[0]);
452 void *target_addr = (void *)tswap32(vptr[1]);
453 socklen_t addrlen = tswap32(vptr[2]);
454 void *addr = alloca(addrlen);
455
456 target_to_host_sockaddr(addr, target_addr, addrlen);
457 ret = get_errno(connect(sockfd, addr, addrlen));
458 }
272 break;
273 case SOCKOP_listen:
459 break;
460 case SOCKOP_listen:
274 ret = get_errno(listen(vptr[0], vptr[1]));
461 {
462 int sockfd = tswap32(vptr[0]);
463 int backlog = tswap32(vptr[1]);
464
465 ret = get_errno(listen(sockfd, backlog));
466 }
275 break;
276 case SOCKOP_accept:
277 {
467 break;
468 case SOCKOP_accept:
469 {
278 socklen_t size;
279 size = tswap32(*(int32_t *)vptr[2]);
280 ret = get_errno(accept(vptr[0], (struct sockaddr *)vptr[1], &size));
281 if (!is_error(ret))
282 *(int32_t *)vptr[2] = size;
470 int sockfd = tswap32(vptr[0]);
471 void *target_addr = (void *)tswap32(vptr[1]);
472 uint32_t *target_addrlen = (void *)tswap32(vptr[2]);
473 socklen_t addrlen = tswap32(*target_addrlen);
474 void *addr = alloca(addrlen);
475
476 ret = get_errno(accept(sockfd, addr, &addrlen));
477 if (!is_error(ret)) {
478 host_to_target_sockaddr(target_addr, addr, addrlen);
479 *target_addrlen = tswap32(addrlen);
480 }
283 }
284 break;
285 case SOCKOP_getsockname:
286 {
481 }
482 break;
483 case SOCKOP_getsockname:
484 {
287 socklen_t size;
288 size = tswap32(*(int32_t *)vptr[2]);
289 ret = get_errno(getsockname(vptr[0], (struct sockaddr *)vptr[1], &size));
290 if (!is_error(ret))
291 *(int32_t *)vptr[2] = size;
485 int sockfd = tswap32(vptr[0]);
486 void *target_addr = (void *)tswap32(vptr[1]);
487 uint32_t *target_addrlen = (void *)tswap32(vptr[2]);
488 socklen_t addrlen = tswap32(*target_addrlen);
489 void *addr = alloca(addrlen);
490
491 ret = get_errno(getsockname(sockfd, addr, &addrlen));
492 if (!is_error(ret)) {
493 host_to_target_sockaddr(target_addr, addr, addrlen);
494 *target_addrlen = tswap32(addrlen);
495 }
292 }
293 break;
294 case SOCKOP_getpeername:
295 {
496 }
497 break;
498 case SOCKOP_getpeername:
499 {
296 socklen_t size;
297 size = tswap32(*(int32_t *)vptr[2]);
298 ret = get_errno(getpeername(vptr[0], (struct sockaddr *)vptr[1], &size));
299 if (!is_error(ret))
300 *(int32_t *)vptr[2] = size;
500 int sockfd = tswap32(vptr[0]);
501 void *target_addr = (void *)tswap32(vptr[1]);
502 uint32_t *target_addrlen = (void *)tswap32(vptr[2]);
503 socklen_t addrlen = tswap32(*target_addrlen);
504 void *addr = alloca(addrlen);
505
506 ret = get_errno(getpeername(sockfd, addr, &addrlen));
507 if (!is_error(ret)) {
508 host_to_target_sockaddr(target_addr, addr, addrlen);
509 *target_addrlen = tswap32(addrlen);
510 }
301 }
302 break;
303 case SOCKOP_socketpair:
304 {
511 }
512 break;
513 case SOCKOP_socketpair:
514 {
515 int domain = tswap32(vptr[0]);
516 int type = tswap32(vptr[1]);
517 int protocol = tswap32(vptr[2]);
518 int32_t *target_tab = (void *)tswap32(vptr[3]);
305 int tab[2];
519 int tab[2];
306 int32_t *target_tab = (int32_t *)vptr[3];
307 ret = get_errno(socketpair(vptr[0], vptr[1], vptr[2], tab));
520
521 ret = get_errno(socketpair(domain, type, protocol, tab));
308 if (!is_error(ret)) {
309 target_tab[0] = tswap32(tab[0]);
310 target_tab[1] = tswap32(tab[1]);
311 }
312 }
313 break;
314 case SOCKOP_send:
522 if (!is_error(ret)) {
523 target_tab[0] = tswap32(tab[0]);
524 target_tab[1] = tswap32(tab[1]);
525 }
526 }
527 break;
528 case SOCKOP_send:
315 ret = get_errno(send(vptr[0], (void *)vptr[1], vptr[2], vptr[3]));
529 {
530 int sockfd = tswap32(vptr[0]);
531 void *msg = (void *)tswap32(vptr[1]);
532 size_t len = tswap32(vptr[2]);
533 int flags = tswap32(vptr[3]);
534
535 ret = get_errno(send(sockfd, msg, len, flags));
536 }
316 break;
317 case SOCKOP_recv:
537 break;
538 case SOCKOP_recv:
318 ret = get_errno(recv(vptr[0], (void *)vptr[1], vptr[2], vptr[3]));
539 {
540 int sockfd = tswap32(vptr[0]);
541 void *msg = (void *)tswap32(vptr[1]);
542 size_t len = tswap32(vptr[2]);
543 int flags = tswap32(vptr[3]);
544
545 ret = get_errno(recv(sockfd, msg, len, flags));
546 }
319 break;
320 case SOCKOP_sendto:
547 break;
548 case SOCKOP_sendto:
321 ret = get_errno(sendto(vptr[0], (void *)vptr[1], vptr[2], vptr[3],
322 (struct sockaddr *)vptr[4], vptr[5]));
549 {
550 int sockfd = tswap32(vptr[0]);
551 void *msg = (void *)tswap32(vptr[1]);
552 size_t len = tswap32(vptr[2]);
553 int flags = tswap32(vptr[3]);
554 void *target_addr = (void *)tswap32(vptr[4]);
555 socklen_t addrlen = tswap32(vptr[5]);
556 void *addr = alloca(addrlen);
557
558 target_to_host_sockaddr(addr, target_addr, addrlen);
559 ret = get_errno(sendto(sockfd, msg, len, flags, addr, addrlen));
560 }
323 break;
324 case SOCKOP_recvfrom:
325 {
561 break;
562 case SOCKOP_recvfrom:
563 {
326 socklen_t size;
327 size = tswap32(*(int32_t *)vptr[5]);
328 ret = get_errno(recvfrom(vptr[0], (void *)vptr[1], vptr[2],
329 vptr[3], (struct sockaddr *)vptr[4], &size));
330 if (!is_error(ret))
331 *(int32_t *)vptr[5] = size;
564 int sockfd = tswap32(vptr[0]);
565 void *msg = (void *)tswap32(vptr[1]);
566 size_t len = tswap32(vptr[2]);
567 int flags = tswap32(vptr[3]);
568 void *target_addr = (void *)tswap32(vptr[4]);
569 uint32_t *target_addrlen = (void *)tswap32(vptr[5]);
570 socklen_t addrlen = tswap32(*target_addrlen);
571 void *addr = alloca(addrlen);
572
573 ret = get_errno(recvfrom(sockfd, msg, len, flags, addr, &addrlen));
574 if (!is_error(ret)) {
575 host_to_target_sockaddr(target_addr, addr, addrlen);
576 *target_addrlen = tswap32(addrlen);
577 }
332 }
333 break;
334 case SOCKOP_shutdown:
578 }
579 break;
580 case SOCKOP_shutdown:
335 ret = get_errno(shutdown(vptr[0], vptr[1]));
581 {
582 int sockfd = tswap32(vptr[0]);
583 int how = tswap32(vptr[1]);
584
585 ret = get_errno(shutdown(sockfd, how));
586 }
336 break;
337 case SOCKOP_sendmsg:
338 case SOCKOP_recvmsg:
339 {
340 int fd;
341 struct target_msghdr *msgp;
342 struct msghdr msg;
343 int flags, count, i;
344 struct iovec *vec;
345 struct target_iovec *target_vec;
346
587 break;
588 case SOCKOP_sendmsg:
589 case SOCKOP_recvmsg:
590 {
591 int fd;
592 struct target_msghdr *msgp;
593 struct msghdr msg;
594 int flags, count, i;
595 struct iovec *vec;
596 struct target_iovec *target_vec;
597
347 msgp = (void *)vptr[1];
598 msgp = (void *)tswap32(vptr[1]);
348 msg.msg_name = (void *)tswapl(msgp->msg_name);
349 msg.msg_namelen = tswapl(msgp->msg_namelen);
599 msg.msg_name = (void *)tswapl(msgp->msg_name);
600 msg.msg_namelen = tswapl(msgp->msg_namelen);
350 msg.msg_control = (void *)tswapl(msgp->msg_control);
351 msg.msg_controllen = tswapl(msgp->msg_controllen);
601 msg.msg_controllen = 2 * tswapl(msgp->msg_controllen);
602 msg.msg_control = alloca(msg.msg_controllen);
352 msg.msg_flags = tswap32(msgp->msg_flags);
353
354 count = tswapl(msgp->msg_iovlen);
355 vec = alloca(count * sizeof(struct iovec));
356 target_vec = (void *)tswapl(msgp->msg_iov);
357 for(i = 0;i < count; i++) {
358 vec[i].iov_base = (void *)tswapl(target_vec[i].iov_base);
359 vec[i].iov_len = tswapl(target_vec[i].iov_len);
360 }
361 msg.msg_iovlen = count;
362 msg.msg_iov = vec;
363
603 msg.msg_flags = tswap32(msgp->msg_flags);
604
605 count = tswapl(msgp->msg_iovlen);
606 vec = alloca(count * sizeof(struct iovec));
607 target_vec = (void *)tswapl(msgp->msg_iov);
608 for(i = 0;i < count; i++) {
609 vec[i].iov_base = (void *)tswapl(target_vec[i].iov_base);
610 vec[i].iov_len = tswapl(target_vec[i].iov_len);
611 }
612 msg.msg_iovlen = count;
613 msg.msg_iov = vec;
614
364 fd = vptr[0];
365 flags = vptr[2];
366 if (num == SOCKOP_sendmsg)
367 ret = sendmsg(fd, &msg, flags);
368 else
369 ret = recvmsg(fd, &msg, flags);
370 ret = get_errno(ret);
615 fd = tswap32(vptr[0]);
616 flags = tswap32(vptr[2]);
617 if (num == SOCKOP_sendmsg) {
618 target_to_host_cmsg(&msg, msgp);
619 ret = get_errno(sendmsg(fd, &msg, flags));
620 } else {
621 ret = get_errno(recvmsg(fd, &msg, flags));
622 if (!is_error(ret))
623 host_to_target_cmsg(msgp, &msg);
624 }
371 }
372 break;
373 case SOCKOP_setsockopt:
625 }
626 break;
627 case SOCKOP_setsockopt:
628 {
629 int sockfd = tswap32(vptr[0]);
630 int level = tswap32(vptr[1]);
631 int optname = tswap32(vptr[2]);
632 void *optval = (void *)tswap32(vptr[3]);
633 socklen_t optlen = tswap32(vptr[4]);
634
635 ret = do_setsockopt(sockfd, level, optname, optval, optlen);
636 }
637 break;
374 case SOCKOP_getsockopt:
638 case SOCKOP_getsockopt:
639 {
640 int sockfd = tswap32(vptr[0]);
641 int level = tswap32(vptr[1]);
642 int optname = tswap32(vptr[2]);
643 void *optval = (void *)tswap32(vptr[3]);
644 uint32_t *target_len = (void *)tswap32(vptr[4]);
645 socklen_t optlen = tswap32(*target_len);
646
647 ret = do_getsockopt(sockfd, level, optname, optval, &optlen);
648 if (!is_error(ret))
649 *target_len = tswap32(optlen);
650 }
651 break;
375 default:
376 gemu_log("Unsupported socketcall: %d\n", num);
377 ret = -ENOSYS;
378 break;
379 }
380 return ret;
381}
382

--- 572 unchanged lines hidden (view full) ---

955 break;
956 case TARGET_NR_link:
957 ret = get_errno(link((const char *)arg1, (const char *)arg2));
958 break;
959 case TARGET_NR_unlink:
960 ret = get_errno(unlink((const char *)arg1));
961 break;
962 case TARGET_NR_execve:
652 default:
653 gemu_log("Unsupported socketcall: %d\n", num);
654 ret = -ENOSYS;
655 break;
656 }
657 return ret;
658}
659

--- 572 unchanged lines hidden (view full) ---

1232 break;
1233 case TARGET_NR_link:
1234 ret = get_errno(link((const char *)arg1, (const char *)arg2));
1235 break;
1236 case TARGET_NR_unlink:
1237 ret = get_errno(unlink((const char *)arg1));
1238 break;
1239 case TARGET_NR_execve:
963 ret = get_errno(execve((const char *)arg1, (void *)arg2, (void *)arg3));
1240 {
1241 char **argp, **envp;
1242 int argc = 0, envc = 0;
1243 uint32_t *p;
1244 char **q;
1245
1246 for (p = (void *)arg2; *p; p++)
1247 argc++;
1248 for (p = (void *)arg3; *p; p++)
1249 envc++;
1250
1251 argp = alloca(argc * sizeof(void *));
1252 envp = alloca(envc * sizeof(void *));
1253
1254 for (p = (void *)arg2, q = argp; *p; p++, q++)
1255 *q = (void *)tswap32(*p);
1256 for (p = (void *)arg3, q = envp; *p; p++, q++)
1257 *q = (void *)tswap32(*p);
1258
1259 ret = get_errno(execve((const char *)arg1, argp, envp));
1260 }
964 break;
965 case TARGET_NR_chdir:
966 ret = get_errno(chdir((const char *)arg1));
967 break;
968 case TARGET_NR_time:
969 {
970 int *time_ptr = (int *)arg1;
971 ret = get_errno(time((time_t *)time_ptr));

--- 507 unchanged lines hidden (view full) ---

1479 break;
1480 case TARGET_NR_fstatfs:
1481 stfs = (void *)arg2;
1482 ret = get_errno(sys_fstatfs(arg1, stfs));
1483 goto convert_statfs;
1484 case TARGET_NR_ioperm:
1485 goto unimplemented;
1486 case TARGET_NR_socketcall:
1261 break;
1262 case TARGET_NR_chdir:
1263 ret = get_errno(chdir((const char *)arg1));
1264 break;
1265 case TARGET_NR_time:
1266 {
1267 int *time_ptr = (int *)arg1;
1268 ret = get_errno(time((time_t *)time_ptr));

--- 507 unchanged lines hidden (view full) ---

1776 break;
1777 case TARGET_NR_fstatfs:
1778 stfs = (void *)arg2;
1779 ret = get_errno(sys_fstatfs(arg1, stfs));
1780 goto convert_statfs;
1781 case TARGET_NR_ioperm:
1782 goto unimplemented;
1783 case TARGET_NR_socketcall:
1487 ret = do_socketcall(arg1, (long *)arg2);
1784 ret = do_socketcall(arg1, (int32_t *)arg2);
1488 break;
1489 case TARGET_NR_syslog:
1490 goto unimplemented;
1491 case TARGET_NR_setitimer:
1492 {
1493 struct target_itimerval *target_value = (void *)arg2;
1494 struct target_itimerval *target_ovalue = (void *)arg3;
1495 struct itimerval value, ovalue, *pvalue;

--- 47 unchanged lines hidden (view full) ---

1543 target_st->st_mode = tswap16(st.st_mode);
1544 target_st->st_nlink = tswap16(st.st_nlink);
1545 target_st->st_uid = tswap16(st.st_uid);
1546 target_st->st_gid = tswap16(st.st_gid);
1547 target_st->st_rdev = tswap16(st.st_rdev);
1548 target_st->st_size = tswapl(st.st_size);
1549 target_st->st_blksize = tswapl(st.st_blksize);
1550 target_st->st_blocks = tswapl(st.st_blocks);
1785 break;
1786 case TARGET_NR_syslog:
1787 goto unimplemented;
1788 case TARGET_NR_setitimer:
1789 {
1790 struct target_itimerval *target_value = (void *)arg2;
1791 struct target_itimerval *target_ovalue = (void *)arg3;
1792 struct itimerval value, ovalue, *pvalue;

--- 47 unchanged lines hidden (view full) ---

1840 target_st->st_mode = tswap16(st.st_mode);
1841 target_st->st_nlink = tswap16(st.st_nlink);
1842 target_st->st_uid = tswap16(st.st_uid);
1843 target_st->st_gid = tswap16(st.st_gid);
1844 target_st->st_rdev = tswap16(st.st_rdev);
1845 target_st->st_size = tswapl(st.st_size);
1846 target_st->st_blksize = tswapl(st.st_blksize);
1847 target_st->st_blocks = tswapl(st.st_blocks);
1551 target_st->st_atime = tswapl(st.st_atime);
1552 target_st->st_mtime = tswapl(st.st_mtime);
1553 target_st->st_ctime = tswapl(st.st_ctime);
1848 target_st->target_st_atime = tswapl(st.st_atime);
1849 target_st->target_st_mtime = tswapl(st.st_mtime);
1850 target_st->target_st_ctime = tswapl(st.st_ctime);
1554 }
1555 }
1556 break;
1557 case TARGET_NR_olduname:
1558 goto unimplemented;
1559 case TARGET_NR_iopl:
1560 goto unimplemented;
1561 case TARGET_NR_vhangup:

--- 160 unchanged lines hidden (view full) ---

1722 (void *)arg5);
1723 break;
1724 case TARGET_NR_poll:
1725 {
1726 struct target_pollfd *target_pfd = (void *)arg1;
1727 unsigned int nfds = arg2;
1728 int timeout = arg3;
1729 struct pollfd *pfd;
1851 }
1852 }
1853 break;
1854 case TARGET_NR_olduname:
1855 goto unimplemented;
1856 case TARGET_NR_iopl:
1857 goto unimplemented;
1858 case TARGET_NR_vhangup:

--- 160 unchanged lines hidden (view full) ---

2019 (void *)arg5);
2020 break;
2021 case TARGET_NR_poll:
2022 {
2023 struct target_pollfd *target_pfd = (void *)arg1;
2024 unsigned int nfds = arg2;
2025 int timeout = arg3;
2026 struct pollfd *pfd;
1730 int i;
2027 unsigned int i;
1731
1732 pfd = alloca(sizeof(struct pollfd) * nfds);
1733 for(i = 0; i < nfds; i++) {
1734 pfd[i].fd = tswap32(target_pfd[i].fd);
1735 pfd[i].events = tswap16(target_pfd[i].events);
1736 }
1737 ret = get_errno(poll(pfd, nfds, timeout));
1738 if (!is_error(ret)) {

--- 196 unchanged lines hidden (view full) ---

1935 target_st->st_nlink = tswap16(st.st_nlink);
1936 target_st->st_uid = tswap16(st.st_uid);
1937 target_st->st_gid = tswap16(st.st_gid);
1938 target_st->st_rdev = tswap16(st.st_rdev);
1939 /* XXX: better use of kernel struct */
1940 target_st->st_size = tswapl(st.st_size);
1941 target_st->st_blksize = tswapl(st.st_blksize);
1942 target_st->st_blocks = tswapl(st.st_blocks);
2028
2029 pfd = alloca(sizeof(struct pollfd) * nfds);
2030 for(i = 0; i < nfds; i++) {
2031 pfd[i].fd = tswap32(target_pfd[i].fd);
2032 pfd[i].events = tswap16(target_pfd[i].events);
2033 }
2034 ret = get_errno(poll(pfd, nfds, timeout));
2035 if (!is_error(ret)) {

--- 196 unchanged lines hidden (view full) ---

2232 target_st->st_nlink = tswap16(st.st_nlink);
2233 target_st->st_uid = tswap16(st.st_uid);
2234 target_st->st_gid = tswap16(st.st_gid);
2235 target_st->st_rdev = tswap16(st.st_rdev);
2236 /* XXX: better use of kernel struct */
2237 target_st->st_size = tswapl(st.st_size);
2238 target_st->st_blksize = tswapl(st.st_blksize);
2239 target_st->st_blocks = tswapl(st.st_blocks);
1943 target_st->st_atime = tswapl(st.st_atime);
1944 target_st->st_mtime = tswapl(st.st_mtime);
1945 target_st->st_ctime = tswapl(st.st_ctime);
2240 target_st->target_st_atime = tswapl(st.st_atime);
2241 target_st->target_st_mtime = tswapl(st.st_mtime);
2242 target_st->target_st_ctime = tswapl(st.st_ctime);
1946 }
1947 }
1948 break;
1949
1950 case TARGET_NR_lchown32:
1951 ret = get_errno(lchown((const char *)arg1, arg2, arg3));
1952 break;
1953 case TARGET_NR_getuid32:

--- 120 unchanged lines hidden ---
2243 }
2244 }
2245 break;
2246
2247 case TARGET_NR_lchown32:
2248 ret = get_errno(lchown((const char *)arg1, arg2, arg3));
2249 break;
2250 case TARGET_NR_getuid32:

--- 120 unchanged lines hidden ---