Hey,

This is my first patch to subversion, so please bear with me.

This looks to address a very commonly requested feature: providing an
alternative for automated tools to provide a password to svn via piping
it in over an fd (similar to gnupg).

One outstanding concern that I couldn't find addressed is clearing out
memory that once contained passwords (like with memset_s or
explicit_bzero). If I missed a technique for doing this that exists in
svn already, please let me know so I can update the diff.

Tested on Fedora 25 x86_64 and OpenBSD 6.1 x86_64.

Please CC me; I'm not on this list.

[[[
Introduce global opt --password-fd to allow applications to provide a
password over an already-opened file descriptor.

* subversion/include/svn_cmdline.h
  (svn_cmdline_create_auth_baton2): Add `auth_password_fd` argument
* subversion/include/svn_error_codes.h
  (SVN_ERR_IO_PIPE_READ_ERROR): Undeprecate, as now used
* subversion/libsvn_subr/cmdline.c
  (read_pass_from_fd): Add static function to get password from a file
descriptor
  (svn_cmdline_create_auth_baton2): Add `auth_password_fd` arg and
trigger read of fd if this arg is not -1
* subversion/libsvn_subr/deprecated.c:
  (svn_cmdline_create_auth_baton): Add default val of -1 when calling
`svn_cmdline_create_auth_baton2`
* subversion/svn/svn.c
  (svn_cl__longopt_t): Add `opt_auth_password_fd` longopt
  (svn_cl__global_options): Add `opt_auth_password_fd` to global options
  (sub_main): Process global option `opt_auth_password_fd` and pass it
to `svn_cmdline_create_auth_baton2`
* subversion/svnmucc/svnmucc.c
  (sub_main): Process global option `opt_auth_password_fd` and pass it
to `svn_cmdline_create_auth_baton2`
* subversion/svnrdump/svnrdump.c
  (svn_svnrdump__longopt_t): add `opt_auth_password_fd`
  (svnrdump__options): add help message for `--password-fd`
  (init_client_context): Pass `auth_password_fd` to
`svn_cmdline_create_auth_baton2`
  (sub_main): Process global option `opt_auth_password_fd` and pass it
to `init_client_context`
* subversion/svnsync/svnsync.c
  (svnsync__opt): Add `svnsync_opt_source_password_fd` and
`svnsync_opt_sync_password_fd`
  (svnsync_options): Add help messages for `--source-password-fd` and
`--sync-password-fd`
  (opt_baton_t): Add `source_password_fd` and `sync_password_fd`
  (sub_main): Process global option `--source-password-fd` and
`--sync-password-fd` and pass it to `svn_cmdline_create_auth_baton2`
invocations
* subversion/tests/cmdline/atomic-ra-revprop-change.c
  (construct_auth_baton): Pass -1 as the `auth_password_fd`
* subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout
  (): Add new `--password-fd` option to expected output
* subversion/tests/libsvn_ra/ra-test.c
  (check_tunnel_callback_test): Pass -1 as the `auth_password_fd`
  (tunnel_callback_test): Pass -1 as the `auth_password_fd`
  (tunnel_run_checkout): Pass -1 as the `auth_password_fd`
* subversion/tests/svn_test_main.c
  (svn_test__init_auth_baton): Pass -1 as the `auth_password_fd`
* tools/client-side/svn-mergeinfo-normalizer/mergeinfo-normalizer.h
  (svn_min__opt_state_t): Add `auth_password_fd`
* tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c
  (svn_min__longopt_t) Add `opt_auth_password_fd`
  (sub_main) Process global option `--password-fd` and pass it to
`svn_cmdline_create_auth_baton2` invocations
* tools/client-side/svnconflict/svnconflict.c
  (svnconflict_opt_state_t): Add `auth_password_fd`
  (svnconflict_options): Add `--password-fd` documentation
  (svnconflict_global_options): Add `opt_auth_password_fd`
  (sub_main): Process global option `--password-fd` and pass it to
`svn_cmdline_create_auth_baton2` invocations
* tools/dev/svnmover/svnmover.c
  (sub_main): Process global option `--password-fd` and pass it to
`svn_cmdline_create_auth_baton2` invocations
]]]
Index: subversion/include/svn_cmdline.h
===================================================================
--- subversion/include/svn_cmdline.h	(revisión: 1808405)
+++ subversion/include/svn_cmdline.h	(copia de trabajo)
@@ -356,6 +356,7 @@ svn_cmdline_create_auth_baton2(svn_auth_baton_t **
                                svn_boolean_t non_interactive,
                                const char *username,
                                const char *password,
+                               int password_fd,
                                const char *config_dir,
                                svn_boolean_t no_auth_cache,
                                svn_boolean_t trust_server_cert_unknown_ca,
Index: subversion/include/svn_error_codes.h
===================================================================
--- subversion/include/svn_error_codes.h	(revisión: 1808405)
+++ subversion/include/svn_error_codes.h	(copia de trabajo)
@@ -296,7 +296,6 @@ SVN_ERROR_START
              SVN_ERR_IO_CATEGORY_START + 4,
              "Framing error in pipe protocol")
 
