Changeset ac78dd2 in rtems-libbsd


Ignore:
Timestamp:
Oct 14, 2013, 10:53:43 AM (6 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, c1e05b9ea378b2971e3d7704779112b4bc4296da, freebsd-9.3, 4a77611a223ea883fb548679b516d326a020d447
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)
Message:

Use getsockopt() and setsockopt() from FreeBSD

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • freebsd/sys/kern/uipc_syscalls.c

    r7c2b59c rac78dd2  
    14871487#endif /* __rtems__ */
    14881488
     1489/* ARGSUSED */
    14891490#ifndef __rtems__
    1490 /* ARGSUSED */
    14911491int
    14921492setsockopt(td, uap)
     1493#else /* __rtems__ */
     1494static int
     1495kern_setsockopt( struct thread *td, int s, int level, int name, void *val,
     1496    enum uio_seg valseg, socklen_t valsize);
     1497
     1498static int
     1499rtems_bsd_setsockopt(td, uap)
     1500#endif /* __rtems__ */
    14931501        struct thread *td;
    14941502        struct setsockopt_args /* {
     
    15041512            uap->val, UIO_USERSPACE, uap->valsize));
    15051513}
     1514#ifdef __rtems__
     1515int
     1516setsockopt(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__ */
    15061538
    15071539int
     
    15541586
    15551587/* ARGSUSED */
     1588#ifndef __rtems__
    15561589int
    15571590getsockopt(td, uap)
     1591#else /* __rtems__ */
     1592static int
     1593kern_getsockopt( struct thread *td, int s, int level, int name, void *val,
     1594   enum uio_seg valseg, socklen_t *valsize);
     1595
     1596static int
     1597rtems_bsd_getsockopt(td, uap)
     1598#endif /* __rtems__ */
    15581599        struct thread *td;
    15591600        struct getsockopt_args /* {
     
    15811622        return (error);
    15821623}
     1624#ifdef __rtems__
     1625int
     1626getsockopt(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__ */
    15831648
    15841649/*
     
    16351700}
    16361701
     1702#ifndef __rtems__
    16371703/*
    16381704 * getsockname1() - Get socket name.
  • freebsd/sys/sys/sysproto.h

    r7c2b59c rac78dd2  
    383383#endif /* __rtems__ */
    384384};
    385 #ifndef __rtems__
    386385struct setsockopt_args {
    387386        char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
     
    389388        char name_l_[PADL_(int)]; int name; char name_r_[PADR_(int)];
    390389        char val_l_[PADL_(caddr_t)]; caddr_t val; char val_r_[PADR_(caddr_t)];
     390#ifndef __rtems__
    391391        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)];
    393394#endif /* __rtems__ */
     395};
    394396struct listen_args {
    395397        char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
     
    405407        char rusage_l_[PADL_(struct rusage *)]; struct rusage * rusage; char rusage_r_[PADR_(struct rusage *)];
    406408};
     409#endif /* __rtems__ */
    407410struct getsockopt_args {
    408411        char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
     
    410413        char name_l_[PADL_(int)]; int name; char name_r_[PADR_(int)];
    411414        char val_l_[PADL_(caddr_t)]; caddr_t val; char val_r_[PADR_(caddr_t)];
     415#ifndef __rtems__
    412416        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__
    414422struct readv_args {
    415423        char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
  • rtemsbsd/include/machine/rtems-bsd-syscall-api.h

    r7c2b59c rac78dd2  
    6262int     connect(int, const struct sockaddr *, socklen_t);
    6363
     64int     getsockopt(int, int, int, void * __restrict, socklen_t * __restrict);
     65
    6466int     listen(int, int);
     67
     68int     setsockopt(int, int, int, const void *, socklen_t);
    6569
    6670int     shutdown(int, int);
  • rtemsbsd/rtems/rtems-bsd-syscalls.c

    r7c2b59c rac78dd2  
    621621
    622622int
    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 int
    668 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 int
    684 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 int
    730 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 int
    757623kern_getpeername(struct thread *td, int fd, struct sockaddr **sa,
    758624    socklen_t *alen)
  • testsuite/syscalls01/test_main.c

    r7c2b59c rac78dd2  
    729729
    730730static void
     731no_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
     750static void
     751test_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
     830static void
    731831test_main(void)
    732832{
     
    741841        test_socket_listen();
    742842        test_socket_accept();
     843        test_socket_getsockopt_and_setsockopt();
    743844
    744845        puts("*** END OF " TEST_NAME " TEST ***");
Note: See TracChangeset for help on using the changeset viewer.