int socket_getsockname(int fd, char *addr, int *port) { sockaddr_x sa; socklen_t len = (socklen_t)sizeof(sa); if (getsockname(fd, (SA*)&sa, &len) == 0) { sa_parse(&sa, addr, port); return 0; } else { return errno; } }
int socket_accept(int fd, int *peer, char *addr, int *port) { sockaddr_x sa; socklen_t len = (socklen_t)sizeof(sa); *peer = accept(fd, (SA*)&sa, &len); if (*peer >= 0) { if (addr != NULL || port != NULL) sa_parse(&sa, addr, port); return 0; } else { return errno; } }
int socket_recvfrom(int fd, uint8 *data, size_t count, int flags, char *addr, int *port, size_t *got) { int nrecv; sockaddr_x sa; socklen_t len = (socklen_t)sizeof(sa); *got = 0; nrecv = recvfrom(fd, data, count, flags, (SA*)&sa, &len); if (nrecv >= 0) { *got = nrecv; sa_parse(&sa, addr, port); return 0; } else { return errno; } }
static void sa_parse_test( const char* const inetId, const unsigned short port) { ServiceAddr* sa; char* buf = ldm_format(80, strchr(inetId, ':') ? "[%s]:%d" : "%s:%d", inetId, port); int status; CU_ASSERT_PTR_NOT_NULL_FATAL(buf); status = sa_parse(&sa, buf); log_flush_error(); CU_ASSERT_EQUAL_FATAL(status, 0); CU_ASSERT_STRING_EQUAL(sa_getInetId(sa), inetId); CU_ASSERT_EQUAL(sa_getPort(sa), port); sa_free(sa); }