aboutsummaryrefslogtreecommitdiff
path: root/src/or/buffers.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2003-08-14 17:13:52 +0000
committerNick Mathewson <nickm@torproject.org>2003-08-14 17:13:52 +0000
commitcd3467bb01cb5bd98b2978fb50bdaa2f3227c980 (patch)
treed91d3689a009c3fa358bae94e883240e83fcb642 /src/or/buffers.c
parent88edae94076cc39d40a39f80b2d6ddadc88fe324 (diff)
downloadtor-cd3467bb01cb5bd98b2978fb50bdaa2f3227c980.tar
tor-cd3467bb01cb5bd98b2978fb50bdaa2f3227c980.tar.gz
Attempt to make sockets code work right on windows.
svn:r398
Diffstat (limited to 'src/or/buffers.c')
-rw-r--r--src/or/buffers.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/or/buffers.c b/src/or/buffers.c
index 4a89b260d..3ea26dbab 100644
--- a/src/or/buffers.c
+++ b/src/or/buffers.c
@@ -36,6 +36,9 @@ void buf_free(char *buf) {
int read_to_buf(int s, int at_most, char **buf, int *buflen, int *buf_datalen, int *reached_eof) {
int read_result;
+#ifdef MS_WINDOWS
+ int e;
+#endif
assert(buf && *buf && buflen && buf_datalen && reached_eof && (s>=0));
@@ -62,9 +65,15 @@ int read_to_buf(int s, int at_most, char **buf, int *buflen, int *buf_datalen, i
// log_fn(LOG_DEBUG,"reading at most %d bytes.",at_most);
read_result = read(s, *buf+*buf_datalen, at_most);
if (read_result < 0) {
- if(errno!=EAGAIN) { /* it's a real error */
+ if(!ERRNO_EAGAIN(errno)) { /* it's a real error */
return -1;
}
+#ifdef MS_WINDOWS
+ e = correct_socket_errno(s);
+ if(!ERRNO_EAGAIN(errno)) { /* no, it *is* a real error! */
+ return -1;
+ }
+#endif
return 0;
} else if (read_result == 0) {
log_fn(LOG_DEBUG,"Encountered eof");
@@ -84,6 +93,9 @@ int flush_buf(int s, char **buf, int *buflen, int *buf_flushlen, int *buf_datale
* return -1 or how many bytes remain to be flushed */
int write_result;
+#ifdef MS_WINDOWS
+ int e;
+#endif
assert(buf && *buf && buflen && buf_flushlen && buf_datalen && (s>=0) && (*buf_flushlen <= *buf_datalen));
@@ -94,9 +106,15 @@ int flush_buf(int s, char **buf, int *buflen, int *buf_flushlen, int *buf_datale
write_result = write(s, *buf, *buf_flushlen);
if (write_result < 0) {
- if(errno!=EAGAIN) { /* it's a real error */
+ if(!ERRNO_EAGAIN(errno)) { /* it's a real error */
+ return -1;
+ }
+#ifdef MS_WINDOWS
+ e = correct_socket_errno(s);
+ if(!ERRNO_EAGAIN(errno)) { /* no, it *is* a real error! */
return -1;
}
+#endif
log_fn(LOG_DEBUG,"write() would block, returning.");
return 0;
} else {