Changeset 468b08e in rtems-libbsd


Ignore:
Timestamp:
Oct 11, 2013, 2:44:48 PM (6 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, a8f29d695e152575479ad1a97fa354f661bebd4d, freebsd-9.3, d892051f37c2c4ad7f345f6a817ea3d38e56a431
Children:
e5393a3
Parents:
6ffb9b9
git-author:
Sebastian Huber <sebastian.huber@…> (10/11/13 14:44:48)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/31/13 12:18:47)
Message:

Use bind() from FreeBSD

Files:
5 edited

Legend:

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

    r6ffb9b9 r468b08e  
    272272int
    273273bind(td, uap)
     274#else /* __rtems__ */
     275static int kern_bind(struct thread *, int, struct sockaddr *);
     276
     277static int
     278rtems_bsd_bind(td, uap)
     279#endif /* __rtems__ */
    274280        struct thread *td;
    275281        struct bind_args /* {
     
    289295        return (error);
    290296}
     297#ifdef __rtems__
     298int
     299bind(int socket, const struct sockaddr *address, socklen_t address_len)
     300{
     301        struct thread *td = rtems_bsd_get_curthread_or_null();
     302        struct bind_args ua = {
     303                .s = socket,
     304                .name = (caddr_t) address,
     305                .namelen = address_len
     306        };
     307        int error;
     308
     309        if (td != NULL) {
     310                error = rtems_bsd_bind(td, &ua);
     311        } else {
     312                error = ENOMEM;
     313        }
     314
     315        return rtems_bsd_error_to_status_and_errno(error);
     316}
     317#endif /* __rtems__ */
    291318
    292319int
     
    318345}
    319346
     347#ifndef __rtems__
    320348/* ARGSUSED */
    321349int
     
    17641792        return (error);
    17651793}
     1794#endif /* __rtems__ */
    17661795
    17671796int
     
    17931822}
    17941823
     1824#ifndef __rtems__
    17951825#include <sys/condvar.h>
    17961826
  • freebsd/sys/sys/sysproto.h

    r6ffb9b9 r468b08e  
    367367        char who_l_[PADL_(int)]; int who; char who_r_[PADR_(int)];
    368368};
     369#endif /* __rtems__ */
    369370struct bind_args {
    370371        char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
    371372        char name_l_[PADL_(caddr_t)]; caddr_t name; char name_r_[PADR_(caddr_t)];
     373#ifndef __rtems__
    372374        char namelen_l_[PADL_(int)]; int namelen; char namelen_r_[PADR_(int)];
    373 };
     375#else /* __rtems__ */
     376        char namelen_l_[PADL_(__socklen_t)]; __socklen_t namelen; char namelen_r_[PADR_(__socklen_t)];
     377#endif /* __rtems__ */
     378};
     379#ifndef __rtems__
    374380struct setsockopt_args {
    375381        char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
  • rtemsbsd/include/machine/rtems-bsd-syscall-api.h

    r6ffb9b9 r468b08e  
    5656int     select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
    5757
     58int     bind(int, const struct sockaddr *, socklen_t);
     59
    5860int     shutdown(int, int);
    5961
  • rtemsbsd/rtems/rtems-bsd-syscalls.c

    r6ffb9b9 r468b08e  
    160160}
    161161
    162 int
    163 getsockaddr(namp, uaddr, len)
    164         struct sockaddr **namp;
    165         caddr_t uaddr;
    166         size_t len;
    167 {
    168         struct sockaddr *sa;
    169         int error;
    170 
    171         if (len > SOCK_MAXADDRLEN)
    172                 return (ENAMETOOLONG);
    173         if (len < offsetof(struct sockaddr, sa_data[0]))
    174                 return (EINVAL);
    175         sa = malloc(len, M_SONAME, M_WAITOK);
    176         error = copyin(uaddr, sa, len);
    177         if (error) {
    178                 free(sa, M_SONAME);
    179         } else {
    180 #if defined(COMPAT_OLDSOCK) && BYTE_ORDER != BIG_ENDIAN
    181                 if (sa->sa_family == 0 && sa->sa_len < AF_MAX)
    182                         sa->sa_family = sa->sa_len;
    183 #endif
    184                 sa->sa_len = len;
    185                 *namp = sa;
    186         }
    187         return (error);
    188 }
    189 
    190162/*
    191163 *********************************************************************
     
    193165 *********************************************************************
    194166 */
    195 int
    196 kern_bind(td, fd, sa)
    197         struct thread *td;
    198         int fd;
    199         struct sockaddr *sa;
    200 {
    201         struct socket *so;
    202         int error;
    203 
    204         if ((so = rtems_bsdnet_fdToSocket (fd)) == NULL) {
    205                 error = EBADF;
    206                 return (error);
    207         }
    208 #ifdef KTRACE
    209         if (KTRPOINT(td, KTR_STRUCT))
    210                 ktrsockaddr(sa);
    211 #endif
    212 #ifdef MAC
    213         error = mac_socket_check_bind(td->td_ucred, so, sa);
    214         if (error == 0)
    215 #endif
    216                 error = sobind(so, sa, td);
    217         return (error);
    218 }
    219 
    220 int
    221 bind (int s, struct sockaddr *name, int namelen)
    222 {
    223         struct thread *td;
    224         struct sockaddr *sa;
    225         int error;
    226 
    227         error = getsockaddr(&sa, name, namelen);
    228         if( error == 0 )
    229         {
    230                 td = curthread;
    231                 error = kern_bind(td, s, sa);
    232                 free(sa, M_SONAME);
    233         }
    234         if( error == 0 )
    235         {
    236                 return error;
    237         }
    238         errno = error;
    239         return -1;
    240 }
    241 
    242167int
    243168kern_connect(td, fd, sa)
  • testsuite/syscalls01/test_main.c

    r6ffb9b9 r468b08e  
    3535#include <sys/socket.h>
    3636#include <netinet/in.h>
     37#include <arpa/inet.h>
    3738
    3839#include <assert.h>
     
    218219
    219220static void
     221init_addr(struct sockaddr_in *addr)
     222{
     223        int ok;
     224
     225        memset(addr, 0, sizeof(*addr));
     226        addr->sin_family = AF_INET;
     227        addr->sin_port = htons(1234);
     228        ok = inet_aton("127.0.0.1", &addr->sin_addr);
     229        assert(ok != 0);
     230}
     231
     232static void
    220233no_mem_task(rtems_task_argument arg)
    221234{
     
    446459
    447460static void
     461no_mem_socket_bind(int fd)
     462{
     463        struct sockaddr_in addr;
     464        int rv;
     465
     466        errno = 0;
     467        rv = bind(fd, (const struct sockaddr *) &addr, sizeof(addr));
     468        assert(rv == -1);
     469        assert(errno == ENOMEM);
     470}
     471
     472static void
     473test_socket_bind(void)
     474{
     475        rtems_resource_snapshot snapshot;
     476        struct sockaddr_in addr;
     477        int sd;
     478        int rv;
     479
     480        puts("test socket bind");
     481
     482        rtems_resource_snapshot_take(&snapshot);
     483
     484        init_addr(&addr);
     485
     486        sd = socket(PF_INET, SOCK_DGRAM, 0);
     487        assert(sd >= 0);
     488
     489        do_no_mem_test(no_mem_socket_bind, sd);
     490
     491        errno = 0;
     492        rv = bind(sd, (const struct sockaddr *) &addr, SOCK_MAXADDRLEN + 1);
     493        assert(rv == -1);
     494        assert(errno == ENAMETOOLONG);
     495
     496        errno = 0;
     497        rv = bind(sd, (const struct sockaddr *) &addr, 0);
     498        assert(rv == -1);
     499        assert(errno == EINVAL);
     500
     501        errno = 0;
     502        rv = bind(sd, (const struct sockaddr *) &addr, sizeof(addr));
     503        assert(rv == -1);
     504        assert(errno == EADDRNOTAVAIL);
     505
     506        rv = close(sd);
     507        assert(rv == 0);
     508
     509        errno = 0;
     510        rv = bind(sd, (struct sockaddr *) &addr, sizeof(addr));
     511        assert(rv == -1);
     512        assert(errno == EBADF);
     513
     514        assert(rtems_resource_snapshot_check(&snapshot));
     515}
     516
     517static void
    448518test_main(void)
    449519{
     
    453523        test_socket_unsupported_ops();
    454524        test_socket_fstat_and_shutdown();
     525        test_socket_bind();
    455526
    456527        puts("*** END OF " TEST_NAME " TEST ***");
Note: See TracChangeset for help on using the changeset viewer.