PERFORCE change 99144 for review
John Baldwin
jhb at freebsd.org
Tue Jun 13 17:57:12 UTC 2006
On Tuesday 13 June 2006 13:12, Roman Divacky wrote:
> http://perforce.freebsd.org/chv.cgi?CH=99144
>
> Change 99144 by rdivacky at rdivacky_witten on 2006/06/13 17:12:02
>
> Make the LINUXBASE path settable via sysctl. Useful when you have more then
one linux bases
> installed etc.
Since you only check the one global variable, why did you make the sysctl's
try to handle per-prison paths?
> example:
> sysctl compat.linux.emulpath=/tmp/linux/
> /tmp/linux/bin/grep
> Usage: grep [OPTION]... PATTERN [FILE]...
>
> Affected files ...
>
> .. //depot/projects/soc2006/rdivacky_linuxolator/amd64/linux32/linux32_sysvec.c#2
edit
> .. //depot/projects/soc2006/rdivacky_linuxolator/compat/linux/linux_mib.c#2
edit
> .. //depot/projects/soc2006/rdivacky_linuxolator/compat/linux/linux_mib.h#2
edit
> .. //depot/projects/soc2006/rdivacky_linuxolator/i386/linux/linux_sysvec.c#2
edit
>
> Differences ...
>
>
==== //depot/projects/soc2006/rdivacky_linuxolator/amd64/linux32/linux32_sysvec.c#2
(text+ko) ====
>
> @@ -1018,7 +1018,7 @@
> ELFOSABI_LINUX,
> EM_386,
> "Linux",
> - "/compat/linux",
> + linux_emul_path,
> "/lib/ld-linux.so.1",
> &elf_linux_sysvec,
> NULL,
> @@ -1029,7 +1029,7 @@
> ELFOSABI_LINUX,
> EM_386,
> "Linux",
> - "/compat/linux",
> + linux_emul_path,
> "/lib/ld-linux.so.2",
> &elf_linux_sysvec,
> NULL,
>
>
==== //depot/projects/soc2006/rdivacky_linuxolator/compat/linux/linux_mib.c#2
(text+ko) ====
>
> @@ -38,7 +38,10 @@
> #include <sys/jail.h>
> #include <sys/lock.h>
> #include <sys/mutex.h>
> +#include <sys/imgact.h>
> +#include <sys/imgact_elf.h>
>
> +extern Elf32_Brandinfo *linux_brandlist[];
> #include "opt_compat.h"
>
> #ifdef COMPAT_LINUX32
> @@ -52,6 +55,7 @@
> char pr_osname[LINUX_MAX_UTSNAME];
> char pr_osrelease[LINUX_MAX_UTSNAME];
> int pr_oss_version;
> + char pr_emul_path[LINUX_NAME_MAX];
> };
>
> SYSCTL_NODE(_compat, OID_AUTO, linux, CTLFLAG_RW, 0,
> @@ -81,6 +85,32 @@
> 0, 0, linux_sysctl_osname, "A",
> "Linux kernel OS name");
>
> +char linux_emul_path[LINUX_NAME_MAX] = "/compat/linux/";
> +
> +static int
> +linux_sysctl_linux_emul_path(SYSCTL_HANDLER_ARGS)
> +{
> + char emul_path[LINUX_NAME_MAX];
> + int error;
> + Elf32_Brandinfo **brandinfo;
> +
> + linux_get_emul_path(req->td, emul_path);
> + error = sysctl_handle_string(oidp, emul_path, LINUX_NAME_MAX, req);
> + if (error || req->newptr == NULL)
> + return (error);
> + error = linux_set_emul_path(req->td, emul_path);
> + for (brandinfo = &linux_brandlist[0]; *brandinfo != NULL;
> + ++brandinfo)
> + if (elf32_insert_brand_entry(*brandinfo) < 0)
> + error = EINVAL;
> + return (error);
> +}
> +
> +SYSCTL_PROC(_compat_linux, OID_AUTO, emulpath,
> + CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON,
> + 0, 0, linux_sysctl_linux_emul_path, "A",
> + "Linux kernel OS emulation path");
> +
> static char linux_osrelease[LINUX_MAX_UTSNAME] = "2.4.2";
>
> static int
> @@ -246,6 +276,51 @@
> return (0);
> }
>
> +void
> +linux_get_emul_path(struct thread *td, char *dst)
> +{
> + register struct prison *pr;
> + register struct linux_prison *lpr;
> +
> + pr = td->td_ucred->cr_prison;
> + if (pr != NULL) {
> + mtx_lock(&pr->pr_mtx);
> + if (pr->pr_linux != NULL) {
> + lpr = (struct linux_prison *)pr->pr_linux;
> + if (lpr->pr_emul_path[0]) {
> + bcopy(lpr->pr_emul_path, dst, LINUX_NAME_MAX);
> + mtx_unlock(&pr->pr_mtx);
> + return;
> + }
> + }
> + mtx_unlock(&pr->pr_mtx);
> + }
> +
> + mtx_lock(&osname_lock);
> + bcopy(linux_emul_path, dst, LINUX_NAME_MAX);
> + mtx_unlock(&osname_lock);
> +}
> +
> +int
> +linux_set_emul_path(struct thread *td, char *emul_path)
> +{
> + struct prison *pr;
> + struct linux_prison *lpr;
> +
> + pr = linux_get_prison(td);
> + if (pr != NULL) {
> + lpr = (struct linux_prison *)pr->pr_linux;
> + strcpy(lpr->pr_emul_path, emul_path);
> + mtx_unlock(&pr->pr_mtx);
> + } else {
> + mtx_lock(&osname_lock);
> + strcpy(linux_emul_path, emul_path);
> + mtx_unlock(&osname_lock);
> + }
> +
> + return (0);
> +}
> +
> int
> linux_get_oss_version(struct thread *td)
> {
>
>
==== //depot/projects/soc2006/rdivacky_linuxolator/compat/linux/linux_mib.h#2
(text+ko) ====
>
> @@ -40,4 +40,7 @@
> int linux_get_oss_version(struct thread *td);
> int linux_set_oss_version(struct thread *td, int oss_version);
>
> +void linux_get_emul_path(struct thread *td, char *dst);
> +int linux_set_emul_path(struct thread *td, char *emul_path);
> +
> #endif /* _LINUX_MIB_H_ */
>
>
==== //depot/projects/soc2006/rdivacky_linuxolator/i386/linux/linux_sysvec.c#2
(text+ko) ====
>
> @@ -858,7 +858,7 @@
> ELFOSABI_LINUX,
> EM_386,
> "Linux",
> - "/compat/linux",
> + linux_emul_path,
> "/lib/ld-linux.so.1",
> &elf_linux_sysvec,
> NULL,
> @@ -869,7 +869,7 @@
> ELFOSABI_LINUX,
> EM_386,
> "Linux",
> - "/compat/linux",
> + linux_emul_path,
> "/lib/ld-linux.so.2",
> &elf_linux_sysvec,
> NULL,
>
--
John Baldwin
More information about the p4-projects
mailing list