From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from 5.mo2.mail-out.ovh.net ([87.98.181.248] helo=mo2.mail-out.ovh.net) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1RSlBX-0007TG-Se for barebox@lists.infradead.org; Tue, 22 Nov 2011 07:54:32 +0000 Received: from mail190.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo2.mail-out.ovh.net (Postfix) with SMTP id 763CEDC8BE1 for ; Tue, 22 Nov 2011 09:00:50 +0100 (CET) Date: Tue, 22 Nov 2011 08:52:02 +0100 From: Jean-Christophe PLAGNIOL-VILLARD Message-ID: <20111122075202.GI21480@game.jcrosoft.org> References: <1319363961-4944-1-git-send-email-plagnioj@jcrosoft.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1319363961-4944-1-git-send-email-plagnioj@jcrosoft.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: barebox-bounces@lists.infradead.org Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: Re: [PATCH 1/1] sanbox: add linux_execve and linux_exec command To: barebox@lists.infradead.org On 17:59 Sun 23 Oct , Jean-Christophe PLAGNIOL-VILLARD wrote: > this will allow to execute a program of the host from barebox > > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD > --- ping Best Regards, J. > arch/sandbox/mach-sandbox/include/mach/linux.h | 2 + > arch/sandbox/os/common.c | 22 +++++++++ > commands/Kconfig | 4 ++ > commands/Makefile | 1 + > commands/linux_exec.c | 58 ++++++++++++++++++++++++ > 5 files changed, 87 insertions(+), 0 deletions(-) > create mode 100644 commands/linux_exec.c > > diff --git a/arch/sandbox/mach-sandbox/include/mach/linux.h b/arch/sandbox/mach-sandbox/include/mach/linux.h > index 7c2386d..5917fe9 100644 > --- a/arch/sandbox/mach-sandbox/include/mach/linux.h > +++ b/arch/sandbox/mach-sandbox/include/mach/linux.h > @@ -10,6 +10,8 @@ ssize_t linux_write(int fd, const void *buf, size_t count); > off_t linux_lseek(int fildes, off_t offset); > int linux_tstc(int fd); > > +int linux_execve(const char * filename, char *const argv[], char *const envp[]); > + > int barebox_register_console(char *name_template, int stdinfd, int stdoutfd); > > struct linux_console_data { > diff --git a/arch/sandbox/os/common.c b/arch/sandbox/os/common.c > index 5074a06..0833959 100644 > --- a/arch/sandbox/os/common.c > +++ b/arch/sandbox/os/common.c > @@ -45,6 +45,7 @@ > #include > #include > #include > +#include > /* > * ...except the ones needed to connect with barebox > */ > @@ -193,6 +194,27 @@ off_t linux_lseek(int fd, off_t offset) > return lseek(fd, offset, SEEK_SET); > } > > +int linux_execve(const char * filename, char *const argv[], char *const envp[]) > +{ > + pid_t pid, tpid; > + int execve_status; > + > + pid = fork(); > + > + if (pid == -1) { > + perror("linux_execve"); > + return pid; > + } else if (pid == 0) { > + exit(execve(filename, argv, envp)); > + } else { > + do { > + tpid = wait(&execve_status); > + } while(tpid != pid); > + > + return execve_status; > + } > +} > + > extern void start_barebox(void); > extern void mem_malloc_init(void *start, void *end); > > diff --git a/commands/Kconfig b/commands/Kconfig > index 11386f9..1eae25a 100644 > --- a/commands/Kconfig > +++ b/commands/Kconfig > @@ -124,6 +124,10 @@ config CMD_TIME > checking for ctrl-c, so the time command can be used with commands > which are interruptible with ctrl-c. > > +config CMD_LINUX_EXEC > + bool "linux exec" > + depends on LINUX > + > endmenu > > menu "file commands " > diff --git a/commands/Makefile b/commands/Makefile > index d50ca68..f50ace6 100644 > --- a/commands/Makefile > +++ b/commands/Makefile > @@ -59,3 +59,4 @@ obj-$(CONFIG_CMD_USB) += usb.o > obj-$(CONFIG_CMD_TIME) += time.o > obj-$(CONFIG_CMD_BOOT_CONFIG) += boot_config.o > obj-$(CONFIG_CMD_BOOT_MENU) += boot_menu.o > +obj-$(CONFIG_CMD_LINUX_EXEC) += linux_exec.o > diff --git a/commands/linux_exec.c b/commands/linux_exec.c > new file mode 100644 > index 0000000..e147629 > --- /dev/null > +++ b/commands/linux_exec.c > @@ -0,0 +1,58 @@ > +/* > + * Copyright (c) 2011 Jean-Christophe PLAGNIOL-VILLARD > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 > + * as published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > + */ > + > +#include > +#include > +#include > + > +static int do_linux_exec(struct command *cmdtp, int argc, char *argv[]) > +{ > + int ret; > + char **newargv; > + char *newenv[] = { NULL }; > + int i, j; > + > + if (argc < 2) > + return 1; > + > + newargv = xzalloc(sizeof(char*) * argc); > + > + for (j = 0, i = 1; i < argc; i++, j++) > + newargv[j] = argv[i]; > + > + newargv[j] = NULL; > + ret = linux_execve(argv[1], newargv, newenv); > + > + if (ret) > + return 1; > + > + return 0; > +} > + > +BAREBOX_CMD_HELP_START(linux_exec) > +BAREBOX_CMD_HELP_USAGE("linux_exec ...\n") > +BAREBOX_CMD_HELP_SHORT("Execute a command on the host\n") > +BAREBOX_CMD_HELP_END > + > +BAREBOX_CMD_START(linux_exec) > + .cmd = do_linux_exec, > + .usage = "Execute a command on the host", > + BAREBOX_CMD_HELP(cmd_linux_exec_help) > +BAREBOX_CMD_END > -- > 1.7.7 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox