Move read/write_all_to_socket into lib/net.

This commit is contained in:
Nick Mathewson 2018-06-27 10:50:24 -04:00
parent 67135ca8e0
commit 356f59b1bd
5 changed files with 48 additions and 45 deletions

View File

@ -1094,24 +1094,6 @@ write_all_to_fd(int fd, const char *buf, size_t count)
return (ssize_t)count; return (ssize_t)count;
} }
/** Write <b>count</b> bytes from <b>buf</b> to <b>sock</b>. Return the number
* of bytes written, or -1 on error. Only use if fd is a blocking fd. */
ssize_t
write_all_to_socket(tor_socket_t fd, const char *buf, size_t count)
{
size_t written = 0;
ssize_t result;
raw_assert(count < SSIZE_MAX);
while (written != count) {
result = tor_socket_send(fd, buf+written, count-written, 0);
if (result<0)
return -1;
written += result;
}
return (ssize_t)count;
}
/** Read from <b>fd</b> to <b>buf</b>, until we get <b>count</b> bytes or /** Read from <b>fd</b> to <b>buf</b>, until we get <b>count</b> bytes or
* reach the end of the file. Return the number of bytes read, or -1 on * reach the end of the file. Return the number of bytes read, or -1 on
* error. Only use if fd is a blocking fd. */ * error. Only use if fd is a blocking fd. */
@ -1137,31 +1119,6 @@ read_all_from_fd(int fd, char *buf, size_t count)
return (ssize_t)numread; return (ssize_t)numread;
} }
/** Read from <b>sock</b> to <b>buf</b>, until we get <b>count</b> bytes or
* reach the end of the file. Return the number of bytes read, or -1 on
* error. Only use if fd is a blocking fd. */
ssize_t
read_all_from_socket(tor_socket_t sock, char *buf, size_t count)
{
size_t numread = 0;
ssize_t result;
if (count > SIZE_T_CEILING || count > SSIZE_MAX) {
errno = EINVAL;
return -1;
}
while (numread < count) {
result = tor_socket_recv(sock, buf+numread, count-numread, 0);
if (result<0)
return -1;
else if (result == 0)
break;
numread += result;
}
return (ssize_t)numread;
}
/* /*
* Filesystem operations. * Filesystem operations.
*/ */

View File

@ -118,9 +118,7 @@ int format_time_interval(char *out, size_t out_len, long interval);
/* File helpers */ /* File helpers */
ssize_t write_all_to_fd(int fd, const char *buf, size_t count); ssize_t write_all_to_fd(int fd, const char *buf, size_t count);
ssize_t write_all_to_socket(tor_socket_t fd, const char *buf, size_t count);
ssize_t read_all_from_fd(int fd, char *buf, size_t count); ssize_t read_all_from_fd(int fd, char *buf, size_t count);
ssize_t read_all_from_socket(tor_socket_t fd, char *buf, size_t count);
#define write_all(fd, buf, count, isSock) \ #define write_all(fd, buf, count, isSock) \
((isSock) ? write_all_to_socket((fd), (buf), (count)) \ ((isSock) ? write_all_to_socket((fd), (buf), (count)) \

View File

@ -5,6 +5,7 @@ ht.h
lib/cc/*.h lib/cc/*.h
lib/container/*.h lib/container/*.h
lib/ctime/*.h lib/ctime/*.h
lib/err/*.h
lib/lock/*.h lib/lock/*.h
lib/log/*.h lib/log/*.h
lib/net/*.h lib/net/*.h

View File

@ -7,6 +7,7 @@
#include "lib/net/socket.h" #include "lib/net/socket.h"
#include "lib/net/address.h" #include "lib/net/address.h"
#include "lib/cc/compat_compiler.h" #include "lib/cc/compat_compiler.h"
#include "lib/err/torerr.h"
#include "lib/lock/compat_mutex.h" #include "lib/lock/compat_mutex.h"
#include "lib/log/torlog.h" #include "lib/log/torlog.h"
#include "lib/log/util_bug.h" #include "lib/log/util_bug.h"
@ -647,3 +648,46 @@ set_socket_nonblocking(tor_socket_t sock)
return 0; return 0;
} }
/** Read from <b>sock</b> to <b>buf</b>, until we get <b>count</b> bytes or
* reach the end of the file. Return the number of bytes read, or -1 on
* error. Only use if fd is a blocking fd. */
ssize_t
read_all_from_socket(tor_socket_t sock, char *buf, size_t count)
{
size_t numread = 0;
ssize_t result;
if (count > SIZE_T_CEILING || count > SSIZE_MAX) {
errno = EINVAL;
return -1;
}
while (numread < count) {
result = tor_socket_recv(sock, buf+numread, count-numread, 0);
if (result<0)
return -1;
else if (result == 0)
break;
numread += result;
}
return (ssize_t)numread;
}
/** Write <b>count</b> bytes from <b>buf</b> to <b>sock</b>. Return the number
* of bytes written, or -1 on error. Only use if fd is a blocking fd. */
ssize_t
write_all_to_socket(tor_socket_t fd, const char *buf, size_t count)
{
size_t written = 0;
ssize_t result;
raw_assert(count < SSIZE_MAX);
while (written != count) {
result = tor_socket_send(fd, buf+written, count-written, 0);
if (result<0)
return -1;
written += result;
}
return (ssize_t)count;
}

View File

@ -52,6 +52,9 @@ int network_init(void);
int get_max_sockets(void); int get_max_sockets(void);
void set_max_sockets(int); void set_max_sockets(int);
ssize_t write_all_to_socket(tor_socket_t fd, const char *buf, size_t count);
ssize_t read_all_from_socket(tor_socket_t fd, char *buf, size_t count);
/* For stupid historical reasons, windows sockets have an independent /* For stupid historical reasons, windows sockets have an independent
* set of errnos, and an independent way to get them. Also, you can't * set of errnos, and an independent way to get them. Also, you can't
* always believe WSAEWOULDBLOCK. Use the macros below to compare * always believe WSAEWOULDBLOCK. Use the macros below to compare