unix: refactor getsockname/getpeername methods
PR-URL: https://github.com/libuv/libuv/pull/1872 Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
parent
26a507877e
commit
bf6c5be84d
@ -1395,3 +1395,26 @@ int uv_os_setpriority(uv_pid_t pid, int priority) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int uv__getsockpeername(const uv_handle_t* handle,
|
||||
uv__peersockfunc func,
|
||||
struct sockaddr* name,
|
||||
int* namelen) {
|
||||
socklen_t socklen;
|
||||
uv_os_fd_t fd;
|
||||
int r;
|
||||
|
||||
r = uv_fileno(handle, &fd);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
/* sizeof(socklen_t) != sizeof(int) on some systems. */
|
||||
socklen = (socklen_t) *namelen;
|
||||
|
||||
if (func(fd, name, &socklen))
|
||||
return UV__ERR(errno);
|
||||
|
||||
*namelen = (int) socklen;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -300,4 +300,11 @@ UV_UNUSED(static char* uv__basename_r(const char* path)) {
|
||||
int uv__inotify_fork(uv_loop_t* loop, void* old_watchers);
|
||||
#endif
|
||||
|
||||
typedef int (*uv__peersockfunc)(int, struct sockaddr*, socklen_t*);
|
||||
|
||||
int uv__getsockpeername(const uv_handle_t* handle,
|
||||
uv__peersockfunc func,
|
||||
struct sockaddr* name,
|
||||
int* namelen);
|
||||
|
||||
#endif /* UV_UNIX_INTERNAL_H_ */
|
||||
|
||||
@ -233,9 +233,6 @@ out:
|
||||
}
|
||||
|
||||
|
||||
typedef int (*uv__peersockfunc)(int, struct sockaddr*, socklen_t*);
|
||||
|
||||
|
||||
static int uv__pipe_getsockpeername(const uv_pipe_t* handle,
|
||||
uv__peersockfunc func,
|
||||
char* buffer,
|
||||
@ -246,10 +243,13 @@ static int uv__pipe_getsockpeername(const uv_pipe_t* handle,
|
||||
|
||||
addrlen = sizeof(sa);
|
||||
memset(&sa, 0, addrlen);
|
||||
err = func(uv__stream_fd(handle), (struct sockaddr*) &sa, &addrlen);
|
||||
err = uv__getsockpeername((const uv_handle_t*) handle,
|
||||
func,
|
||||
(struct sockaddr*) &sa,
|
||||
(int*) &addrlen);
|
||||
if (err < 0) {
|
||||
*size = 0;
|
||||
return UV__ERR(errno);
|
||||
return err;
|
||||
}
|
||||
|
||||
#if defined(__linux__)
|
||||
|
||||
@ -82,7 +82,7 @@ static int maybe_new_socket(uv_tcp_t* handle, int domain, unsigned long flags) {
|
||||
handle->flags |= flags;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Query to see if tcp socket is bound. */
|
||||
slen = sizeof(saddr);
|
||||
memset(&saddr, 0, sizeof(saddr));
|
||||
@ -279,44 +279,28 @@ int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) {
|
||||
int uv_tcp_getsockname(const uv_tcp_t* handle,
|
||||
struct sockaddr* name,
|
||||
int* namelen) {
|
||||
socklen_t socklen;
|
||||
|
||||
if (handle->delayed_error)
|
||||
return handle->delayed_error;
|
||||
|
||||
if (uv__stream_fd(handle) < 0)
|
||||
return UV_EINVAL; /* FIXME(bnoordhuis) UV_EBADF */
|
||||
|
||||
/* sizeof(socklen_t) != sizeof(int) on some systems. */
|
||||
socklen = (socklen_t) *namelen;
|
||||
|
||||
if (getsockname(uv__stream_fd(handle), name, &socklen))
|
||||
return UV__ERR(errno);
|
||||
|
||||
*namelen = (int) socklen;
|
||||
return 0;
|
||||
return uv__getsockpeername((const uv_handle_t*) handle,
|
||||
getsockname,
|
||||
name,
|
||||
namelen);
|
||||
}
|
||||
|
||||
|
||||
int uv_tcp_getpeername(const uv_tcp_t* handle,
|
||||
struct sockaddr* name,
|
||||
int* namelen) {
|
||||
socklen_t socklen;
|
||||
|
||||
if (handle->delayed_error)
|
||||
return handle->delayed_error;
|
||||
|
||||
if (uv__stream_fd(handle) < 0)
|
||||
return UV_EINVAL; /* FIXME(bnoordhuis) UV_EBADF */
|
||||
|
||||
/* sizeof(socklen_t) != sizeof(int) on some systems. */
|
||||
socklen = (socklen_t) *namelen;
|
||||
|
||||
if (getpeername(uv__stream_fd(handle), name, &socklen))
|
||||
return UV__ERR(errno);
|
||||
|
||||
*namelen = (int) socklen;
|
||||
return 0;
|
||||
return uv__getsockpeername((const uv_handle_t*) handle,
|
||||
getpeername,
|
||||
name,
|
||||
namelen);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -847,19 +847,11 @@ int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr)
|
||||
int uv_udp_getsockname(const uv_udp_t* handle,
|
||||
struct sockaddr* name,
|
||||
int* namelen) {
|
||||
socklen_t socklen;
|
||||
|
||||
if (handle->io_watcher.fd == -1)
|
||||
return UV_EINVAL; /* FIXME(bnoordhuis) UV_EBADF */
|
||||
|
||||
/* sizeof(socklen_t) != sizeof(int) on some systems. */
|
||||
socklen = (socklen_t) *namelen;
|
||||
|
||||
if (getsockname(handle->io_watcher.fd, name, &socklen))
|
||||
return UV__ERR(errno);
|
||||
|
||||
*namelen = (int) socklen;
|
||||
return 0;
|
||||
return uv__getsockpeername((const uv_handle_t*) handle,
|
||||
getsockname,
|
||||
name,
|
||||
namelen);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -429,6 +429,31 @@ int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
int uv_cpumask_size(void) {
|
||||
return (int)(sizeof(DWORD_PTR) * 8);
|
||||
=======
|
||||
|
||||
int uv__getsockpeername(const uv_handle_t* handle,
|
||||
uv__peersockfunc func,
|
||||
struct sockaddr* name,
|
||||
int* namelen,
|
||||
int delayed_error) {
|
||||
|
||||
int result;
|
||||
uv_os_fd_t fd;
|
||||
|
||||
result = uv_fileno(handle, &fd);
|
||||
if (result != 0)
|
||||
return result;
|
||||
|
||||
if (delayed_error)
|
||||
return uv_translate_sys_error(delayed_error);
|
||||
|
||||
result = func((SOCKET) fd, name, namelen);
|
||||
if (result != 0)
|
||||
return uv_translate_sys_error(WSAGetLastError());
|
||||
|
||||
return 0;
|
||||
>>>>>>> f574d69a... unix: refactor getsockname/getpeername methods
|
||||
}
|
||||
|
||||
@ -248,6 +248,14 @@ int uv__getpwuid_r(uv_passwd_t* pwd);
|
||||
int uv__convert_utf16_to_utf8(const WCHAR* utf16, int utf16len, char** utf8);
|
||||
int uv__convert_utf8_to_utf16(const char* utf8, int utf8len, WCHAR** utf16);
|
||||
|
||||
typedef int (WINAPI *uv__peersockfunc)(SOCKET, struct sockaddr*, int*);
|
||||
|
||||
int uv__getsockpeername(const uv_handle_t* handle,
|
||||
uv__peersockfunc func,
|
||||
struct sockaddr* name,
|
||||
int* namelen,
|
||||
int delayed_error);
|
||||
|
||||
|
||||
/*
|
||||
* Process stdio handles.
|
||||
|
||||
@ -776,44 +776,24 @@ static int uv_tcp_try_connect(uv_connect_t* req,
|
||||
int uv_tcp_getsockname(const uv_tcp_t* handle,
|
||||
struct sockaddr* name,
|
||||
int* namelen) {
|
||||
int result;
|
||||
|
||||
if (handle->socket == INVALID_SOCKET) {
|
||||
return UV_EINVAL;
|
||||
}
|
||||
|
||||
if (handle->delayed_error) {
|
||||
return uv_translate_sys_error(handle->delayed_error);
|
||||
}
|
||||
|
||||
result = getsockname(handle->socket, name, namelen);
|
||||
if (result != 0) {
|
||||
return uv_translate_sys_error(WSAGetLastError());
|
||||
}
|
||||
|
||||
return 0;
|
||||
return uv__getsockpeername((const uv_handle_t*) handle,
|
||||
getsockname,
|
||||
name,
|
||||
namelen,
|
||||
handle->delayed_error);
|
||||
}
|
||||
|
||||
|
||||
int uv_tcp_getpeername(const uv_tcp_t* handle,
|
||||
struct sockaddr* name,
|
||||
int* namelen) {
|
||||
int result;
|
||||
|
||||
if (handle->socket == INVALID_SOCKET) {
|
||||
return UV_EINVAL;
|
||||
}
|
||||
|
||||
if (handle->delayed_error) {
|
||||
return uv_translate_sys_error(handle->delayed_error);
|
||||
}
|
||||
|
||||
result = getpeername(handle->socket, name, namelen);
|
||||
if (result != 0) {
|
||||
return uv_translate_sys_error(WSAGetLastError());
|
||||
}
|
||||
|
||||
return 0;
|
||||
return uv__getsockpeername((const uv_handle_t*) handle,
|
||||
getpeername,
|
||||
name,
|
||||
namelen,
|
||||
handle->delayed_error);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -32,18 +32,12 @@
|
||||
int uv_udp_getsockname(const uv_udp_t* handle,
|
||||
struct sockaddr* name,
|
||||
int* namelen) {
|
||||
int result;
|
||||
|
||||
if (handle->socket == INVALID_SOCKET) {
|
||||
return UV_EINVAL;
|
||||
}
|
||||
|
||||
result = getsockname(handle->socket, name, namelen);
|
||||
if (result != 0) {
|
||||
return uv_translate_sys_error(WSAGetLastError());
|
||||
}
|
||||
|
||||
return 0;
|
||||
return uv__getsockpeername((const uv_handle_t*) handle,
|
||||
getsockname,
|
||||
name,
|
||||
namelen,
|
||||
0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user