- {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
-@@ -1931,6 +1937,18 @@ void server_options(char **args, int *ar
+ {"contimeout", 0, POPT_ARG_INT, &connect_timeout, 0, 0, 0 },
+@@ -1229,6 +1237,43 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+ }
+ break;
+
++ case OPT_USERMAP:
++ if (usermap) {
++ snprintf(err_buf, sizeof err_buf,
++ "You can only specify --usermap once.\n");
++ return 0;
++ }
++ usermap = (char *)poptGetOptArg(pc);
++ break;
++
++ case OPT_GROUPMAP:
++ if (groupmap) {
++ snprintf(err_buf, sizeof err_buf,
++ "You can only specify --groupmap once.\n");
++ return 0;
++ }
++ groupmap = (char *)poptGetOptArg(pc);
++ break;
++
++ case OPT_CHOWN:
++ if (usermap || groupmap) {
++ snprintf(err_buf, sizeof err_buf,
++ "You can only specify --chown once.\n");
++ return 0;
++ } else {
++ const char *chown = poptGetOptArg(pc);
++ int len;
++ if ((arg = strchr(chown, ':')) != NULL) {
++ if (arg[1] && asprintf(&groupmap, "*:%s", arg+1) < 0)
++ out_of_memory("parse_arguments");
++ len = arg - chown;
++ } else
++ len = strlen(chown);
++ if (len && asprintf(&usermap, "*:%.*s", len, chown) < 0)
++ out_of_memory("parse_arguments");
++ }
++ break;
++
+ case OPT_HELP:
+ usage(FINFO);
+ exit_cleanup(0);
+@@ -2007,6 +2052,18 @@ void server_options(char **args, int *argc_p)