Index: subversion/include/svn_cmdline.h =================================================================== --- subversion/include/svn_cmdline.h (revision 18460) +++ subversion/include/svn_cmdline.h (working copy) @@ -29,6 +29,7 @@ #define APR_WANT_STDIO #endif #include +#include #include "svn_utf.h" #include "svn_auth.h" @@ -247,6 +248,20 @@ void *cancel_baton, apr_pool_t *pool); +/** Wrapper for apr_getopt_init(), which see. + * + * On OS400 V5R4, prior to calling apr_getopt_init(), converts each of the + * @a argc strings in @a argv[] in place from EBCDIC to UTF-8, allocating + * each new UTF-8 string in @a pool. + * + * This is a private API for Subversion's own use. + */ +svn_error_t * +svn_cmdline__getopt_init (apr_getopt_t **os, + apr_pool_t *pool, + int argc, + const char *argv[]); + #ifdef __cplusplus } #endif /* __cplusplus */ Index: subversion/libsvn_subr/cmdline.c =================================================================== --- subversion/libsvn_subr/cmdline.c (revision 18460) +++ subversion/libsvn_subr/cmdline.c (working copy) @@ -46,6 +46,10 @@ #define SVN_UTF_CONTOU_XLATE_HANDLE "svn-utf-contou-xlate-handle" #define SVN_UTF_UTOCON_XLATE_HANDLE "svn-utf-utocon-xlate-handle" +#ifdef AS400_UTF8 +#define SVN_UTF_ETOU_XLATE_HANDLE "svn-utf-etou-xlate-handle" +#endif + /* The stdin encoding. If null, it's the same as the native encoding. */ static const char *input_encoding = NULL; @@ -446,3 +450,30 @@ return SVN_NO_ERROR; } + +svn_error_t * +svn_cmdline__getopt_init(apr_getopt_t **os, + apr_pool_t *pool, + int argc, + const char *argv[]) +{ + apr_status_t apr_err; +#ifdef AS400_UTF8 + /* Convert command line args from EBCDIC to UTF-8. */ + int i; + for (i = 0; i < argc; ++i) + { + char *arg_utf8; + SVN_ERR(svn_utf_cstring_to_utf8_ex(&arg_utf8, argv[i], "0", + SVN_UTF_ETOU_XLATE_HANDLE, + pool)); + argv[i] = arg_utf8; + } +#endif + apr_err = apr_getopt_init (os, pool, argc, argv); + if (apr_err) + return svn_error_wrap_apr (apr_err, + _("Error initializing command line arguments")); + return SVN_NO_ERROR; +} + Index: subversion/svn/main.c =================================================================== --- subversion/svn/main.c (revision 18460) +++ subversion/svn/main.c (working copy) @@ -762,7 +762,7 @@ /*** Main. ***/ int -main (int argc, const char * const *argv) +main(int argc, const char *argv[]) { svn_error_t *err; apr_allocator_t *allocator; @@ -831,7 +831,10 @@ } /* Else, parse options. */ - apr_getopt_init (&os, pool, argc, argv); + err = svn_cmdline__getopt_init (&os, pool, argc, argv); + if (err) + return svn_cmdline_handle_exit_error (err, pool, "svn: "); + os->interleave = 1; while (1) { Index: subversion/svnadmin/main.c =================================================================== --- subversion/svnadmin/main.c (revision 18460) +++ subversion/svnadmin/main.c (working copy) @@ -1136,7 +1136,7 @@ /** Main. **/ int -main (int argc, const char * const *argv) +main(int argc, const char *argv[]) { svn_error_t *err; apr_status_t apr_err; @@ -1190,7 +1190,10 @@ opt_state.end_revision.kind = svn_opt_revision_unspecified; /* Parse options. */ - apr_getopt_init (&os, pool, argc, argv); + err = svn_cmdline__getopt_init (&os, pool, argc, argv); + if (err) + return svn_cmdline_handle_exit_error (err, pool, "svnadmin: "); + os->interleave = 1; while (1) Index: subversion/svndumpfilter/main.c =================================================================== --- subversion/svndumpfilter/main.c (revision 18460) +++ subversion/svndumpfilter/main.c (working copy) @@ -1067,7 +1067,7 @@ /** Main. **/ int -main (int argc, const char * const *argv) +main(int argc, const char *argv[]) { svn_error_t *err; apr_status_t apr_err; @@ -1122,7 +1122,10 @@ opt_state.end_revision.kind = svn_opt_revision_unspecified; /* Parse options. */ - apr_getopt_init (&os, pool, argc, argv); + err = svn_cmdline__getopt_init (&os, pool, argc, argv); + if (err) + return svn_cmdline_handle_exit_error (err, pool, "svndumpfilter: "); + os->interleave = 1; while (1) { Index: subversion/svnlook/main.c =================================================================== --- subversion/svnlook/main.c (revision 18460) +++ subversion/svnlook/main.c (working copy) @@ -1974,7 +1974,7 @@ /*** Main. ***/ int -main (int argc, const char * const *argv) +main(int argc, const char *argv[]) { svn_error_t *err; apr_status_t apr_err; @@ -2027,7 +2027,10 @@ opt_state.rev = SVN_INVALID_REVNUM; /* Parse options. */ - apr_getopt_init (&os, pool, argc, argv); + err = svn_cmdline__getopt_init (&os, pool, argc, argv); + if (err) + return svn_cmdline_handle_exit_error (err, pool, "svnlook: "); + os->interleave = 1; while (1) { Index: subversion/svnserve/main.c =================================================================== --- subversion/svnserve/main.c (revision 18460) +++ subversion/svnserve/main.c (working copy) @@ -256,7 +256,7 @@ } -int main(int argc, const char *const *argv) +int main(int argc, const char *argv[]) { enum run_mode run_mode = run_mode_unspecified; svn_boolean_t foreground = FALSE; @@ -313,7 +313,9 @@ return EXIT_FAILURE; } - apr_getopt_init(&os, pool, argc, argv); + err = svn_cmdline__getopt_init(&os, pool, argc, argv); + if (err) + return svn_cmdline_handle_exit_error (err, pool, "svnserve: "); params.root = "/"; params.tunnel = FALSE; Index: subversion/svnsync/main.c =================================================================== --- subversion/svnsync/main.c (revision 18460) +++ subversion/svnsync/main.c (working copy) @@ -1154,7 +1154,7 @@ } int -main (int argc, const char * const argv[]) +main(int argc, const char *argv[]) { const svn_opt_subcommand_desc_t *subcommand = NULL; apr_array_header_t *received_opts; @@ -1200,7 +1200,9 @@ return EXIT_FAILURE; } - apr_getopt_init (&os, pool, argc, argv); + err = svn_cmdline__getopt_init (&os, pool, argc, argv); + if (err) + return svn_cmdline_handle_exit_error (err, pool, "svnsync: "); os->interleave = 1; Index: subversion/svnversion/main.c =================================================================== --- subversion/svnversion/main.c (revision 18460) +++ subversion/svnversion/main.c (working copy) @@ -163,7 +163,10 @@ } #endif - apr_getopt_init(&os, pool, argc, argv); + err = svn_cmdline__getopt_init(&os, pool, argc, argv); + if (err) + return svn_cmdline_handle_exit_error (err, pool, "svnversion: "); + os->interleave = 1; while (1) {