-  /** @deprecated Unused, slated for removal in the next major release. */
   SVN_ERRDEF(SVN_ERR_IO_PIPE_READ_ERROR,
              SVN_ERR_IO_CATEGORY_START + 5,
              "Read error in pipe")
Index: subversion/libsvn_subr/cmdline.c
===================================================================
--- subversion/libsvn_subr/cmdline.c	(revisión: 1808405)
+++ subversion/libsvn_subr/cmdline.c	(copia de trabajo)
@@ -516,6 +516,39 @@ struct trust_server_cert_non_interactive_baton {
   svn_boolean_t trust_server_cert_other_failure;
 };
 
+static svn_error_t *
+read_pass_from_fd(int fd, const char **password, apr_pool_t *pool)
+{
+  SVN_ERR_ASSERT(fd != -1);
+
+  svn_error_t *err = SVN_NO_ERROR;
+  size_t password_size = 0;
+  ssize_t password_len = 0;
+  char *ret = NULL;
+  FILE *desc = NULL;
+  svn_stringbuf_t *password_str = NULL;
+
+  if (! (desc = fdopen(fd, "r")))
+    {
+      return svn_error_create(SVN_ERR_IO_PIPE_READ_ERROR, NULL, NULL);
+    }
+
+  if ((password_len = getline(&ret, &password_size, desc)) == -1)
+    {
+      err = svn_error_create(SVN_ERR_IO_PIPE_READ_ERROR, NULL, NULL);
+      goto cleanup;
+    }
+
+  password_str = svn_stringbuf_create(ret, pool);
+  svn_stringbuf_chop(password_str, 1);
+  *password = password_str->data;
+
+ cleanup:
+  free(ret);
+
+  return err;
+}
+
 /* This implements 'svn_auth_ssl_server_trust_prompt_func_t'.
 
    Don't actually prompt.  Instead, set *CRED_P to valid credentials
@@ -567,6 +600,7 @@ svn_cmdline_create_auth_baton2(svn_auth_baton_t **
                                svn_boolean_t non_interactive,
                                const char *auth_username,
                                const char *auth_password,
+                               int auth_password_fd,
                                const char *config_dir,
                                svn_boolean_t no_auth_cache,
                                svn_boolean_t trust_server_cert_unknown_ca,
@@ -584,6 +618,7 @@ svn_cmdline_create_auth_baton2(svn_auth_baton_t **
   svn_boolean_t store_auth_creds_val = TRUE;
   svn_auth_provider_object_t *provider;
   svn_cmdline_prompt_baton2_t *pb = NULL;
+  const char *password = NULL;
 
   /* The whole list of registered providers */
   apr_array_header_t *providers;
