2 Copyright (C) Andrew Tridgell 1998
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 /* the socket based protocol for setting up a connection wit rsyncd */
26 extern int rsync_port
;
28 int sanitize_paths
= 0;
30 int start_socket_client(char *host
, char *path
, int argc
, char *argv
[])
33 char *sargs
[MAX_ARGS
];
35 char line
[MAXPATHLEN
];
37 extern int remote_version
;
39 extern struct in_addr socket_address
;
42 rprintf(FERROR
,"ERROR: The remote path must start with a module name\n");
46 p
= strchr(host
, '@');
53 if (!user
) user
= getenv("USER");
54 if (!user
) user
= getenv("LOGNAME");
56 fd
= open_socket_out(host
, rsync_port
, &socket_address
);
58 exit_cleanup(RERR_SOCKETIO
);
61 server_options(sargs
,&sargc
);
66 sargs
[sargc
++] = path
;
70 io_printf(fd
,"@RSYNCD: %d\n", PROTOCOL_VERSION
);
72 if (!read_line(fd
, line
, sizeof(line
)-1)) {
76 if (sscanf(line
,"@RSYNCD: %d", &remote_version
) != 1) {
82 io_printf(fd
,"%s\n",path
);
86 if (!read_line(fd
, line
, sizeof(line
)-1)) {
90 if (strncmp(line
,"@RSYNCD: AUTHREQD ",18) == 0) {
91 auth_client(fd
, user
, line
+18);
95 if (strcmp(line
,"@RSYNCD: OK") == 0) break;
96 rprintf(FINFO
,"%s\n", line
);
99 for (i
=0;i
<sargc
;i
++) {
100 io_printf(fd
,"%s\n", sargs
[i
]);
104 if (remote_version
< 23) {
105 if (remote_version
== 22 || (remote_version
> 17 && !am_sender
))
106 io_start_multiplex_in(fd
);
109 return client_run(fd
, fd
, -1, argc
, argv
);
114 static int rsync_module(int fd
, int i
)
117 char *argv
[MAX_ARGS
];
119 char line
[MAXPATHLEN
];
120 uid_t uid
= (uid_t
)-2;
121 gid_t gid
= (gid_t
)-2;
123 char *addr
= client_addr(fd
);
124 char *host
= client_name(fd
);
125 char *name
= lp_name(i
);
126 int use_chroot
= lp_use_chroot(i
);
130 extern int am_sender
;
131 extern int remote_version
;
134 if (!allow_access(addr
, host
, lp_hosts_allow(i
), lp_hosts_deny(i
))) {
135 rprintf(FERROR
,"rsync denied on module %s from %s (%s)\n",
136 name
, client_name(fd
), client_addr(fd
));
137 io_printf(fd
,"@ERROR: access denied to %s from %s (%s)\n",
138 name
, client_name(fd
), client_addr(fd
));
142 if (!claim_connection(lp_lock_file(i
), lp_max_connections(i
))) {
144 rprintf(FERROR
,"failed to open lock file %s : %s\n",
145 lp_lock_file(i
), strerror(errno
));
146 io_printf(fd
,"@ERROR: failed to open lock file %s : %s\n",
147 lp_lock_file(i
), strerror(errno
));
149 rprintf(FERROR
,"max connections (%d) reached\n",
150 lp_max_connections(i
));
151 io_printf(fd
,"@ERROR: max connections (%d) reached - try again later\n", lp_max_connections(i
));
157 auth_user
= auth_server(fd
, i
, addr
, "@RSYNCD: AUTHREQD ");
160 rprintf(FERROR
,"auth failed on module %s from %s (%s)\n",
161 name
, client_name(fd
), client_addr(fd
));
162 io_printf(fd
,"@ERROR: auth failed on module %s\n",name
);
168 am_root
= (getuid() == 0);
172 if (!name_to_uid(p
, &uid
)) {
174 rprintf(FERROR
,"Invalid uid %s\n", p
);
175 io_printf(fd
,"@ERROR: invalid uid\n");
182 if (!name_to_gid(p
, &gid
)) {
184 rprintf(FERROR
,"Invalid gid %s\n", p
);
185 io_printf(fd
,"@ERROR: invalid gid\n");
192 p
= lp_include_from(i
);
193 add_exclude_file(p
, 1, 1);
198 p
= lp_exclude_from(i
);
199 add_exclude_file(p
, 1, 0);
207 if (chroot(lp_path(i
))) {
208 rprintf(FERROR
,"chroot %s failed\n", lp_path(i
));
209 io_printf(fd
,"@ERROR: chroot failed\n");
213 if (!push_dir("/", 0)) {
214 rprintf(FERROR
,"chdir %s failed\n", lp_path(i
));
215 io_printf(fd
,"@ERROR: chdir failed\n");
220 if (!push_dir(lp_path(i
), 0)) {
221 rprintf(FERROR
,"chdir %s failed\n", lp_path(i
));
222 io_printf(fd
,"@ERROR: chdir failed\n");
230 rprintf(FERROR
,"setgid %d failed\n", gid
);
231 io_printf(fd
,"@ERROR: setgid failed\n");
236 rprintf(FERROR
,"setuid %d failed\n", uid
);
237 io_printf(fd
,"@ERROR: setuid failed\n");
241 am_root
= (getuid() == 0);
244 io_printf(fd
,"@RSYNCD: OK\n");
246 argv
[argc
++] = "rsyncd";
249 if (!read_line(fd
, line
, sizeof(line
)-1)) {
257 argv
[argc
] = strdup(p
);
263 if (start_glob
== 1) {
267 glob_expand(name
, argv
, &argc
, MAX_ARGS
);
272 if (strcmp(line
,".") == 0) {
276 if (argc
== MAX_ARGS
) {
281 if (sanitize_paths
) {
283 * Note that this is applied to all parameters, whether or not
284 * they are filenames, but no other legal parameters contain
285 * the forms that need to be sanitized so it doesn't hurt;
286 * it is not known at this point which parameters are files
289 for (i
= 1; i
< argc
; i
++) {
290 sanitize_path(argv
[i
], NULL
);
294 ret
= parse_arguments(argc
, argv
, 0);
298 rprintf(FINFO
,"rsync %s %s from %s@%s (%s)\n",
300 request
, auth_user
, host
, addr
);
302 rprintf(FINFO
,"rsync %s %s from %s (%s)\n",
304 request
, host
, addr
);
310 /* don't allow the logs to be flooded too fast */
311 if (verbose
> 1) verbose
= 1;
315 argp
= argv
+ optind
;
318 if (remote_version
< 23) {
319 if (remote_version
== 22 || (remote_version
> 17 && am_sender
))
320 io_start_multiplex_out(fd
);
328 extern int io_timeout
;
329 io_timeout
= lp_timeout(i
);
332 start_server(fd
, fd
, argc
, argp
);
337 /* send a list of available modules to the client. Don't list those
338 with "list = False". */
339 static void send_listing(int fd
)
341 int n
= lp_numservices();
346 io_printf(fd
, "%-15s\t%s\n", lp_name(i
), lp_comment(i
));
349 /* this is called when a socket connection is established to a client
350 and we want to start talking. The setup of the system is done from
352 static int start_daemon(int fd
)
357 extern char *config_file
;
358 extern int remote_version
;
360 if (!lp_load(config_file
, 0)) {
361 exit_cleanup(RERR_SYNTAX
);
364 set_socket_options(fd
,"SO_KEEPALIVE");
365 set_socket_options(fd
,lp_socket_options());
368 io_printf(fd
,"@RSYNCD: %d\n", PROTOCOL_VERSION
);
370 motd
= lp_motd_file();
372 FILE *f
= fopen(motd
,"r");
373 while (f
&& !feof(f
)) {
374 int len
= fread(line
, 1, sizeof(line
)-1, f
);
377 io_printf(fd
,"%s", line
);
384 if (!read_line(fd
, line
, sizeof(line
)-1)) {
388 if (sscanf(line
,"@RSYNCD: %d", &remote_version
) != 1) {
389 io_printf(fd
,"@ERROR: protocol startup error\n");
395 if (!read_line(fd
, line
, sizeof(line
)-1)) {
399 if (!*line
|| strcmp(line
,"#list")==0) {
405 /* it's some sort of command that I don't understand */
406 io_printf(fd
,"@ERROR: Unknown command '%s'\n", line
);
412 io_printf(fd
,"@ERROR: Unknown module '%s'\n", line
);
417 return rsync_module(fd
, i
);
421 int daemon_main(void)
423 extern char *config_file
;
424 extern int orig_umask
;
427 if (is_a_socket(STDIN_FILENO
)) {
430 /* we are running via inetd - close off stdout and
431 stderr so that library functions (and getopt) don't
432 try to use them. Redirect them to /dev/null */
435 open("/dev/null", O_RDWR
);
438 return start_daemon(STDIN_FILENO
);
443 if (!lp_load(config_file
, 1)) {
444 exit_cleanup(RERR_SYNTAX
);
449 rprintf(FINFO
,"rsyncd version %s starting\n",VERSION
);
451 if (((pid_file
= lp_pid_file()) != NULL
) && (*pid_file
!= '\0')) {
454 int pid
= (int) getpid();
455 cleanup_set_pid(pid
);
456 if ((fd
= do_open(lp_pid_file(), O_WRONLY
|O_CREAT
|O_TRUNC
,
457 0666 & ~orig_umask
)) == -1) {
459 rprintf(FLOG
,"failed to create pid file %s\n", pid_file
);
460 exit_cleanup(RERR_FILEIO
);
462 slprintf(pidbuf
, sizeof(pidbuf
), "%d\n", pid
);
463 write(fd
, pidbuf
, strlen(pidbuf
));
467 start_accept_loop(rsync_port
, start_daemon
);