PERFORCE change 163967 for review
Robert Watson
rwatson at FreeBSD.org
Wed Jun 10 11:00:54 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=163967
Change 163967 by rwatson at rwatson_freebsd_capabilities on 2009/06/10 11:00:14
Start also implementing an agent API, simplify host API a bit.
Affected files ...
.. //depot/projects/trustedbsd/capabilities/src/lib/libcapability/Makefile#3 edit
.. //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability.3#3 edit
.. //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability.c#2 edit
.. //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability.h#5 edit
.. //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability_agent.c#1 add
.. //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability_agent_api.h#1 add
Differences ...
==== //depot/projects/trustedbsd/capabilities/src/lib/libcapability/Makefile#3 (text+ko) ====
@@ -3,7 +3,8 @@
LIB= capability
SRCS= \
- libcapability.c
+ libcapability.c \
+ libcapability_agent.c
INCS= libcapability.h
==== //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability.3#3 (text+ko) ====
@@ -47,19 +47,27 @@
.Ft int
.Fn lc_limitfd "int fd" "cap_rights_t rights"
.Ft int
-.Fn lch_agent_start "const char *agent" "struct lc_agent **lcap"
+.Fn lch_start "const char *agent" "struct lc_agent **lcap"
.Ft void
-.Fn lch_agent_stop "struct lc_agent *lcap"
+.Fn lch_stop "struct lc_agent *lcap"
+.Ft int
+.Fn lch_getsock "struct lc_agent *lcap" "int *fdp"
+.Ft int
+.Fn lch_getpid "struct lc_agent *lcap" "pid_t *pidp"
.Ft int
-.Fn lch_agent_getsock "struct lc_agent *lcap" "int *fdp"
+.Fn lch_getprocdesc "struct lc_agent *lcap" "int *fdp"
+.Ft ssize_t
+.Fn lch_recv "struct lc_agent *lcap, void *buf" "size_t len" "int flags"
+.Ft ssize_t
+.Fn lch_send "struct lc_agent *lcap" "const void *msg" "size_t len" "int flags"
.Ft int
-.Fn lch_agent_getpid "struct lc_agent *lcap" "pid_t *pidp"
+.Fn lca_get "struct lc_host **lchpp"
.Ft int
-.Fn lch_agent_getprocdesc "struct lc_agent *lcap" "int *fdp"
+.Fn lca_getsock "struct lc_host *lchp" "int *fdp"
.Ft ssize_t
-.Fn lch_agent_recv "struct lc_agent *lcap, void *buf" "size_t len" "int flags"
+.Fn lca_recv "struct lc_host *lchp" "void *buf" "size_t len" "int flags"
.Ft ssize_t
-.Fn lch_agent_send "struct lc_agent *lcap" "const void *msg" "size_t len" "int flags"
+.Fn lca_send "struct lc_host *lchp" "const void *msg" "size_t len" "int flags"
.Sh DESCRIPTION
The
.Nm
@@ -76,26 +84,26 @@
Each executing agent instance is described by an opaque
.Dt "struct lc_agent" ,
which is returned by
-.Fn lch_agent_start
+.Fn lch_start
for successfully started agents, and passed into other APIs to indicate which
agent should be acted on.
-.Fn lch_agent_start
+.Fn lch_start
creates a new executing agent, given the name of the agent binary via
.Va agent .
Executing agents may be stopped (and state freed) using
-.Fn lch_agent_stop .
+.Fn lch_stop .
.Pp
Properties of the agent, such as the socket used to communicate with it,
the proces descriptor for the agent process, and the pid, may be queried
using
-.Fn lch_agent_getsock ,
-.Fn lch_agent_getprocdesc ,
+.Fn lch_getsock ,
+.Fn lch_getprocdesc ,
and
-.Fn lch_agent_getpid .
+.Fn lch_getpid .
.Pp
-.Fn lch_agent_recv
+.Fn lch_recv
and
-.Fn lch_agent_send
+.Fn lch_send
provide simple wrappers around
.Xr recv 2
and
@@ -108,6 +116,24 @@
agent API allows agent processes to interact with their host process.
Agent API functions can be identified by their function name prefix,
.Dv lca_ .
+.Pp
+Each executing agent will have a single corresponding host instance,
+described by an opaque
+.Dt "struct lc_host" ,
+which is returned by
+.Fn lca_get .
+.Pp
+The socket for the host may be queried using
+.Fn lca_getsock .
+.Pp
+.Fn lca_recv
+and
+.Fn lca_send
+provide simple wrappers around
+.Xr recv 2
+and
+.Xr send 2
+to avoid agents having to query host socket file descriptors before use.
.Sh SEE ALSO
.Xr cap_enter 2
.Xr cap_new 2
==== //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability.c#2 (text+ko) ====
@@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability.c#1 $
+ * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability.c#2 $
*/
#include <sys/types.h>
@@ -47,6 +47,7 @@
#include <unistd.h>
#include "libcapability.h"
+#include "libcapability_agent_api.h"
#define LIBCAPABILITY_CAPMASK_DEVNULL (CAP_EVENT | CAP_READ | CAP_WRITE)
#define LIBCAPABILITY_CAPMASK_SOCK (CAP_EVENT | CAP_READ | CAP_WRITE)
@@ -143,7 +144,7 @@
static void
lch_agent(int fd_sock, int fd_agent, int fd_ldso, int fd_libc, int fd_libz)
{
- char *env_caplibindex;
+ char *env_caplibindex, *env_libcapability_agent_api;
int fd_array[8], fd_devnull;
fd_devnull = open(_PATH_DEVNULL, O_RDWR);
@@ -172,10 +173,27 @@
if (lch_installfds(7, fd_array) < 0)
return;
+ /*
+ * Pass library list into rtld-elf-cap.
+ */
if (asprintf(&env_caplibindex, "%d:%s,%d:%s", fd_libc, LIBC_SO,
fd_libz, LIBZ_SO) == -1)
return;
- setenv("LD_CAPLIBINDEX", env_caplibindex, 1);
+ if (setenv("LD_CAPLIBINDEX", env_caplibindex, 1) == -1)
+ return;
+ free(env_caplibindex);
+
+ /*
+ * Make sure that libcapability in the sandbox knows that its API
+ * assumptions hold.
+ */
+ if (asprintf(&env_libcapability_agent_api, "%s:%d",
+ LIBCAPABILITY_AGENT_API_SOCK, fd_sock) == -1)
+ return;
+ if (setenv(LIBCAPABILITY_AGENT_API_ENV, env_libcapability_agent_api,
+ 1) == -1)
+ return;
+ free(env_libcapability_agent_api);
if (cap_enter() < 0)
return;
@@ -184,7 +202,7 @@
}
int
-lch_agent_start(const char *agent, struct lc_agent **lcapp)
+lch_start(const char *agent, struct lc_agent **lcapp)
{
struct lc_agent *lcap;
int fd_agent, fd_ldso, fd_libc, fd_libz, fd_procdesc, fd_sockpair[2];
@@ -270,7 +288,7 @@
}
void
-lch_agent_stop(struct lc_agent *lcap)
+lch_stop(struct lc_agent *lcap)
{
close(lcap->lca_fd_sock);
@@ -281,7 +299,7 @@
}
int
-lch_agent_getsock(struct lc_agent *lcap, int *fdp)
+lch_getsock(struct lc_agent *lcap, int *fdp)
{
*fdp = lcap->lca_fd_sock;
@@ -289,7 +307,7 @@
}
int
-lch_agent_getpid(struct lc_agent *lcap, pid_t *pidp)
+lch_getpid(struct lc_agent *lcap, pid_t *pidp)
{
*pidp = lcap->lca_pid;
@@ -297,7 +315,7 @@
}
int
-lch_agent_getprocdesc(struct lc_agent *lcap, int *fdp)
+lch_getprocdesc(struct lc_agent *lcap, int *fdp)
{
*fdp = lcap->lca_fd_procdesc;
@@ -309,7 +327,7 @@
* on the worker should take place here.
*/
ssize_t
-lch_agent_send(struct lc_agent *lcap, const void *msg, size_t len, int flags)
+lch_send(struct lc_agent *lcap, const void *msg, size_t len, int flags)
{
if (lcap->lca_fd_sock == -1 ||
@@ -321,7 +339,7 @@
}
ssize_t
-lch_agent_recv(struct lc_agent *lcap, void *buf, size_t len, int flags)
+lch_recv(struct lc_agent *lcap, void *buf, size_t len, int flags)
{
if (lcap->lca_fd_sock == -1 ||
==== //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability.h#5 (text+ko) ====
@@ -30,13 +30,14 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability.h#4 $
+ * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapability/libcapability.h#5 $
*/
#ifndef _LIBCAPABILITY_H_
#define _LIBCAPABILITY_H_
struct lc_agent;
+struct lc_host;
/*
* Capability interfaces.
@@ -46,22 +47,30 @@
/*
* Interfaces to start and stop capability mode agents.
*/
-int lch_agent_start(const char *agent, struct lc_agent **lcap);
-void lch_agent_stop(struct lc_agent *lcap);
+int lch_start(const char *agent, struct lc_agent **lcapp);
+void lch_stop(struct lc_agent *lcap);
/*
* Interfaces to query state about capability mode agents.
*/
-int lch_agent_getsock(struct lc_agent *lcap, int *fdp);
-int lch_agent_getpid(struct lc_agent *lcap, pid_t *pidp);
-int lch_agent_getprocdesc(struct lc_agent *lcap, int *fdp);
+int lch_getsock(struct lc_agent *lcap, int *fdp);
+int lch_getpid(struct lc_agent *lcap, pid_t *pidp);
+int lch_getprocdesc(struct lc_agent *lcap, int *fdp);
/*
* I/O interfaces for capability mode agents.
*/
-ssize_t lch_agent_recv(struct lc_agent *lcap, void *buf, size_t len,
+ssize_t lch_recv(struct lc_agent *lcap, void *buf, size_t len, int flags);
+ssize_t lch_send(struct lc_agent *lcap, const void *msg, size_t len,
int flags);
-ssize_t lch_agent_send(struct lc_agent *lcap, const void *msg, size_t len,
+
+/*
+ * Capability mode agent APIs.
+ */
+int lca_get(struct lc_host **lchpp);
+int lca_getsock(struct lc_host *lchp, int *fdp);
+ssize_t lca_recv(struct lc_host *lchp, void *buf, size_t len, int flags);
+ssize_t lca_send(struct lc_host *lchp, const void *msg, size_t len,
int flags);
#endif /* !_LIBCAPABILITY_H_ */
More information about the p4-projects
mailing list