diff --git a/Makefile b/Makefile index 07e3b0a..201ef07 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ daemon: - gcc -ggdb3 -Wall guestfs-inspectd.c -o guestfs-inspectd `pkg-config libguestfs libczmq --cflags --libs` + gcc -ggdb3 -Wall guestfs-inspectd.c libguestfs-inspect.c -o guestfs-inspectd `pkg-config libguestfs libczmq --cflags --libs` client: - gcc -ggdb3 -Wall guestfs-inspect.c -o guestfs-inspect `pkg-config libguestfs libczmq --cflags --libs` + gcc -ggdb3 -Wall guestfs-inspect.c libguestfs-inspect.c -o guestfs-inspect `pkg-config libguestfs libczmq --cflags --libs` build: daemon client diff --git a/libguestfs-inspect.c b/libguestfs-inspect.c new file mode 100644 index 0000000..3e0d6d0 --- /dev/null +++ b/libguestfs-inspect.c @@ -0,0 +1,110 @@ +#include + +#include "libguestfs-inspect.h" + +char *guestfs_inspect_endpoint() { + const char *guestfs_inspect_endpoint = getenv("GUESTFS_INSPECT_ENDPOINT"); + const char *socket_file_name = "/guestfs-inspect.sock"; + char *res = NULL; + if (guestfs_inspect_endpoint) { + res = malloc(strlen(guestfs_inspect_endpoint) + 1); + strcpy(res, guestfs_inspect_endpoint); + } else { + const char *xdg_runtime_dir = getenv("XDG_RUNTIME_DIR"); + if (xdg_runtime_dir) { + res = malloc(strlen(xdg_runtime_dir) + strlen(socket_file_name) + strlen("ipc://") + 1); + strcpy(res, "ipc://"); + strcat(res, xdg_runtime_dir); + strcat(res, socket_file_name); + } else { + const char *tmp_dir = "/tmp"; + res = malloc(strlen(tmp_dir) + strlen(socket_file_name) + strlen("ipc://") + 1); + strcpy(res, "ipc://"); + strcat(res, tmp_dir); + strcat(res, socket_file_name); + } + } + return res; +} + +zmsg_t *guestfs_inspect_command_to_zmsg(struct guestfs_inpsect_command *command) { + zmsg_t *res = zmsg_new(); + + zmsg_addstr(res, command->name); + zmsg_addmem(res, &(command->command), sizeof(command->command)); + + switch (command->command) { + case GUESTFS_COMMAND_LS: + zmsg_addmem(res, &(command->args.ls.paths_length), sizeof(command->args.ls.paths_length)); + + for (size_t i = 0; i < (command->args.ls.paths_length); i++) { + zmsg_addstr(res, command->args.ls.paths[i]); + } + break; + case GUESTFS_COMMAND_CAT: + zmsg_addmem(res, &(command->args.cat.paths_length), sizeof(command->args.cat.paths_length)); + + for (size_t i = 0; i < (command->args.cat.paths_length); i++) { + zmsg_addstr(res, command->args.cat.paths[i]); + } + break; + } + + return res; +} + +struct guestfs_inpsect_command *guestfs_inspect_zmsg_to_command(zmsg_t *msg) { + struct guestfs_inpsect_command *res = malloc(sizeof(struct guestfs_inpsect_command)); + + res->name = zmsg_popstr(msg); + zframe_t *next = zmsg_pop(msg); + res->command = *(zframe_data(next)); + free(next); + + switch (res->command) { + case GUESTFS_COMMAND_LS: + next = zmsg_pop(msg); + res->args.ls.paths_length = *(zframe_data(next)); + free(next); + + res->args.ls.paths = calloc(res->args.ls.paths_length, sizeof(char *)); + + for (size_t i = 0; i < res->args.ls.paths_length; i++) { + res->args.ls.paths[i] = zmsg_popstr(msg); + } + break; + case GUESTFS_COMMAND_CAT: + next = zmsg_pop(msg); + res->args.cat.paths_length = *(zframe_data(next)); + free(next); + + res->args.cat.paths = calloc(res->args.cat.paths_length, sizeof(char *)); + + for (size_t i = 0; i < res->args.cat.paths_length; i++) { + res->args.cat.paths[i] = zmsg_popstr(msg); + } + break; + } + return res; +} + +void guestfs_inspect_command_destroy(struct guestfs_inpsect_command **c) { + free((*c)->name); + switch ((*c)->command) { + case GUESTFS_COMMAND_LS: + for (size_t i = 0; i < (*c)->args.ls.paths_length; i++) { + free((*c)->args.ls.paths[i]); + } + free((*c)->args.ls.paths); + break; + case GUESTFS_COMMAND_CAT: + for (size_t i = 0; i < (*c)->args.cat.paths_length; i++) { + free((*c)->args.cat.paths[i]); + } + free((*c)->args.cat.paths); + break; + } + + free(*c); + *c = NULL; +} diff --git a/libguestfs-inspect.h b/libguestfs-inspect.h index d9cb4b7..c9f7448 100644 --- a/libguestfs-inspect.h +++ b/libguestfs-inspect.h @@ -28,111 +28,9 @@ struct guestfs_inpsect_command { } args; }; -char *guestfs_inspect_endpoint() { - const char *guestfs_inspect_endpoint = getenv("GUESTFS_INSPECT_ENDPOINT"); - const char *socket_file_name = "/guestfs-inspect.sock"; - char *res = NULL; - if (guestfs_inspect_endpoint) { - res = malloc(strlen(guestfs_inspect_endpoint) + 1); - strcpy(res, guestfs_inspect_endpoint); - } else { - const char *xdg_runtime_dir = getenv("XDG_RUNTIME_DIR"); - if (xdg_runtime_dir) { - res = malloc(strlen(xdg_runtime_dir) + strlen(socket_file_name) + strlen("ipc://") + 1); - strcpy(res, "ipc://"); - strcat(res, xdg_runtime_dir); - strcat(res, socket_file_name); - } else { - const char *tmp_dir = "/tmp"; - res = malloc(strlen(tmp_dir) + strlen(socket_file_name) + strlen("ipc://") + 1); - strcpy(res, "ipc://"); - strcat(res, tmp_dir); - strcat(res, socket_file_name); - } - } - return res; -} - -zmsg_t *guestfs_inspect_command_to_zmsg(struct guestfs_inpsect_command *command) { - zmsg_t *res = zmsg_new(); - - zmsg_addstr(res, command->name); - zmsg_addmem(res, &(command->command), sizeof(command->command)); - - switch (command->command) { - case GUESTFS_COMMAND_LS: - zmsg_addmem(res, &(command->args.ls.paths_length), sizeof(command->args.ls.paths_length)); - - for (size_t i = 0; i < (command->args.ls.paths_length); i++) { - zmsg_addstr(res, command->args.ls.paths[i]); - } - break; - case GUESTFS_COMMAND_CAT: - zmsg_addmem(res, &(command->args.cat.paths_length), sizeof(command->args.cat.paths_length)); - - for (size_t i = 0; i < (command->args.cat.paths_length); i++) { - zmsg_addstr(res, command->args.cat.paths[i]); - } - break; - } - - return res; -} - -struct guestfs_inpsect_command *guestfs_inspect_zmsg_to_command(zmsg_t *msg) { - struct guestfs_inpsect_command *res = malloc(sizeof(struct guestfs_inpsect_command)); - - res->name = zmsg_popstr(msg); - zframe_t *next = zmsg_pop(msg); - res->command = *(zframe_data(next)); - free(next); - - switch (res->command) { - case GUESTFS_COMMAND_LS: - next = zmsg_pop(msg); - res->args.ls.paths_length = *(zframe_data(next)); - free(next); - - res->args.ls.paths = calloc(res->args.ls.paths_length, sizeof(char *)); - - for (size_t i = 0; i < res->args.ls.paths_length; i++) { - res->args.ls.paths[i] = zmsg_popstr(msg); - } - break; - case GUESTFS_COMMAND_CAT: - next = zmsg_pop(msg); - res->args.cat.paths_length = *(zframe_data(next)); - free(next); - - res->args.cat.paths = calloc(res->args.cat.paths_length, sizeof(char *)); - - for (size_t i = 0; i < res->args.cat.paths_length; i++) { - res->args.cat.paths[i] = zmsg_popstr(msg); - } - break; - } - return res; -} - -void guestfs_inspect_command_destroy(struct guestfs_inpsect_command **c) { - free((*c)->name); - switch ((*c)->command) { - case GUESTFS_COMMAND_LS: - for (size_t i = 0; i < (*c)->args.ls.paths_length; i++) { - free((*c)->args.ls.paths[i]); - } - free((*c)->args.ls.paths); - break; - case GUESTFS_COMMAND_CAT: - for (size_t i = 0; i < (*c)->args.cat.paths_length; i++) { - free((*c)->args.cat.paths[i]); - } - free((*c)->args.cat.paths); - break; - } - - free(*c); - *c = NULL; -} +char *guestfs_inspect_endpoint(void); +zmsg_t *guestfs_inspect_command_to_zmsg(struct guestfs_inpsect_command *command); +struct guestfs_inpsect_command *guestfs_inspect_zmsg_to_command(zmsg_t *msg); +void guestfs_inspect_command_destroy(struct guestfs_inpsect_command **c); #endif // LIBGUESTFS_INSPECT_H