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
Print a warning message in the version if the platform cannot support 32-bit ints
[rsync/rsync.git]
/
io.c
diff --git
a/io.c
b/io.c
index
fbaf6a3
..
253344b
100644
(file)
--- a/
io.c
+++ b/
io.c
@@
-1,5
+1,6
@@
-/*
- Copyright (C) Andrew Tridgell 1996
+/* -*- c-file-style: "linux" -*-
+
+ Copyright (C) 1996-2000 by Andrew Tridgell
Copyright (C) Paul Mackerras 1996
This program is free software; you can redistribute it and/or modify
Copyright (C) Paul Mackerras 1996
This program is free software; you can redistribute it and/or modify
@@
-27,6
+28,8
@@
/* if no timeout is specified then use a 60 second select timeout */
#define SELECT_TIMEOUT 60
/* if no timeout is specified then use a 60 second select timeout */
#define SELECT_TIMEOUT 60
+extern int bwlimit;
+
static int io_multiplexing_out;
static int io_multiplexing_in;
static int multiplex_in_fd;
static int io_multiplexing_out;
static int io_multiplexing_in;
static int multiplex_in_fd;
@@
-37,16
+40,10
@@
extern int verbose;
extern int io_timeout;
extern struct stats stats;
extern int io_timeout;
extern struct stats stats;
-static int buffer_f_in = -1;
static int io_error_fd = -1;
static void read_loop(int fd, char *buf, int len);
static int io_error_fd = -1;
static void read_loop(int fd, char *buf, int len);
-void setup_readbuffer(int f_in)
-{
- buffer_f_in = f_in;
-}
-
static void check_timeout(void)
{
extern int am_server, am_daemon;
static void check_timeout(void)
{
extern int am_server, am_daemon;
@@
-321,11
+318,7
@@
unsigned char read_byte(int f)
return c;
}
return c;
}
-
-
-/* write len bytes to fd, possibly reading from buffer_f_in if set
- in order to unclog the pipe. don't return until all len
- bytes have been written */
+/* write len bytes to fd */
static void writefd_unbuffered(int fd,char *buf,int len)
{
int total = 0;
static void writefd_unbuffered(int fd,char *buf,int len)
{
int total = 0;
@@
-380,6
+373,7
@@
static void writefd_unbuffered(int fd,char *buf,int len)
if (ret == -1 &&
(errno == EWOULDBLOCK || errno == EAGAIN)) {
if (ret == -1 &&
(errno == EWOULDBLOCK || errno == EAGAIN)) {
+ msleep(1);
continue;
}
continue;
}
@@
-388,6
+382,19
@@
static void writefd_unbuffered(int fd,char *buf,int len)
exit_cleanup(RERR_STREAMIO);
}
exit_cleanup(RERR_STREAMIO);
}
+ /* Sleep after writing to limit I/O bandwidth */
+ if (bwlimit)
+ {
+ tv.tv_sec = 0;
+ tv.tv_usec = ret * 1000 / bwlimit;
+ while (tv.tv_usec > 1000000)
+ {
+ tv.tv_sec++;
+ tv.tv_usec -= 1000000;
+ }
+ select(0, NULL, NULL, NULL, &tv);
+ }
+
total += ret;
if (io_timeout)
total += ret;
if (io_timeout)
@@
-449,6
+456,8
@@
void io_flush(void)
io_buffer_count = 0;
}
io_buffer_count = 0;
}
+
+/* XXX: fd is ignored, which seems a little strange. */
void io_end_buffering(int fd)
{
io_flush();
void io_end_buffering(int fd)
{
io_flush();
@@
-458,6
+467,17
@@
void io_end_buffering(int fd)
}
}
}
}
+/* some OSes have a bug where an exit causes the pending writes on
+ a socket to be flushed. Do an explicit shutdown to try to prevent this */
+void io_shutdown(void)
+{
+ if (multiplex_out_fd != -1) close(multiplex_out_fd);
+ if (io_error_fd != -1) close(io_error_fd);
+ multiplex_out_fd = -1;
+ io_error_fd = -1;
+}
+
+
static void writefd(int fd,char *buf,int len)
{
stats.total_written += len;
static void writefd(int fd,char *buf,int len)
{
stats.total_written += len;
@@
-488,6
+508,11
@@
void write_int(int f,int32 x)
writefd(f,b,4);
}
writefd(f,b,4);
}
+
+/*
+ * Note: int64 may actually be a 32-bit type if ./configure couldn't find any
+ * 64-bit types on this platform.
+ */
void write_longint(int f, int64 x)
{
extern int remote_version;
void write_longint(int f, int64 x)
{
extern int remote_version;
@@
-608,8
+633,3
@@
void io_multiplexing_close(void)
io_multiplexing_out = 0;
}
io_multiplexing_out = 0;
}
-void io_close_input(int fd)
-{
- buffer_f_in = -1;
-}
-