@@ -701,8 +736,14 @@ svn_cmdline_create_auth_baton2(svn_auth_baton_t **
   /* Build an authentication baton to give to libsvn_client. */
   svn_auth_open(ab, providers, pool);
 
-  /* Place any default --username or --password credentials into the
-     auth_baton's run-time parameter hash. */
+  /* need to audit for places I set it to 0 */
+  if (auth_password_fd != -1 && auth_password == NULL)
+    {
+      SVN_ERR(read_pass_from_fd(auth_password_fd, &password, pool));
+    }
+
+  /* Place any default --username, --password or credentials read from password
+     fd into the auth_baton's run-time parameter hash. */
   if (auth_username)
     svn_auth_set_parameter(*ab, SVN_AUTH_PARAM_DEFAULT_USERNAME,
                            auth_username);
@@ -709,6 +750,9 @@ svn_cmdline_create_auth_baton2(svn_auth_baton_t **
   if (auth_password)
     svn_auth_set_parameter(*ab, SVN_AUTH_PARAM_DEFAULT_PASSWORD,
                            auth_password);
+  else if (password)
+    svn_auth_set_parameter(*ab, SVN_AUTH_PARAM_DEFAULT_PASSWORD,
+                           password);
 
   /* Same with the --non-interactive option. */
   if (non_interactive)
Index: subversion/libsvn_subr/deprecated.c
===================================================================
--- subversion/libsvn_subr/deprecated.c	(revisión: 1808405)
+++ subversion/libsvn_subr/deprecated.c	(copia de trabajo)
@@ -1573,6 +1573,7 @@ svn_cmdline_create_auth_baton(svn_auth_baton_t **a
                                                         non_interactive,
                                                         auth_username,
                                                         auth_password,
+                                                        -1,
                                                         config_dir,
                                                         no_auth_cache,
                                                         trust_server_cert,
Index: subversion/svn/cl.h
===================================================================
--- subversion/svn/cl.h	(revisión: 1808405)
+++ subversion/svn/cl.h	(copia de trabajo)
@@ -178,6 +178,7 @@ typedef struct svn_cl__opt_state_t
   svn_boolean_t help;            /* print usage message */
   const char *auth_username;     /* auth username */
   const char *auth_password;     /* auth password */
+  int auth_password_fd;          /* fd to read password from */
   const char *extensions;        /* subprocess extension args */
   apr_array_header_t *targets;   /* target list from file */
   svn_boolean_t xml;             /* output in xml, e.g., "svn log --xml" */
Index: subversion/svn/svn.c
===================================================================
--- subversion/svn/svn.c	(revisión: 1808405)
+++ subversion/svn/svn.c	(copia de trabajo)
@@ -68,6 +68,7 @@
    use the short option letter as identifier.  */
 typedef enum svn_cl__longopt_t {
   opt_auth_password = SVN_OPT_FIRST_LONGOPT_ID,
+  opt_auth_password_fd,
   opt_auth_username,
   opt_autoprops,
   opt_changelist,
@@ -200,6 +201,8 @@ const apr_getopt_option_t svn_cl__options[] =
                     N_("specify a password ARG (caution: on many operating\n"
                        "                             "
                        "systems, other users will be able to see this)")},
+  {"password-fd",   opt_auth_password_fd, 1,
+                    N_("specify an fd to read a password from ARG")},
   {"extensions",    'x', 1,
                     N_("Specify differencing options for external diff or\n"
                        "                             "
@@ -495,7 +498,8 @@ const apr_getopt_option_t svn_cl__options[] =
    command to take these arguments allows scripts to just pass them
    willy-nilly to every invocation of 'svn') . */
 const int svn_cl__global_options[] =
-{ opt_auth_username, opt_auth_password, opt_no_auth_cache, opt_non_interactive,
+{ opt_auth_username, opt_auth_password, opt_auth_password_fd,
+  opt_no_auth_cache, opt_non_interactive,
   opt_force_interactive, opt_trust_server_cert,
   opt_trust_server_cert_failures,
   opt_config_dir, opt_config_options, 0
@@ -1991,6 +1995,7 @@ sub_main(int *exit_code, int argc, const char *arg
   opt_state.set_depth = svn_depth_unknown;
   opt_state.accept_which = svn_cl__accept_unspecified;
   opt_state.show_revs = svn_cl__show_revs_invalid;
+  opt_state.auth_password_fd = -1;
 
   /* No args?  Show usage. */
   if (argc <= 1)
@@ -2251,6 +2256,9 @@ sub_main(int *exit_code, int argc, const char *arg
         SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password,
                                         opt_arg, pool));
         break;
+      case opt_auth_password_fd:
+        SVN_ERR(svn_cstring_atoi(&opt_state.auth_password_fd, opt_arg));
+        break;
       case opt_encoding:
         opt_state.encoding = apr_pstrdup(pool, opt_arg);
         break;
@@ -3044,6 +3052,7 @@ sub_main(int *exit_code, int argc, const char *arg
             opt_state.non_interactive,
             opt_state.auth_username,
             opt_state.auth_password,
+            opt_state.auth_password_fd,
             opt_state.config_dir,
             opt_state.no_auth_cache,
             opt_state.trust_server_cert_unknown_ca,
Index: subversion/svnbench/cl.h
===================================================================
--- subversion/svnbench/cl.h	(revisión: 1808405)
+++ subversion/svnbench/cl.h	(copia de trabajo)
@@ -80,6 +80,7 @@ typedef struct svn_cl__opt_state_t
   svn_boolean_t help;            /* print usage message */
   const char *auth_username;     /* auth username */ /* UTF-8! */
   const char *auth_password;     /* auth password */ /* UTF-8! */
+  int auth_password_fd;          /* auth password fd */
   apr_array_header_t *targets;   /* target list from file */ /* UTF-8! */
   svn_boolean_t no_auth_cache;   /* do not cache authentication information */
   svn_boolean_t stop_on_copy;    /* don't cross copies during processing */
Index: subversion/svnbench/svnbench.c
===================================================================
--- subversion/svnbench/svnbench.c	(revisión: 1808405)
+++ subversion/svnbench/svnbench.c	(copia de trabajo)
@@ -53,6 +53,7 @@
    use the short option letter as identifier.  */
 typedef enum svn_cl__longopt_t {
   opt_auth_password = SVN_OPT_FIRST_LONGOPT_ID,
+  opt_auth_password_fd,
   opt_auth_username,
   opt_config_dir,
   opt_config_options,
@@ -112,6 +113,7 @@ const apr_getopt_option_t svn_cl__options[] =
   {"verbose",       'v', 0, N_("print extra information")},
   {"username",      opt_auth_username, 1, N_("specify a username ARG")},
   {"password",      opt_auth_password, 1, N_("specify a password ARG")},
+  {"password-fd",   opt_auth_password_fd, 1, N_("specify a password-fd ARG")},
   {"targets",       opt_targets, 1,
                     N_("pass contents of file ARG as additional args")},
   {"depth",         opt_depth, 1,
@@ -197,7 +199,8 @@ const apr_getopt_option_t svn_cl__options[] =
    command to take these arguments allows scripts to just pass them
    willy-nilly to every invocation of 'svn') . */
 const int svn_cl__global_options[] =
-{ opt_auth_username, opt_auth_password, opt_no_auth_cache, opt_non_interactive,
+{ opt_auth_username, opt_auth_password, opt_auth_password_fd,
+  opt_no_auth_cache, opt_non_interactive,
   opt_trust_server_cert, opt_trust_server_cert_failures,
   opt_config_dir, opt_config_options, 0
 };
@@ -420,6 +423,7 @@ sub_main(int *exit_code, int argc, const char *arg
   opt_state.revision_ranges =
     apr_array_make(pool, 0, sizeof(svn_opt_revision_range_t *));
   opt_state.depth = svn_depth_unknown;
+  opt_state.auth_password_fd = -1;
 
   /* No args?  Show usage. */
   if (argc <= 1)
@@ -625,6 +629,9 @@ sub_main(int *exit_code, int argc, const char *arg
         SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password,
                                             opt_arg, pool));
         break;
+      case opt_auth_password_fd:
+        SVN_ERR(svn_cstring_atoi(&opt_state.auth_password_fd, opt_arg));
+        break;
       case opt_stop_on_copy:
         opt_state.stop_on_copy = TRUE;
         break;
@@ -929,6 +936,7 @@ sub_main(int *exit_code, int argc, const char *arg
             opt_state.non_interactive,
             opt_state.auth_username,
             opt_state.auth_password,
+            opt_state.auth_password_fd,
             opt_state.config_dir,
             opt_state.no_auth_cache,
             opt_state.trust_server_cert_unknown_ca,
Index: subversion/svnmucc/svnmucc.c
===================================================================
--- subversion/svnmucc/svnmucc.c	(revisión: 1808405)
+++ subversion/svnmucc/svnmucc.c	(copia de trabajo)
@@ -480,7 +480,8 @@ sub_main(int *exit_code, int argc, const char *arg
     non_interactive_opt,
     force_interactive_opt,
     trust_server_cert_opt,
-    trust_server_cert_failures_opt
+    trust_server_cert_failures_opt,
+    password_fd_opt
   };
   static const apr_getopt_option_t options[] = {
     {"message", 'm', 1, ""},
@@ -487,6 +488,7 @@ sub_main(int *exit_code, int argc, const char *arg
     {"file", 'F', 1, ""},
     {"username", 'u', 1, ""},
     {"password", 'p', 1, ""},
+    {"password-fd", password_fd_opt, 1, ""},
     {"root-url", 'U', 1, ""},
     {"revision", 'r', 1, ""},
     {"with-revprop",  with_revprop_opt, 1, ""},
@@ -527,6 +529,7 @@ sub_main(int *exit_code, int argc, const char *arg
   svn_client_ctx_t *ctx;
   struct log_message_baton lmb;
   int i;
+  int password_fd = -1;
 
   /* Check library versions */
   SVN_ERR(check_lib_versions());
@@ -572,6 +575,8 @@ sub_main(int *exit_code, int argc, const char *arg
         case 'p':
           password = apr_pstrdup(pool, arg);
           break;
+        case password_fd_opt:
+          SVN_ERR(svn_cstring_atoi(&password_fd, arg));
         case 'U':
           SVN_ERR(svn_utf_cstring_to_utf8(&root_url, arg, pool));
           if (! svn_path_is_url(root_url))
@@ -729,6 +734,7 @@ sub_main(int *exit_code, int argc, const char *arg
             non_interactive,
             username,
             password,
+            password_fd,
             config_dir,
             no_auth_cache,
             trust_unknown_ca,
Index: subversion/svnrdump/svnrdump.c
===================================================================
--- subversion/svnrdump/svnrdump.c	(revisión: 1808405)
+++ subversion/svnrdump/svnrdump.c	(copia de trabajo)
@@ -59,6 +59,7 @@ enum svn_svnrdump__longopt_t
     opt_config_option,
     opt_auth_username,
     opt_auth_password,
+    opt_auth_password_fd,
     opt_auth_nocache,
     opt_non_interactive,
     opt_skip_revprop,
@@ -73,6 +74,7 @@ enum svn_svnrdump__longopt_t
                                    opt_config_option, \
                                    opt_auth_username, \
                                    opt_auth_password, \
+                                   opt_auth_password_fd, \
                                    opt_auth_nocache, \
                                    opt_trust_server_cert, \
                                    opt_trust_server_cert_failures, \
@@ -114,6 +116,8 @@ static const apr_getopt_option_t svnrdump__options
                       N_("specify a username ARG")},
     {"password",      opt_auth_password, 1,
                       N_("specify a password ARG")},
+    {"password-fd",   opt_auth_password, 1,
+                      N_("specify a password fd ARG")},
     {"non-interactive", opt_non_interactive, 0,
                       N_("do no interactive prompting (default is to prompt\n"
                          "                             "
@@ -294,6 +298,7 @@ init_client_context(svn_client_ctx_t **ctx_p,
                     svn_boolean_t non_interactive,
                     const char *username,
                     const char *password,
+                    int password_fd,
                     const char *config_dir,
                     const char *repos_url,
                     svn_boolean_t no_auth_cache,
@@ -366,7 +371,8 @@ init_client_context(svn_client_ctx_t **ctx_p,
 
   /* Default authentication providers for non-interactive use */
   SVN_ERR(svn_cmdline_create_auth_baton2(&(ctx->auth_baton), non_interactive,
-                                         username, password, config_dir,
+                                         username, password, password_fd,
+                                         config_dir,
                                          no_auth_cache, trust_unknown_ca,
                                          trust_cn_mismatch, trust_expired,
                                          trust_not_yet_valid,
@@ -760,6 +766,7 @@ sub_main(int *exit_code, int argc, const char *arg
   const char *config_dir = NULL;
   const char *username = NULL;
   const char *password = NULL;
+  int password_fd = -1;
   svn_boolean_t no_auth_cache = FALSE;
   svn_boolean_t trust_unknown_ca = FALSE;
   svn_boolean_t trust_cn_mismatch = FALSE;
@@ -850,6 +857,8 @@ sub_main(int *exit_code, int argc, const char *arg
         case opt_auth_password:
           SVN_ERR(svn_utf_cstring_to_utf8(&password, opt_arg, pool));
           break;
+        case opt_auth_password_fd:
+          SVN_ERR(svn_cstring_atoi(&password_fd, opt_arg));
         case opt_auth_nocache:
           no_auth_cache = TRUE;
           break;
@@ -1046,6 +1055,7 @@ sub_main(int *exit_code, int argc, const char *arg
                               non_interactive,
                               username,
                               password,
+                              password_fd,
                               config_dir,
                               opt_baton->url,
                               no_auth_cache,
Index: subversion/svnsync/svnsync.c
===================================================================
--- subversion/svnsync/svnsync.c	(revisión: 1808405)
+++ subversion/svnsync/svnsync.c	(copia de trabajo)
@@ -59,8 +59,10 @@ enum svnsync__opt {
   svnsync_opt_auth_password,
   svnsync_opt_source_username,
   svnsync_opt_source_password,
+  svnsync_opt_source_password_fd,
   svnsync_opt_sync_username,
   svnsync_opt_sync_password,
+  svnsync_opt_sync_password_fd,
   svnsync_opt_config_dir,
   svnsync_opt_config_options,
   svnsync_opt_source_prop_encoding,
@@ -84,8 +86,10 @@ enum svnsync__opt {
                              svnsync_opt_trust_server_cert_failures_dst, \
                              svnsync_opt_source_username, \
                              svnsync_opt_source_password, \
+                             svnsync_opt_source_password_fd, \
                              svnsync_opt_sync_username, \
                              svnsync_opt_sync_password, \
+                             svnsync_opt_sync_password_fd, \
                              svnsync_opt_config_dir, \
                              svnsync_opt_config_options
 
@@ -240,10 +244,14 @@ static const apr_getopt_option_t svnsync_options[]
                        N_("connect to source repository with username ARG") },
     {"source-password", svnsync_opt_source_password, 1,
                        N_("connect to source repository with password ARG") },
+    {"source-password-fd", svnsync_opt_source_password_fd, 1,
+                       N_("connect to source repository with password from fd ARG") },
     {"sync-username",  svnsync_opt_sync_username, 1,
                        N_("connect to sync repository with username ARG") },
     {"sync-password",  svnsync_opt_sync_password, 1,
                        N_("connect to sync repository with password ARG") },
+    {"source-password-fd", svnsync_opt_sync_password_fd, 1,
+                       N_("connect to sync repository with password from fd ARG") },
     {"config-dir",     svnsync_opt_config_dir, 1,
                        N_("read user configuration files from directory ARG")},
     {"config-option",  svnsync_opt_config_options, 1,
@@ -301,8 +309,10 @@ typedef struct opt_baton_t {
   svn_auth_baton_t *sync_auth_baton;
   const char *source_username;
   const char *source_password;
+  int source_password_fd;
   const char *sync_username;
   const char *sync_password;
+  int sync_password_fd;
   const char *config_dir;
   apr_hash_t *config;
   const char *source_prop_encoding;
@@ -1973,6 +1983,7 @@ sub_main(int *exit_code, int argc, const char *arg
   apr_array_header_t *config_options = NULL;
   const char *source_prop_encoding = NULL;
   svn_boolean_t force_interactive = FALSE;
+  int source_password_fd = -1, sync_password_fd = -1;
 
   /* Check library versions */
   SVN_ERR(check_lib_versions());
@@ -2071,6 +2082,10 @@ sub_main(int *exit_code, int argc, const char *arg
             opt_err = svn_utf_cstring_to_utf8(&source_password, opt_arg, pool);
             break;
 
+          case svnsync_opt_source_password_fd:
+            opt_err = svn_cstring_atoi(&source_password_fd, opt_arg);
+            break;
+
           case svnsync_opt_sync_username:
             opt_err = svn_utf_cstring_to_utf8(&sync_username, opt_arg, pool);
             break;
@@ -2079,6 +2094,10 @@ sub_main(int *exit_code, int argc, const char *arg
             opt_err = svn_utf_cstring_to_utf8(&sync_password, opt_arg, pool);
             break;
 
+        case svnsync_opt_sync_password_fd:
+          opt_err = svn_cstring_atoi(&sync_password_fd, opt_arg);
+          break;
+
           case svnsync_opt_config_dir:
             {
               const char *path;
@@ -2229,8 +2248,10 @@ sub_main(int *exit_code, int argc, const char *arg
     }
   opt_baton.source_username = source_username;
   opt_baton.source_password = source_password;
+  opt_baton.source_password_fd = source_password_fd;
   opt_baton.sync_username = sync_username;
   opt_baton.sync_password = sync_password;
+  opt_baton.sync_password_fd = sync_password_fd;
 
   /* Disallow mixing of --steal-lock and --disable-locking. */
   if (opt_baton.steal_lock && opt_baton.disable_locking)
@@ -2351,6 +2372,7 @@ sub_main(int *exit_code, int argc, const char *arg
           opt_baton.non_interactive,
           opt_baton.source_username,
           opt_baton.source_password,
+          opt_baton.source_password_fd,
           opt_baton.config_dir,
           opt_baton.no_auth_cache,
           opt_baton.src_trust.trust_server_cert_unknown_ca,
@@ -2367,6 +2389,7 @@ sub_main(int *exit_code, int argc, const char *arg
             opt_baton.non_interactive,
             opt_baton.sync_username,
             opt_baton.sync_password,
+            opt_baton.sync_password_fd,
             opt_baton.config_dir,
             opt_baton.no_auth_cache,
             opt_baton.dst_trust.trust_server_cert_unknown_ca,
Index: subversion/tests/cmdline/atomic-ra-revprop-change.c
===================================================================
--- subversion/tests/cmdline/atomic-ra-revprop-change.c	(revisión: 1808405)
+++ subversion/tests/cmdline/atomic-ra-revprop-change.c	(copia de trabajo)
@@ -60,7 +60,7 @@ construct_auth_baton(svn_auth_baton_t **auth_baton
 {
   SVN_ERR(svn_cmdline_create_auth_baton2(auth_baton_p,
                                          TRUE  /* non_interactive */,
-                                         "jrandom", "rayjandom",
+                                         "jrandom", "rayjandom", -1,
                                          config_dir,
                                          TRUE  /* no_auth_cache */,
                                          FALSE /* trust_server_cert */,
Index: subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout
===================================================================
--- subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout	(revisión: 1808405)
+++ subversion/tests/cmdline/getopt_tests_data/svn_help_log_switch_stdout	(copia de trabajo)
@@ -134,6 +134,7 @@ Global options:
   --username ARG           : specify a username ARG
   --password ARG           : specify a password ARG (caution: on many operating
                              systems, other users will be able to see this)
+  --password-fd ARG        : specify an fd to read a password from ARG
   --no-auth-cache          : do not cache authentication tokens
   --non-interactive        : do no interactive prompting (default is to prompt
                              only if standard input is a terminal device)
@@ -224,6 +225,7 @@ Global options:
   --username ARG           : specify a username ARG
   --password ARG           : specify a password ARG (caution: on many operating
                              systems, other users will be able to see this)
+  --password-fd ARG        : specify an fd to read a password from ARG
   --no-auth-cache          : do not cache authentication tokens
   --non-interactive        : do no interactive prompting (default is to prompt
                              only if standard input is a terminal device)
Index: subversion/tests/libsvn_ra/ra-test.c
===================================================================
--- subversion/tests/libsvn_ra/ra-test.c	(revisión: 1808405)
+++ subversion/tests/libsvn_ra/ra-test.c	(copia de trabajo)
@@ -344,7 +344,7 @@ check_tunnel_callback_test(const svn_test_opts_t *
   cbtable->tunnel_baton = b;
   SVN_ERR(svn_cmdline_create_auth_baton2(&cbtable->auth_baton,
                                          TRUE  /* non_interactive */,
-                                         "jrandom", "rayjandom",
+                                         "jrandom", "rayjandom", -1,
                                          NULL,
                                          TRUE  /* no_auth_cache */,
                                          FALSE /* trust_server_cert */,
@@ -387,7 +387,7 @@ tunnel_callback_test(const svn_test_opts_t *opts,
   cbtable->tunnel_baton = b;
   SVN_ERR(svn_cmdline_create_auth_baton2(&cbtable->auth_baton,
                                          TRUE  /* non_interactive */,
-                                         "jrandom", "rayjandom",
+                                         "jrandom", "rayjandom", -1,
                                          NULL,
                                          TRUE  /* no_auth_cache */,
                                          FALSE /* trust_server_cert */,
@@ -1557,7 +1557,7 @@ tunnel_run_checkout(const svn_test_opts_t *opts,
   cbtable->tunnel_baton = b;
   SVN_ERR(svn_cmdline_create_auth_baton2(&cbtable->auth_baton,
     TRUE  /* non_interactive */,
-    "jrandom", "rayjandom",
+    "jrandom", "rayjandom", -1,
     NULL,
     TRUE  /* no_auth_cache */,
     FALSE /* trust_server_cert */,
Index: subversion/tests/svn_test_main.c
===================================================================
--- subversion/tests/svn_test_main.c	(revisión: 1808405)
+++ subversion/tests/svn_test_main.c	(copia de trabajo)
@@ -754,7 +754,7 @@ svn_test__init_auth_baton(svn_auth_baton_t **ab,
 
   SVN_ERR(svn_cmdline_create_auth_baton2(ab,
                                          TRUE  /* non_interactive */,
-                                         "jrandom", "rayjandom",
+                                         "jrandom", "rayjandom", -1,
                                          NULL,
                                          TRUE  /* no_auth_cache */,
                                          TRUE /* trust_server_cert_unkown_ca */,
Index: tools/client-side/svn-mergeinfo-normalizer/mergeinfo-normalizer.h
===================================================================
--- tools/client-side/svn-mergeinfo-normalizer/mergeinfo-normalizer.h	(revisión: 1808405)
+++ tools/client-side/svn-mergeinfo-normalizer/mergeinfo-normalizer.h	(copia de trabajo)
@@ -56,6 +56,7 @@ typedef struct svn_min__opt_state_t
   svn_boolean_t help;            /* print usage message */
   const char *auth_username;     /* auth username */
   const char *auth_password;     /* auth password */
+  int auth_password_fd;          /* auth password fd */
   apr_array_header_t *targets;
   svn_boolean_t no_auth_cache;   /* do not cache authentication information */
   svn_boolean_t dry_run;         /* try operation but make no changes */
Index: tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c
===================================================================
--- tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c	(revisión: 1808405)
+++ tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c	(copia de trabajo)
@@ -68,6 +68,7 @@
    use the short option letter as identifier.  */
 typedef enum svn_min__longopt_t {
   opt_auth_password = SVN_OPT_FIRST_LONGOPT_ID,
+  opt_auth_password_fd,
   opt_auth_username,
   opt_config_dir,
   opt_config_options,
@@ -113,6 +114,8 @@ const apr_getopt_option_t svn_min__options[] =
                     N_("specify a password ARG (caution: on many operating\n"
                        "                             "
                        "systems, other users will be able to see this)")},
+  {"password-fd",   opt_auth_password_fd, 1,
+                    N_("specify an fd to read a password from")},
   {"targets",       opt_targets, 1,
                     N_("pass contents of file ARG as additional args")},
   {"depth",         opt_depth, 1,
@@ -419,6 +422,7 @@ sub_main(int *exit_code, int argc, const char *arg
   apr_hash_t *cfg_hash;
 
   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+  opt_state.auth_password_fd = -1;
 
   /* Check library versions */
   SVN_ERR(check_lib_versions());
@@ -528,6 +532,9 @@ sub_main(int *exit_code, int argc, const char *arg
         SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password,
                                         opt_arg, pool));
         break;
+      case opt_auth_password_fd:
+        SVN_ERR(svn_cstring_atoi(&opt_state.auth_password_fd, opt_arg));
+        break;
       case opt_no_auth_cache:
         opt_state.no_auth_cache = TRUE;
         break;
@@ -825,6 +832,7 @@ sub_main(int *exit_code, int argc, const char *arg
             opt_state.non_interactive,
             opt_state.auth_username,
             opt_state.auth_password,
+            opt_state.auth_password_fd,
             opt_state.config_dir,
             opt_state.no_auth_cache,
             opt_state.trust_server_cert_unknown_ca,
Index: tools/client-side/svnconflict/svnconflict.c
===================================================================
--- tools/client-side/svnconflict/svnconflict.c	(revisión: 1808405)
+++ tools/client-side/svnconflict/svnconflict.c	(copia de trabajo)
@@ -60,6 +60,7 @@ typedef struct svnconflict_opt_state_t {
   svn_boolean_t help;            /* print usage message */
   const char *auth_username;     /* auth username */
   const char *auth_password;     /* auth password */
+  int auth_password_fd;          /* auth password fd */
   const char *config_dir;        /* over-riding configuration directory */
   apr_array_header_t *config_options; /* over-riding configuration options */
 } svnconflict_opt_state_t;
@@ -78,6 +79,7 @@ typedef struct svnconflict_cmd_baton_t
    use the short option letter as identifier.  */
 typedef enum svnconflict_longopt_t {
   opt_auth_password = SVN_OPT_FIRST_LONGOPT_ID,
+  opt_auth_password_fd,
   opt_auth_username,
   opt_config_dir,
   opt_config_options,
@@ -96,6 +98,8 @@ static const apr_getopt_option_t svnconflict_optio
                     N_("specify a password ARG (caution: on many operating\n"
                        "                             "
                        "systems, other users will be able to see this)")},
+  {"password-fd",   opt_auth_password_fd, 1,
+                    N_("specify an fd to read a password from ARG")},
   {"config-dir",    opt_config_dir, 1,
                     N_("read user configuration files from directory ARG")},
   {"config-option", opt_config_options, 1,
@@ -141,7 +145,8 @@ static svn_error_t * svnconflict_resolve_tree(apr_
 
 /* Options that apply to all commands. */
 static const int svnconflict_global_options[] =
-{ opt_auth_username, opt_auth_password, opt_config_dir, opt_config_options, 0 };
+{ opt_auth_username, opt_auth_password, opt_auth_password_fd,
+  opt_config_dir, opt_config_options, 0 };
 
 static const svn_opt_subcommand_desc2_t svnconflict_cmd_table[] =
 {
@@ -641,6 +646,7 @@ sub_main(int *exit_code, int argc, const char *arg
   apr_hash_t *cfg_hash;
 
   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+  opt_state.auth_password_fd = -1;
 
   /* Check library versions */
   SVN_ERR(check_lib_versions());
@@ -704,6 +710,9 @@ sub_main(int *exit_code, int argc, const char *arg
         SVN_ERR(svn_utf_cstring_to_utf8(&opt_state.auth_password,
                                         opt_arg, pool));
         break;
+      case opt_auth_password_fd:
+        SVN_ERR(svn_cstring_atoi(&opt_state.auth_password_fd, opt_arg));
+        break;
       case opt_config_dir:
         SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
         opt_state.config_dir = svn_dirent_internal_style(utf8_opt_arg, pool);
@@ -856,6 +865,7 @@ sub_main(int *exit_code, int argc, const char *arg
             TRUE, /* non-interactive */
             opt_state.auth_username,
             opt_state.auth_password,
+            opt_state.auth_password_fd,
             opt_state.config_dir,
             TRUE, /* no auth cache */
             FALSE, FALSE, FALSE, FALSE, FALSE, /* reject invalid SSL certs */
Index: tools/dev/svnmover/svnmover.c
===================================================================
--- tools/dev/svnmover/svnmover.c	(revisión: 1808405)
+++ tools/dev/svnmover/svnmover.c	(copia de trabajo)
@@ -4332,7 +4332,8 @@ sub_main(int *exit_code, int argc, const char *arg
     trust_server_cert_opt,
     trust_server_cert_failures_opt,
     ui_opt,
-    colour_opt
+    colour_opt,
+    auth_password_fd_opt
   };
   static const apr_getopt_option_t options[] = {
     {"verbose", 'v', 0, ""},
@@ -4341,6 +4342,7 @@ sub_main(int *exit_code, int argc, const char *arg
     {"file", 'F', 1, ""},
     {"username", 'u', 1, ""},
     {"password", 'p', 1, ""},
+    {"password-fd", auth_password_fd_opt, 1, ""},
     {"root-url", 'U', 1, ""},
     {"revision", 'r', 1, ""},
     {"branch-id", 'B', 1, ""},
@@ -4387,6 +4389,7 @@ sub_main(int *exit_code, int argc, const char *arg
   const char *log_msg;
   svn_tristate_t coloured_output = svn_tristate_false;
   svnmover_wc_t *wc;
+  int password_fd = -1;
 
   /* Check library versions */
   SVN_ERR(check_lib_versions());
@@ -4431,6 +4434,9 @@ sub_main(int *exit_code, int argc, const char *arg
         case 'p':
           password = apr_pstrdup(pool, arg);
           break;
+        case auth_password_fd_opt:
+          password_fd = svn_cstring_atoi(&password_fd, arg);
+          break;
         case 'U':
           SVN_ERR(svn_utf_cstring_to_utf8(&anchor_url, arg, pool));
           if (! svn_path_is_url(anchor_url))
@@ -4587,6 +4593,7 @@ sub_main(int *exit_code, int argc, const char *arg
                                          non_interactive,
                                          username,
                                          password,
+                                         password_fd,
                                          config_dir,
                                          no_auth_cache,
                                          trust_unknown_ca,

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to