PERFORCE change 168316 for review
Jonathan Anderson
jona at FreeBSD.org
Tue Sep 8 00:59:31 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=168316
Change 168316 by jona at jona-trustedbsd-belle-vmware on 2009/09/08 00:59:16
Handle FD caching and retrieving
Affected files ...
.. //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.c#16 edit
.. //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.h#14 edit
Differences ...
==== //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.c#16 (text+ko) ====
@@ -140,6 +140,92 @@
+int ua_ping()
+{
+ if(angel < 0) angel = ua_find();
+ if(angel < 0) return -1;
+
+ datum *d = ua_marshall_int(UA_NO_OP);
+ if(ua_send(angel, d, NULL, 0) < 0) return -1;
+ if(ua_send(angel, d, NULL, 0) < 0) return -1; /* we have to send an arg */
+ free(d);
+
+ 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_cache_fd(int fd, const char *name, char **token, int long_lasting)
+{
+ if(angel < 0) angel = ua_find();
+ if(angel < 0) return -1;
+
+ struct ua_datum *data[4];
+ data[0] = ua_marshall_int(UA_CACHE_FD);
+ data[1] = ua_marshall_int(1);
+ data[2] = ua_marshall_int(long_lasting);
+ data[3] = ua_marshall_string(name, strlen(name));
+
+ for(int i = 0; i < 3; i++)
+ {
+ if(ua_send(angel, data[i], NULL, 0) < 0) return -1;
+ free(data[i]);
+ }
+
+ if(ua_send(angel, data[3], &fd, 1) < 0) return -1;
+ free(data[3]);
+
+
+
+ // retrieve the crypto token
+ struct ua_datum *d = ua_recv(angel, NULL, NULL);
+ if(!d) return -1;
+
+ unsigned int len = d->length + 1;
+ *token = malloc(len);
+ if(ua_unmarshall_string(d, *token, &len) < 0) return -1;
+
+ return 0;
+}
+
+
+int ua_retrieve_fd(const char *token)
+{
+ if(angel < 0) angel = ua_find();
+ if(angel < 0) return -1;
+
+ struct ua_datum *data[2];
+ data[0] = ua_marshall_int(UA_RETRIEVE_FD);
+ data[1] = ua_marshall_string(token, strlen(token));
+
+ for(int i = 0; i < 2; i++)
+ {
+ if(ua_send(angel, data[i], NULL, 0) < 0) return -1;
+ free(data[i]);
+ }
+
+ // retrieve the file descriptor
+ int32_t fd = -1;
+ unsigned int fdlen = 1;
+ struct ua_datum *d = ua_recv(angel, &fd, &fdlen);
+ if(!d) return -1;
+
+ // make sure there hasn't been an error
+ unsigned int buflen = d->length + 1;
+ char buf[buflen];
+ if(ua_unmarshall_string(d, buf, &buflen) < 0) return -1;
+
+ return fd;
+}
+
+
+
int ua_access(const char *path, int mode)
{
if(angel < 0) angel = ua_find();
@@ -603,7 +689,10 @@
int ua_unmarshall_string(const datum *d, char *value, unsigned int *len)
{
(*len)--;
- ua_unmarshall_bytes(d, value, len);
+
+ int ret = ua_unmarshall_bytes(d, value, len);
+ if(ret < 0) return ret;
+
value[*len] = '\0';
return d->length;
@@ -620,11 +709,8 @@
else if(d->type != STRING)
{
if(d->type & ERROR) handle_error(d);
- else
- {
- errno = EINVAL;
- return -1;
- }
+ else errno = EINVAL;
+ return -1;
}
else if(d->length > *len)
{
==== //depot/projects/trustedbsd/capabilities/src/lib/libuserangel/libuserangel.h#14 (text+ko) ====
@@ -56,6 +56,15 @@
/** Set the user angel */
void ua_set(int fd);
+/** Ping the user angel to make sure the connection works */
+int ua_ping(void);
+
+/** Cache a file descriptor */
+int ua_cache_fd(int fd, const char *name, char **token, int long_lasting);
+
+/** Retrieve a cached file descriptor */
+int ua_retrieve_fd(const char *token);
+
/** Check access rights via the User Angel */
int ua_access(const char *access, int mode);
@@ -81,6 +90,8 @@
enum ua_request_t
{
UA_NO_OP = 0, /* do nothing (useful for debugging) */
+ UA_CACHE_FD, /* cache a file descriptor */
+ UA_RETRIEVE_FD, /* retrieve a cached file descriptor */
UA_CHECK_ACCESS, /* access() substitute */
UA_STAT, /* stat() substitute */
UA_OPEN_PATH, /* open() substitute */
More information about the p4-projects
mailing list