Compare commits

..

9 Commits

Author SHA1 Message Date
rsync-bugs
ed0992b888 preparing for release of 2.0.2 1998-05-15 07:37:00 +00:00
Andrew Tridgell
d6dead6bb1 added write buffering during the file list sending. This makes things
a bit more efficient (less system calls)
1998-05-15 07:34:19 +00:00
Andrew Tridgell
344fb1276b fixed a select bug which caused rsync to use far more cpu time than
necessary on the server
1998-05-15 07:11:29 +00:00
Andrew Tridgell
e095b568d0 updated the README a bit 1998-05-15 05:42:56 +00:00
Andrew Tridgell
4c3d16be50 - added some notes about encryption and authentication to the man
pages

- documented the RSYNC_PASSWORD environment variable
1998-05-15 05:37:34 +00:00
rsync-bugs
715e727784 preparing for release of 2.0.1 1998-05-15 01:19:42 +00:00
Andrew Tridgell
5805327b28 fixed typo in rsyncd exclude handling 1998-05-15 01:14:48 +00:00
Andrew Tridgell
8f3a2d54a6 added "exclude" and "exclude from" options to rsyncd.conf.
This is useful for mirroring a web site when you don't want users to
mirror everything.
1998-05-15 01:02:49 +00:00
Andrew Tridgell
e22de16264 fixed SIGCLD -> SIGCHLD
fixed formatting of man page (thanks to Karsten)
1998-05-15 00:29:45 +00:00
11 changed files with 166 additions and 34 deletions

14
README
View File

@@ -57,6 +57,9 @@ Options:
--exclude-from FILE exclude files listed in FILE
--suffix SUFFIX override backup suffix
--version print version number
--daemon run as a rsync daemon
--config FILE specify alternate rsyncd.conf file
--port PORT specify alternate rsyncd port number
SETUP
@@ -81,6 +84,14 @@ case.
Once built put a copy of rsync in your search path on the local and
remote systems (or use "make install"). That's it!
RSYNC SERVERS
-------------
rsync can also talk to "rsync servers" which can provide anonymous or
authenticated rsync. See the rsync.conf(5) man page for details on how
to setup a rsync server. See the rsync(1) man page for info on how to
connect to a rsync server.
MAILING LIST
------------
@@ -138,7 +149,8 @@ paulus@cs.anu.edu.au
AVAILABILITY
------------
The main ftp site for rsync is ftp://samba.anu.edu.au/pub/rsync
The main ftp site for rsync is ftp://samba.anu.edu.au/pub/rsync
This is also available as rsync://samba.anu.edu.au/rsyncftp/
Mirrors are available at:

View File

@@ -162,6 +162,12 @@ static int rsync_module(int fd, int i)
gid = atoi(p);
}
p = lp_exclude_from(i);
add_exclude_file(p, 1);
p = lp_exclude(i);
add_exclude_line(p);
if (chroot(lp_path(i))) {
io_printf(fd,"@ERROR: chroot failed\n");
return -1;

View File

@@ -142,7 +142,9 @@ char **make_exclude_list(char *fname,char **list1,int fatal)
void add_exclude_file(char *fname,int fatal)
{
exclude_list = make_exclude_list(fname,exclude_list,fatal);
if (!fname || !*fname) return;
exclude_list = make_exclude_list(fname,exclude_list,fatal);
}
@@ -172,6 +174,18 @@ void recv_exclude_list(int f)
}
void add_exclude_line(char *p)
{
char *tok;
if (!p || !*p) return;
p = strdup(p);
if (!p) out_of_memory("add_exclude_line");
for (tok=strtok(p," "); tok; tok=strtok(NULL," "))
add_exclude(tok);
free(p);
}
static char *cvs_ignore_list[] = {
"RCS","SCCS","CVS","CVS.adm","RCSLOG","cvslog.*",
"tags","TAGS",".make.state",".nse_depinfo",
@@ -195,9 +209,5 @@ void add_cvs_excludes(void)
add_exclude_file(fname,0);
}
if ((p=getenv("CVSIGNORE"))) {
char *tok;
for (tok=strtok(p," "); tok; tok=strtok(NULL," "))
add_exclude(tok);
}
add_exclude_line(getenv("CVSIGNORE"));
}

