X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=e109d6c1bef5dbc5e53696dfa2632a55f57b38d5;hp=6d51d4f58ad9f35a3a79b03d41cbd90b6a85b418;hb=f07fded9f5645a7ac89e63baf50b895cd3a4a140;hpb=4c2a8737d3867f7ec8ee4d858e981c1b62e29759 diff --git a/afs.c b/afs.c index 6d51d4f5..e109d6c1 100644 --- a/afs.c +++ b/afs.c @@ -144,11 +144,12 @@ int send_callback_request(callback_function *f, struct osl_object *query, int ret, fd = -1, query_shmid, result_shmid; void *query_shm, *result_shm; char buf[sizeof(afs_socket_cookie) + sizeof(int)]; -// char *tmpsocket_name; struct sockaddr_un unix_addr; + size_t query_shm_size = sizeof(*cq); - assert(query->data && query->size); - ret = shm_new(query->size + sizeof(*cq)); + if (query) + query_shm_size += query->size; + ret = shm_new(query_shm_size); if (ret < 0) return ret; query_shmid = ret; @@ -157,9 +158,10 @@ int send_callback_request(callback_function *f, struct osl_object *query, goto out; cq = query_shm; cq->handler = f; - cq->query_size = query->size; + cq->query_size = query_shm_size - sizeof(*cq); - memcpy(query_shm + sizeof(*cq), query->data, query->size); + if (query) + memcpy(query_shm + sizeof(*cq), query->data, query->size); ret = shm_detach(query_shm); if (ret < 0) goto out; @@ -364,8 +366,9 @@ static int fd2buf(int fd, unsigned max_size, struct osl_object *obj) } /** - * Read from stdin, and send the result to the parent process. + * Read data from a file descriptor, and send it to the afs process. * + * \param fd File descriptor to read data from. * \param arg_obj Pointer to the arguments to \a f. * \param f The callback function. * \param max_len Don't read more than that many bytes from stdin. @@ -373,7 +376,7 @@ static int fd2buf(int fd, unsigned max_size, struct osl_object *obj) * * This function is used by commands that wish to let para_server store * arbitrary data specified by the user (for instance the add_blob family of - * commands). First, at most \a max_len bytes are read from stdin, the result + * commands). First, at most \a max_len bytes are read from \a fd, the result * is concatenated with the buffer given by \a arg_obj, and the combined buffer * is made available to the parent process via shared memory. * @@ -855,3 +858,66 @@ int com_init(int fd, int argc, char * const * const argv) return ret; return send_va_buffer(fd, "successfully created afs table(s)\n"); } + +enum com_check_flags { + CHECK_AFT = 1, + CHECK_MOODS = 2, + CHECK_PLAYLISTS = 4 +}; + +int com_check(int fd, int argc, char * const * const argv) +{ + unsigned flags = 0; + int i, ret; + struct osl_object result; + + for (i = 1; i < argc; i++) { + const char *arg = argv[i]; + if (arg[0] != '-') + break; + if (!strcmp(arg, "--")) { + i++; + break; + } + if (!strcmp(arg, "-a")) { + flags |= CHECK_AFT; + continue; + } + if (!strcmp(arg, "-p")) { + flags |= CHECK_PLAYLISTS; + continue; + } + if (!strcmp(arg, "-m")) { + flags |= CHECK_MOODS; + continue; + } + return -E_AFS_SYNTAX; + } + if (i < argc) + return -E_AFS_SYNTAX; + if (!flags) + flags = ~0U; + if (flags & CHECK_AFT) { + ret = send_callback_request(aft_check_callback, NULL, &result); + if (ret < 0) + return ret; + if (ret > 0) { + ret = send_buffer(fd, (char *) result.data); + free(result.data); + if (ret < 0) + return ret; + } + } + if (flags & CHECK_PLAYLISTS) { + ret = send_callback_request(playlist_check_callback, NULL, &result); + if (ret < 0) + return ret; + if (ret > 0) { + ret = send_buffer(fd, (char *) result.data); + free(result.data); + if (ret < 0) + return ret; + } + } + return 1; +}