PERFORCE change 166441 for review

Jonathan Anderson jona at FreeBSD.org
Thu Jul 23 13:56:49 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=166441

Change 166441 by jona at jona-trustedbsd-belle-vmware on 2009/07/23 13:56:30

	Added ua_stat(), ua_access(), ua_opendir() and ua_unmarshall_bytes()

Affected files ...

.. //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.c#9 edit
.. //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.h#11 edit

Differences ...

==== //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.c#9 (text+ko) ====

@@ -37,6 +37,7 @@
 
 #include <libcapability.h>
 
+#include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <stdarg.h>
@@ -139,6 +140,64 @@
 
 
 
+int ua_access(const char *path, int mode)
+{
+	if(angel < 0) angel = ua_find();
+	if(angel < 0) return -1;
+
+	struct ua_datum *data[3];
+	data[0] = ua_marshall_int(UA_CHECK_ACCESS);
+	data[1] = ua_marshall_string(path, strlen(path));
+	data[2] = ua_marshall_int(mode);
+
+	for(int i = 0; i < 3; i++) if(ua_send(angel, data[i], NULL, 0) < 0) return -1;
+
+	free(data[0]);
+	free(data[1]);
+	free(data[2]);
+
+
+
+	// retrieve the file descriptor(s)
+	struct ua_datum *d = ua_recv(angel, NULL, NULL);
+	if(!d) return -1;
+
+	int response;
+	if(ua_unmarshall_int(d, &response) < 0) return -1;
+
+	return response;
+}
+
+
+
+int ua_stat(const char *path, struct stat *s)
+{
+	if(angel < 0) angel = ua_find();
+	if(angel < 0) return -1;
+
+	struct ua_datum *data[2];
+	data[0] = ua_marshall_int(UA_STAT);
+	data[1] = ua_marshall_string(path, strlen(path));
+
+	for(int i = 0; i < 2; i++)
+		if(ua_send(angel, data[i], NULL, 0) < 0)
+			return -1;
+
+	free(data[0]);
+	free(data[1]);
+
+
+
+	struct ua_datum *d = ua_recv(angel, NULL, NULL);
+	if(!d) return -1;
+
+	unsigned int len = sizeof(struct stat);
+	if(ua_unmarshall_bytes(d, (char*) s, &len) < 0) return -1;
+
+	return 0;
+}
+
+
 int ua_open(const char *path, int flags)
 {
 	cap_rights_t rights = CAP_SEEK | CAP_FSYNC;
@@ -158,8 +217,6 @@
 	if(angel < 0) angel = ua_find();
 	if(angel < 0) return -1;
 
-	printf("ua_ropen('%s', %i, %016llx)\n", path, flags, rights);
-
 	struct ua_datum *data[4];
 	data[0] = ua_marshall_int(UA_OPEN_PATH);
 	data[1] = ua_marshall_string(path, strlen(path));
@@ -256,7 +313,16 @@
 }
 
 
+DIR* ua_opendir(const char *filename)
+{
+	int fd = ua_open(filename, O_RDONLY | O_DIRECTORY);
+	if(fd < 0) return NULL;
+
+	return fdopendir(fd);
+}
 
+
+
 int ua_send(int sock, datum *d, int32_t fds[], int32_t fdlen)
 {
 	// the datum is the I/O vector
@@ -434,6 +500,16 @@
 
 int ua_unmarshall_string(const datum *d, char *value, unsigned int *len)
 {
+	(*len)--;
+	ua_unmarshall_bytes(d, value, len);
+	value[*len] = '\0';
+
+	return d->length;
+}
+
+
+int ua_unmarshall_bytes(const datum *d, char *value, unsigned int *len)
+{
 	if(d == NULL)
 	{
 		errno = EINVAL;
@@ -448,7 +524,7 @@
 			return -1;
 		}
 	}
-	else if(d->length >= *len)
+	else if(d->length > *len)
 	{
 		errno = EOVERFLOW;
 		return -1;
@@ -456,7 +532,6 @@
 
 	*len = d->length;
 	memcpy(value, ((const char*) d) + sizeof(datum), d->length);
-	value[*len] = '\0';
 
 	return d->length;
 }

==== //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.h#11 (text+ko) ====

@@ -35,6 +35,9 @@
 #define	_LIBUSERANGEL_H_
 
 #include <sys/cdefs.h>
+#include <sys/stat.h>
+
+#include <dirent.h>
 #include <stdio.h>
 
 #include <libuserangel-powerbox.h>
@@ -53,6 +56,12 @@
 /** Set the user angel */
 void ua_set(int fd);
 
+/** Check access rights via the User Angel */
+int ua_access(const char *access, int mode);
+
+/** Check file status via the User Angel */
+int ua_stat(const char *path, struct stat *s);
+
 /** Open a file via the User Angel */
 int ua_open(const char *path, int flags);
 
@@ -62,6 +71,9 @@
 /** Open a file stream via the User Angel */
 FILE* ua_fopen(const char *path, const char *mode);
 
+/** Open a directory via the User Angel */
+DIR* ua_opendir(const char *filename);
+
 
 /* Low-level API */
 
@@ -69,7 +81,10 @@
 enum ua_request_t
 {
 	UA_NO_OP = 0,		/* do nothing (useful for debugging) */
+	UA_CHECK_ACCESS,        /* access() substitute */
+	UA_STAT,                /* stat() substitute */
 	UA_OPEN_PATH,		/* open() substitute */
+	UA_OPEN_DIR,            /* opendir() substitute */
 	UA_LOAD_LIBRARY,	/* load a shared library */
 	UA_POWERBOX		/* ask the user for file descriptor(s) */
 };
@@ -114,6 +129,7 @@
 
 /* Unmarshalling functions; return the number of bytes unmarshalled (or -1) */
 int ua_unmarshall_int(const struct ua_datum *d, int32_t *value);
+int ua_unmarshall_bytes(const struct ua_datum *d, char *value, unsigned int *len);
 int ua_unmarshall_string(const struct ua_datum *d, char *value, unsigned int *len);
 int ua_unmarshall_error(const struct ua_datum *d, int *errnum, char *msg, int *msglen);
 int ua_unmarshall_powerbox(const struct ua_datum *d, struct ua_powerbox_options *options);


More information about the p4-projects mailing list