Use "use warnings" rather than -w on the #! line.
[rsync/rsync-patches.git] / nameconverter.diff
index 2f428c8..1d65549 100644 (file)
@@ -23,7 +23,7 @@ To use this patch, run these commands for a successful build:
 diff --git a/clientserver.c b/clientserver.c
 --- a/clientserver.c
 +++ b/clientserver.c
-@@ -59,6 +59,7 @@ char *auth_user;
+@@ -67,6 +67,7 @@ char *auth_user;
  int read_only = 0;
  int module_id = -1;
  int munge_symlinks = 0;
@@ -31,15 +31,15 @@ diff --git a/clientserver.c b/clientserver.c
  struct chmod_mode_struct *daemon_chmod_modes;
  
  /* module_dirlen is the length of the module_dir string when in daemon
-@@ -67,6 +68,7 @@ char *module_dir = NULL;
unsigned int module_dirlen = 0;
+@@ -78,6 +79,7 @@ unsigned int module_dirlen = 0;
char *full_module_path;
  
  static int rl_nulls = 0;
 +static int namecvt_fd_req = -1, namecvt_fd_ans = -1;
  
  #ifdef HAVE_SIGACTION
  static struct sigaction sigact;
-@@ -508,7 +510,7 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host)
+@@ -565,7 +567,7 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host)
        log_init(1);
  
  #ifdef HAVE_PUTENV
@@ -47,8 +47,8 @@ diff --git a/clientserver.c b/clientserver.c
 +      if (*lp_prexfer_exec(i) || *lp_postxfer_exec(i) || *lp_name_converter(i)) {
                char *modname, *modpath, *hostaddr, *hostname, *username;
                int status;
-               if (asprintf(&modname, "RSYNC_MODULE_NAME=%s", name) < 0
-@@ -595,6 +597,44 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host)
+@@ -654,6 +656,44 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host)
                        set_blocking(fds[1]);
                        pre_exec_fd = fds[1];
                }
@@ -93,7 +93,7 @@ diff --git a/clientserver.c b/clientserver.c
                umask(0);
        }
  #endif
-@@ -789,6 +829,44 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host)
+@@ -877,6 +917,44 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host)
        return 0;
  }
  
@@ -141,7 +141,7 @@ diff --git a/clientserver.c b/clientserver.c
 diff --git a/loadparm.c b/loadparm.c
 --- a/loadparm.c
 +++ b/loadparm.c
-@@ -139,6 +139,7 @@ typedef struct
+@@ -140,6 +140,7 @@ typedef struct
        char *log_file;
        char *log_format;
        char *name;
@@ -149,7 +149,7 @@ diff --git a/loadparm.c b/loadparm.c
        char *outgoing_chmod;
        char *path;
        char *postxfer_exec;
-@@ -188,6 +189,7 @@ static service sDefault =
+@@ -191,6 +192,7 @@ static service sDefault =
   /* log_file; */              NULL,
   /* log_format; */            "%o %h [%a] %m (%u) %f %l",
   /* name; */                  NULL,
@@ -157,44 +157,46 @@ diff --git a/loadparm.c b/loadparm.c
   /* outgoing_chmod; */                NULL,
   /* path; */                  NULL,
   /* postxfer_exec; */         NULL,
-@@ -323,6 +325,7 @@ static struct parm_struct parm_table[] =
+@@ -328,6 +330,7 @@ static struct parm_struct parm_table[] =
   {"max verbosity",     P_INTEGER,P_LOCAL, &sDefault.max_verbosity,     NULL,0},
   {"munge symlinks",    P_BOOL,   P_LOCAL, &sDefault.munge_symlinks,    NULL,0},
   {"name",              P_STRING, P_LOCAL, &sDefault.name,              NULL,0},
 + {"name converter",    P_STRING, P_LOCAL, &sDefault.name_converter,    NULL,0},
+  {"numeric ids",       P_BOOL,   P_LOCAL, &sDefault.numeric_ids,       NULL,0},
   {"outgoing chmod",    P_STRING, P_LOCAL, &sDefault.outgoing_chmod,    NULL,0},
   {"path",              P_PATH,   P_LOCAL, &sDefault.path,              NULL,0},
- #ifdef HAVE_PUTENV
-@@ -411,6 +414,7 @@ FN_LOCAL_STRING(lp_outgoing_chmod, outgoing_chmod)
+@@ -418,6 +421,7 @@ FN_LOCAL_STRING(lp_outgoing_chmod, outgoing_chmod)
  FN_LOCAL_STRING(lp_path, path)
  FN_LOCAL_STRING(lp_postxfer_exec, postxfer_exec)
  FN_LOCAL_STRING(lp_prexfer_exec, prexfer_exec)
 +FN_LOCAL_STRING(lp_name_converter, name_converter)
  FN_LOCAL_STRING(lp_refuse_options, refuse_options)
  FN_LOCAL_STRING(lp_secrets_file, secrets_file)
- FN_LOCAL_INTEGER(lp_syslog_facility, syslog_facility)
+ FN_LOCAL_STRING(lp_temp_dir, temp_dir)
 diff --git a/rsyncd.conf.yo b/rsyncd.conf.yo
 --- a/rsyncd.conf.yo
 +++ b/rsyncd.conf.yo
