version 1.3, 2019/02/11 19:18:36 |
version 1.4, 2019/02/11 21:41:22 |
|
|
|
|
*sz = 0; |
*sz = 0; |
|
|
if (0 == bsz) |
if (bsz == 0) |
return 1; |
return 1; |
|
|
pfd.fd = fd; |
pfd.fd = fd; |
|
|
if (!c) { |
if (!c) { |
ERRX1(sess, "io_write_nonblocking"); |
ERRX1(sess, "io_write_nonblocking"); |
return 0; |
return 0; |
} else if (0 == wsz) { |
} else if (wsz == 0) { |
ERRX(sess, "io_write_nonblocking: short write"); |
ERRX(sess, "io_write_nonblocking: short write"); |
return 0; |
return 0; |
} |
} |
|
|
|
|
*sz = 0; |
*sz = 0; |
|
|
if (0 == bsz) |
if (bsz == 0) |
return 1; |
return 1; |
|
|
pfd.fd = fd; |
pfd.fd = fd; |
|
|
if ((rsz = read(fd, buf, bsz)) < 0) { |
if ((rsz = read(fd, buf, bsz)) < 0) { |
ERR(sess, "read"); |
ERR(sess, "read"); |
return 0; |
return 0; |
} else if (0 == rsz) { |
} else if (rsz == 0) { |
ERRX(sess, "unexpected end of file"); |
ERRX(sess, "unexpected end of file"); |
return 0; |
return 0; |
} |
} |
|
|
if (!c) { |
if (!c) { |
ERRX1(sess, "io_read_nonblocking"); |
ERRX1(sess, "io_read_nonblocking"); |
return 0; |
return 0; |
} else if (0 == rsz) { |
} else if (rsz == 0) { |
ERRX(sess, "io_read_nonblocking: short read"); |
ERRX(sess, "io_read_nonblocking: short read"); |
return 0; |
return 0; |
} |
} |
|
|
tag = le32toh(tagbuf); |
tag = le32toh(tagbuf); |
sess->mplex_read_remain = tag & 0xFFFFFF; |
sess->mplex_read_remain = tag & 0xFFFFFF; |
tag >>= 24; |
tag >>= 24; |
if (7 == tag) |
if (tag == 7) |
return 1; |
return 1; |
|
|
tag -= 7; |
tag -= 7; |
|
|
if (sess->mplex_read_remain > sizeof(mpbuf)) { |
if (sess->mplex_read_remain > sizeof(mpbuf)) { |
ERRX(sess, "multiplex buffer overflow"); |
ERRX(sess, "multiplex buffer overflow"); |
return 0; |
return 0; |
} else if (0 == sess->mplex_read_remain) |
} else if (sess->mplex_read_remain == 0) |
return 1; |
return 1; |
|
|
if (!io_read_blocking(sess, fd, |
if (!io_read_blocking(sess, fd, |
|
|
ERRX1(sess, "io_read_blocking"); |
ERRX1(sess, "io_read_blocking"); |
return 0; |
return 0; |
} |
} |
if ('\n' == mpbuf[sess->mplex_read_remain - 1]) |
if (mpbuf[sess->mplex_read_remain - 1] == '\n') |
mpbuf[--sess->mplex_read_remain] = '\0'; |
mpbuf[--sess->mplex_read_remain] = '\0'; |
|
|
/* |
/* |
|
|
* This means that we should exit. |
* This means that we should exit. |
*/ |
*/ |
|
|
if (1 == tag) { |
if (tag == 1) { |
ERRX1(sess, "error from remote host"); |
ERRX1(sess, "error from remote host"); |
return 0; |
return 0; |
} |
} |
|
|
/* If we're not multiplexing, read directly. */ |
/* If we're not multiplexing, read directly. */ |
|
|
if (!sess->mplex_reads) { |
if (!sess->mplex_reads) { |
assert(0 == sess->mplex_read_remain); |
assert(sess->mplex_read_remain == 0); |
c = io_read_blocking(sess, fd, buf, sz); |
c = io_read_blocking(sess, fd, buf, sz); |
sess->total_read += sz; |
sess->total_read += sz; |
return c; |
return c; |
|
|
continue; |
continue; |
} |
} |
|
|
assert(0 == sess->mplex_read_remain); |
assert(sess->mplex_read_remain == 0); |
if (!io_read_flush(sess, fd)) { |
if (!io_read_flush(sess, fd)) { |
ERRX1(sess, "io_read_flush"); |
ERRX1(sess, "io_read_flush"); |
return 0; |
return 0; |
|
|
{ |
{ |
int32_t nv = htole32(val); |
int32_t nv = htole32(val); |
|
|
io_buffer_buf(sess, buf, bufpos, |
io_buffer_buf(sess, buf, bufpos, buflen, &nv, sizeof(int32_t)); |
buflen, &nv, sizeof(int32_t)); |
|
} |
} |
|
|
int |
int |
|
|
if (!io_read_int(sess, fd, &sval)) { |
if (!io_read_int(sess, fd, &sval)) { |
ERRX(sess, "io_read_int"); |
ERRX(sess, "io_read_int"); |
return 0; |
return 0; |
} else if (INT32_MAX != sval) { |
} else if (sval != INT32_MAX) { |
*val = sval; |
*val = sval; |
return 1; |
return 1; |
} |
} |