[stgt] [PATCH 1/5] Prepare run_ext_program() for getting stdout to the caller

Chandra Seetharaman sekharan at us.ibm.com
Tue Sep 7 22:41:32 CEST 2010


On Tue, 2010-09-07 at 09:49 +0900, FUJITA Tomonori wrote:
> Sorry for the delay,
> 
> On Wed, 01 Sep 2010 17:45:51 -0700
> Chandra Seetharaman <sekharan at us.ibm.com> wrote:
> 
> >  int run_ext_program(const char *cmd,
> > -		    void (*callback)(void *data, int result), void *data)
> > +		    void (*callback)(void *data, int result), void *data,
> > +		    char *output, int op_len)
> 
> We might want to run the program asynchronously? We don't need to
> support the feature now but adding the flags argument for it might be
> nice?

I will add the flags argument now (and delay the  implementation of
asynchronization support to later, when needed) 
> 
> 
> >  {
> >  	pid_t pid;
> > -	int fds[2], ret;
> > -	struct ext_prog_info *ex;
> > -	ssize_t ignored;
> > -
> > -	ex = zalloc(sizeof(*ex));
> > -	if (!ex)
> > -		return -ENOMEM;
> > +	int fds[2], ret, i;
> > +	char *pos, arg[256];
> > +	char *argv[sizeof(arg) / 2];
> > +
> > +	i = 0;
> > +	pos = arg;
> > +	str_spacecpy(&pos, cmd);
> > +	if (strchr(cmd, ' ')) {
> > +		while (pos != '\0')
> > +			argv[i++] = strsep(&pos, " ");
> > +	} else
> > +		argv[i++] = arg;
> > +	argv[i] =  NULL;
> >  
> >  	ret = pipe(fds);
> > -	if (ret < 0) {
> > -		free(ex);
> > +	if (ret < 0)
> >  		return ret;
> > -	}
> >  
> >  	eprintf("%d %d\n", fds[0], fds[1]);
> >  
> > -	ex->callback = callback;
> > -	ex->data = data;
> > -
> > -	tgt_event_add(fds[0], EPOLLIN, run_ext_callback, ex);
> > -
> >  	pid = fork();
> >  	if (pid < 0)
> >  		return pid;
> >  
> >  	if (!pid) {
> > -		ret = system(cmd);
> > -		ignored = write(fds[1], &ret, sizeof(ret));
> > -		return 0;
> > +		close(1);
> > +		dup(fds[1]);
> > +		close(fds[0]);
> > +		ret = execv(argv[0], argv);
> > +		exit(-1);
> > +	} else {
> > +		close(fds[1]);
> > +		waitpid(pid, &i, 0);
> > +		ret = read(fds[0], output, op_len);
> > +		if (ret < 0)
> > +			eprintf("failed to get the output from <%s>.", cmd);
> > +
> > +		if (callback)
> > +			callback(data, WEXITSTATUS(i));
> > +		close(fds[0]);
> >  	}
> >  
> > -	close(fds[1]);
> > -
> >  	return 0;
> >  }
> >  
> > Index: tgt-1.0.8/usr/tgtd.h
> > ===================================================================
> > --- tgt-1.0.8.orig/usr/tgtd.h
> > +++ tgt-1.0.8/usr/tgtd.h
> > @@ -335,5 +335,8 @@ struct event_data {
> >  };
> >  
> >  int run_ext_program(const char *cmd,
> > -		    void (*callback)(void *data, int result), void *data);
> > +		    void (*callback)(void *data, int result), void *data,
> > +		    char *output, int op_len);
> > +#define call_program(cmd, output, len) \
> > +	run_ext_program(cmd, NULL, NULL, output, len)
> >  #endif
> 
> I think that you can simply rename the function since nobody uses
> run_ext_program().


--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list