Changeset 6676de4 in rtems-libbsd


Ignore:
Timestamp:
Oct 14, 2013, 7:48:56 AM (6 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, afaeccc05a556f6aa25ba044a7e49d6aa634a59e, freebsd-9.3, master
Children:
7c36251
Parents:
e5393a3
git-author:
Sebastian Huber <sebastian.huber@…> (10/14/13 07:48:56)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/31/13 12:18:47)
Message:

Use connect() from FreeBSD

Files:
5 edited

Legend:

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

    re5393a3 r6676de4  
    609609}
    610610#endif /* COMPAT_OLDSOCK */
     611#endif /* __rtems__ */
    611612
    612613/* ARGSUSED */
    613 int
    614 connect(td, uap)
     614#ifndef __rtems__
     615int
     616#else /* __rtems__ */
     617static int kern_connect(struct thread *, int, struct sockaddr *);
     618
     619static int
     620rtems_bsd_connect(td, uap)
     621#endif /* __rtems__ */
    615622        struct thread *td;
    616623        struct connect_args /* {
     
    631638        return (error);
    632639}
     640#ifdef __rtems__
     641int
     642connect(int socket, const struct sockaddr *address, socklen_t address_len)
     643{
     644        struct thread *td = rtems_bsd_get_curthread_or_null();
     645        struct connect_args ua = {
     646                .s = socket,
     647                .name = (caddr_t) address,
     648                .namelen = address_len
     649        };
     650        int error;
     651
     652        if (td != NULL) {
     653                error = rtems_bsd_connect(td, &ua);
     654        } else {
     655                error = ENOMEM;
     656        }
     657
     658        return rtems_bsd_error_to_status_and_errno(error);
     659}
     660#endif /* __rtems__ */
    633661
    634662
     
    694722}
    695723
     724#ifndef __rtems__
    696725int
    697726kern_socketpair(struct thread *td, int domain, int type, int protocol,
  • freebsd/sys/sys/sysproto.h

    re5393a3 r6676de4  
    357357        char protocol_l_[PADL_(int)]; int protocol; char protocol_r_[PADR_(int)];
    358358};
    359 #ifndef __rtems__
    360359struct connect_args {
    361360        char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
    362361        char name_l_[PADL_(caddr_t)]; caddr_t name; char name_r_[PADR_(caddr_t)];
     362#ifndef __rtems__
    363363        char namelen_l_[PADL_(int)]; int namelen; char namelen_r_[PADR_(int)];
    364 };
     364#else /* __rtems__ */
     365        char namelen_l_[PADL_(__socklen_t)]; __socklen_t namelen; char namelen_r_[PADR_(__socklen_t)];
     366#endif /* __rtems__ */
     367};
     368#ifndef __rtems__
    365369struct getpriority_args {
    366370        char which_l_[PADL_(int)]; int which; char which_r_[PADR_(int)];
  • rtemsbsd/include/machine/rtems-bsd-syscall-api.h

    re5393a3 r6676de4  
    5858int     bind(int, const struct sockaddr *, socklen_t);
    5959
     60int     connect(int, const struct sockaddr *, socklen_t);
     61
    6062int     shutdown(int, int);
    6163
  • rtemsbsd/rtems/rtems-bsd-syscalls.c

    re5393a3 r6676de4  
    165165 *********************************************************************
    166166 */
    167 int
    168 kern_connect(td, fd, sa)
    169         struct thread *td;
    170         int fd;
    171         struct sockaddr *sa;
    172 {
    173         struct socket *so;
    174         int error;
    175         int interrupted = 0;
    176 
    177         if ((so = rtems_bsdnet_fdToSocket (fd)) == NULL) {
    178                 error = EBADF;
    179                 return (error);
    180         }
    181 
    182         if (so->so_state & SS_ISCONNECTING) {
    183                 error = EALREADY;
    184                 goto done1;
    185         }
    186 #ifdef KTRACE
    187         if (KTRPOINT(td, KTR_STRUCT))
    188                 ktrsockaddr(sa);
    189 #endif
    190 #ifdef MAC
    191         error = mac_socket_check_connect(td->td_ucred, so, sa);
    192         if (error)
    193                 goto bad;
    194 #endif
    195         error = soconnect(so, sa, td);
    196         if (error)
    197                 goto bad;
    198         if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
    199                 error = EINPROGRESS;
    200                 goto done1;
    201         }
    202         SOCK_LOCK(so);
    203         while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {
    204                 error = msleep(&so->so_timeo, SOCK_MTX(so), PSOCK | PCATCH,
    205                     "connec", 0);
    206                 if (error) {
    207                         if (error == EINTR || error == ERESTART)
    208                                 interrupted = 1;
    209                         break;
    210                 }
    211         }
    212         if (error == 0) {
    213                 error = so->so_error;
    214                 so->so_error = 0;
    215         }
    216         SOCK_UNLOCK(so);
    217 bad:
    218         if (!interrupted)
    219                 so->so_state &= ~SS_ISCONNECTING;
    220         if (error == ERESTART)
    221                 error = EINTR;
    222 done1:
    223         return (error);
    224 }
    225 
    226 int
    227 connect (int s, struct sockaddr *name, int namelen)
    228 {
    229         int error;
    230         struct sockaddr *sa;
    231         struct thread *td;
    232 
    233         error = getsockaddr(&sa, name, namelen);
    234         if (error == 0)
    235         {
    236                 td = curthread;
    237                 error = kern_connect(td, s, sa);
    238                 free(sa, M_SONAME);
    239         }
    240         if( error == 0 )
    241         {
    242                 return error;
    243         }
    244         errno = error;
    245         return -1;
    246 }
    247167
    248168int
  • testsuite/syscalls01/test_main.c

    re5393a3 r6676de4  
    567567
    568568static void
     569no_mem_socket_connect(int fd)
     570{
     571        struct sockaddr_in addr;
     572        int rv;
     573
     574        errno = 0;
     575        rv = connect(fd, (const struct sockaddr *) &addr, sizeof(addr));
     576        assert(rv == -1);
     577        assert(errno == ENOMEM);
     578}
     579
     580static void
     581test_socket_connect(void)
     582{
     583        rtems_resource_snapshot snapshot;
     584        struct sockaddr_in addr;
     585        int sd;
     586        int rv;
     587
     588        puts("test socket connect");
     589
     590        rtems_resource_snapshot_take(&snapshot);
     591
     592        init_addr(&addr);
     593
     594        sd = socket(PF_INET, SOCK_DGRAM, 0);
     595        assert(sd >= 0);
     596
     597        do_no_mem_test(no_mem_socket_connect, sd);
     598
     599        errno = 0;
     600        rv = connect(sd, (const struct sockaddr *) &addr, SOCK_MAXADDRLEN + 1);
     601        assert(rv == -1);
     602        assert(errno == ENAMETOOLONG);
     603
     604        errno = 0;
     605        rv = connect(sd, (const struct sockaddr *) &addr, 0);
     606        assert(rv == -1);
     607        assert(errno == EINVAL);
     608
     609        errno = 0;
     610        rv = connect(sd, (const struct sockaddr *) &addr, sizeof(addr));
     611        assert(rv == -1);
     612        assert(errno == ENETUNREACH);
     613
     614        rv = close(sd);
     615        assert(rv == 0);
     616
     617        errno = 0;
     618        rv = connect(sd, (struct sockaddr *) &addr, sizeof(addr));
     619        assert(rv == -1);
     620        assert(errno == EBADF);
     621
     622        assert(rtems_resource_snapshot_check(&snapshot));
     623}
     624
     625static void
    569626test_main(void)
    570627{
     
    576633        test_socket_ioctl();
    577634        test_socket_bind();
     635        test_socket_connect();
    578636
    579637        puts("*** END OF " TEST_NAME " TEST ***");
Note: See TracChangeset for help on using the changeset viewer.