Changeset 7c2b59c in rtems-libbsd


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

Use accept() from FreeBSD

Files:
5 edited

Legend:

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

    r7c36251 r7c2b59c  
    402402#endif /* __rtems__ */
    403403
    404 #ifndef __rtems__
     404#ifdef __rtems__
     405static int
     406kern_accept(struct thread *td, int s, struct sockaddr **name,
     407    socklen_t *namelen, struct file **fp);
     408#endif /* __rtems__ */
    405409/*
    406410 * accept1()
     
    457461        return (error);
    458462}
     463#ifdef __rtems__
     464int
     465accept(int socket, struct sockaddr *__restrict address,
     466    socklen_t *__restrict address_len)
     467{
     468        struct thread *td = rtems_bsd_get_curthread_or_null();
     469        struct accept_args ua = {
     470                .s = socket,
     471                .name = address,
     472                .anamelen = address_len
     473        };
     474        int error;
     475
     476        if (td != NULL) {
     477                error = accept1(td, &ua);
     478        } else {
     479                error = ENOMEM;
     480        }
     481
     482        if (error == 0) {
     483                return td->td_retval[0];
     484        } else {
     485                rtems_set_errno_and_return_minus_one(error);
     486        }
     487}
     488#endif /* __rtems__ */
    459489
    460490int
     
    462492    socklen_t *namelen, struct file **fp)
    463493{
     494#ifndef __rtems__
    464495        struct filedesc *fdp;
     496#endif /* __rtems__ */
    465497        struct file *headfp, *nfp = NULL;
    466498        struct sockaddr *sa = NULL;
     
    479511
    480512        AUDIT_ARG_FD(s);
     513#ifndef __rtems__
    481514        fdp = td->td_proc->p_fd;
     515#endif /* __rtems__ */
    482516        error = getsock(fdp, s, &headfp, &fflag);
    483517        if (error)
     
    615649}
    616650
     651#ifndef __rtems__
    617652int
    618653accept(td, uap)
  • freebsd/sys/sys/sysproto.h

    r7c36251 r7c2b59c  
    146146        char fromlenaddr_l_[PADL_(__socklen_t *__restrict)]; __socklen_t *__restrict fromlenaddr; char fromlenaddr_r_[PADR_(__socklen_t *__restrict)];
    147147};
     148#endif /* __rtems__ */
    148149struct accept_args {
    149150        char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
     
    151152        char anamelen_l_[PADL_(__socklen_t *__restrict)]; __socklen_t *__restrict anamelen; char anamelen_r_[PADR_(__socklen_t *__restrict)];
    152153};
     154#ifndef __rtems__
    153155struct getpeername_args {
    154156        char fdes_l_[PADL_(int)]; int fdes; char fdes_r_[PADR_(int)];
  • rtemsbsd/include/machine/rtems-bsd-syscall-api.h

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

    r7c36251 r7c2b59c  
    167167
    168168int
    169 kern_accept(struct thread *td, int s, struct sockaddr **name, socklen_t *namelen)
    170 {
    171         struct sockaddr *sa = NULL;
    172         int error;
    173         struct socket *head, *so;
    174         int fd;
    175         u_int fflag;
    176         pid_t pgid;
    177         int tmp;
    178 
    179         if (name) {
    180                 *name = NULL;
    181                 if (*namelen < 0)
    182                         return (EINVAL);
    183         }
    184 
    185         if ((head = rtems_bsdnet_fdToSocket (s)) == NULL) {
    186                 error = EBADF;
    187                 return (error);
    188         }
    189         if ((head->so_options & SO_ACCEPTCONN) == 0) {
    190                 error = EINVAL;
    191                 goto done;
    192         }
    193 #ifdef MAC
    194         error = mac_socket_check_accept(td->td_ucred, head);
    195         if (error != 0)
    196                 goto done;
    197 #endif
    198         ACCEPT_LOCK();
    199         if ((head->so_state & SS_NBIO) && TAILQ_EMPTY(&head->so_comp)) {
    200                 ACCEPT_UNLOCK();
    201                 error = EWOULDBLOCK;
    202                 goto noconnection;
    203         }
    204         while (TAILQ_EMPTY(&head->so_comp) && head->so_error == 0) {
    205                 if (head->so_rcv.sb_state & SBS_CANTRCVMORE) {
    206                         head->so_error = ECONNABORTED;
    207                         break;
    208                 }
    209                 error = msleep(&head->so_timeo, &accept_mtx, PSOCK | PCATCH,
    210                     "accept", 0);
    211                 if (error) {
    212                         ACCEPT_UNLOCK();
    213                         goto noconnection;
    214                 }
    215         }
    216         if (head->so_error) {
    217                 error = head->so_error;
    218                 head->so_error = 0;
    219                 ACCEPT_UNLOCK();
    220                 goto noconnection;
    221         }
    222         so = TAILQ_FIRST(&head->so_comp);
    223         KASSERT(!(so->so_qstate & SQ_INCOMP), ("accept1: so SQ_INCOMP"));
    224         KASSERT(so->so_qstate & SQ_COMP, ("accept1: so not SQ_COMP"));
    225 
    226         /*
    227          * Before changing the flags on the socket, we have to bump the
    228          * reference count.  Otherwise, if the protocol calls sofree(),
    229          * the socket will be released due to a zero refcount.
    230          */
    231         SOCK_LOCK(so);                  /* soref() and so_state update */
    232         soref(so);                      /* file descriptor reference */
    233 
    234         TAILQ_REMOVE(&head->so_comp, so, so_list);
    235         head->so_qlen--;
    236 
    237         fd = rtems_bsdnet_makeFdForSocket (so);
    238         if (fd < 0) {
    239                 TAILQ_INSERT_HEAD(&head->so_comp, so, so_list);
    240                 head->so_qlen++;
    241     wakeup(head);
    242                 error = EBADF;
    243                 return (error);
    244         }
    245 
    246         so->so_state |= (head->so_state & SS_NBIO);
    247         so->so_qstate &= ~SQ_COMP;
    248         so->so_head = NULL;
    249 
    250         SOCK_UNLOCK(so);
    251         ACCEPT_UNLOCK();
    252 
    253         td->td_retval[0] = fd;
    254 
    255         sa = 0;
    256         CURVNET_SET(so->so_vnet);
    257         error = soaccept(so, &sa);
    258         CURVNET_RESTORE();
    259         if (error) {
    260                 /*
    261                  * return a namelen of zero for older code which might
    262                  * ignore the return value from accept.
    263                  */
    264                 if (name)
    265                         *namelen = 0;
    266                 goto noconnection;
    267         }
    268         if (sa == NULL) {
    269                 if (name)
    270                         *namelen = 0;
    271                 goto done;
    272         }
    273         if (name) {
    274                 /* check sa_len before it is destroyed */
    275                 if (*namelen > sa->sa_len)
    276                         *namelen = sa->sa_len;
    277 #ifdef KTRACE
    278                 if (KTRPOINT(td, KTR_STRUCT))
    279                         ktrsockaddr(sa);
    280 #endif
    281                 *name = sa;
    282                 sa = NULL;
    283         }
    284 noconnection:
    285         if (sa)
    286                 free(sa, M_SONAME);
    287 
    288 done:
    289         return (error);
    290 }
    291 
    292 static int
    293 accept1(td, s, _name, _namelen, compat)
    294         struct thread *td;
    295         int s;
    296         struct sockaddr *_name;
    297         int *_namelen;
    298         int compat;
    299 {
    300         struct sockaddr *name;
    301         socklen_t namelen;
    302         int error;
    303 
    304         if (_name == NULL)
    305                 return (kern_accept(td, s, NULL, NULL));
    306 
    307         error = copyin(_namelen, &namelen, sizeof (namelen));
    308         if (error)
    309                 return (error);
    310 
    311         error = kern_accept(td, s, &name, &namelen);
    312 
    313         /*
    314          * return a namelen of zero for older code which might
    315          * ignore the return value from accept.
    316          */
    317         if (error) {
    318                 (void) copyout(&namelen,
    319                     _namelen, sizeof(*_namelen));
    320                 return (error);
    321         }
    322 
    323         if (error == 0 && name != NULL) {
    324 #ifdef COMPAT_OLDSOCK
    325                 if (compat)
    326                         ((struct osockaddr *)name)->sa_family =
    327                             name->sa_family;
    328 #endif
    329                 error = copyout(name, _name, namelen);
    330         }
    331         if (error == 0)
    332                 error = copyout(&namelen, _namelen,
    333                     sizeof(namelen));
    334         free(name, M_SONAME);
    335         return (error);
    336 }
    337 
    338 int
    339 accept (int s, struct sockaddr *name, int *namelen)
    340 {
    341         struct thread *td;
    342         int error;
    343 
    344         td = curthread;
    345         error = accept1(td, s, name, namelen, 0);
    346         if( error == 0 )
    347         {
    348                 return td->td_retval[0];
    349         }
    350         errno = error;
    351         return -1;
    352 }
    353 
    354 int
    355169kern_sendit(td, s, mp, flags, control, segflg)
    356170        struct thread *td;
  • testsuite/syscalls01/test_main.c

    r7c36251 r7c2b59c  
    678678
    679679static void
     680no_mem_socket_accept(int fd)
     681{
     682        struct sockaddr_in addr;
     683        socklen_t addr_len;
     684        int rv;
     685
     686        errno = 0;
     687        addr_len = sizeof(addr);
     688        rv = accept(fd, (struct sockaddr *) &addr, &addr_len);
     689        assert(rv == -1);
     690        assert(errno == ENOMEM);
     691}
     692
     693static void
     694test_socket_accept(void)
     695{
     696        rtems_resource_snapshot snapshot;
     697        struct sockaddr_in addr;
     698        socklen_t addr_len;
     699        int sd;
     700        int ad;
     701        int rv;
     702
     703        puts("test socket accept");
     704
     705        rtems_resource_snapshot_take(&snapshot);
     706
     707        sd = socket(PF_INET, SOCK_STREAM, 0);
     708        assert(sd >= 0);
     709
     710        do_no_mem_test(no_mem_socket_accept, sd);
     711
     712        errno = 0;
     713        addr_len = sizeof(addr);
     714        ad = accept(sd, (struct sockaddr *) &addr, &addr_len);
     715        assert(ad == -1);
     716        assert(errno == EINVAL);
     717
     718        rv = close(sd);
     719        assert(rv == 0);
     720
     721        errno = 0;
     722        addr_len = sizeof(addr);
     723        ad = accept(sd, (struct sockaddr *) &addr, &addr_len);
     724        assert(ad == -1);
     725        assert(errno == EBADF);
     726
     727        assert(rtems_resource_snapshot_check(&snapshot));
     728}
     729
     730static void
    680731test_main(void)
    681732{
     
    689740        test_socket_connect();
    690741        test_socket_listen();
     742        test_socket_accept();
    691743
    692744        puts("*** END OF " TEST_NAME " TEST ***");
Note: See TracChangeset for help on using the changeset viewer.