diff options
-rw-r--r-- | freebsd/sys/kern/uipc_syscalls.c | 29 | ||||
-rw-r--r-- | freebsd/sys/sys/sysproto.h | 2 | ||||
-rw-r--r-- | rtemsbsd/include/machine/rtems-bsd-syscall-api.h | 2 | ||||
-rw-r--r-- | rtemsbsd/rtems/rtems-bsd-syscalls.c | 92 | ||||
-rw-r--r-- | testsuite/syscalls01/test_main.c | 51 |
5 files changed, 83 insertions, 93 deletions
diff --git a/freebsd/sys/kern/uipc_syscalls.c b/freebsd/sys/kern/uipc_syscalls.c index 7377c7f4..249bc2b7 100644 --- a/freebsd/sys/kern/uipc_syscalls.c +++ b/freebsd/sys/kern/uipc_syscalls.c @@ -1799,7 +1799,13 @@ ogetsockname(td, uap) return (getsockname1(td, uap, 1)); } #endif /* COMPAT_OLDSOCK */ +#endif /* __rtems__ */ +#ifdef __rtems__ +static int +kern_getpeername(struct thread *td, int fd, struct sockaddr **sa, + socklen_t *alen); +#endif /* __rtems__ */ /* * getpeername1() - Get name of peer for connected socket. */ @@ -1838,6 +1844,28 @@ getpeername1(td, uap, compat) error = copyout(&len, uap->alen, sizeof(len)); return (error); } +#ifdef __rtems__ +int +getpeername(int socket, struct sockaddr *__restrict address, + socklen_t *__restrict address_len) +{ + struct thread *td = rtems_bsd_get_curthread_or_null(); + struct getpeername_args ua = { + .fdes = socket, + .asa = address, + .alen = address_len + }; + int error; + + if (td != NULL) { + error = getpeername1(td, &ua); + } else { + error = ENOMEM; + } + + return rtems_bsd_error_to_status_and_errno(error); +} +#endif /* __rtems__ */ int kern_getpeername(struct thread *td, int fd, struct sockaddr **sa, @@ -1885,6 +1913,7 @@ done: return (error); } +#ifndef __rtems__ int getpeername(td, uap) struct thread *td; diff --git a/freebsd/sys/sys/sysproto.h b/freebsd/sys/sys/sysproto.h index 3d81aff4..a053d5d2 100644 --- a/freebsd/sys/sys/sysproto.h +++ b/freebsd/sys/sys/sysproto.h @@ -151,12 +151,12 @@ struct accept_args { char name_l_[PADL_(struct sockaddr *__restrict)]; struct sockaddr *__restrict name; char name_r_[PADR_(struct sockaddr *__restrict)]; char anamelen_l_[PADL_(__socklen_t *__restrict)]; __socklen_t *__restrict anamelen; char anamelen_r_[PADR_(__socklen_t *__restrict)]; }; -#ifndef __rtems__ struct getpeername_args { char fdes_l_[PADL_(int)]; int fdes; char fdes_r_[PADR_(int)]; char asa_l_[PADL_(struct sockaddr *__restrict)]; struct sockaddr *__restrict asa; char asa_r_[PADR_(struct sockaddr *__restrict)]; char alen_l_[PADL_(__socklen_t *__restrict)]; __socklen_t *__restrict alen; char alen_r_[PADR_(__socklen_t *__restrict)]; }; +#ifndef __rtems__ struct getsockname_args { char fdes_l_[PADL_(int)]; int fdes; char fdes_r_[PADR_(int)]; char asa_l_[PADL_(struct sockaddr *__restrict)]; struct sockaddr *__restrict asa; char asa_r_[PADR_(struct sockaddr *__restrict)]; diff --git a/rtemsbsd/include/machine/rtems-bsd-syscall-api.h b/rtemsbsd/include/machine/rtems-bsd-syscall-api.h index 3b60fa6b..a75968b2 100644 --- a/rtemsbsd/include/machine/rtems-bsd-syscall-api.h +++ b/rtemsbsd/include/machine/rtems-bsd-syscall-api.h @@ -61,6 +61,8 @@ int bind(int, const struct sockaddr *, socklen_t); int connect(int, const struct sockaddr *, socklen_t); +int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict); + int getsockopt(int, int, int, void * __restrict, socklen_t * __restrict); int listen(int, int); diff --git a/rtemsbsd/rtems/rtems-bsd-syscalls.c b/rtemsbsd/rtems/rtems-bsd-syscalls.c index cf457122..69a25f62 100644 --- a/rtemsbsd/rtems/rtems-bsd-syscalls.c +++ b/rtemsbsd/rtems/rtems-bsd-syscalls.c @@ -620,98 +620,6 @@ done2: } int -kern_getpeername(struct thread *td, int fd, struct sockaddr **sa, - socklen_t *alen) -{ - struct socket *so; - socklen_t len; - int error; - - if (*alen < 0) - return (EINVAL); - - if ((so = rtems_bsdnet_fdToSocket (fd)) == NULL) { - error = EBADF; - return error; - } - if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0) { - error = ENOTCONN; - goto done; - } - *sa = NULL; - CURVNET_SET(so->so_vnet); - error = (*so->so_proto->pr_usrreqs->pru_peeraddr)(so, sa); - CURVNET_RESTORE(); - if (error) - goto bad; - if (*sa == NULL) - len = 0; - else - len = MIN(*alen, (*sa)->sa_len); - *alen = len; -#ifdef KTRACE - if (KTRPOINT(td, KTR_STRUCT)) - ktrsockaddr(*sa); -#endif -bad: - if (error && *sa) { - free(*sa, M_SONAME); - *sa = NULL; - } -done: - return (error); -} - -static int -getpeername1(td, fdes, asa, alen, compat) - struct thread *td; - int fdes; - struct sockaddr * asa; - socklen_t * alen; - int compat; -{ - struct sockaddr *sa; - socklen_t len; - int error; - - error = copyin(alen, &len, sizeof (len)); - if (error) - return (error); - - error = kern_getpeername(td, fdes, &sa, &len); - if (error) - return (error); - - if (len != 0) { -#ifdef COMPAT_OLDSOCK - if (compat) - ((struct osockaddr *)sa)->sa_family = sa->sa_family; -#endif - error = copyout(sa, asa, (u_int)len); - } - free(sa, M_SONAME); - if (error == 0) - error = copyout(&len, alen, sizeof(len)); - return (error); -} - -int -getpeername (int s, struct sockaddr *name, socklen_t *namelen) -{ - struct thread *td; - int error; - - td = curthread; - error = getpeername1(td, s, name, namelen, 0); - if( error == 0 ) - { - return error; - } - errno = error; - return -1; -} - -int kern_getsockname(struct thread *td, int fd, struct sockaddr **sa, socklen_t *alen) { diff --git a/testsuite/syscalls01/test_main.c b/testsuite/syscalls01/test_main.c index 6d0746e3..ce626467 100644 --- a/testsuite/syscalls01/test_main.c +++ b/testsuite/syscalls01/test_main.c @@ -828,6 +828,56 @@ test_socket_getsockopt_and_setsockopt(void) } static void +no_mem_socket_getpeername(int fd) +{ + struct sockaddr_in addr; + socklen_t addr_len; + int rv; + + errno = 0; + addr_len = sizeof(addr); + rv = getpeername(fd, (struct sockaddr *) &addr, &addr_len); + assert(rv == -1); + assert(errno == ENOMEM); +} + +static void +test_socket_getpeername(void) +{ + rtems_resource_snapshot snapshot; + struct sockaddr_in addr; + socklen_t addr_len; + int sd; + int rv; + + puts("test socket getpeername"); + + rtems_resource_snapshot_take(&snapshot); + + sd = socket(PF_INET, SOCK_STREAM, 0); + assert(sd >= 0); + + do_no_mem_test(no_mem_socket_getpeername, sd); + + errno = 0; + addr_len = sizeof(addr); + rv = getpeername(sd, (struct sockaddr *) &addr, &addr_len); + assert(rv == -1); + assert(errno == ENOTCONN); + + rv = close(sd); + assert(rv == 0); + + errno = 0; + addr_len = sizeof(addr); + rv = getpeername(sd, (struct sockaddr *) &addr, &addr_len); + assert(rv == -1); + assert(errno == EBADF); + + assert(rtems_resource_snapshot_check(&snapshot)); +} + +static void test_main(void) { /* Must be first test to ensure resource checks work */ @@ -841,6 +891,7 @@ test_main(void) test_socket_listen(); test_socket_accept(); test_socket_getsockopt_and_setsockopt(); + test_socket_getpeername(); puts("*** END OF " TEST_NAME " TEST ***"); exit(0); |