aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2022-08-23 22:45:41 +0200
committerEgor Tensin <Egor.Tensin@gmail.com>2022-08-23 22:45:41 +0200
commita299c8cbcdc4cc541d7b6671bf3784e9de1562a1 (patch)
tree40237d54673d879305b9ba23fbcde4b6ee4f9660
parentnet: use CLOEXEC (diff)
downloadcimple-a299c8cbcdc4cc541d7b6671bf3784e9de1562a1.tar.gz
cimple-a299c8cbcdc4cc541d7b6671bf3784e9de1562a1.zip
cmd: add cmd_from_argv
-rw-r--r--src/cmd.c36
-rw-r--r--src/cmd.h2
2 files changed, 38 insertions, 0 deletions
diff --git a/src/cmd.c b/src/cmd.c
index c3ddf6c..f84cb32 100644
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -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;
diff --git a/src/cmd.h b/src/cmd.h
index f9b3c6b..9f519f6 100644
--- a/src/cmd.h
+++ b/src/cmd.h
@@ -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);