diff options
author | Egor Tensin <Egor.Tensin@gmail.com> | 2022-08-23 22:45:41 +0200 |
---|---|---|
committer | Egor Tensin <Egor.Tensin@gmail.com> | 2022-08-23 22:45:41 +0200 |
commit | a299c8cbcdc4cc541d7b6671bf3784e9de1562a1 (patch) | |
tree | 40237d54673d879305b9ba23fbcde4b6ee4f9660 | |
parent | net: use CLOEXEC (diff) | |
download | cimple-a299c8cbcdc4cc541d7b6671bf3784e9de1562a1.tar.gz cimple-a299c8cbcdc4cc541d7b6671bf3784e9de1562a1.zip |
cmd: add cmd_from_argv
-rw-r--r-- | src/cmd.c | 36 | ||||
-rw-r--r-- | src/cmd.h | 2 |
2 files changed, 38 insertions, 0 deletions
@@ -5,6 +5,42 @@ #include <stdlib.h> #include <string.h> +int cmd_from_argv(struct cmd *cmd, const char *argv[]) +{ + int argc = 0; + + for (const char **s = argv; *s; ++s) + ++argc; + + cmd->argc = argc; + cmd->argv = calloc(argc, sizeof(char *)); + + if (!cmd->argv) { + print_errno("calloc"); + return -1; + } + + for (int i = 0; i < argc; ++i) { + cmd->argv[i] = strdup(argv[i]); + if (!cmd->argv[i]) { + print_errno("strdup"); + goto free; + } + } + + return 0; + +free: + for (int i = 0; i < argc; ++i) + if (cmd->argv[i]) + free(cmd->argv[i]); + else + break; + + free(cmd->argv); + return -1; +} + static size_t calc_buf_len(int argc, char **argv) { size_t len = 0; @@ -6,6 +6,8 @@ struct cmd { char **argv; }; +int cmd_from_argv(struct cmd *, const char *argv[]); + int cmd_send(int fd, const struct cmd *); int cmd_send_and_wait_for_result(int fd, const struct cmd *, int *result); |