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;
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;
return ret;
return send_va_buffer(fd, "successfully created afs table(s)\n");
}
+
+enum com_check_flags {
+ CHECK_AFT = 1,
+ CHECK_MOODS_TABLE = 8,
+ CHECK_PLAYLISTS = 16
+};
+
+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;
+ }
+ 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;
+ }
+ }
+ return 1;
+}