On Thu, Dec 16, 2010 at 11:18 AM, <cmpil...@apache.org> wrote: > Author: cmpilato > Date: Thu Dec 16 17:18:43 2010 > New Revision: 1050061 > > URL: http://svn.apache.org/viewvc?rev=1050061&view=rev > Log: > Rev the svn_io_start_cmd() API, adding pipe support. > > * subversion/libsvn_subr/io.c > (svn_io_start_cmd2): New revision of svn_io_start_cmd(), adding > booleans to indicate where pipes should be used instead of file > handles. > (svn_io_start_cmd): Moved to deprecated.c. > > * subversion/libsvn_subr/deprecated.c > (svn_io_start_cmd): Moved here from io.c, and reduced to a mere > wrapper around svn_io_start_cmd2(). > > * subversion/include/svn_io.h > (svn_io_start_cmd2): New revision of svn_io_start_cmd2(). > (svn_io_start_cmd): Deprecate this function. > > Patch by: Martin Furter <m...@rola.ch> > (Tweaked by cmpilato.) > > Modified: > subversion/trunk/subversion/include/svn_io.h > subversion/trunk/subversion/libsvn_subr/deprecated.c > subversion/trunk/subversion/libsvn_subr/io.c > > Modified: subversion/trunk/subversion/include/svn_io.h > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_io.h?rev=1050061&r1=1050060&r2=1050061&view=diff > ============================================================================== > --- subversion/trunk/subversion/include/svn_io.h (original) > +++ subversion/trunk/subversion/include/svn_io.h Thu Dec 16 17:18:43 2010 > @@ -1484,9 +1484,17 @@ svn_io_dir_walk(const char *dirname, > > /** > * Start @a cmd with @a args, using utf8-encoded @a path as working > - * directory. Connect @a cmd's stdin, stdout, and stderr to @a infile, > - * @a outfile, and @a errfile, except where they are NULL. Return the > - * process handle for the invoked program in @a *cmd_proc. > + * directory. Return the process handle for the invoked program in @a > + * *cmd_proc. > + * > + * If @a infile_pipe is TRUE, connect @a cmd's stdin to a pipe; > + * otherwise, connect it to @a infile (which may be NULL). If > + * @a outfile_pipe is TRUE, connect @a cmd's stdout to a pipe; otherwise, > + * connect it to @a outfile (which may be NULL). If @a errfile_pipe > + * is TRUE, connect @a cmd's stderr to a pipe; otherwise, connect it > + * to @a errfile (which may be NULL). (Callers must pass FALSE for > + * each of these boolean values for which the corresponding file > + * handle is non-NULL.)
Innocent bystander question: if the *file_pipe arg is always FALSE when the *file arg is non-NULL, is it always TRUE if the *file arg is NULL? If so, can we use the NULL as the use-a-pipe sentinel, rather than a separate arg? > * > * @a args is a list of utf8-encoded <tt>const char *</tt> arguments, > * terminated by @c NULL. �...@a args[0] is the name of the program, though it > @@ -1501,8 +1509,29 @@ svn_io_dir_walk(const char *dirname, > * will result in error output being written to @a errfile, if non-NULL, and > * a non-zero exit status being returned to the parent process. > * > + * @since New in 1.7. > + */ > +svn_error_t *svn_io_start_cmd2(apr_proc_t *cmd_proc, > + const char *path, > + const char *cmd, > + const char *const *args, > + svn_boolean_t inherit, > + svn_boolean_t infile_pipe, > + apr_file_t *infile, > + svn_boolean_t outfile_pipe, > + apr_file_t *outfile, > + svn_boolean_t errfile_pipe, > + apr_file_t *errfile, > + apr_pool_t *pool); > + > +/** > + * Similar to svn_io_start_cmd2() but with @a infile_pipe, @a > + * outfile_pipe, and @a errfile_pipe always FALSE. > + * > + * @deprecated Provided for backward compatibility with the 1.6 API > * @since New in 1.3. > */ > +SVN_DEPRECATED > svn_error_t * > svn_io_start_cmd(apr_proc_t *cmd_proc, > const char *path, > > Modified: subversion/trunk/subversion/libsvn_subr/deprecated.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/deprecated.c?rev=1050061&r1=1050060&r2=1050061&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_subr/deprecated.c (original) > +++ subversion/trunk/subversion/libsvn_subr/deprecated.c Thu Dec 16 17:18:43 > 2010 > @@ -754,6 +754,22 @@ svn_io_get_dirents(apr_hash_t **dirents, > return svn_io_get_dirents2(dirents, path, pool); > } > > +svn_error_t * > +svn_io_start_cmd(apr_proc_t *cmd_proc, > + const char *path, > + const char *cmd, > + const char *const *args, > + svn_boolean_t inherit, > + apr_file_t *infile, > + apr_file_t *outfile, > + apr_file_t *errfile, > + apr_pool_t *pool) > +{ > + return svn_io_start_cmd2(cmd_proc, path, cmd, args, inherit, FALSE, > + infile, FALSE, outfile, FALSE, errfile, pool); > +} > + > + > struct walk_func_filter_baton_t > { > svn_io_walk_func_t walk_func; > > Modified: subversion/trunk/subversion/libsvn_subr/io.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/io.c?rev=1050061&r1=1050060&r2=1050061&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_subr/io.c (original) > +++ subversion/trunk/subversion/libsvn_subr/io.c Thu Dec 16 17:18:43 2010 > @@ -2188,15 +2188,18 @@ handle_child_process_error(apr_pool_t *p > > > svn_error_t * > -svn_io_start_cmd(apr_proc_t *cmd_proc, > - const char *path, > - const char *cmd, > - const char *const *args, > - svn_boolean_t inherit, > - apr_file_t *infile, > - apr_file_t *outfile, > - apr_file_t *errfile, > - apr_pool_t *pool) > +svn_io_start_cmd2(apr_proc_t *cmd_proc, > + const char *path, > + const char *cmd, > + const char *const *args, > + svn_boolean_t inherit, > + svn_boolean_t infile_pipe, > + apr_file_t *infile, > + svn_boolean_t outfile_pipe, > + apr_file_t *outfile, > + svn_boolean_t errfile_pipe, > + apr_file_t *errfile, > + apr_pool_t *pool) > { > apr_status_t apr_err; > apr_procattr_t *cmdproc_attr; > @@ -2204,6 +2207,10 @@ svn_io_start_cmd(apr_proc_t *cmd_proc, > const char **args_native; > const char *cmd_apr; > > + SVN_ERR_ASSERT(!((infile != NULL) && infile_pipe)); > + SVN_ERR_ASSERT(!((outfile != NULL) && outfile_pipe)); > + SVN_ERR_ASSERT(!((errfile != NULL) && errfile_pipe)); > + > /* Create the process attributes. */ > apr_err = apr_procattr_create(&cmdproc_attr, pool); > if (apr_err) > @@ -2212,7 +2219,7 @@ svn_io_start_cmd(apr_proc_t *cmd_proc, > > /* Make sure we invoke cmd directly, not through a shell. */ > apr_err = apr_procattr_cmdtype_set(cmdproc_attr, > - inherit?APR_PROGRAM_PATH:APR_PROGRAM); > + inherit ? APR_PROGRAM_PATH : > APR_PROGRAM); > if (apr_err) > return svn_error_wrap_apr(apr_err, _("Can't set process '%s' cmdtype"), > cmd); > @@ -2256,6 +2263,13 @@ svn_io_start_cmd(apr_proc_t *cmd_proc, > (apr_err, _("Can't set process '%s' child errfile"), cmd); > } > > + /* Forward request for pipes to APR. */ > + if (infile_pipe || outfile_pipe || errfile_pipe) > + apr_procattr_io_set(cmdproc_attr, > + infile_pipe ? APR_FULL_BLOCK : APR_NO_PIPE, > + outfile_pipe ? APR_FULL_BLOCK : APR_NO_PIPE, > + errfile_pipe ? APR_FULL_BLOCK : APR_NO_PIPE); > + > /* Have the child print any problems executing its program to errfile. */ > apr_err = apr_pool_userdata_set(errfile, ERRFILE_KEY, NULL, pool); > if (apr_err) > > >