Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Jul 2009 13:59:50 GMT
From:      Jonathan Anderson <jona@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 166443 for review
Message-ID:  <200907231359.n6NDxoU1028546@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=166443

Change 166443 by jona@jona-trustedbsd-belle-vmware on 2009/07/23 13:59:40

	Handle ua_access() and ua_stat() requests in the user_angel

Affected files ...

.. //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/server.c#16 edit

Differences ...

==== //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/server.c#16 (text+ko) ====

@@ -33,6 +33,7 @@
 
 #include <sys/capability.h>
 #include <sys/socket.h>
+#include <sys/stat.h>
 #include <sys/un.h>
 
 #include <libuserangel.h>
@@ -80,6 +81,8 @@
 void	accept_client(int fd_server);
 int	service_client(struct client*);
 int	handle_request(struct client*, enum ua_request_t);
+int	handle_stat_request(struct client *client, struct ua_datum *d);
+int	handle_check_access(struct client *client, struct ua_datum *d);
 int	handle_path_request(struct client*, struct ua_datum*);
 int	handle_powerbox_request(struct client*, struct ua_datum*);
 void	client_error(struct client*, const char *message, int errnum,
@@ -207,9 +210,9 @@
 		for(struct client *c = clients; ; c = c->next)
 			if(c->next == NULL)
 			{
-				c->next = client;
 				client->prev = c;
 				client->next = NULL;
+				c->next = client;
 				break;
 			}
 
@@ -246,21 +249,27 @@
 
 	if(FD_ISSET(fd_server, &selected))
 	{
+		printf("server socket selected\n"); /* TODO: tmp */
 		accept_client(fd_server);
 
 		FD_CLR(fd_server, &selected);
 		ready--;
 	}
 
-	for(struct client *c = clients; c && ready; c = c->next)
+	for(struct client *c = clients; c && ready; )
 		if(FD_ISSET(c->socket, &selected))
 		{
 			int sock = c->socket;
+			struct client *next = c->next;
+
 			service_client(c);
 
 			FD_CLR(sock, &selected);
 			ready--;
+
+			c = next;
 		}
+		else c = c->next;
 }
 
 
@@ -327,12 +336,23 @@
 	int retval;
 	switch(req)
 	{
+		case UA_CHECK_ACCESS:
+			printf("%20s", "UA_CHECK_ACCESS");
+			retval = handle_check_access(client, datum);
+			break;
+
+		case UA_STAT:
+			printf("%20s", "UA_STAT");
+			retval = handle_stat_request(client, datum);
+			break;
+
 		case UA_OPEN_PATH:
+			printf("%20s", "UA_OPEN_PATH");
 			retval = handle_path_request(client, datum);
 			break;
 
 		case UA_POWERBOX:
-			puts("UA_POWERBOX");
+			printf("%20s", "UA_POWERBOX");
 			retval = handle_powerbox_request(client, datum);
 			break;
 
@@ -346,14 +366,65 @@
 }
 
 
+int handle_check_access(struct client *client, struct ua_datum *d)
+{
+	char path[256] = "";
+	unsigned int pathlen = 256;
+
+	int sock = client->socket;
+
+	if(ua_unmarshall_string(d, path, &pathlen) < 0) return -1;
+
+	printf(": %s\n", path);
+
+	int32_t mode;
+	if(ua_unmarshall_int(ua_recv(sock, NULL, NULL), &mode) < 0) return -1;
+
+
+	int retval = access(path, mode);
+	d = ua_marshall_int(retval);
+	if(!d) return -1;
+
+	if(ua_send(sock, d, NULL, 0) < 0) return -1;
+	free(d);
+
+
+	return 0;
+}
+
+
+int handle_stat_request(struct client *client, struct ua_datum *d)
+{
+	char path[256] = "";
+	unsigned int pathlen = 256;
+
+	int sock = client->socket;
+
+	if(ua_unmarshall_string(d, path, &pathlen) < 0) return -1;
+	printf(": %s\n", path);
+
+	struct stat s;
+	if(stat(path, &s)) return 1;
+
+
+	d = ua_marshall_string((char*) &s, sizeof(s));
+	if(!d) return -1;
+
+	if(ua_send(sock, d, NULL, 0) < 0) return -1;
+	free(d);
+
+
+	return 0;
+}
+
+
+
 int handle_path_request(struct client *client, struct ua_datum *d)
 {
 //	unsigned int fdlen = 0;
 	char path[256] = "";
 	unsigned int pathlen = 256;
 
-	printf("UA_OPEN_PATH");
-
 	int sock = client->socket;
 
 //	struct ua_datum *d = ua_recv(sock, NULL, &fdlen);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907231359.n6NDxoU1028546>