Permalink
Browse files

Welcome the new user-land implementation of the pbi runtime

functionality. There is also a related patch to rtld.c which we will
be putting into our freebsd fork.

This patch replaces all the previous nullfs/fusefs VFS implementations.

Instead for PBI runtime, we will use PBI_PRELOAD to dynamically load a
wrapper library, and do the /usr/local -> /usr/pbi path mapping all in
userspace. This bypasses all the kernel VFS calls, which greatly speeds up
the execution time of PBIs, while improving reliability. (No more kernel
panics when VFS ops go haywire).

Required rtld.c patch:

trueos/freebsd@956ccdb
  • Loading branch information...
1 parent 67bf73c commit 1cafdcc30292dad35f5a20250c9de645df43938b @kmoore134 kmoore134 committed Mar 31, 2014
View
@@ -1346,3 +1346,115 @@ src-qt4/life-preserver/lp-tray/i18n/LifePreserverTray_zu.qm
src-qt4/life-preserver/lp-tray/life-preserver-tray
src-sh/lpreserver/install
src-sh/pbi-manager/pbifs/pbifs
+retired/pc-gdmconf/Makefile
+src-qt4/pc-servicemanager/ui_progress.h
+src-qt4/pc-servicemanager/ui_servicemanager.h
+src-qt4/pc-updatecenter/Makefile
+src-qt4/pc-updatecenter/pc-updatecenter
+src-qt4/pc-updatecenter/ui_branchesdialog.h
+src-qt4/pc-updatecenter/ui_dialogconflict.h
+src-qt4/pc-updatecenter/ui_indicatorwidget.h
+src-qt4/pc-updatecenter/ui_jailindicator.h
+src-qt4/pc-updatecenter/ui_jailsdialog.h
+src-qt4/pc-updatecenter/ui_logviewdialog.h
+src-qt4/pc-updatecenter/ui_mainwindow.h
+src-qt4/pc-updatecenter/ui_patchsetdialog.h
+src-qt4/pc-updatecenter/ui_pbidetailswidget.h
+src-qt4/pc-updatecenter/ui_pkgdetailswidget.h
+src-qt4/pc-updatecenter/ui_rebootwidget.h
+src-qt4/pc-updatecenter/ui_sysdetailswidget.h
+src-qt4/pc-xgui/i18n/XGUISource_af.qm
+src-qt4/pc-xgui/i18n/XGUISource_ar.qm
+src-qt4/pc-xgui/i18n/XGUISource_az.qm
+src-qt4/pc-xgui/i18n/XGUISource_bg.qm
+src-qt4/pc-xgui/i18n/XGUISource_bn.qm
+src-qt4/pc-xgui/i18n/XGUISource_bs.qm
+src-qt4/pc-xgui/i18n/XGUISource_ca.qm
+src-qt4/pc-xgui/i18n/XGUISource_cs.qm
+src-qt4/pc-xgui/i18n/XGUISource_cy.qm
+src-qt4/pc-xgui/i18n/XGUISource_da.qm
+src-qt4/pc-xgui/i18n/XGUISource_de.qm
+src-qt4/pc-xgui/i18n/XGUISource_el.qm
+src-qt4/pc-xgui/i18n/XGUISource_en_GB.qm
+src-qt4/pc-xgui/i18n/XGUISource_en_ZA.qm
+src-qt4/pc-xgui/i18n/XGUISource_es.qm
+src-qt4/pc-xgui/i18n/XGUISource_et.qm
+src-qt4/pc-xgui/i18n/XGUISource_eu.qm
+src-qt4/pc-xgui/i18n/XGUISource_fa.qm
+src-qt4/pc-xgui/i18n/XGUISource_fi.qm
+src-qt4/pc-xgui/i18n/XGUISource_fr.qm
+src-qt4/pc-xgui/i18n/XGUISource_fr_CA.qm
+src-qt4/pc-xgui/i18n/XGUISource_fur.qm
+src-qt4/pc-xgui/i18n/XGUISource_gl.qm
+src-qt4/pc-xgui/i18n/XGUISource_he.qm
+src-qt4/pc-xgui/i18n/XGUISource_hi.qm
+src-qt4/pc-xgui/i18n/XGUISource_hr.qm
+src-qt4/pc-xgui/i18n/XGUISource_hu.qm
+src-qt4/pc-xgui/i18n/XGUISource_id.qm
+src-qt4/pc-xgui/i18n/XGUISource_is.qm
+src-qt4/pc-xgui/i18n/XGUISource_it.qm
+src-qt4/pc-xgui/i18n/XGUISource_ja.qm
+src-qt4/pc-xgui/i18n/XGUISource_ka.qm
+src-qt4/pc-xgui/i18n/XGUISource_ko.qm
+src-qt4/pc-xgui/i18n/XGUISource_lt.qm
+src-qt4/pc-xgui/i18n/XGUISource_lv.qm
+src-qt4/pc-xgui/i18n/XGUISource_mk.qm
+src-qt4/pc-xgui/i18n/XGUISource_mn.qm
+src-qt4/pc-xgui/i18n/XGUISource_ms.qm
+src-qt4/pc-xgui/i18n/XGUISource_mt.qm
+src-qt4/pc-xgui/i18n/XGUISource_nb.qm
+src-qt4/pc-xgui/i18n/XGUISource_ne.qm
+src-qt4/pc-xgui/i18n/XGUISource_nl.qm
+src-qt4/pc-xgui/i18n/XGUISource_pa.qm
+src-qt4/pc-xgui/i18n/XGUISource_pl.qm
+src-qt4/pc-xgui/i18n/XGUISource_pt.qm
+src-qt4/pc-xgui/i18n/XGUISource_pt_BR.qm
+src-qt4/pc-xgui/i18n/XGUISource_ro.qm
+src-qt4/pc-xgui/i18n/XGUISource_ru.qm
+src-qt4/pc-xgui/i18n/XGUISource_sa.qm
+src-qt4/pc-xgui/i18n/XGUISource_sk.qm
+src-qt4/pc-xgui/i18n/XGUISource_sl.qm
+src-qt4/pc-xgui/i18n/XGUISource_sr.qm
+src-qt4/pc-xgui/i18n/XGUISource_sv.qm
+src-qt4/pc-xgui/i18n/XGUISource_sw.qm
+src-qt4/pc-xgui/i18n/XGUISource_ta.qm
+src-qt4/pc-xgui/i18n/XGUISource_tg.qm
+src-qt4/pc-xgui/i18n/XGUISource_th.qm
+src-qt4/pc-xgui/i18n/XGUISource_tr.qm
+src-qt4/pc-xgui/i18n/XGUISource_uk.qm
+src-qt4/pc-xgui/i18n/XGUISource_uz.qm
+src-qt4/pc-xgui/i18n/XGUISource_vi.qm
+src-qt4/pc-xgui/i18n/XGUISource_zh_CN.qm
+src-qt4/pc-xgui/i18n/XGUISource_zh_HK.qm
+src-qt4/pc-xgui/i18n/XGUISource_zh_TW.qm
+src-qt4/pc-xgui/i18n/XGUISource_zu.qm
+src-qt4/pc-xgui/pc-xgui
+src-qt4/pc-xgui/ui_dialogconfirm.h
+src-qt4/pc-xgui/ui_xgui.h
+src-sh/pbi-manager/pbime/pbild
+src-sh/pbi-manager/pbime/pbirun
+src-sh/pc-adctl/pc-krbconf/krb5-lexer.lex.c
+src-sh/pc-adctl/pc-krbconf/krb5-parser.tab.c
+src-sh/pc-adctl/pc-krbconf/krb5-parser.tab.h
+src-sh/pc-adctl/pc-krbconf/pc-krbconf
+src-sh/pc-adctl/pc-ldapconf/ldap-lexer.lex.c
+src-sh/pc-adctl/pc-ldapconf/ldap-parser.tab.c
+src-sh/pc-adctl/pc-ldapconf/ldap-parser.tab.h
+src-sh/pc-adctl/pc-ldapconf/pc-ldapconf
+src-sh/pc-adctl/pc-nssconf/nss-lexer.lex.c
+src-sh/pc-adctl/pc-nssconf/nss-parser.tab.c
+src-sh/pc-adctl/pc-nssconf/nss-parser.tab.h
+src-sh/pc-adctl/pc-nssconf/pc-nssconf
+src-sh/pc-adctl/pc-nssldapconf/nssldap-lexer.lex.c
+src-sh/pc-adctl/pc-nssldapconf/nssldap-parser.tab.c
+src-sh/pc-adctl/pc-nssldapconf/nssldap-parser.tab.h
+src-sh/pc-adctl/pc-nssldapconf/pc-nssldapconf
+src-sh/pc-adctl/pc-pamconf/pam-lexer.lex.c
+src-sh/pc-adctl/pc-pamconf/pam-parser.tab.c
+src-sh/pc-adctl/pc-pamconf/pam-parser.tab.h
+src-sh/pc-adctl/pc-pamconf/pc-pamconf
+src-sh/pc-adctl/pc-sambaconf/pc-sambaconf
+src-sh/pc-adctl/pc-sambaconf/samba-lexer.lex.c
+src-sh/pc-adctl/pc-sambaconf/samba-parser.tab.c
+src-sh/pc-adctl/pc-sambaconf/samba-parser.tab.h
+
@@ -135,24 +135,28 @@ fi
# Install the pbime wrapper
cd ${DIR}/pbime && make
-install -o root -g wheel -m 4751 pbime ${LB}/share/pbi-manager/.pbime
-install -o root -g wheel -m 755 pbimount ${LB}/share/pbi-manager/.pbimount
+install -o root -g wheel -m 755 pbime ${LB}/share/pbi-manager/.pbime
+install -o root -g wheel -m 4751 pbild ${LB}/share/pbi-manager/.pbild
+install -o root -g wheel -m 755 pbirun ${LB}/share/pbi-manager/.pbirun
+install -o root -g wheel -m 755 pbiinit ${LB}/share/pbi-manager/.pbiinit
install -o root -g wheel -m 755 ldconfig ${LB}/share/pbi-manager/.ldconfig
-install -o root -g wheel -m 755 pbisyslisten ${LB}/share/pbi-manager/.pbisyslisten
install -o root -g wheel -m 755 pbisyscmd ${LB}/share/pbi-manager/.pbisyscmd
+install -o root -g wheel -m 755 pbisyscmd ${LB}/share/pbi-manager/openwith
if [ "${LB}" = "/usr/local" ] ; then
- install -o root -g wheel -m 4751 pbime /usr/pbi/.pbime
- install -o root -g wheel -m 755 pbimount /usr/pbi/.pbimount
+ install -o root -g wheel -m 755 pbime /usr/pbi/.pbime
+ install -o root -g wheel -m 4751 pbild /usr/pbi/.pbild
+ install -o root -g wheel -m 755 pbirun /usr/pbi/.pbirun
+ install -o root -g wheel -m 755 pbiinit /usr/pbi/.pbiinit
install -o root -g wheel -m 755 ldconfig /usr/pbi/.ldconfig
- install -o root -g wheel -m 755 pbisyslisten /usr/pbi/.pbisyslisten
install -o root -g wheel -m 755 pbisyscmd /usr/pbi/.pbisyscmd
+ install -o root -g wheel -m 755 pbisyscmd /usr/bin/openwith
fi
-# Install the pbifs binary
-cd ${DIR}/pbifs && make
-install -o root -g wheel -m 755 pbifs ${LB}/share/pbi-manager/.pbifs
+# Install the pbi_preload wrapper library
+cd ${DIR}/pbi_preload && make
+install -o root -g wheel -m 755 pbi_preload.so ${LB}/share/pbi-manager/.pbi_preload.so
if [ "${LB}" = "/usr/local" ] ; then
- install -o root -g wheel -m 755 pbifs /usr/pbi/.pbifs
+ install -o root -g wheel -m 755 pbi_preload.so /usr/pbi/.pbi_preload.so
fi
# Install the MANPATH conf
@@ -0,0 +1,13 @@
+
+all: pbi_preload
+
+pbi_preload: pbi_preload.c
+ ${CC} -fPIC -c -o pbi_preload.o pbi_preload.c
+ ${CC} -shared -o pbi_preload.so pbi_preload.o
+
+install: pbi_preload
+ install -o root -g wheel -m 755 pbi_preload.so /usr/pbi/.pbi_preload.so
+
+clean:
+ rm pbi_preload.so
+ rm pbi_preload.o
@@ -0,0 +1,136 @@
+/*-
+ * Copyright (c) 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _DLFCN_H_
+#define _DLFCN_H_
+
+#include <sys/_types.h>
+
+/*
+ * Modes and flags for dlopen().
+ */
+#define RTLD_LAZY 1 /* Bind function calls lazily. */
+#define RTLD_NOW 2 /* Bind function calls immediately. */
+#define RTLD_MODEMASK 0x3
+#define RTLD_GLOBAL 0x100 /* Make symbols globally available. */
+#define RTLD_LOCAL 0 /* Opposite of RTLD_GLOBAL, and the default. */
+#define RTLD_TRACE 0x200 /* Trace loaded objects and exit. */
+#define RTLD_NODELETE 0x01000 /* Do not remove members. */
+#define RTLD_NOLOAD 0x02000 /* Do not load if not already loaded. */
+
+/*
+ * Request arguments for dlinfo().
+ */
+#define RTLD_DI_LINKMAP 2 /* Obtain link map. */
+#define RTLD_DI_SERINFO 4 /* Obtain search path info. */
+#define RTLD_DI_SERINFOSIZE 5 /* ... query for required space. */
+#define RTLD_DI_ORIGIN 6 /* Obtain object origin */
+#define RTLD_DI_MAX RTLD_DI_ORIGIN
+
+/*
+ * Special handle arguments for dlsym()/dlinfo().
+ */
+#define RTLD_NEXT ((void *) -1) /* Search subsequent objects. */
+#define RTLD_DEFAULT ((void *) -2) /* Use default search algorithm. */
+#define RTLD_SELF ((void *) -3) /* Search the caller itself. */
+
+#if __BSD_VISIBLE
+
+#ifndef _SIZE_T_DECLARED
+typedef __size_t size_t;
+#define _SIZE_T_DECLARED
+#endif
+
+/*
+ * Structure filled in by dladdr().
+ */
+typedef struct dl_info {
+ const char *dli_fname; /* Pathname of shared object. */
+ void *dli_fbase; /* Base address of shared object. */
+ const char *dli_sname; /* Name of nearest symbol. */
+ void *dli_saddr; /* Address of nearest symbol. */
+} Dl_info;
+
+/*-
+ * The actual type declared by this typedef is immaterial, provided that
+ * it is a function pointer. Its purpose is to provide a return type for
+ * dlfunc() which can be cast to a function pointer type without depending
+ * on behavior undefined by the C standard, which might trigger a compiler
+ * diagnostic. We intentionally declare a unique type signature to force
+ * a diagnostic should the application not cast the return value of dlfunc()
+ * appropriately.
+ */
+struct __dlfunc_arg {
+ int __dlfunc_dummy;
+};
+
+typedef void (*dlfunc_t)(struct __dlfunc_arg);
+
+/*
+ * Structures, returned by the RTLD_DI_SERINFO dlinfo() request.
+ */
+typedef struct dl_serpath {
+ char * dls_name; /* single search path entry */
+ unsigned int dls_flags; /* path information */
+} Dl_serpath;
+
+typedef struct dl_serinfo {
+ size_t dls_size; /* total buffer size */
+ unsigned int dls_cnt; /* number of path entries */
+ Dl_serpath dls_serpath[1]; /* there may be more than one */
+} Dl_serinfo;
+
+#endif /* __BSD_VISIBLE */
+
+__BEGIN_DECLS
+/* XSI functions first. */
+int dlclose(void *);
+char *dlerror(void);
+void *dlsym(void * __restrict, const char * __restrict);
+
+#if __BSD_VISIBLE
+void *fdlopen(int, int);
+int dladdr(const void * __restrict, Dl_info * __restrict);
+dlfunc_t dlfunc(void * __restrict, const char * __restrict);
+int dlinfo(void * __restrict, int, void * __restrict);
+void dllockinit(void *_context,
+ void *(*_lock_create)(void *_context),
+ void (*_rlock_acquire)(void *_lock),
+ void (*_wlock_acquire)(void *_lock),
+ void (*_lock_release)(void *_lock),
+ void (*_lock_destroy)(void *_lock),
+ void (*_context_destroy)(void *_context));
+void *dlvsym(void * __restrict, const char * __restrict,
+ const char * __restrict);
+#endif /* __BSD_VISIBLE */
+__END_DECLS
+
+#endif /* !_DLFCN_H_ */
Oops, something went wrong.

0 comments on commit 1cafdcc

Please sign in to comment.