From owner-p4-projects@FreeBSD.ORG Thu Jun 18 10:51:11 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1521E1065672; Thu, 18 Jun 2009 10:51:11 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C92FE106566B for ; Thu, 18 Jun 2009 10:51:10 +0000 (UTC) (envelope-from jona@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id B5D9A8FC15 for ; Thu, 18 Jun 2009 10:51:10 +0000 (UTC) (envelope-from jona@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n5IApAbV098114 for ; Thu, 18 Jun 2009 10:51:10 GMT (envelope-from jona@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5IApAqI098112 for perforce@freebsd.org; Thu, 18 Jun 2009 10:51:10 GMT (envelope-from jona@FreeBSD.org) Date: Thu, 18 Jun 2009 10:51:10 GMT Message-Id: <200906181051.n5IApAqI098112@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jona@FreeBSD.org using -f From: Jonathan Anderson To: Perforce Change Reviews Cc: Subject: PERFORCE change 164653 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 18 Jun 2009 10:51:11 -0000 http://perforce.freebsd.org/chv.cgi?CH=164653 Change 164653 by jona@jona-trustedbsd-kentvm on 2009/06/18 10:50:48 Some cleanup Affected files ... .. //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/powerbox.c#5 edit .. //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/powerbox.h#5 edit .. //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/server.c#6 edit .. //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/test_client.c#7 edit .. //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/user_angel.c#4 edit Differences ... ==== //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/powerbox.c#5 (text+ko) ==== @@ -46,48 +46,26 @@ int capbox_display(struct capbox_options *options, int fds[], char *names[], int *len) { - printf("capbox_display()\n"); - printf(" options:\n"); - printf(" UI: "); + // get the filenames from the user switch(options->ui) { - case KDE: printf("KDE"); break; - default: printf("", options->ui); - } - printf("\n"); + case KDE: + if(dbus_powerbox(options, names, len)) + { + fprintf(stderr, "Error opening DBus powerbox\n"); + return -1; + } + break; - printf(" operation: "); - switch(options->operation) - { - case OPEN_FILE: printf("OPEN_FILE"); break; - case SAVE_FILE: printf("SAVE_FILE"); break; - case SELECT_DIR: printf("SELECT_DIR"); break; - default: printf("", options->operation); + default: + fprintf(stderr, "Unhandled powerbox UI type %i\n", + options->ui); } - printf("\n"); - printf(" window title: %s\n", options->window_title); - printf(" parent window: %i\n", options->parent_window); - printf(" start path: "); - if(options->pathlen > 0) printf("%s\n", options->start_path); - else printf("\n"); - printf(" start FD: %i\n", options->start_fd); - printf(" multiple select: %s\n", (options->mult ? "true" : "false")); - printf(" filter: "); - if(options->filterlen > 0) printf("%s\n", options->filter); - else printf("\n"); - - if(dbus_powerbox(options, names, len)) - { - fprintf(stderr, "Error opening powerbox via DBus\n"); - return -1; - } - - printf("File names:\n"); + // open the files using the requested flags and rights for(int i = 0; i < *len; i++) { - printf(" %s\n", names[i]); fds[i] = cap_open(names[i], options->flags, options->rights); if(fds[i] < 0) { @@ -97,27 +75,5 @@ } return 0; - - fprintf(stderr, "powerbox not implemented, faking it\n"); - - if(*len > 0) - { - names[0] = (char*) malloc(32); - strcpy(names[0], "/etc/hosts"); - - fds[0] = open("/etc/hosts", O_RDONLY); - } - - if(*len > 1) - { - names[1] = (char*) malloc(32); - strcpy(names[1], "/etc/nsswitch.conf"); - - fds[1] = open("/etc/nsswitch.conf", O_RDONLY); - } - - if(*len > 2) *len = 2; - - return 0; } ==== //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/powerbox.h#5 (text+ko) ==== @@ -68,8 +68,6 @@ * Open a powerbox. * * @param options powerbox options - * @param flags open() flags (e.g. O_RDONLY) - * @param rights capabilities requested (e.g. CAP_SEEK) * @param fds an array for file descriptors (size len) * @param names an array for file names (size len) * @param len the length of the above arrays (modified by this call) ==== //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/server.c#6 (text+ko) ==== @@ -69,11 +69,13 @@ -int handle_request(int client, enum capangel_req_t req); int bind_to_path(const char *path); void serve(int fd_server, struct fd_set *clients); void accept_client(int fd_server); int service_client(int client); +int handle_request(int client, enum capangel_req_t req); +int handle_path_request(int client); +int handle_powerbox_request(int client); void client_closed(int client); @@ -279,127 +281,138 @@ { printf("Client %4i: ", client); - struct cap_wire_datum *d; - int pathlen = 256; - char path[pathlen]; - int fds[32]; - int fdlen; - switch(req) { case FD_FROM_PATH: - ; - fdlen = 1; - d = cap_recv_fds(client, fds, &fdlen); - if(!d) - { - perror("Error receiving path from client"); - return -1; - } + puts("FD_FROM_PATH"); + return handle_path_request(client); + + case FD_POWERBOX: + puts("FD_POWERBOX"); + return handle_powerbox_request(client); + + default: + fprintf(stderr, "Unknown request %i\n", req); + return -1; + } + + return 0; +} + + +int handle_path_request(int client) +{ + int fdlen = 0; + struct cap_wire_datum *d = cap_recv_fds(client, NULL, &fdlen); - if(cap_unmarshall_string(d, path, &pathlen) < 0) - { - fprintf(stderr, "Error unmarshalling path: %s\n", cap_error()); - return -1; - } - free(d); // TODO: why does this fail on attempt #245? + if(!d) + { + perror("Error receiving path from client"); + return -1; + } + char path[256] = ""; + int pathlen = 256; - printf("FD_FROM_PATH: %s\n", path); - int cap = cap_open(path, O_RDONLY, CAP_SET_FILE_READ); + if(cap_unmarshall_string(d, path, &pathlen) < 0) + { + fprintf(stderr, "Error unmarshalling path: %s\n", cap_error()); + return -1; + } + free(d); + - d = cap_marshall_int(1); - if(!d) - { - fprintf(stderr, "Error marshalling FD count: %s\n", cap_error()); - return -1; - } + int cap = cap_open(path, O_RDONLY, CAP_SET_FILE_READ); - if(cap_send(client, d) < 0) - { - perror("Error sending FD count"); - return -1; - } - free(d); + d = cap_marshall_int(1); + if(!d) + { + fprintf(stderr, "Error marshalling FD count: %s\n", cap_error()); + return -1; + } - d = cap_marshall_string(path, pathlen); - if(!d) - { - fprintf(stderr, "Error marshalling FD path: %s\n", cap_error()); - return -1; - } + if(cap_send(client, d) < 0) + { + perror("Error sending FD count"); + return -1; + } + free(d); - if(cap_send_fd(client, d, &cap, 1) < 0) - { - perror("Error sending FD"); - return -1; - } - close(cap); - free(d); + d = cap_marshall_string(path, pathlen); + if(!d) + { + fprintf(stderr, "Error marshalling FD path: %s\n", cap_error()); + return -1; + } - return 0; + if(cap_send_fd(client, d, &cap, 1) < 0) + { + perror("Error sending FD"); + return -1; + } + close(cap); + free(d); - case FD_POWERBOX: - puts("FD_POWERBOX"); + return 0; +} - struct capbox_options options; - fdlen = 1; - d = cap_recv_fds(client, &options.start_fd, &fdlen); - if(!d) - { - perror("Error receiving powerbox options"); - return -1; - } - if(cap_unmarshall_capbox(d, &options) < 0) - { - fprintf(stderr, "Error unmarshalling powerbox options: %s", - cap_error()); - return -1; - } +int handle_powerbox_request(int client) +{ + struct capbox_options options; + int fdlen = 1; + struct cap_wire_datum *d = cap_recv_fds(client, &options.start_fd, &fdlen); + if(!d) + { + perror("Error receiving powerbox options"); + return -1; + } - // TODO: some more sophisticated per-client state (eg name) - options.window_title = (char*) malloc(80); - sprintf(options.window_title, - "Powerbox for user_angel client %i", client); + if(cap_unmarshall_capbox(d, &options) < 0) + { + fprintf(stderr, "Error unmarshalling powerbox options: %s", + cap_error()); + return -1; + } - char *names[32]; - int len = 32; - if(capbox_display(&options, fds, names, &len)) - { - fprintf(stderr, "Error in powerbox\n"); - return 0; - } + // TODO: some more sophisticated per-client state (eg name) + options.window_title = (char*) malloc(80); + sprintf(options.window_title, + "Powerbox for user_angel client %i", client); - free(options.window_title); + int fds[32]; + char *names[32]; + int len = 32; + if(capbox_display(&options, fds, names, &len)) + { + fprintf(stderr, "Error in powerbox\n"); + return 0; + } - struct cap_wire_datum *fdcount = cap_marshall_int(len); - if(cap_send(client, fdcount) < 0) - { - perror("Error sending FD count"); - return -1; - } + free(options.window_title); - for(int i = 0; i < len; i++) - { - const char *name = names[i]; - struct cap_wire_datum *d - = cap_marshall_string(name, strlen(name)); - if(cap_send_fd(client, d, fds + i, 1) < 0) - { - printf("Error sending file descriptor"); - return -1; - } - } + struct cap_wire_datum *fdcount = cap_marshall_int(len); + if(cap_send(client, fdcount) < 0) + { + perror("Error sending FD count"); + return -1; + } + for(int i = 0; i < len; i++) + { + const char *name = names[i]; + struct cap_wire_datum *d + = cap_marshall_string(name, strlen(name)); - default: - fprintf(stderr, "Unknown request %i\n", req); + if(cap_send_fd(client, d, fds + i, 1) < 0) + { + printf("Error sending file descriptor"); return -1; + } } return 0; ==== //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/test_client.c#7 (text+ko) ==== @@ -17,6 +17,7 @@ int connect_to_user_angel(void); void open_file(int fd_angel, const char *path); void open_powerbox(int fd_angel, const char *path, const char *filter, int parent); +void test_fd(int fd, char *name); int main(int argc, char *argv[]) @@ -62,7 +63,7 @@ open_file(fd_angel, "/etc/group"); open_file(fd_angel, "/etc/passwd"); - open_powerbox(fd_angel, "~/Desktop/", "*.txt", 0x2a00003); + open_powerbox(fd_angel, "~/Desktop/", "*.gz", 0x2a00003); return 0; } @@ -135,11 +136,7 @@ return; } - printf("FD %i: %s\n", fd, name); - - FILE *f = fdopen(fd, "r"); - if(!f) err(EX_IOERR, "Error opening %s", name); - fclose(f); + test_fd(fd, name); } } @@ -156,6 +153,8 @@ options.mult = 1; options.filter = filter; options.filterlen = strlen(filter); + options.flags = O_RDWR; + options.rights = CAP_FSTAT | CAP_READ | CAP_WRITE | CAP_SEEK; struct cap_wire_datum *data[2]; @@ -197,11 +196,28 @@ return; } - printf("FD %i: %s\n", fd, name); + test_fd(fd, name); + } +} + + +void test_fd(int fd, char *name) +{ + printf("FD %i: %s\n", fd, name); + + FILE *rf = fdopen(fd, "r"); + if(!rf) err(EX_IOERR, "Error opening %s", name); + printf("Opened %s for reading\n", name); + fclose(rf); - FILE *f = fdopen(fd, "r"); - if(!f) err(EX_IOERR, "Error opening %s", name); - fclose(f); + FILE *wf = fdopen(fd, "w"); + if(wf) + { + printf("Opened %s for writing\n", name); + fclose(wf); } + else printf("Couldn't open %s for writing\n", name); + + close(fd); } ==== //depot/projects/trustedbsd/capabilities/src/tools/cap/user_angel/user_angel.c#4 (text+ko) ==== @@ -50,13 +50,6 @@ #include "server.h" -#define BASE_CAPS (CAP_IOCTL | CAP_EVENT | CAP_SEEK | CAP_FSTAT) -#define STDIN_CAPS (BASE_CAPS | CAP_READ) -#define STDOUT_CAPS (BASE_CAPS | CAP_WRITE) -#define STDERR_CAPS (BASE_CAPS | CAP_WRITE) -#define BIN_CAPS (CAP_SEEK | CAP_FSTAT | CAP_FSTATFS | CAP_READ | \ - CAP_FEXECVE | CAP_MMAP | CAP_MAPEXEC) - void sighandle(int sig) { @@ -94,83 +87,12 @@ return 1; } - - char address[128]; sprintf(address, "%s/.user-angel", homedir); + run_server(address); - /* - printf("Creating control socket at %s\n", control_socket_name); - - struct sockaddr_un addr; - addr.sun_family = AF_UNIX; - strcpy(addr.sun_path, control_socket_name); - - - fd_control = socket(AF_UNIX, SOCK_STREAM, 0); - if(fd_control == 0) - { - perror("Error creating control socket"); - user_angel_shutdown(); - return -1; - } - - if(bind(fd_control, (struct sockaddr*) &addr, sizeof(struct sockaddr_un))) - { - perror("Error binding control socket"); - user_angel_shutdown(); - return -1; - } - - - if(listen(fd_control, 10)) - { - perror("Error listening for connections"); - user_angel_shutdown(); - return -1; - } - - int client; - struct sockaddr_un clientaddr; - int clientaddrlen; - - client = accept(fd_control, &clientaddr, &clientaddrlen); - if(client <= 0) - { - perror("Error accepting client"); - user_angel_shutdown(); - return -1; - } - - printf("Accepted client: %i\n", client); -*/ user_angel_server_shutdown(); - return 0; -/* fd_control = open(control_socket_name, O_RDONLY | O_NONBLOCK); - - - enum user_angel_request req; - while(1) - { - int bytes = read(fd_control, &req, 4); - - if(bytes == 0) usleep(100); - else if(bytes > 0) - { - printf("Read %i bytes\n", bytes); - printf("Req: %x\n", req); - } - else - { - if(shutting_down) return 0; - - perror("Error reading from control pipe"); - break; - } - } - user_angel_server_shutdown(); -*/ return 0; }