-@@ -144,7 +144,10 @@ args if rsync believes they would escape the chroot.
- The default for "use chroot" is true, and is the safer choice (especially
- if the module is not read-only).
+@@ -159,10 +159,11 @@ if the module is not read-only).
  
--In order to preserve usernames and groupnames, rsync needs to be able to
-+In order to preserve usernames and groupnames, you can use the
-+bf(name converter) option to specify a name-converting program that the
-+rsync daemon will start prior to enabling chroot (see the option for more
-+details).  If that option is not specified, the daemon needs to be able to
+ When this parameter is enabled, rsync will not attempt to map users and groups
+ by name (by default), but instead copy IDs as though bf(--numeric-ids) had
+-been specified.  In order to enable name-mapping, rsync needs to be able to
++been specified.  In order to enable name-mapping, rsync needs either the
++bf(name converter) parameter to specify a conversion program, or it needs to
  use the standard library functions for looking up names and IDs (i.e.
- code(getpwuid()), code(getgrgid()), code(getpwname()), and code(getgrnam())).  This means a
- process in the chroot namespace will need to have access to the resources
-@@ -200,6 +203,27 @@ path elements that rsync believes will allow a symlink to escape the module's
+ code(getpwuid()), code(getgrgid()), code(getpwname()), and code(getgrnam())).
+-This means the rsync
++The latter choice means the rsync
+ process in the chroot hierarchy will need to have access to the resources
+ used by these library functions (traditionally /etc/passwd and
+ /etc/group, but perhaps additional dynamic libraries as well).
+@@ -227,6 +228,27 @@ path elements that rsync believes will allow a symlink to escape the module's
  hierarchy.  There are tricky ways to work around this, though, so you had
- better trust your users if you choose this combination of options.
+ better trust your users if you choose this combination of parameters.
  
-+dit(bf(name converter))  The "name converter" option lets you specify a
++dit(bf(name converter))  This parameter lets you specify a
 +program that will be run by the rsync daemon (prior to bf(use chroot), if
-+that option is enabled) to convert user/group names into numbers or visa
++that parameter is enabled) to convert user/group names into numbers or visa
 +versa.  There is a sample perl script in the support directory named
 +"nameconvert" that you can use to enable the use of the normal passwd/group
 +lookup calls in a chroot daemon (which does not require any extra files
@@ -213,15 +215,15 @@ diff --git a/rsyncd.conf.yo b/rsyncd.conf.yo
 +bf(RSYNC_USER_NAME).  This is useful if you want to customize the
 +conversion using a single program invocation.
 +
- dit(bf(max connections)) The "max connections" option allows you to
- specify the maximum number of simultaneous connections you will allow.
- Any clients connecting when the maximum has been reached will receive a
+ dit(bf(charset)) This specifies the name of the character set in which the
+ module's filenames are stored.  If the client uses an bf(--iconv) option,
+ the daemon will use the value of the "charset" parameter regardless of the
 diff --git a/support/nameconvert b/support/nameconvert
 new file mode 100755
 --- /dev/null
 +++ b/support/nameconvert
-@@ -0,0 +1,42 @@
-+#!/usr/bin/perl -w
+@@ -0,0 +1,43 @@
++#!/usr/bin/perl
 +# This implements a simple protocol to do {user,group}-{name,id}
 +# conversions.  All input and output consists of simple strings
 +# with a terminating null char (or newline for debugging).  If
@@ -240,6 +242,7 @@ new file mode 100755
 +# "name converter" setting.
 +
 +use strict;
++use warnings;
 +
 +my $eol = grep(/^--debug$/, @ARGV) ? "\n" : "\0";
 +$/ = $eol;
@@ -266,15 +269,15 @@ new file mode 100755
 diff --git a/t_stub.c b/t_stub.c
 --- a/t_stub.c
 +++ b/t_stub.c
-@@ -29,6 +29,7 @@ int module_dirlen = 0;
+@@ -30,6 +30,7 @@ int preserve_xattrs = 0;
  mode_t orig_umask = 002;
  char *partial_dir;
  char *module_dir;
 +pid_t namecvt_pid;
- struct filter_list_struct server_filter_list;
+ struct filter_list_struct daemon_filter_list;
  
   void rprintf(UNUSED(enum logcode code), const char *format, ...)
-@@ -69,6 +70,11 @@ struct filter_list_struct server_filter_list;
+@@ -75,6 +76,11 @@ struct filter_list_struct daemon_filter_list;
        return -1;
  }
  
@@ -330,19 +333,19 @@ diff --git a/uidlist.c b/uidlist.c
 diff --git a/util.c b/util.c
 --- a/util.c
 +++ b/util.c
-@@ -30,9 +30,10 @@ extern int modify_window;
- extern int relative_paths;
+@@ -31,9 +31,10 @@ extern int relative_paths;
  extern int human_readable;
+ extern int preserve_xattrs;
  extern char *module_dir;
 -extern unsigned int module_dirlen;
  extern mode_t orig_umask;
  extern char *partial_dir;
 +extern pid_t namecvt_pid;
 +extern unsigned int module_dirlen;
- extern struct filter_list_struct server_filter_list;
+ extern struct filter_list_struct daemon_filter_list;
  
  int sanitize_paths = 0;
-@@ -468,24 +469,44 @@ void kill_all(int sig)
+@@ -497,24 +498,44 @@ void kill_all(int sig)
  /** Turn a user name into a uid */
  int name_to_uid(const char *name, uid_t *uid_p)
  {