Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Matt's executability test with a few tweaks (e.g. to avoid using
[rsync/rsync.git]
/
io.c
diff --git
a/io.c
b/io.c
index
f8b908e
..
6dafa2a
100644
(file)
--- a/
io.c
+++ b/
io.c
@@
-49,6
+49,7
@@
extern int am_daemon;
extern int am_sender;
extern int am_generator;
extern int eol_nulls;
extern int am_sender;
extern int am_generator;
extern int eol_nulls;
+extern int read_batch;
extern int csum_length;
extern int checksum_seed;
extern int protocol_version;
extern int csum_length;
extern int checksum_seed;
extern int protocol_version;
@@
-59,7
+60,6
@@
extern struct stats stats;
extern struct file_list *the_file_list;
const char phase_unknown[] = "unknown";
extern struct file_list *the_file_list;
const char phase_unknown[] = "unknown";
-int select_timeout = SELECT_TIMEOUT;
int ignore_timeout = 0;
int batch_fd = -1;
int batch_gen_fd = -1;
int ignore_timeout = 0;
int batch_fd = -1;
int batch_gen_fd = -1;
@@
-90,7
+90,8
@@
int sock_f_out = -1;
static int io_multiplexing_out;
static int io_multiplexing_in;
static int io_multiplexing_out;
static int io_multiplexing_in;
-static time_t last_io;
+static time_t last_io_in;
+static time_t last_io_out;
static int no_flush;
static int write_batch_monitor_in = -1;
static int no_flush;
static int write_batch_monitor_in = -1;
@@
-103,6
+104,7
@@
static char *io_filesfrom_bp;
static char io_filesfrom_lastchar;
static int io_filesfrom_buflen;
static size_t contiguous_write_len = 0;
static char io_filesfrom_lastchar;
static int io_filesfrom_buflen;
static size_t contiguous_write_len = 0;
+static int select_timeout = SELECT_TIMEOUT;
static void read_loop(int fd, char *buf, size_t len);
static void read_loop(int fd, char *buf, size_t len);
@@
-117,14
+119,17
@@
struct flist_ndx_list {
static struct flist_ndx_list redo_list, hlink_list;
static struct flist_ndx_list redo_list, hlink_list;
-struct msg_list {
- struct msg_list *next;
+struct msg_list
_item
{
+ struct msg_list
_item
*next;
char *buf;
int len;
};
char *buf;
int len;
};
-static struct msg_list *msg_list_head;
-static struct msg_list *msg_list_tail;
+struct msg_list {
+ struct msg_list_item *head, *tail;
+};
+
+static struct msg_list msg_list;
static void flist_ndx_push(struct flist_ndx_list *lp, int ndx)
{
static void flist_ndx_push(struct flist_ndx_list *lp, int ndx)
{
@@
-166,17
+171,17
@@
static void check_timeout(void)
if (!io_timeout || ignore_timeout)
return;
if (!io_timeout || ignore_timeout)
return;
- if (!last_io) {
- last_io = time(NULL);
+ if (!last_io
_in
) {
+ last_io
_in
= time(NULL);
return;
}
t = time(NULL);
return;
}
t = time(NULL);
- if (t - last_io >= io_timeout) {
+ if (t - last_io
_in
>= io_timeout) {
if (!am_server && !am_daemon) {
rprintf(FERROR, "io timeout after %d seconds -- exiting\n",
if (!am_server && !am_daemon) {
rprintf(FERROR, "io timeout after %d seconds -- exiting\n",
- (int)(t-last_io));
+ (int)(t-last_io
_in
));
}
exit_cleanup(RERR_TIMEOUT);
}
}
exit_cleanup(RERR_TIMEOUT);
}
@@
-190,6
+195,18
@@
void io_set_sock_fds(int f_in, int f_out)
sock_f_out = f_out;
}
sock_f_out = f_out;
}
+void set_io_timeout(int secs)
+{
+ io_timeout = secs;
+
+ if (!io_timeout || io_timeout > SELECT_TIMEOUT)
+ select_timeout = SELECT_TIMEOUT;
+ else
+ select_timeout = io_timeout;
+
+ allowed_lull = read_batch ? 0 : (io_timeout + 1) / 2;
+}
+
/* Setup the fd used to receive MSG_* messages. Only needed during the
* early stages of being a local sender (up through the sending of the
* file list) or when we're the generator (to fetch the messages from
/* Setup the fd used to receive MSG_* messages. Only needed during the
* early stages of being a local sender (up through the sending of the
* file list) or when we're the generator (to fetch the messages from
@@
-210,9
+227,9
@@
void set_msg_fd_out(int fd)
/* Add a message to the pending MSG_* list. */
static void msg_list_add(int code, char *buf, int len)
{
/* Add a message to the pending MSG_* list. */
static void msg_list_add(int code, char *buf, int len)
{
- struct msg_list *ml;
+ struct msg_list
_item
*ml;
- if (!(ml = new(struct msg_list)))
+ if (!(ml = new(struct msg_list
_item
)))
out_of_memory("msg_list_add");
ml->next = NULL;
if (!(ml->buf = new_array(char, len+4)))
out_of_memory("msg_list_add");
ml->next = NULL;
if (!(ml->buf = new_array(char, len+4)))
@@
-220,21
+237,11
@@
static void msg_list_add(int code, char *buf, int len)
SIVAL(ml->buf, 0, ((code+MPLEX_BASE)<<24) | len);
memcpy(ml->buf+4, buf, len);
ml->len = len+4;
SIVAL(ml->buf, 0, ((code+MPLEX_BASE)<<24) | len);
memcpy(ml->buf+4, buf, len);
ml->len = len+4;
- if (msg_list
_
tail)
- msg_list
_
tail->next = ml;
+ if (msg_list
.
tail)
+ msg_list
.
tail->next = ml;
else
else
- msg_list_head = ml;
- msg_list_tail = ml;
-}
-
-void send_msg(enum msgcode code, char *buf, int len)
-{
- if (msg_fd_out < 0) {
- io_multiplex_write(code, buf, len);
- return;
- }
- msg_list_add(code, buf, len);
- msg_list_push(NORMAL_FLUSH);
+ msg_list.head = ml;
+ msg_list.tail = ml;
}
/* Read a message from the MSG_* fd and handle it. This is called either
}
/* Read a message from the MSG_* fd and handle it. This is called either
@@
-293,6
+300,13
@@
static void read_msg_fd(void)
if (preserve_hard_links)
flist_ndx_push(&hlink_list, IVAL(buf,0));
break;
if (preserve_hard_links)
flist_ndx_push(&hlink_list, IVAL(buf,0));
break;
+ case MSG_SOCKERR:
+ if (!am_generator) {
+ rprintf(FERROR, "invalid message %d:%d\n", tag, len);
+ exit_cleanup(RERR_STREAMIO);
+ }
+ close_multiplexing_out();
+ /* FALL THROUGH */
case MSG_INFO:
case MSG_ERROR:
case MSG_LOG:
case MSG_INFO:
case MSG_ERROR:
case MSG_LOG:
@@
-316,7
+330,7
@@
static void read_msg_fd(void)
/* Try to push messages off the list onto the wire. If we leave with more
* to do, return 0. On error, return -1. If everything flushed, return 1.
* This is only active in the receiver. */
/* Try to push messages off the list onto the wire. If we leave with more
* to do, return 0. On error, return -1. If everything flushed, return 1.
* This is only active in the receiver. */
-
int msg_list_p
ush(int flush_it_all)
+
static int msg_list_fl
ush(int flush_it_all)
{
static int written = 0;
struct timeval tv;
{
static int written = 0;
struct timeval tv;
@@
-325,8
+339,8
@@
int msg_list_push(int flush_it_all)
if (msg_fd_out < 0)
return -1;
if (msg_fd_out < 0)
return -1;
- while (msg_list
_
head) {
- struct msg_list
*ml = msg_list_
head;
+ while (msg_list
.
head) {
+ struct msg_list
_item *ml = msg_list.
head;
int n = write(msg_fd_out, ml->buf + written, ml->len - written);
if (n < 0) {
if (errno == EINTR)
int n = write(msg_fd_out, ml->buf + written, ml->len - written);
if (n < 0) {
if (errno == EINTR)
@@
-343,9
+357,9
@@
int msg_list_push(int flush_it_all)
check_timeout();
} else if ((written += n) == ml->len) {
free(ml->buf);
check_timeout();
} else if ((written += n) == ml->len) {
free(ml->buf);
- msg_list
_
head = ml->next;
- if (!msg_list
_
head)
- msg_list
_
tail = NULL;
+ msg_list
.
head = ml->next;
+ if (!msg_list
.
head)
+ msg_list
.
tail = NULL;
free(ml);
written = 0;
}
free(ml);
written = 0;
}
@@
-353,6
+367,16
@@
int msg_list_push(int flush_it_all)
return 1;
}
return 1;
}
+void send_msg(enum msgcode code, char *buf, int len)
+{
+ if (msg_fd_out < 0) {
+ io_multiplex_write(code, buf, len);
+ return;
+ }
+ msg_list_add(code, buf, len);
+ msg_list_flush(NORMAL_FLUSH);
+}
+
int get_redo_num(int itemizing, enum logcode code)
{
while (1) {
int get_redo_num(int itemizing, enum logcode code)
{
while (1) {
@@
-420,7
+444,6
@@
static void whine_about_eof(int fd)
exit_cleanup(RERR_STREAMIO);
}
exit_cleanup(RERR_STREAMIO);
}
-
/**
* Read from a socket with I/O timeout. return the number of bytes
* read. If no bytes can be read then exit, never return a number <= 0.
/**
* Read from a socket with I/O timeout. return the number of bytes
* read. If no bytes can be read then exit, never return a number <= 0.
@@
-434,11
+457,11
@@
static void whine_about_eof(int fd)
*/
static int read_timeout(int fd, char *buf, size_t len)
{
*/
static int read_timeout(int fd, char *buf, size_t len)
{
- int n,
re
t = 0;
+ int n,
cn
t = 0;
io_flush(NORMAL_FLUSH);
io_flush(NORMAL_FLUSH);
- while (
re
t == 0) {
+ while (
cn
t == 0) {
/* until we manage to read *something* */
fd_set r_fds, w_fds;
struct timeval tv;
/* until we manage to read *something* */
fd_set r_fds, w_fds;
struct timeval tv;
@@
-448,7
+471,7
@@
static int read_timeout(int fd, char *buf, size_t len)
FD_ZERO(&r_fds);
FD_ZERO(&w_fds);
FD_SET(fd, &r_fds);
FD_ZERO(&r_fds);
FD_ZERO(&w_fds);
FD_SET(fd, &r_fds);
- if (msg_list
_
head) {
+ if (msg_list
.
head) {
FD_SET(msg_fd_out, &w_fds);
if (msg_fd_out > maxfd)
maxfd = msg_fd_out;
FD_SET(msg_fd_out, &w_fds);
if (msg_fd_out > maxfd)
maxfd = msg_fd_out;
@@
-485,8
+508,8
@@
static int read_timeout(int fd, char *buf, size_t len)
continue;
}
continue;
}
- if (msg_list
_
head && FD_ISSET(msg_fd_out, &w_fds))
- msg_list_
p
ush(NORMAL_FLUSH);
+ if (msg_list
.
head && FD_ISSET(msg_fd_out, &w_fds))
+ msg_list_
fl
ush(NORMAL_FLUSH);
if (io_filesfrom_f_out >= 0) {
if (io_filesfrom_buflen) {
if (io_filesfrom_f_out >= 0) {
if (io_filesfrom_buflen) {
@@
-564,21
+587,23
@@
static int read_timeout(int fd, char *buf, size_t len)
continue;
/* Don't write errors on a dead socket. */
continue;
/* Don't write errors on a dead socket. */
- if (fd == sock_f_in)
+ if (fd == sock_f_in)
{
close_multiplexing_out();
close_multiplexing_out();
- rsyserr(FERROR, errno, "read error");
+ rsyserr(FSOCKERR, errno, "read error");
+ } else
+ rsyserr(FERROR, errno, "read error");
exit_cleanup(RERR_STREAMIO);
}
buf += n;
len -= n;
exit_cleanup(RERR_STREAMIO);
}
buf += n;
len -= n;
-
re
t += n;
+
cn
t += n;
- if (fd == sock_f_in &&
(io_timeout || am_generator)
)
- last_io = time(NULL);
+ if (fd == sock_f_in &&
io_timeout
)
+ last_io
_in
= time(NULL);
}
}
- return
re
t;
+ return
cn
t;
}
/**
}
/**
@@
-628,7
+653,6
@@
int read_filesfrom_line(int fd, char *fname)
return s - fname;
}
return s - fname;
}
-
static char *iobuf_out;
static int iobuf_out_cnt;
static char *iobuf_out;
static int iobuf_out_cnt;
@@
-641,7
+665,6
@@
void io_start_buffering_out(void)
iobuf_out_cnt = 0;
}
iobuf_out_cnt = 0;
}
-
static char *iobuf_in;
static size_t iobuf_in_siz;
static char *iobuf_in;
static size_t iobuf_in_siz;
@@
-654,7
+677,6
@@
void io_start_buffering_in(void)
out_of_memory("io_start_buffering_in");
}
out_of_memory("io_start_buffering_in");
}
-
void io_end_buffering(void)
{
io_flush(NORMAL_FLUSH);
void io_end_buffering(void)
{
io_flush(NORMAL_FLUSH);
@@
-664,17
+686,15
@@
void io_end_buffering(void)
}
}
}
}
-
void maybe_flush_socket(void)
{
void maybe_flush_socket(void)
{
- if (iobuf_out && iobuf_out_cnt && time(NULL) - last_io >= 5)
+ if (iobuf_out && iobuf_out_cnt && time(NULL) - last_io
_out
>= 5)
io_flush(NORMAL_FLUSH);
}
io_flush(NORMAL_FLUSH);
}
-
void maybe_send_keepalive(void)
{
void maybe_send_keepalive(void)
{
- if (time(NULL) - last_io >= allowed_lull) {
+ if (time(NULL) - last_io
_out
>= allowed_lull) {
if (!iobuf_out || !iobuf_out_cnt) {
if (protocol_version < 29)
return; /* there's nothing we can do */
if (!iobuf_out || !iobuf_out_cnt) {
if (protocol_version < 29)
return; /* there's nothing we can do */
@@
-686,7
+706,6
@@
void maybe_send_keepalive(void)
}
}
}
}
-
/**
* Continue trying to read len bytes - don't return until len has been
* read.
/**
* Continue trying to read len bytes - don't return until len has been
* read.
@@
-701,7
+720,6
@@
static void read_loop(int fd, char *buf, size_t len)
}
}
}
}
-
/**
* Read from the file descriptor handling multiplexing - return number
* of bytes read.
/**
* Read from the file descriptor handling multiplexing - return number
* of bytes read.
@@
-713,12
+731,8
@@
static int readfd_unbuffered(int fd, char *buf, size_t len)
static size_t remaining;
static size_t iobuf_in_ndx;
size_t msg_bytes;
static size_t remaining;
static size_t iobuf_in_ndx;
size_t msg_bytes;
- int tag, ret = 0;
-#if MAXPATHLEN < 4096
- char line[4096+1024];
-#else
- char line[MAXPATHLEN+1024];
-#endif
+ int tag, cnt = 0;
+ char line[BIGPATHBUFLEN];
if (!iobuf_in || fd != sock_f_in)
return read_timeout(fd, buf, len);
if (!iobuf_in || fd != sock_f_in)
return read_timeout(fd, buf, len);
@@
-728,13
+742,13
@@
static int readfd_unbuffered(int fd, char *buf, size_t len)
iobuf_in_ndx = 0;
}
iobuf_in_ndx = 0;
}
- while (
re
t == 0) {
+ while (
cn
t == 0) {
if (remaining) {
len = MIN(len, remaining);
memcpy(buf, iobuf_in + iobuf_in_ndx, len);
iobuf_in_ndx += len;
remaining -= len;
if (remaining) {
len = MIN(len, remaining);
memcpy(buf, iobuf_in + iobuf_in_ndx, len);
iobuf_in_ndx += len;
remaining -= len;
-
re
t = len;
+
cn
t = len;
break;
}
break;
}
@@
-798,11
+812,9
@@
static int readfd_unbuffered(int fd, char *buf, size_t len)
if (remaining == 0)
io_flush(NORMAL_FLUSH);
if (remaining == 0)
io_flush(NORMAL_FLUSH);
- return
re
t;
+ return
cn
t;
}
}
-
-
/**
* Do a buffered read from @p fd. Don't return until all @p n bytes
* have been read. If all @p n can't be read then exit with an
/**
* Do a buffered read from @p fd. Don't return until all @p n bytes
* have been read. If all @p n can't be read then exit with an
@@
-810,12
+822,12
@@
static int readfd_unbuffered(int fd, char *buf, size_t len)
**/
static void readfd(int fd, char *buffer, size_t N)
{
**/
static void readfd(int fd, char *buffer, size_t N)
{
- int
re
t;
+ int
cn
t;
size_t total = 0;
while (total < N) {
size_t total = 0;
while (total < N) {
-
re
t = readfd_unbuffered(fd, buffer + total, N-total);
- total +=
re
t;
+
cn
t = readfd_unbuffered(fd, buffer + total, N-total);
+ total +=
cn
t;
}
if (fd == write_batch_monitor_in) {
}
if (fd == write_batch_monitor_in) {
@@
-827,7
+839,6
@@
static void readfd(int fd, char *buffer, size_t N)
stats.total_read += total;
}
stats.total_read += total;
}
-
int read_shortint(int f)
{
uchar b[2];
int read_shortint(int f)
{
uchar b[2];
@@
-835,37
+846,36
@@
int read_shortint(int f)
return (b[1] << 8) + b[0];
}
return (b[1] << 8) + b[0];
}
-
int32 read_int(int f)
{
char b[4];
int32 read_int(int f)
{
char b[4];
- int32
ret
;
+ int32
num
;
readfd(f,b,4);
readfd(f,b,4);
-
ret
= IVAL(b,0);
- if (
ret
== (int32)0xffffffff)
+
num
= IVAL(b,0);
+ if (
num
== (int32)0xffffffff)
return -1;
return -1;
- return
ret
;
+ return
num
;
}
int64 read_longint(int f)
{
}
int64 read_longint(int f)
{
- int64
ret
;
+ int64
num
;
char b[8];
char b[8];
-
ret
= read_int(f);
+
num
= read_int(f);
- if ((int32)
ret
!= (int32)0xffffffff)
- return
ret
;
+ if ((int32)
num
!= (int32)0xffffffff)
+ return
num
;
#if SIZEOF_INT64 < 8
rprintf(FERROR, "Integer overflow: attempted 64-bit offset\n");
exit_cleanup(RERR_UNSUPPORTED);
#else
readfd(f,b,8);
#if SIZEOF_INT64 < 8
rprintf(FERROR, "Integer overflow: attempted 64-bit offset\n");
exit_cleanup(RERR_UNSUPPORTED);
#else
readfd(f,b,8);
-
ret
= IVAL(b,0) | (((int64)IVAL(b,4))<<32);
+
num
= IVAL(b,0) | (((int64)IVAL(b,4))<<32);
#endif
#endif
- return
ret
;
+ return
num
;
}
void read_buf(int f,char *buf,size_t len)
}
void read_buf(int f,char *buf,size_t len)
@@
-947,7
+957,6
@@
void write_sum_head(int f, struct sum_struct *sum)
write_int(f, sum->remainder);
}
write_int(f, sum->remainder);
}
-
/**
* Sleep after writing to limit I/O bandwidth usage.
*
/**
* Sleep after writing to limit I/O bandwidth usage.
*
@@
-1003,9
+1012,8
@@
static void sleep_for_bwlimit(int bytes_written)
total_written = (sleep_usec - elapsed_usec) * bwlimit / (ONE_SEC/1024);
}
total_written = (sleep_usec - elapsed_usec) * bwlimit / (ONE_SEC/1024);
}
-
/* Write len bytes to the file descriptor fd, looping as necessary to get
/* Write len bytes to the file descriptor fd, looping as necessary to get
- * the job done and also (in certain circumstnces) reading any data on
+ * the job done and also (in certain circumst
a
nces) reading any data on
* msg_fd_in to avoid deadlock.
*
* This function underlies the multiplexing system. The body of the
* msg_fd_in to avoid deadlock.
*
* This function underlies the multiplexing system. The body of the
@@
-1014,7
+1022,7
@@
static void writefd_unbuffered(int fd,char *buf,size_t len)
{
size_t n, total = 0;
fd_set w_fds, r_fds;
{
size_t n, total = 0;
fd_set w_fds, r_fds;
- int maxfd, count,
re
t, using_r_fds;
+ int maxfd, count,
cn
t, using_r_fds;
struct timeval tv;
no_flush++;
struct timeval tv;
no_flush++;
@@
-1056,10
+1064,10
@@
static void writefd_unbuffered(int fd,char *buf,size_t len)
n = len - total;
if (bwlimit && n > bwlimit_writemax)
n = bwlimit_writemax;
n = len - total;
if (bwlimit && n > bwlimit_writemax)
n = bwlimit_writemax;
-
re
t = write(fd, buf + total, n);
+
cn
t = write(fd, buf + total, n);
- if (
re
t <= 0) {
- if (
re
t < 0) {
+ if (
cn
t <= 0) {
+ if (
cn
t < 0) {
if (errno == EINTR)
continue;
if (errno == EWOULDBLOCK || errno == EAGAIN) {
if (errno == EINTR)
continue;
if (errno == EWOULDBLOCK || errno == EAGAIN) {
@@
-1077,7
+1085,7
@@
static void writefd_unbuffered(int fd,char *buf,size_t len)
/* If the other side is sending us error messages, try
* to grab any messages they sent before they died. */
while (fd == sock_f_out && io_multiplexing_in) {
/* If the other side is sending us error messages, try
* to grab any messages they sent before they died. */
while (fd == sock_f_out && io_multiplexing_in) {
-
io_timeout = select_timeout = 30
;
+
set_io_timeout(30)
;
ignore_timeout = 0;
readfd_unbuffered(sock_f_in, io_filesfrom_buf,
sizeof io_filesfrom_buf);
ignore_timeout = 0;
readfd_unbuffered(sock_f_in, io_filesfrom_buf,
sizeof io_filesfrom_buf);
@@
-1085,26
+1093,25
@@
static void writefd_unbuffered(int fd,char *buf,size_t len)
exit_cleanup(RERR_STREAMIO);
}
exit_cleanup(RERR_STREAMIO);
}
- total +=
re
t;
+ total +=
cn
t;
if (fd == sock_f_out) {
if (io_timeout || am_generator)
if (fd == sock_f_out) {
if (io_timeout || am_generator)
- last_io = time(NULL);
- sleep_for_bwlimit(
re
t);
+ last_io
_out
= time(NULL);
+ sleep_for_bwlimit(
cn
t);
}
}
no_flush--;
}
}
}
no_flush--;
}
-
/**
* Write an message to a multiplexed stream. If this fails then rsync
* exits.
**/
static void mplex_write(enum msgcode code, char *buf, size_t len)
{
/**
* Write an message to a multiplexed stream. If this fails then rsync
* exits.
**/
static void mplex_write(enum msgcode code, char *buf, size_t len)
{
- char buffer[
4096
];
+ char buffer[
BIGPATHBUFLEN
];
size_t n = len;
SIVAL(buffer, 0, ((MPLEX_BASE + (int)code)<<24) + len);
size_t n = len;
SIVAL(buffer, 0, ((MPLEX_BASE + (int)code)<<24) + len);
@@
-1132,10
+1139,9
@@
static void mplex_write(enum msgcode code, char *buf, size_t len)
contiguous_write_len = 0;
}
contiguous_write_len = 0;
}
-
void io_flush(int flush_it_all)
{
void io_flush(int flush_it_all)
{
- msg_list_
p
ush(flush_it_all);
+ msg_list_
fl
ush(flush_it_all);
if (!iobuf_out_cnt || no_flush)
return;
if (!iobuf_out_cnt || no_flush)
return;
@@
-1147,7
+1153,6
@@
void io_flush(int flush_it_all)
iobuf_out_cnt = 0;
}
iobuf_out_cnt = 0;
}
-
static void writefd(int fd,char *buf,size_t len)
{
if (fd == msg_fd_out) {
static void writefd(int fd,char *buf,size_t len)
{
if (fd == msg_fd_out) {
@@
-1182,7
+1187,6
@@
static void writefd(int fd,char *buf,size_t len)
}
}
}
}
-
void write_shortint(int f, int x)
{
uchar b[2];
void write_shortint(int f, int x)
{
uchar b[2];
@@
-1191,7
+1195,6
@@
void write_shortint(int f, int x)
writefd(f, (char *)b, 2);
}
writefd(f, (char *)b, 2);
}
-
void write_int(int f,int32 x)
{
char b[4];
void write_int(int f,int32 x)
{
char b[4];
@@
-1199,7
+1202,6
@@
void write_int(int f,int32 x)
writefd(f,b,4);
}
writefd(f,b,4);
}
-
void write_int_named(int f, int32 x, const char *phase)
{
io_write_phase = phase;
void write_int_named(int f, int32 x, const char *phase)
{
io_write_phase = phase;
@@
-1207,7
+1209,6
@@
void write_int_named(int f, int32 x, const char *phase)
io_write_phase = phase_unknown;
}
io_write_phase = phase_unknown;
}
-
/*
* Note: int64 may actually be a 32-bit type if ./configure couldn't find any
* 64-bit types on this platform.
/*
* Note: int64 may actually be a 32-bit type if ./configure couldn't find any
* 64-bit types on this platform.
@@
-1269,7
+1270,6
@@
void write_vstring(int f, char *str, int len)
writefd(f, str, len);
}
writefd(f, str, len);
}
-
/**
* Read a line of up to @p maxlen characters into @p buf (not counting
* the trailing null). Strips the (required) trailing newline and all
/**
* Read a line of up to @p maxlen characters into @p buf (not counting
* the trailing null). Strips the (required) trailing newline and all
@@
-1295,11
+1295,10
@@
int read_line(int f, char *buf, size_t maxlen)
return maxlen > 0;
}
return maxlen > 0;
}
-
void io_printf(int fd, const char *format, ...)
{
va_list ap;
void io_printf(int fd, const char *format, ...)
{
va_list ap;
- char buf[
1024
];
+ char buf[
BIGPATHBUFLEN
];
int len;
va_start(ap, format);
int len;
va_start(ap, format);
@@
-1309,10
+1308,14
@@
void io_printf(int fd, const char *format, ...)
if (len < 0)
exit_cleanup(RERR_STREAMIO);
if (len < 0)
exit_cleanup(RERR_STREAMIO);
+ if (len > (int)sizeof buf) {
+ rprintf(FERROR, "io_printf() was too long for the buffer.\n");
+ exit_cleanup(RERR_STREAMIO);
+ }
+
write_sbuf(fd, buf);
}
write_sbuf(fd, buf);
}
-
/** Setup for multiplexing a MSG_* stream with the data stream. */
void io_start_multiplex_out(void)
{
/** Setup for multiplexing a MSG_* stream with the data stream. */
void io_start_multiplex_out(void)
{