}
if (*path == '/') {
- rprintf(FERROR,"ERROR: The remote path must start with a module name\n");
+ rprintf(FERROR,"ERROR: The remote path must start with a module name not a /\n");
return -1;
}
}
if (strcmp(line,"@RSYNCD: OK") == 0) break;
+
+ if (strcmp(line,"@RSYNCD: EXIT") == 0) exit(0);
+
rprintf(FINFO,"%s\n", line);
}
char *argv[MAX_ARGS];
char **argp;
char line[MAXPATHLEN];
- uid_t uid = (uid_t)-2;
+ uid_t uid = (uid_t)-2; /* canonically "nobody" */
gid_t gid = (gid_t)-2;
char *p;
char *addr = client_addr(fd);
if (!name_to_uid(p, &uid)) {
if (!isdigit(*p)) {
rprintf(FERROR,"Invalid uid %s\n", p);
- io_printf(fd,"@ERROR: invalid uid\n");
+ io_printf(fd,"@ERROR: invalid uid %s\n", p);
return -1;
}
uid = atoi(p);
if (!name_to_gid(p, &gid)) {
if (!isdigit(*p)) {
rprintf(FERROR,"Invalid gid %s\n", p);
- io_printf(fd,"@ERROR: invalid gid\n");
+ io_printf(fd,"@ERROR: invalid gid %s\n", p);
return -1;
}
gid = atoi(p);
}
}
+
+ /* TODO: If we're not root, but the configuration requests
+ * that we change to some uid other than the current one, then
+ * log a warning. */
+
+ /* TODO: Perhaps take a list of gids, and make them into the
+ * supplementary groups. */
p = lp_include_from(i);
add_exclude_file(p, 1, 1);
if (am_root) {
if (setgid(gid)) {
- rsyserr(FERROR, errno, "setgid %d failed", gid);
+ rsyserr(FERROR, errno, "setgid %d failed", (int) gid);
io_printf(fd,"@ERROR: setgid failed\n");
return -1;
}
if (setuid(uid)) {
- rsyserr(FERROR, errno, "setuid %d failed", uid);
+ rsyserr(FERROR, errno, "setuid %d failed", (int) uid);
io_printf(fd,"@ERROR: setuid failed\n");
return -1;
}
for (i=0;i<n;i++)
if (lp_list(i))
io_printf(fd, "%-15s\t%s\n", lp_name(i), lp_comment(i));
+
+ io_printf(fd, "@RSYNCD: EXIT\n");
}
/* this is called when a socket connection is established to a client
rsyserr(FLOG, errno, "failed to create pid file %s", pid_file);
exit_cleanup(RERR_FILEIO);
}
- slprintf(pidbuf, sizeof(pidbuf), "%d\n", pid);
+ snprintf(pidbuf, sizeof(pidbuf), "%d\n", pid);
write(fd, pidbuf, strlen(pidbuf));
close(fd);
}