Changeset 6676de4 in rtems-libbsd
- Timestamp:
- 10/14/13 07:48:56 (9 years ago)
- Branches:
- 4.11, 5, 5-freebsd-12, 6-freebsd-12, 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)
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
freebsd/sys/kern/uipc_syscalls.c
re5393a3 r6676de4 609 609 } 610 610 #endif /* COMPAT_OLDSOCK */ 611 #endif /* __rtems__ */ 611 612 612 613 /* ARGSUSED */ 613 int 614 connect(td, uap) 614 #ifndef __rtems__ 615 int 616 #else /* __rtems__ */ 617 static int kern_connect(struct thread *, int, struct sockaddr *); 618 619 static int 620 rtems_bsd_connect(td, uap) 621 #endif /* __rtems__ */ 615 622 struct thread *td; 616 623 struct connect_args /* { … … 631 638 return (error); 632 639 } 640 #ifdef __rtems__ 641 int 642 connect(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__ */ 633 661 634 662 … … 694 722 } 695 723 724 #ifndef __rtems__ 696 725 int 697 726 kern_socketpair(struct thread *td, int domain, int type, int protocol, -
freebsd/sys/sys/sysproto.h
re5393a3 r6676de4 357 357 char protocol_l_[PADL_(int)]; int protocol; char protocol_r_[PADR_(int)]; 358 358 }; 359 #ifndef __rtems__360 359 struct connect_args { 361 360 char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)]; 362 361 char name_l_[PADL_(caddr_t)]; caddr_t name; char name_r_[PADR_(caddr_t)]; 362 #ifndef __rtems__ 363 363 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__ 365 369 struct getpriority_args { 366 370 char which_l_[PADL_(int)]; int which; char which_r_[PADR_(int)]; -
rtemsbsd/include/machine/rtems-bsd-syscall-api.h
re5393a3 r6676de4 58 58 int bind(int, const struct sockaddr *, socklen_t); 59 59 60 int connect(int, const struct sockaddr *, socklen_t); 61 60 62 int shutdown(int, int); 61 63 -
rtemsbsd/rtems/rtems-bsd-syscalls.c
re5393a3 r6676de4 165 165 ********************************************************************* 166 166 */ 167 int168 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 KTRACE187 if (KTRPOINT(td, KTR_STRUCT))188 ktrsockaddr(sa);189 #endif190 #ifdef MAC191 error = mac_socket_check_connect(td->td_ucred, so, sa);192 if (error)193 goto bad;194 #endif195 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 int227 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 }247 167 248 168 int -
testsuite/syscalls01/test_main.c
re5393a3 r6676de4 567 567 568 568 static void 569 no_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 580 static void 581 test_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 625 static void 569 626 test_main(void) 570 627 { … … 576 633 test_socket_ioctl(); 577 634 test_socket_bind(); 635 test_socket_connect(); 578 636 579 637 puts("*** END OF " TEST_NAME " TEST ***");
Note: See TracChangeset
for help on using the changeset viewer.