Changeset ac78dd2 in rtems-libbsd
- Timestamp:
- 10/14/13 10:53:43 (9 years ago)
- Branches:
- 4.11, 5, 5-freebsd-12, 6-freebsd-12, freebsd-9.3, master
- Children:
- 0beab1e
- Parents:
- 7c2b59c
- git-author:
- Sebastian Huber <sebastian.huber@…> (10/14/13 10:53:43)
- git-committer:
- Sebastian Huber <sebastian.huber@…> (10/31/13 12:18:47)
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
freebsd/sys/kern/uipc_syscalls.c
r7c2b59c rac78dd2 1487 1487 #endif /* __rtems__ */ 1488 1488 1489 /* ARGSUSED */ 1489 1490 #ifndef __rtems__ 1490 /* ARGSUSED */1491 1491 int 1492 1492 setsockopt(td, uap) 1493 #else /* __rtems__ */ 1494 static int 1495 kern_setsockopt( struct thread *td, int s, int level, int name, void *val, 1496 enum uio_seg valseg, socklen_t valsize); 1497 1498 static int 1499 rtems_bsd_setsockopt(td, uap) 1500 #endif /* __rtems__ */ 1493 1501 struct thread *td; 1494 1502 struct setsockopt_args /* { … … 1504 1512 uap->val, UIO_USERSPACE, uap->valsize)); 1505 1513 } 1514 #ifdef __rtems__ 1515 int 1516 setsockopt(int socket, int level, int option_name, const void *option_value, 1517 socklen_t option_len) 1518 { 1519 struct thread *td = rtems_bsd_get_curthread_or_null(); 1520 struct setsockopt_args ua = { 1521 .s = socket, 1522 .level = level, 1523 .name = option_name, 1524 .val = __DECONST(void *, option_value), 1525 .valsize = option_len 1526 }; 1527 int error; 1528 1529 if (td != NULL) { 1530 error = rtems_bsd_setsockopt(td, &ua); 1531 } else { 1532 error = ENOMEM; 1533 } 1534 1535 return rtems_bsd_error_to_status_and_errno(error); 1536 } 1537 #endif /* __rtems__ */ 1506 1538 1507 1539 int … … 1554 1586 1555 1587 /* ARGSUSED */ 1588 #ifndef __rtems__ 1556 1589 int 1557 1590 getsockopt(td, uap) 1591 #else /* __rtems__ */ 1592 static int 1593 kern_getsockopt( struct thread *td, int s, int level, int name, void *val, 1594 enum uio_seg valseg, socklen_t *valsize); 1595 1596 static int 1597 rtems_bsd_getsockopt(td, uap) 1598 #endif /* __rtems__ */ 1558 1599 struct thread *td; 1559 1600 struct getsockopt_args /* { … … 1581 1622 return (error); 1582 1623 } 1624 #ifdef __rtems__ 1625 int 1626 getsockopt(int socket, int level, int option_name, void *__restrict 1627 option_value, socklen_t *__restrict option_len) 1628 { 1629 struct thread *td = rtems_bsd_get_curthread_or_null(); 1630 struct getsockopt_args ua = { 1631 .s = socket, 1632 .level = level, 1633 .name = option_name, 1634 .val = (caddr_t) option_value, 1635 .avalsize = option_len 1636 }; 1637 int error; 1638 1639 if (td != NULL) { 1640 error = rtems_bsd_getsockopt(td, &ua); 1641 } else { 1642 error = ENOMEM; 1643 } 1644 1645 return rtems_bsd_error_to_status_and_errno(error); 1646 } 1647 #endif /* __rtems__ */ 1583 1648 1584 1649 /* … … 1635 1700 } 1636 1701 1702 #ifndef __rtems__ 1637 1703 /* 1638 1704 * getsockname1() - Get socket name. -
freebsd/sys/sys/sysproto.h
r7c2b59c rac78dd2 383 383 #endif /* __rtems__ */ 384 384 }; 385 #ifndef __rtems__386 385 struct setsockopt_args { 387 386 char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)]; … … 389 388 char name_l_[PADL_(int)]; int name; char name_r_[PADR_(int)]; 390 389 char val_l_[PADL_(caddr_t)]; caddr_t val; char val_r_[PADR_(caddr_t)]; 390 #ifndef __rtems__ 391 391 char valsize_l_[PADL_(int)]; int valsize; char valsize_r_[PADR_(int)]; 392 }; 392 #else /* __rtems__ */ 393 char valsize_l_[PADL_(__socklen_t)]; __socklen_t valsize; char valsize_r_[PADR_(__socklen_t)]; 393 394 #endif /* __rtems__ */ 395 }; 394 396 struct listen_args { 395 397 char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)]; … … 405 407 char rusage_l_[PADL_(struct rusage *)]; struct rusage * rusage; char rusage_r_[PADR_(struct rusage *)]; 406 408 }; 409 #endif /* __rtems__ */ 407 410 struct getsockopt_args { 408 411 char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)]; … … 410 413 char name_l_[PADL_(int)]; int name; char name_r_[PADR_(int)]; 411 414 char val_l_[PADL_(caddr_t)]; caddr_t val; char val_r_[PADR_(caddr_t)]; 415 #ifndef __rtems__ 412 416 char avalsize_l_[PADL_(int *)]; int * avalsize; char avalsize_r_[PADR_(int *)]; 413 }; 417 #else /* __rtems__ */ 418 char avalsize_l_[PADL_(__socklen_t *)]; __socklen_t * avalsize; char avalsize_r_[PADR_(__socklen_t *)]; 419 #endif /* __rtems__ */ 420 }; 421 #ifndef __rtems__ 414 422 struct readv_args { 415 423 char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; -
rtemsbsd/include/machine/rtems-bsd-syscall-api.h
r7c2b59c rac78dd2 62 62 int connect(int, const struct sockaddr *, socklen_t); 63 63 64 int getsockopt(int, int, int, void * __restrict, socklen_t * __restrict); 65 64 66 int listen(int, int); 67 68 int setsockopt(int, int, int, const void *, socklen_t); 65 69 66 70 int shutdown(int, int); -
rtemsbsd/rtems/rtems-bsd-syscalls.c
r7c2b59c rac78dd2 621 621 622 622 int 623 kern_setsockopt(td, s, level, name, val, valseg, valsize)624 struct thread *td;625 int s;626 int level;627 int name;628 void *val;629 enum uio_seg valseg;630 socklen_t valsize;631 {632 int error;633 struct socket *so;634 struct sockopt sopt;635 636 if (val == NULL && valsize != 0)637 return (EFAULT);638 if ((int)valsize < 0)639 return (EINVAL);640 641 sopt.sopt_dir = SOPT_SET;642 sopt.sopt_level = level;643 sopt.sopt_name = name;644 sopt.sopt_val = val;645 sopt.sopt_valsize = valsize;646 switch (valseg) {647 case UIO_USERSPACE:648 sopt.sopt_td = td;649 break;650 case UIO_SYSSPACE:651 sopt.sopt_td = NULL;652 break;653 default:654 panic("kern_setsockopt called with bad valseg");655 }656 657 if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) {658 error = EBADF;659 return error;660 }661 CURVNET_SET(so->so_vnet);662 error = sosetopt(so, &sopt);663 CURVNET_RESTORE();664 return(error);665 }666 667 int668 setsockopt (int s, int level, int name, const void *val, socklen_t valsize)669 {670 struct thread *td;671 int error;672 673 td = curthread;674 error = kern_setsockopt(td, s, level, name, val, UIO_USERSPACE, valsize);675 if( error == 0 )676 {677 return error;678 }679 errno = error;680 return -1;681 }682 683 int684 kern_getsockopt(td, s, level, name, val, valseg, valsize)685 struct thread *td;686 int s;687 int level;688 int name;689 void *val;690 enum uio_seg valseg;691 socklen_t *valsize;692 {693 int error;694 struct socket *so;695 struct sockopt sopt;696 697 if (val == NULL)698 *valsize = 0;699 if ((int)*valsize < 0)700 return (EINVAL);701 702 sopt.sopt_dir = SOPT_GET;703 sopt.sopt_level = level;704 sopt.sopt_name = name;705 sopt.sopt_val = val;706 sopt.sopt_valsize = (size_t)*valsize; /* checked non-negative above */707 switch (valseg) {708 case UIO_USERSPACE:709 sopt.sopt_td = td;710 break;711 case UIO_SYSSPACE:712 sopt.sopt_td = NULL;713 break;714 default:715 panic("kern_getsockopt called with bad valseg");716 }717 718 if ((so = rtems_bsdnet_fdToSocket (s)) == NULL) {719 error = EBADF;720 return error;721 }722 CURVNET_SET(so->so_vnet);723 error = sogetopt(so, &sopt);724 CURVNET_RESTORE();725 *valsize = sopt.sopt_valsize;726 return (error);727 }728 729 int730 getsockopt (int s, int level, int name, void *val, socklen_t *avalsize)731 {732 struct thread *td;733 socklen_t valsize;734 int error = 0;735 736 td = curthread;737 if (val) {738 error = copyin(avalsize, &valsize, sizeof (valsize));739 }740 741 if( error == 0 )742 {743 error = kern_getsockopt(td, s, level, name, val, UIO_USERSPACE, &valsize);744 745 if (error == 0)746 error = copyout(&valsize, avalsize, sizeof (valsize));747 }748 if( error == 0 )749 {750 return error;751 }752 errno = error;753 return -1;754 }755 756 int757 623 kern_getpeername(struct thread *td, int fd, struct sockaddr **sa, 758 624 socklen_t *alen) -
testsuite/syscalls01/test_main.c
r7c2b59c rac78dd2 729 729 730 730 static void 731 no_mem_socket_getsockopt_and_setsockopt(int fd) 732 { 733 int rv; 734 int optval; 735 socklen_t optlen; 736 737 errno = 0; 738 optlen = sizeof(optval); 739 rv = getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, &optlen); 740 assert(rv == -1); 741 assert(errno == ENOMEM); 742 743 errno = 0; 744 optlen = sizeof(optval); 745 rv = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, optlen); 746 assert(rv == -1); 747 assert(errno == ENOMEM); 748 } 749 750 static void 751 test_socket_getsockopt_and_setsockopt(void) 752 { 753 rtems_resource_snapshot snapshot; 754 int optval; 755 socklen_t optlen; 756 int sd; 757 int rv; 758 759 puts("test socket getsockopt and setsockopt"); 760 761 rtems_resource_snapshot_take(&snapshot); 762 763 sd = socket(PF_INET, SOCK_STREAM, 0); 764 assert(sd >= 0); 765 766 do_no_mem_test(no_mem_socket_getsockopt_and_setsockopt, sd); 767 768 errno = 0; 769 optlen = sizeof(optval); 770 rv = getsockopt(sd, SOL_SOCKET, -1, &optval, &optlen); 771 assert(rv == -1); 772 assert(errno == ENOPROTOOPT); 773 774 errno = 0; 775 optlen = sizeof(optval); 776 rv = setsockopt(sd, SOL_SOCKET, -1, &optval, optlen); 777 assert(rv == -1); 778 assert(errno == ENOPROTOOPT); 779 780 errno = 0; 781 optlen = sizeof(optval); 782 rv = getsockopt(sd, -1, SO_REUSEADDR, &optval, &optlen); 783 assert(rv == -1); 784 assert(errno == EINVAL); 785 786 errno = 0; 787 optlen = sizeof(optval); 788 rv = setsockopt(sd, -1, SO_REUSEADDR, &optval, optlen); 789 assert(rv == -1); 790 assert(errno == EINVAL); 791 792 optval = -1; 793 optlen = sizeof(optval); 794 rv = getsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optval, &optlen); 795 assert(rv == 0); 796 assert(optval == 0); 797 assert(optlen == sizeof(optval)); 798 799 optval = 1; 800 optlen = sizeof(optval); 801 rv = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optval, optlen); 802 assert(rv == 0); 803 804 optval = 0; 805 optlen = sizeof(optval); 806 rv = getsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optval, &optlen); 807 assert(rv == 0); 808 assert(optval != 0); 809 assert(optlen == sizeof(optval)); 810 811 rv = close(sd); 812 assert(rv == 0); 813 814 errno = 0; 815 optlen = sizeof(optval); 816 rv = getsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optval, &optlen); 817 assert(rv == -1); 818 assert(errno == EBADF); 819 820 errno = 0; 821 optval = 0; 822 optlen = sizeof(optval); 823 rv = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optval, optlen); 824 assert(rv == -1); 825 assert(errno == EBADF); 826 827 assert(rtems_resource_snapshot_check(&snapshot)); 828 } 829 830 static void 731 831 test_main(void) 732 832 { … … 741 841 test_socket_listen(); 742 842 test_socket_accept(); 843 test_socket_getsockopt_and_setsockopt(); 743 844 744 845 puts("*** END OF " TEST_NAME " TEST ***");
Note: See TracChangeset
for help on using the changeset viewer.