10
flist.c
View File

@@ -573,6 +573,10 @@ struct file_list *send_file_list(int f,int argc,char *argv[])
flist->malloced);
if (!flist->files) out_of_memory("send_file_list");
if (f != -1) {
io_start_buffering(f);
}
for (i=0;i<argc;i++) {
char fname2[MAXPATHLEN];
char *fname = fname2;
@@ -658,7 +662,6 @@ struct file_list *send_file_list(int f,int argc,char *argv[])
if (f != -1) {
send_file_entry(NULL,f,0);
write_flush(f);
}
if (verbose && recurse && !am_server && f != -1)
@@ -677,6 +680,11 @@ struct file_list *send_file_list(int f,int argc,char *argv[])
write_int(f, io_error);
}
if (f != -1) {
io_end_buffering(f);
write_flush(f);
}
if (verbose > 2)
rprintf(FINFO,"send_file_list done\n");

57
io.c
View File

@@ -148,7 +148,8 @@ static int readfd(int fd,char *buffer,int N)
tv.tv_sec = io_timeout;
tv.tv_usec = 0;
if (select(fd+1, &fds, NULL, NULL, &tv) != 1) {
if (select(fd+1, &fds, NULL, NULL,
io_timeout?&tv:NULL) != 1) {
check_timeout();
}
}
@@ -300,7 +301,7 @@ int write_file(int f,char *buf,int len)
}
static int writefd(int fd,char *buf,int len)
static int writefd_unbuffered(int fd,char *buf,int len)
{
int total = 0;
fd_set w_fds, r_fds;
@@ -374,6 +375,58 @@ static int writefd(int fd,char *buf,int len)
return total;
}
static char *io_buffer;
static int io_buffer_count;
void io_start_buffering(int fd)
{
io_buffer = (char *)malloc(IO_BUFFER_SIZE);
if (!io_buffer) out_of_memory("writefd");
io_buffer_count = 0;
}
void io_end_buffering(int fd)
{
if (io_buffer_count) {
if (writefd_unbuffered(fd, io_buffer,
io_buffer_count) !=
io_buffer_count) {
rprintf(FERROR,"write failed\n");
exit_cleanup(1);
}
io_buffer_count = 0;
}
free(io_buffer);
io_buffer = NULL;
}
static int writefd(int fd,char *buf,int len1)
{
int len = len1;
if (!io_buffer) return writefd_unbuffered(fd, buf, len);
while (len) {
int n = MIN(len, IO_BUFFER_SIZE-io_buffer_count);
if (n > 0) {
memcpy(io_buffer+io_buffer_count, buf, n);
buf += n;
len -= n;
io_buffer_count += n;
}
if (io_buffer_count == IO_BUFFER_SIZE) {
if (writefd_unbuffered(fd, io_buffer,
io_buffer_count) !=
io_buffer_count) {
return -1;
}
io_buffer_count = 0;
}
}
return len1;
}
void write_int(int f,int32 x)

View File

