aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2023-05-14 18:02:25 +0200
committerEgor Tensin <Egor.Tensin@gmail.com>2023-05-14 18:08:24 +0200
commitb09122e98c0156db0da4eac6d8819f1c41ecd9e1 (patch)
tree672531e000990214fc692c37d71e1ad82c8584f9
parentmsg: enforce at least one word (diff)
downloadcimple-b09122e98c0156db0da4eac6d8819f1c41ecd9e1.tar.gz
cimple-b09122e98c0156db0da4eac6d8819f1c41ecd9e1.zip
msg: add functions for one-off communication
-rw-r--r--src/client.c22
-rw-r--r--src/client.h4
-rw-r--r--src/client_main.c4
-rw-r--r--src/msg.c59
-rw-r--r--src/msg.h4
-rw-r--r--src/server.c2
6 files changed, 58 insertions, 37 deletions
diff --git a/src/client.c b/src/client.c
index f0c0d3b..8cfb1d1 100644
--- a/src/client.c
+++ b/src/client.c
@@ -6,18 +6,18 @@
*/
#include "client.h"
+#include "compiler.h"
#include "log.h"
#include "msg.h"
#include "net.h"
#include <stdlib.h>
-#include <unistd.h>
struct client {
- int fd;
+ int dummy;
};
-int client_create(struct client **_client, const struct settings *settings)
+int client_create(struct client **_client)
{
int ret = 0;
@@ -27,27 +27,17 @@ int client_create(struct client **_client, const struct settings *settings)
return -1;
}
- ret = net_connect(settings->host, settings->port);
- if (ret < 0)
- goto free;
- client->fd = ret;
-
*_client = client;
return ret;
-
-free:
- free(client);
-
- return ret;
}
void client_destroy(struct client *client)
{
- log_errno_if(close(client->fd), "close");
free(client);
}
-int client_main(const struct client *client, const char **argv)
+int client_main(UNUSED const struct client *client, const struct settings *settings,
+ const char **argv)
{
struct msg *request = NULL, *response = NULL;
int ret = 0;
@@ -56,7 +46,7 @@ int client_main(const struct client *client, const char **argv)
if (ret < 0)
return ret;
- ret = msg_send_and_wait(client->fd, request, &response);
+ ret = msg_connect_and_communicate(settings->host, settings->port, request, &response);
if (ret < 0)
goto free_request;
diff --git a/src/client.h b/src/client.h
index 5bc3f5c..471a7be 100644
--- a/src/client.h
+++ b/src/client.h
@@ -15,9 +15,9 @@ struct settings {
struct client;
-int client_create(struct client **, const struct settings *);
+int client_create(struct client **);
void client_destroy(struct client *);
-int client_main(const struct client *, const char **argv);
+int client_main(const struct client *, const struct settings *, const char **argv);
#endif
diff --git a/src/client_main.c b/src/client_main.c
index 160bb7e..287a5cb 100644
--- a/src/client_main.c
+++ b/src/client_main.c
@@ -70,11 +70,11 @@ int main(int argc, char *argv[])
if (ret < 0)
return ret;
- ret = client_create(&client, &settings);
+ ret = client_create(&client);
if (ret < 0)
return ret;
- ret = client_main(client, (const char **)argv + optind);
+ ret = client_main(client, &settings, (const char **)argv + optind);
if (ret < 0)
goto destroy_client;
diff --git a/src/msg.c b/src/msg.c
index 4da0154..b95e27e 100644
--- a/src/msg.c
+++ b/src/msg.c
@@ -12,6 +12,7 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
struct msg {
size_t argc;
@@ -169,21 +170,6 @@ destroy_buf:
return ret;
}
-int msg_send_and_wait(int fd, const struct msg *request, struct msg **response)
-{
- int ret = 0;
-
- ret = msg_send(fd, request);
- if (ret < 0)
- return ret;
-
- ret = msg_recv(fd, response);
- if (ret < 0)
- return ret;
-
- return ret;
-}
-
int msg_recv(int fd, struct msg **_msg)
{
struct buf *buf = NULL;
@@ -221,6 +207,49 @@ destroy_buf:
return ret;
}
+int msg_communicate(int fd, const struct msg *request, struct msg **response)
+{
+ int ret = 0;
+
+ if (!request && !response) {
+ log_err("For communication, there must be at least a request and/or response\n");
+ return -1;
+ }
+
+ if (request) {
+ ret = msg_send(fd, request);
+ if (ret < 0)
+ return ret;
+ }
+
+ if (response) {
+ ret = msg_recv(fd, response);
+ if (ret < 0)
+ return ret;
+ }
+
+ return ret;
+}
+
+int msg_connect_and_communicate(const char *host, const char *port, const struct msg *request,
+ struct msg **response)
+{
+ int fd = -1, ret = 0;
+
+ fd = net_connect(host, port);
+ if (fd < 0)
+ return fd;
+
+ ret = msg_communicate(fd, request, response);
+ if (ret < 0)
+ goto close;
+
+close:
+ log_errno_if(close(fd), "close");
+
+ return ret;
+}
+
void msg_dump(const struct msg *msg)
{
log("Message[%zu]:\n", msg->argc);
diff --git a/src/msg.h b/src/msg.h
index 158c5e6..19a204d 100644
--- a/src/msg.h
+++ b/src/msg.h
@@ -30,7 +30,9 @@ int msg_is_error(const struct msg *);
int msg_recv(int fd, struct msg **);
int msg_send(int fd, const struct msg *);
-int msg_send_and_wait(int fd, const struct msg *, struct msg **response);
+int msg_communicate(int fd, const struct msg *, struct msg **response);
+int msg_connect_and_communicate(const char *host, const char *port, const struct msg *,
+ struct msg **);
void msg_dump(const struct msg *);
diff --git a/src/server.c b/src/server.c
index 04a6847..9d4e872 100644
--- a/src/server.c
+++ b/src/server.c
@@ -120,7 +120,7 @@ static int worker_ci_run(int fd, const struct run_queue_entry *ci_run)
if (ret < 0)
return ret;
- ret = msg_send_and_wait(fd, request, &response);
+ ret = msg_communicate(fd, request, &response);
msg_free(request);
if (ret < 0)
return ret;