Changeset 8989c11 in rtems-libbsd


Ignore:
Timestamp:
Oct 14, 2013, 11:24:10 AM (6 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, c1e05b9ea378b2971e3d7704779112b4bc4296da, freebsd-9.3, 4a77611a223ea883fb548679b516d326a020d447
Children:
ec702ab
Parents:
0beab1e
git-author:
Sebastian Huber <sebastian.huber@…> (10/14/13 11:24:10)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/31/13 12:18:48)
Message:

Use getsockname() from FreeBSD

Files:
5 edited

Legend:

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

    r0beab1e r8989c11  
    17001700}
    17011701
    1702 #ifndef __rtems__
     1702#ifdef __rtems__
     1703int
     1704kern_getsockname(struct thread *td, int fd, struct sockaddr **sa,
     1705    socklen_t *alen);
     1706#endif /* __rtems__ */
    17031707/*
    17041708 * getsockname1() - Get socket name.
     
    17391743        return (error);
    17401744}
     1745#ifdef __rtems__
     1746int
     1747getsockname(int socket, struct sockaddr *__restrict address,
     1748    socklen_t *__restrict address_len)
     1749{
     1750        struct thread *td = rtems_bsd_get_curthread_or_null();
     1751        struct getsockname_args ua = {
     1752                .fdes = socket,
     1753                .asa = address,
     1754                .alen = address_len
     1755        };
     1756        int error;
     1757
     1758        if (td != NULL) {
     1759                error = getsockname1(td, &ua);
     1760        } else {
     1761                error = ENOMEM;
     1762        }
     1763
     1764        return rtems_bsd_error_to_status_and_errno(error);
     1765}
     1766#endif /* __rtems__ */
    17411767
    17421768int
     
    17811807}
    17821808
     1809#ifndef __rtems__
    17831810int
    17841811getsockname(td, uap)
  • freebsd/sys/sys/sysproto.h

    r0beab1e r8989c11  
    157157        char alen_l_[PADL_(__socklen_t *__restrict)]; __socklen_t *__restrict alen; char alen_r_[PADR_(__socklen_t *__restrict)];
    158158};
    159 #ifndef __rtems__
    160159struct getsockname_args {
    161160        char fdes_l_[PADL_(int)]; int fdes; char fdes_r_[PADR_(int)];
     
    163162        char alen_l_[PADL_(__socklen_t *__restrict)]; __socklen_t *__restrict alen; char alen_r_[PADR_(__socklen_t *__restrict)];
    164163};
     164#ifndef __rtems__
    165165struct access_args {
    166166        char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
  • rtemsbsd/include/machine/rtems-bsd-syscall-api.h

    r0beab1e r8989c11  
    6464int     getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict);
    6565
     66int     getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict);
     67
    6668int     getsockopt(int, int, int, void * __restrict, socklen_t * __restrict);
    6769
  • rtemsbsd/rtems/rtems-bsd-syscalls.c

    r0beab1e r8989c11  
    620620}
    621621
    622 int
    623 kern_getsockname(struct thread *td, int fd, struct sockaddr **sa,
    624     socklen_t *alen)
    625 {
    626         struct socket *so;
    627         socklen_t len;
    628         int error;
    629 
    630         if (*alen < 0)
    631                 return (EINVAL);
    632 
    633         if ((so = rtems_bsdnet_fdToSocket (fd)) == NULL) {
    634                 error = EBADF;
    635                 return error;
    636         }
    637         *sa = NULL;
    638         CURVNET_SET(so->so_vnet);
    639         error = (*so->so_proto->pr_usrreqs->pru_sockaddr)(so, sa);
    640         CURVNET_RESTORE();
    641         if (error)
    642                 goto bad;
    643         if (*sa == NULL)
    644                 len = 0;
    645         else
    646                 len = MIN(*alen, (*sa)->sa_len);
    647         *alen = len;
    648 #ifdef KTRACE
    649         if (KTRPOINT(td, KTR_STRUCT))
    650                 ktrsockaddr(*sa);
    651 #endif
    652 bad:
    653         if (error && *sa) {
    654                 free(*sa, M_SONAME);
    655                 *sa = NULL;
    656         }
    657         return (error);
    658 }
    659 
    660 static int
    661 getsockname1(td, fdes, asa, alen, compat)
    662         struct thread *td;
    663         int     fdes;
    664         struct sockaddr *  asa;
    665         socklen_t * alen;
    666         int compat;
    667 {
    668         struct sockaddr *sa;
    669         socklen_t len;
    670         int error;
    671 
    672         error = copyin(alen, &len, sizeof(len));
    673         if (error)
    674                 return (error);
    675 
    676         error = kern_getsockname(td, fdes, &sa, &len);
    677         if (error)
    678                 return (error);
    679 
    680         if (len != 0) {
    681 #ifdef COMPAT_OLDSOCK
    682                 if (compat)
    683                         ((struct osockaddr *)sa)->sa_family = sa->sa_family;
    684 #endif
    685                 error = copyout(sa, asa, (u_int)len);
    686         }
    687         free(sa, M_SONAME);
    688         if (error == 0)
    689                 error = copyout(&len, alen, sizeof(len));
    690         return (error);
    691 }
    692 
    693 int
    694 getsockname (int s, struct sockaddr *name, socklen_t *namelen)
    695 {
    696         struct thread *td;
    697         int error;
    698 
    699         td = curthread;
    700         error = getsockname1(td, s, name, namelen, 0);
    701         if( error == 0 )
    702         {
    703                 return error;
    704         }
    705         errno = error;
    706         return -1;
    707 }
    708 
    709622/*
    710623 ************************************************************************
  • testsuite/syscalls01/test_main.c

    r0beab1e r8989c11  
    879879
    880880static void
     881no_mem_socket_getsockname(int fd)
     882{
     883        struct sockaddr_in addr;
     884        socklen_t addr_len;
     885        int rv;
     886
     887        errno = 0;
     888        addr_len = sizeof(addr);
     889        rv = getsockname(fd, (struct sockaddr *) &addr, &addr_len);
     890        assert(rv == -1);
     891        assert(errno == ENOMEM);
     892}
     893
     894static void
     895test_socket_getsockname(void)
     896{
     897        rtems_resource_snapshot snapshot;
     898        struct sockaddr_in addr;
     899        struct sockaddr_in expected_addr;
     900        socklen_t addr_len;
     901        int sd;
     902        int rv;
     903
     904        puts("test socket getsockname");
     905
     906        rtems_resource_snapshot_take(&snapshot);
     907
     908        sd = socket(PF_INET, SOCK_STREAM, 0);
     909        assert(sd >= 0);
     910
     911        do_no_mem_test(no_mem_socket_getsockname, sd);
     912
     913        memset(&addr, 0xff, sizeof(addr));
     914        addr_len = sizeof(addr);
     915        rv = getsockname(sd, (struct sockaddr *) &addr, &addr_len);
     916        assert(rv == 0);
     917        memset(&expected_addr, 0, sizeof(expected_addr));
     918        expected_addr.sin_len = sizeof(expected_addr);
     919        expected_addr.sin_family = AF_INET;
     920        assert(memcmp(&addr, &expected_addr, sizeof(addr)) == 0);
     921
     922        rv = close(sd);
     923        assert(rv == 0);
     924
     925        errno = 0;
     926        addr_len = sizeof(addr);
     927        rv = getsockname(sd, (struct sockaddr *) &addr, &addr_len);
     928        assert(rv == -1);
     929        assert(errno == EBADF);
     930
     931        assert(rtems_resource_snapshot_check(&snapshot));
     932}
     933
     934static void
    881935test_main(void)
    882936{
     
    893947        test_socket_getsockopt_and_setsockopt();
    894948        test_socket_getpeername();
     949        test_socket_getsockname();
    895950
    896951        puts("*** END OF " TEST_NAME " TEST ***");
Note: See TracChangeset for help on using the changeset viewer.