aboutsummaryrefslogtreecommitdiff
path: root/emulators
diff options
context:
space:
mode:
authorJuergen Lock <nox@FreeBSD.org>2014-02-06 17:48:25 +0000
committerJuergen Lock <nox@FreeBSD.org>2014-02-06 17:48:25 +0000
commited2838916058083b36d2bcd1b3de2a34bba84d34 (patch)
tree5b0e50643c389261e636fbcbc9990de7766d3169 /emulators
parent92e7b5e96c8c9065a90ff9ba9fe1b81cb1ebf6a7 (diff)
downloadports-ed2838916058083b36d2bcd1b3de2a34bba84d34.tar.gz
ports-ed2838916058083b36d2bcd1b3de2a34bba84d34.zip
Notes
Diffstat (limited to 'emulators')
-rw-r--r--emulators/qemu-devel/Makefile3
-rw-r--r--emulators/qemu-devel/files/extra-patch-bsd-user-freebsd-os-proc.c116
2 files changed, 118 insertions, 1 deletions
diff --git a/emulators/qemu-devel/Makefile b/emulators/qemu-devel/Makefile
index d4d896e7ecfd..2ef5c39c21fb 100644
--- a/emulators/qemu-devel/Makefile
+++ b/emulators/qemu-devel/Makefile
@@ -3,7 +3,7 @@
PORTNAME= qemu
PORTVERSION= 1.7.0
-PORTREVISION= 1
+PORTREVISION= 2
CATEGORIES= emulators
MASTER_SITES= http://wiki.qemu.org/download/:release \
LOCAL/nox:snapshot
@@ -67,6 +67,7 @@ PATCHFILES= \
0017-bsd-user-add-support-for-miscellaneous-system-calls.patch \
0018-bsd-user-add-arm-mips-and-mips64-options-to-configur.patch
PATCH_DIST_STRIP= -p1
+EXTRA_PATCHES+= ${FILESDIR}/extra-patch-bsd-user-freebsd-os-proc.c
.endif
CONFIGURE_ARGS+= --extra-ldflags=-L${LOCALBASE}/lib
diff --git a/emulators/qemu-devel/files/extra-patch-bsd-user-freebsd-os-proc.c b/emulators/qemu-devel/files/extra-patch-bsd-user-freebsd-os-proc.c
new file mode 100644
index 000000000000..78c80e43a3a1
--- /dev/null
+++ b/emulators/qemu-devel/files/extra-patch-bsd-user-freebsd-os-proc.c
@@ -0,0 +1,116 @@
+--- a/bsd-user/freebsd/os-proc.c
+--- b/bsd-user/freebsd/os-proc.c
+@@ -83,7 +83,7 @@ out:
+ }
+
+ static int
+-is_target_shell_script(int fd, char *interp, size_t size)
++is_target_shell_script(int fd, char *interp, size_t size, char **interp_args)
+ {
+ char buf[2], *p, *b;
+ ssize_t n;
+@@ -120,7 +120,21 @@ is_target_shell_script(int fd, char *int
+ return 0;
+ }
+ if ((p = memchr(b, '\n', size)) != NULL) {
++ int hasargs = 0;
+ *p = 0;
++
++ *interp_args = NULL;
++ p = interp;
++ while (*p) {
++ if ((*p == ' ') || (*p == '\t')) {
++ hasargs = 1;
++ *p = 0;
++ } else if (hasargs) {
++ *interp_args = p;
++ break;
++ }
++ ++p;
++ }
+ return 1;
+ }
+ b += n;
+@@ -136,7 +150,7 @@ is_target_shell_script(int fd, char *int
+ abi_long freebsd_exec_common(abi_ulong path_or_fd, abi_ulong guest_argp,
+ abi_ulong guest_envp, int do_fexec)
+ {
+- char **argp, **envp, **qargp, **qarg1, **qarg0;
++ char **argp, **envp, **qargp, **qarg1, **qarg0, **qargend;
+ int argc, envc;
+ abi_ulong gp;
+ abi_ulong addr;
+@@ -166,7 +180,7 @@ abi_long freebsd_exec_common(abi_ulong p
+ envc++;
+ }
+
+- qarg0 = argp = alloca((argc + 4) * sizeof(void *));
++ qarg0 = argp = alloca((argc + 5) * sizeof(void *));
+ /* save the first agrument for the emulator */
+ *argp++ = (char *)getprogname();
+ qargp = argp;
+@@ -188,7 +202,8 @@ abi_long freebsd_exec_common(abi_ulong p
+ }
+ total_size += strlen(*q) + 1;
+ }
+- *q = NULL;
++ *q++ = NULL;
++ qargend = q;
+
+ for (gp = guest_envp, q = envp; gp; gp += sizeof(abi_ulong), q++) {
+ if (get_user_ual(addr, gp)) {
+@@ -217,7 +232,7 @@ abi_long freebsd_exec_common(abi_ulong p
+ }
+
+ if (do_fexec) {
+- char execpath[PATH_MAX];
++ char execpath[PATH_MAX], *scriptargs;
+
+ if (((int)path_or_fd > 0 &&
+ is_target_elf_binary((int)path_or_fd)) == 1) {
+@@ -238,7 +253,7 @@ abi_long freebsd_exec_common(abi_ulong p
+ goto execve_end;
+ }
+ } else if (is_target_shell_script((int)path_or_fd, execpath,
+- sizeof(execpath)) != 0) {
++ sizeof(execpath), &scriptargs) != 0) {
+ char scriptpath[PATH_MAX];
+
+ /* execve() as a target script using emulator. */
+@@ -246,6 +261,10 @@ abi_long freebsd_exec_common(abi_ulong p
+ sizeof(scriptpath)) != NULL) {
+ *qargp = execpath;
+ *qarg1 = scriptpath;
++ if (scriptargs) {
++ memmove(qarg1 + 1, qarg1, (qargend-qarg1) * sizeof(*qarg1));
++ *qarg1 = scriptargs;
++ }
+ ret = get_errno(execve(qemu_proc_pathname, qarg0, envp));
+ } else {
+ ret = -TARGET_EBADF;
+@@ -256,7 +275,7 @@ abi_long freebsd_exec_common(abi_ulong p
+ }
+ } else {
+ int fd;
+- char execpath[PATH_MAX];
++ char execpath[PATH_MAX], *scriptargs;
+
+ p = lock_user_string(path_or_fd);
+ if (p == NULL) {
+@@ -275,11 +294,15 @@ abi_long freebsd_exec_common(abi_ulong p
+ *qarg1 = (char *)p;
+ ret = get_errno(execve(qemu_proc_pathname, qargp, envp));
+ } else if (is_target_shell_script(fd, execpath,
+- sizeof(execpath)) != 0) {
++ sizeof(execpath), &scriptargs) != 0) {
+ close(fd);
+ /* execve() as a target script using emulator. */
+ *qargp = execpath;
+ *qarg1 = (char *)p;
++ if (scriptargs) {
++ memmove(qarg1 + 1, qarg1, (qargend-qarg1) * sizeof(*qarg1));
++ *qarg1 = scriptargs;
++ }
+ ret = get_errno(execve(qemu_proc_pathname, qarg0, envp));
+ } else {
+ close(fd);