@@ -123,6 +123,8 @@ typedef struct
char *hosts_deny;
char *auth_users;
char *secrets_file;
char *exclude;
char *exclude_from;
} service;
@@ -140,6 +142,8 @@ static service sDefault =
NULL, /* hosts deny */
NULL, /* auth users */
NULL, /* secrets file */
NULL, /* exclude */
NULL, /* exclude from */
};
@@ -238,6 +242,8 @@ static struct parm_struct parm_table[] =
{"hosts deny", P_STRING, P_LOCAL, &sDefault.hosts_deny, NULL, 0},
{"auth users", P_STRING, P_LOCAL, &sDefault.auth_users, NULL, 0},
{"secrets file", P_STRING, P_LOCAL, &sDefault.secrets_file,NULL, 0},
{"exclude", P_STRING, P_LOCAL, &sDefault.exclude, NULL, 0},
{"exclude from", P_STRING, P_LOCAL, &sDefault.exclude_from,NULL, 0},
{NULL, P_BOOL, P_NONE, NULL, NULL, 0}
};
@@ -300,6 +306,8 @@ FN_LOCAL_STRING(lp_hosts_allow, hosts_allow)
FN_LOCAL_STRING(lp_hosts_deny, hosts_deny)
FN_LOCAL_STRING(lp_auth_users, auth_users)
FN_LOCAL_STRING(lp_secrets_file, secrets_file)
FN_LOCAL_STRING(lp_exclude, exclude)
FN_LOCAL_STRING(lp_exclude_from, exclude_from)
/* local prototypes */
static int strwicmp( char *psz1, char *psz2 );

View File

@@ -51,6 +51,7 @@
#define WRITE_SIZE (32*1024)
#define CHUNK_SIZE (32*1024)
#define MAX_MAP_SIZE (4*1024*1024)
#define IO_BUFFER_SIZE (4096)
#define MAX_ARGS 1000

View File

@@ -139,6 +139,11 @@ itemize(
list of accessible paths on the server will be shown.
)
Some paths on the remote server may require authentication. If so then
you will receive a password prompt when you connect. You can avoid the
password prompt by setting the environment variable RSYNC_PASSWORD to
the password you want to use. This may be useful when scripting rsync.
manpagesection(RUNNING AN RSYNC SERVER)
An rsync server is configured using a config file which by default is

View File

@@ -8,7 +8,7 @@ rsyncd.conf
manpagedescription()
The rsyncd.conf file is the runtime configuration file for rsync when
run with the -daemon option. When run in this way rsync becomes a
run with the --daemon option. When run in this way rsync becomes a
rsync server listening on TCP port 873. Connections from rsync clients
are accepted for either anonymous or authenticated rsync sessions.
@@ -33,7 +33,7 @@ within a parameter value is retained verbatim.
Any line beginning with a hash (#) is ignored, as are lines containing
only whitespace.
Any line ending in a \e is "continued" on the next line in the
Any line ending in a \ is "continued" on the next line in the
customary UNIX fashion.
The values following the equals sign in parameters are all either a string
@@ -47,22 +47,22 @@ The rsync daemon is launched by specifying the --daemon option to
rsync. The daemon must run with root privileges.
You can launch it either via inetd or as a standalone daemon. If run
as a daemon then just run the command "rsync -daemon" from a suitable
as a daemon then just run the command "rsync --daemon" from a suitable
startup script.
When run via inetd you should add a line like this to /etc/services:
rsync 873/tcp
quote(rsync 873/tcp)
and a line something like this to /etc/inetd.conf:
and a single line something like this to /etc/inetd.conf:
rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon
quote(rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon)
You will then need to send inetd a HUP signal to tell it to reread its
config file.
Note that you should not send the rsync server a HUP signal to force
it to reread the /etc/rsyncd.conf. The file is re-read on each client
it to reread the tt(/etc/rsyncd.conf). The file is re-read on each client
connection.
manpagesection(GLOBAL OPTIONS)
@@ -89,7 +89,7 @@ The default is 0 which means no limit.
dit(bf(lock file)) The "lock file" option specifies the file to use to
support the "max connections" option. The rsync server uses record
locking on this file to ensure that the max connections limit is not
exceeded. The default is /var/run/rsyncd.lock
exceeded. The default is tt(/var/run/rsyncd.lock).
dit(bf(syslog facility)) The "syslog facility" option allows you to
specify the syslog facility name to use when logging messages from the
@@ -118,7 +118,7 @@ of available modules. The default is no comment.
dit(bf(path)) The "path" option specifies the directory in the servers
filesystem to make available in this module. The rsync server will
chroot to this path before starting the file transfer with the
client. You must specify this option for each module in /etc/rsyncd.conf.
client. You must specify this option for each module in tt(/etc/rsyncd.conf).
dit(bf(read only)) The "read only" option determines whether clients
will be able to upload files or not. If "read only" is true then any
@@ -140,6 +140,21 @@ dit(bf(gid)) The "gid" option specifies the group name or group id that
file transfers to and from that module should take place as. This
complements the "uid" option. The default is the group "nobody".
dit(bf(exclude)) The "exclude" option allows you to specify a space
separated list of patterns to add to the exclude list. This is
equivalent to the client specifying these patterns with the --exclude
option. Note that this option is not designed with strong security in
mind, it is quite possible that a client may find a way to bypass this
exclude list. If you want to absolutely ensure that certain files
cannot be accessed then use the uid/gid options in combination with
file permissions.
dit(bf(exclude from)) The "exclude from" option specifies a filename
on the server that contains exclude patterns, one per line. This is
equivalent to the client specifying the --exclude-from option with a
equivalent file. See also the note about security for the exclude
option above.
dit(bf(auth users)) The "auth users" option specifies a comma
and space separated list of usernames that will be allowed to connect
to this module. The usernames do not need to exist on the local
@@ -163,7 +178,7 @@ you may find that passwords longer than 8 characters don't work.
bf(You should make sure that the secrets file is not readable by anyone
other than the system administrator.) There is no default for the
"secrets file" option, you must choose a name (such as
/etc/rsyncd.secrets).
tt(/etc/rsyncd.secrets)).
dit(bf(hosts allow)) The "hosts allow" option allows you to specify a
list of patterns that are matched against a connecting clients
@@ -212,27 +227,43 @@ The default is no "hosts deny" option, which means all hosts can connect.
enddit()
manpagesection(AUTHENTICATION STRENGTH)
The authentication protocol used in rsync is a 128 bit MD4 based
challenge response system. Although I believe that no one has ever
demonstrated a brute-force break of this sort of system you should
realise that this is not a "military strength" authentication system.
It should be good enough for most purposes but if you want really top
quality security then I recommend that you run rsync over ssh.
Also note that the rsync server protocol does not currently provide any
encryption of the data that is transferred over the link. Only
authentication is provided. Use ssh as the transport if you want
encryption.
Future versions of rsync may support SSL for better authentication and
encryption, but that is still being investigated.
manpagesection(EXAMPLES)
A simple rsyncd.conf file that allow anonymous rsync to a ftp area at
/home/ftp would be:
tt(/home/ftp) would be:
verb(
[ftp]
path = /home/ftp
comment = ftp export area
path = /home/ftp
comment = ftp export area
)
A more sophisticated example would be:
verb(
uid = nobody
gid = nobody
max connections = 4
syslog facility = local5
uid = nobody nl()
gid = nobody nl()
max connections = 4 nl()
syslog facility = local5 nl()
[ftp]
verb([ftp]
path = /var/ftp/pub
comment = whole ftp area (approx 6.1 GB)
@@ -257,10 +288,8 @@ syslog facility = local5
The /etc/rsyncd.secrets file would look something like this:
verb(
tridge:mypass
tridge:mypass nl()
susan:herpass
)
manpagefiles()

View File

@@ -120,7 +120,7 @@ void start_accept_loop(int port, int (*fn)(int ))
{
int s;
signal(SIGCLD, SIG_IGN);
signal(SIGCHLD, SIG_IGN);
/* open an incoming socket */
s = open_socket_in(SOCK_STREAM, port);

View File

@@ -1 +1 @@
#define VERSION "2.0.0"
#define VERSION "2.0.2"