summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/CMakeLists.txt2
-rw-r--r--src/lib/crypt.c13
-rw-r--r--src/lib/dev.c99
-rw-r--r--src/lib/irm.c67
-rw-r--r--src/lib/list.c2
-rw-r--r--src/lib/pb/irm.proto47
-rw-r--r--src/lib/protobuf.c8
-rw-r--r--src/lib/rib.c10
-rw-r--r--src/lib/shm_flow_set.c16
-rw-r--r--src/lib/shm_rbuff.c16
-rw-r--r--src/lib/shm_rbuff_pthr.c20
-rw-r--r--src/lib/shm_rdrbuff.c16
-rw-r--r--src/lib/sockets.c20
-rw-r--r--src/lib/tests/CMakeLists.txt2
-rw-r--r--src/lib/tests/time_test.c (renamed from src/lib/tests/time_utils_test.c)6
-rw-r--r--src/lib/tpm.c11
-rw-r--r--src/lib/utils.c59
17 files changed, 289 insertions, 125 deletions
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 514d60d4..4a4684b0 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -172,7 +172,7 @@ else ()
set(PTHREAD_COND_CLOCK "CLOCK_REALTIME" CACHE INTERNAL
"Clock to use for condition variable timing")
endif ()
-set(SOCKET_TIMEOUT 1000 CACHE STRING
+set(SOCKET_TIMEOUT 500 CACHE STRING
"Default timeout for responses from IPCPs (ms)")
set(SHM_PREFIX "ouroboros" CACHE STRING
"String to prepend to POSIX shared memory filenames")
diff --git a/src/lib/crypt.c b/src/lib/crypt.c
index f3b7076d..ad679501 100644
--- a/src/lib/crypt.c
+++ b/src/lib/crypt.c
@@ -182,15 +182,14 @@ static void openssl_ecdh_pkp_destroy(void * pkp)
}
static int openssl_ecdh_derive(void * pkp,
- uint8_t * pk,
- size_t len,
+ buffer_t pk,
uint8_t * s)
{
uint8_t * pos;
EVP_PKEY * pub;
- pos = pk; /* d2i_PUBKEY increments the pointer, don't use key ptr! */
- pub = d2i_PUBKEY(NULL, (const uint8_t **) &pos, (long) len);
+ pos = pk.data; /* d2i_PUBKEY increments the pointer, don't use key ptr! */
+ pub = d2i_PUBKEY(NULL, (const uint8_t **) &pos, (long) pk.len);
if (pub == NULL)
return -ECRYPT;
@@ -390,16 +389,14 @@ void crypt_dh_pkp_destroy(void * pkp)
}
int crypt_dh_derive(void * pkp,
- uint8_t * pk,
- size_t len,
+ buffer_t pk,
uint8_t * s)
{
#ifdef HAVE_OPENSSL
- return openssl_ecdh_derive(pkp, pk, len, s);
+ return openssl_ecdh_derive(pkp, pk, s);
#else
(void) pkp;
(void) pk;
- (void) len;
memset(s, 0, SYMMKEYSZ);
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 216bf670..9e37978c 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -233,9 +233,8 @@ static int proc_announce(char * prog)
msg.prog = prog;
recv_msg = send_recv_irm_msg(&msg);
- if (recv_msg == NULL) {
+ if (recv_msg == NULL)
return -EIRMD;
- }
if (!recv_msg->has_result || (ret = recv_msg->result)) {
irm_msg__free_unpacked(recv_msg, NULL);
@@ -247,11 +246,35 @@ static int proc_announce(char * prog)
return ret;
}
+static void proc_exit(void)
+{
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg;
+ int ret = -1;
+
+ msg.code = IRM_MSG_CODE__IRM_PROC_EXIT;
+ msg.has_pid = true;
+ msg.pid = getpid();
+
+ recv_msg = send_recv_irm_msg(&msg);
+ if (recv_msg == NULL)
+ return;
+
+ if (!recv_msg->has_result || (ret = recv_msg->result)) {
+ irm_msg__free_unpacked(recv_msg, NULL);
+ return;
+ }
+
+ irm_msg__free_unpacked(recv_msg, NULL);
+
+ return;
+}
+
#include "frct.c"
void * flow_tx(void * o)
{
- struct timespec tic = {0, TICTIME};
+ struct timespec tic = TIMESPEC_INIT_NS(TICTIME);
(void) o;
@@ -347,7 +370,7 @@ static void __cleanup_fqueue_destroy(void * fq)
void * flow_rx(void * o)
{
- struct timespec tic = {0, TICTIME};
+ struct timespec tic = TIMESPEC_INIT_NS(TICTIME);
int ret;
struct fqueue * fq;
@@ -549,7 +572,7 @@ static void init(int argc,
prog = path_strip(prog);
if (prog == NULL) {
- fprintf(stderr, "FATAL: Could not find program name.\n");
+ fprintf(stderr, "FATAL: Could not determine program name.\n");
goto fail_prog;
}
@@ -588,7 +611,7 @@ static void init(int argc,
ai.flows = malloc(sizeof(*ai.flows) * PROG_MAX_FLOWS);
if (ai.flows == NULL) {
- fprintf(stderr, "FATAL: Could not allocate flows.\n");
+ fprintf(stderr, "FATAL: Could not malloc flows.\n");
goto fail_flows;
}
@@ -597,7 +620,7 @@ static void init(int argc,
ai.id_to_fd = malloc(sizeof(*ai.id_to_fd) * SYS_MAX_FLOWS);
if (ai.id_to_fd == NULL) {
- fprintf(stderr, "FATAL: Could not allocate id_to_fd.\n");
+ fprintf(stderr, "FATAL: Could not malloc id_to_fd.\n");
goto fail_id_to_fd;
}
@@ -716,7 +739,6 @@ static void fini(void)
#ifdef PROC_FLOW_STATS
rib_fini();
#endif
-
timerwheel_fini();
fset_destroy(ai.frct_set);
@@ -733,6 +755,8 @@ static void fini(void)
bmp_destroy(ai.fds);
bmp_destroy(ai.fqueues);
+ proc_exit();
+
memset(&ai, 0, sizeof(ai));
}
@@ -946,7 +970,7 @@ int flow_dealloc(int fd)
irm_msg_t msg = IRM_MSG__INIT;
irm_msg_t * recv_msg;
uint8_t buf[128];
- struct timespec tic = {0, TICTIME};
+ struct timespec tic = TIMESPEC_INIT_NS(TICTIME);
struct flow * f;
time_t timeo;
@@ -1027,6 +1051,53 @@ int flow_dealloc(int fd)
return 0;
}
+int ipcp_flow_dealloc(int fd)
+{
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg;
+ struct flow * f;
+
+ if (fd < 0 || fd >= SYS_MAX_FLOWS )
+ return -EINVAL;
+
+ msg.code = IRM_MSG_CODE__IPCP_FLOW_DEALLOC;
+ msg.has_pid = true;
+ msg.pid = getpid();
+ msg.has_flow_id = true;
+
+ f = &ai.flows[fd];
+
+ pthread_rwlock_rdlock(&ai.lock);
+
+ if (f->flow_id < 0) {
+ pthread_rwlock_unlock(&ai.lock);
+ return -ENOTALLOC;
+ }
+
+ msg.flow_id = f->flow_id;
+
+ pthread_rwlock_unlock(&ai.lock);
+
+ recv_msg = send_recv_irm_msg(&msg);
+ if (recv_msg == NULL)
+ return -EIRMD;
+
+ if (!recv_msg->has_result) {
+ irm_msg__free_unpacked(recv_msg, NULL);
+ return -EIRMD;
+ }
+
+ irm_msg__free_unpacked(recv_msg, NULL);
+
+ pthread_rwlock_wrlock(&ai.lock);
+
+ flow_fini(fd);
+
+ pthread_rwlock_unlock(&ai.lock);
+
+ return 0;
+}
+
int fccntl(int fd,
int cmd,
...)
@@ -1801,19 +1872,19 @@ int np1_flow_resp(int flow_id)
return fd;
}
-int ipcp_create_r(int result)
+int ipcp_create_r(const struct ipcp_info * info)
{
irm_msg_t msg = IRM_MSG__INIT;
irm_msg_t * recv_msg;
int ret;
msg.code = IRM_MSG_CODE__IPCP_CREATE_R;
- msg.has_pid = true;
- msg.pid = getpid();
- msg.has_result = true;
- msg.result = result;
+ msg.ipcp_info = ipcp_info_s_to_msg(info);
recv_msg = send_recv_irm_msg(&msg);
+
+ ipcp_info_msg__free_unpacked(msg.ipcp_info, NULL);
+
if (recv_msg == NULL)
return -EIRMD;
diff --git a/src/lib/irm.c b/src/lib/irm.c
index 0947c0c7..d25101f3 100644
--- a/src/lib/irm.c
+++ b/src/lib/irm.c
@@ -38,8 +38,8 @@
#include <stdlib.h>
#include <sys/stat.h>
-pid_t irm_create_ipcp(const char * name,
- enum ipcp_type type)
+int irm_create_ipcp(const char * name,
+ enum ipcp_type type)
{
irm_msg_t msg = IRM_MSG__INIT;
irm_msg_t * recv_msg;
@@ -49,6 +49,8 @@ pid_t irm_create_ipcp(const char * name,
if (name == NULL || strlen(name) > IPCP_NAME_SIZE)
return -EINVAL;
+ memset(&info, 0, sizeof(info));
+
info.type = type;
strcpy(info.name, name);
@@ -366,50 +368,69 @@ int irm_bind_program(const char * prog,
int argc,
char ** argv)
{
- irm_msg_t msg = IRM_MSG__INIT;
- irm_msg_t * recv_msg = NULL;
- int ret = -1;
- char * full_name;
+ irm_msg_t msg = IRM_MSG__INIT;
+ irm_msg_t * recv_msg;
+ char ** exec;
+ int ret;
+ int i;
if (prog == NULL || name == NULL)
return -EINVAL;
- full_name = strdup(prog);
- if (full_name == NULL)
- return -ENOMEM;
+ exec = malloc((argc + 2) * sizeof(*exec));
+ if (exec== NULL) {
+ ret = -ENOMEM;
+ goto fail_exec;
+ }
- if ((ret = check_prog_path(&full_name)) < 0) {
- free(full_name);
- return ret;
+ exec[0] = strdup(prog);
+ if (exec[0] == NULL) {
+ ret = -ENOMEM;
+ goto fail_exec0;
}
+ ret = check_prog_path(&exec[0]);
+ if (ret < 0)
+ goto fail;
+
+ for (i = 0; i < argc; i++)
+ exec[i + 1] = argv[i];
+
+ exec[argc + 1] = "";
+
msg.code = IRM_MSG_CODE__IRM_BIND_PROGRAM;
msg.name = (char *) name;
- msg.prog = full_name;
- if (argv != NULL) {
- msg.n_args = argc;
- msg.args = (char **) argv;
- }
+ msg.n_exec = argc + 2;
+ msg.exec = exec;
msg.has_opts = true;
msg.opts = opts;
recv_msg = send_recv_irm_msg(&msg);
-
- free(full_name);
-
- if (recv_msg == NULL)
- return -EIRMD;
+ if (recv_msg == NULL) {
+ ret = -EIRMD;
+ goto fail;
+ }
if (!recv_msg->has_result) {
irm_msg__free_unpacked(recv_msg, NULL);
- return -1;
+ ret = -EPERM;
+ goto fail;
}
ret = recv_msg->result;
irm_msg__free_unpacked(recv_msg, NULL);
+ free(exec[0]);
+ free(exec);
+
+ return ret;
+ fail:
+ free(exec[0]);
+ fail_exec0:
+ free(exec);
+ fail_exec:
return ret;
}
diff --git a/src/lib/list.c b/src/lib/list.c
index 4fc9fa4a..62b2eb27 100644
--- a/src/lib/list.c
+++ b/src/lib/list.c
@@ -65,7 +65,7 @@ void list_del(struct list_head * e)
e->nxt = e->prv = e;
}
-bool list_is_empty(struct list_head * h)
+bool list_is_empty(const struct list_head * h)
{
return h->nxt == h;
}
diff --git a/src/lib/pb/irm.proto b/src/lib/pb/irm.proto
index 77db8057..c962e5e5 100644
--- a/src/lib/pb/irm.proto
+++ b/src/lib/pb/irm.proto
@@ -37,32 +37,37 @@ enum irm_msg_code {
IRM_BIND_PROGRAM = 9;
IRM_UNBIND_PROGRAM = 10;
IRM_PROC_ANNOUNCE = 11;
- IRM_BIND_PROCESS = 12;
- IRM_UNBIND_PROCESS = 13;
- IRM_CREATE_NAME = 14;
- IRM_DESTROY_NAME = 15;
- IRM_LIST_NAMES = 16;
- IRM_REG_NAME = 17;
- IRM_UNREG_NAME = 18;
- IRM_FLOW_ALLOC = 19;
- IRM_FLOW_ACCEPT = 20;
- IRM_FLOW_JOIN = 21;
- IRM_FLOW_DEALLOC = 22;
- IPCP_FLOW_REQ_ARR = 23;
- IPCP_FLOW_ALLOC_REPLY = 24;
- IRM_REPLY = 25;
+ IRM_PROC_EXIT = 12;
+ IRM_BIND_PROCESS = 13;
+ IRM_UNBIND_PROCESS = 14;
+ IRM_CREATE_NAME = 15;
+ IRM_DESTROY_NAME = 16;
+ IRM_LIST_NAMES = 17;
+ IRM_REG_NAME = 18;
+ IRM_UNREG_NAME = 19;
+ IRM_FLOW_ALLOC = 20;
+ IRM_FLOW_ACCEPT = 21;
+ IRM_FLOW_JOIN = 22;
+ IRM_FLOW_DEALLOC = 23;
+ IPCP_FLOW_DEALLOC = 24;
+ IPCP_FLOW_REQ_ARR = 25;
+ IPCP_FLOW_ALLOC_REPLY = 26;
+ IRM_REPLY = 27;
}
message ipcp_info_msg {
- required uint32 type = 1;
- required string name = 2;
+ required uint32 type = 1;
+ required string name = 2;
+ required uint32 pid = 3;
+ required uint32 state = 4;
}
message ipcp_list_msg {
- required uint32 pid = 1;
- required uint32 type = 2;
- required string name = 3;
- required string layer = 4;
+ required uint32 pid = 1;
+ required uint32 type = 2;
+ required string name = 3;
+ required string layer = 4;
+ required uint32 hash_algo = 5;
}
message name_info_msg {
@@ -77,7 +82,7 @@ message irm_msg {
optional string name = 4;
optional ipcp_info_msg ipcp_info = 5;
optional string layer = 6;
- repeated string args = 7;
+ repeated string exec = 7;
optional sint32 response = 8;
optional string dst = 9;
optional bytes hash = 10;
diff --git a/src/lib/protobuf.c b/src/lib/protobuf.c
index b6bec783..2135d57e 100644
--- a/src/lib/protobuf.c
+++ b/src/lib/protobuf.c
@@ -83,7 +83,9 @@ ipcp_info_msg_t * ipcp_info_s_to_msg(const struct ipcp_info * s)
if (msg->name == NULL)
goto fail_msg;
- msg->type = s->type;
+ msg->type = s->type;
+ msg->pid = s->pid;
+ msg->state = s->state;
return msg;
fail_msg:
@@ -100,8 +102,10 @@ struct ipcp_info ipcp_info_msg_to_s(const ipcp_info_msg_t * msg)
assert(msg->name != NULL);
assert(strlen(msg->name) <= NAME_SIZE);
- s.type = msg->type;
strcpy(s.name, msg->name);
+ s.type = msg->type;
+ s.pid = msg->pid;
+ s.state = msg->state;
return s;
}
diff --git a/src/lib/rib.c b/src/lib/rib.c
index abbeba21..97a20f47 100644
--- a/src/lib/rib.c
+++ b/src/lib/rib.c
@@ -391,6 +391,16 @@ void rib_fini(void)
#endif
}
+void rib_cleanup(const char * mnt)
+{
+#ifdef HAVE_FUSE
+ fuse_unmount(mnt, NULL);
+ rmdir(mnt);
+#else
+ (void) mnt;
+#endif
+}
+
int rib_reg(const char * path,
struct rib_ops * ops)
{
diff --git a/src/lib/shm_flow_set.c b/src/lib/shm_flow_set.c
index 5f31ed3e..39913fd1 100644
--- a/src/lib/shm_flow_set.c
+++ b/src/lib/shm_flow_set.c
@@ -24,21 +24,21 @@
#include "config.h"
-#include <ouroboros/lockfile.h>
-#include <ouroboros/time_utils.h>
-#include <ouroboros/shm_flow_set.h>
#include <ouroboros/errno.h>
+#include <ouroboros/lockfile.h>
#include <ouroboros/pthread.h>
+#include <ouroboros/shm_flow_set.h>
+#include <ouroboros/time.h>
-#include <sys/mman.h>
+#include <assert.h>
#include <fcntl.h>
+#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
+#include <string.h>
#include <unistd.h>
-#include <signal.h>
+#include <sys/mman.h>
#include <sys/stat.h>
-#include <string.h>
-#include <assert.h>
/*
* pthread_cond_timedwait has a WONTFIX bug as of glibc 2.25 where it
@@ -196,7 +196,7 @@ struct shm_flow_set * shm_flow_set_open(pid_t pid)
void shm_flow_set_destroy(struct shm_flow_set * set)
{
- char fn[25];
+ char fn[FN_MAX_CHARS];
assert(set);
diff --git a/src/lib/shm_rbuff.c b/src/lib/shm_rbuff.c
index 19a775ae..22cff41c 100644
--- a/src/lib/shm_rbuff.c
+++ b/src/lib/shm_rbuff.c
@@ -26,22 +26,22 @@
#include <ouroboros/shm_rbuff.h>
#include <ouroboros/lockfile.h>
-#include <ouroboros/time_utils.h>
#include <ouroboros/errno.h>
#include <ouroboros/fccntl.h>
#include <ouroboros/pthread.h>
+#include <ouroboros/time.h>
-#include <sys/mman.h>
+#include <assert.h>
#include <fcntl.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <stdio.h>
-#include <stdint.h>
#include <unistd.h>
-#include <signal.h>
+#include <sys/mman.h>
#include <sys/stat.h>
-#include <assert.h>
-#include <stdbool.h>
#define FN_MAX_CHARS 255
@@ -172,7 +172,7 @@ struct shm_rbuff * shm_rbuff_create(pid_t pid,
*rb->head = 0;
*rb->tail = 0;
- rb->pid = pid;
+ rb->pid = pid;
rb->flow_id = flow_id;
pthread_mutexattr_destroy(&mattr);
diff --git a/src/lib/shm_rbuff_pthr.c b/src/lib/shm_rbuff_pthr.c
index 1ee346e8..b543fb07 100644
--- a/src/lib/shm_rbuff_pthr.c
+++ b/src/lib/shm_rbuff_pthr.c
@@ -24,7 +24,7 @@ void shm_rbuff_destroy(struct shm_rbuff * rb)
{
char fn[FN_MAX_CHARS];
- assert(rb);
+ assert(rb != NULL);
#ifdef CONFIG_OUROBOROS_DEBUG
pthread_mutex_lock(rb->lock);
@@ -48,7 +48,7 @@ int shm_rbuff_write(struct shm_rbuff * rb,
{
int ret = 0;
- assert(rb);
+ assert(rb != NULL);
assert(idx < SHM_BUFFER_SIZE);
#ifndef HAVE_ROBUST_MUTEX
@@ -91,7 +91,7 @@ int shm_rbuff_write_b(struct shm_rbuff * rb,
{
int ret = 0;
- assert(rb);
+ assert(rb != NULL);
assert(idx < SHM_BUFFER_SIZE);
#ifndef HAVE_ROBUST_MUTEX
@@ -138,6 +138,8 @@ int shm_rbuff_write_b(struct shm_rbuff * rb,
static int check_rb_acl(struct shm_rbuff * rb)
{
+ assert(rb != NULL);
+
if (*rb->acl & ACL_FLOWDOWN)
return -EFLOWDOWN;
@@ -151,7 +153,7 @@ ssize_t shm_rbuff_read(struct shm_rbuff * rb)
{
ssize_t ret = 0;
- assert(rb);
+ assert(rb != NULL);
#ifndef HAVE_ROBUST_MUTEX
pthread_mutex_lock(rb->lock);
@@ -180,7 +182,7 @@ ssize_t shm_rbuff_read_b(struct shm_rbuff * rb,
{
ssize_t idx = -1;
- assert(rb);
+ assert(rb != NULL);
#ifndef HAVE_ROBUST_MUTEX
pthread_mutex_lock(rb->lock);
@@ -224,7 +226,7 @@ ssize_t shm_rbuff_read_b(struct shm_rbuff * rb,
void shm_rbuff_set_acl(struct shm_rbuff * rb,
uint32_t flags)
{
- assert(rb);
+ assert(rb != NULL);
#ifndef HAVE_ROBUST_MUTEX
pthread_mutex_lock(rb->lock);
@@ -244,7 +246,7 @@ uint32_t shm_rbuff_get_acl(struct shm_rbuff * rb)
{
uint32_t flags;
- assert(rb);
+ assert(rb != NULL);
#ifndef HAVE_ROBUST_MUTEX
pthread_mutex_lock(rb->lock);
@@ -261,7 +263,7 @@ uint32_t shm_rbuff_get_acl(struct shm_rbuff * rb)
void shm_rbuff_fini(struct shm_rbuff * rb)
{
- assert(rb);
+ assert(rb != NULL);
#ifndef HAVE_ROBUST_MUTEX
pthread_mutex_lock(rb->lock);
@@ -285,7 +287,7 @@ size_t shm_rbuff_queued(struct shm_rbuff * rb)
{
size_t ret;
- assert(rb);
+ assert(rb != NULL);
#ifndef HAVE_ROBUST_MUTEX
pthread_mutex_lock(rb->lock);
diff --git a/src/lib/shm_rdrbuff.c b/src/lib/shm_rdrbuff.c
index d6849d03..7ad1bd2e 100644
--- a/src/lib/shm_rdrbuff.c
+++ b/src/lib/shm_rdrbuff.c
@@ -25,21 +25,19 @@
#include "config.h"
#include <ouroboros/errno.h>
-#include <ouroboros/shm_rdrbuff.h>
-#include <ouroboros/shm_du_buff.h>
-#include <ouroboros/time_utils.h>
#include <ouroboros/pthread.h>
+#include <ouroboros/shm_rdrbuff.h>
-#include <sys/mman.h>
+#include <assert.h>
#include <fcntl.h>
-#include <unistd.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <stdio.h>
-#include <signal.h>
+#include <unistd.h>
+#include <sys/mman.h>
#include <sys/stat.h>
-#include <stdbool.h>
-#include <assert.h>
#define SHM_BLOCKS_SIZE ((SHM_BUFFER_SIZE) * SHM_RDRB_BLOCK_SIZE)
#define SHM_FILE_SIZE (SHM_BLOCKS_SIZE + 2 * sizeof(size_t) \
diff --git a/src/lib/sockets.c b/src/lib/sockets.c
index 5ed43647..9c5b7a51 100644
--- a/src/lib/sockets.c
+++ b/src/lib/sockets.c
@@ -31,7 +31,6 @@
#include <stdlib.h>
#include <pthread.h>
#include <stdbool.h>
-#include <sys/time.h>
/* Apple doesn't support SEQPACKET. */
#ifdef __APPLE__
@@ -57,8 +56,7 @@ int client_socket_open(char * file_name)
serv_addr.sun_family = AF_UNIX;
sprintf(serv_addr.sun_path, "%s", file_name);
- if (connect(sockfd,
- (struct sockaddr *) &serv_addr,
+ if (connect(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr))) {
close(sockfd);
return -1;
@@ -100,13 +98,11 @@ int server_socket_open(char * file_name)
return sockfd;
}
-__attribute__((no_sanitize_address))
irm_msg_t * send_recv_irm_msg(irm_msg_t * msg)
{
- int sockfd;
- uint8_t buf[SOCK_BUF_SIZE];
- ssize_t len;
- irm_msg_t * recv_msg = NULL;
+ int sockfd;
+ uint8_t buf[SOCK_BUF_SIZE];
+ ssize_t len;
sockfd = client_socket_open(IRM_SOCK_PATH);
if (sockfd < 0)
@@ -127,10 +123,12 @@ irm_msg_t * send_recv_irm_msg(irm_msg_t * msg)
pthread_cleanup_pop(true);
- if (len > 0)
- recv_msg = irm_msg__unpack(NULL, len, buf);
+ if (len < 0)
+ goto fail;
- return recv_msg;
+ return irm_msg__unpack(NULL, len, buf);
+ fail:
+ return NULL;
}
char * ipcp_sock_path(pid_t pid)
diff --git a/src/lib/tests/CMakeLists.txt b/src/lib/tests/CMakeLists.txt
index b3b79760..0e114548 100644
--- a/src/lib/tests/CMakeLists.txt
+++ b/src/lib/tests/CMakeLists.txt
@@ -10,7 +10,7 @@ create_test_sourcelist(${PARENT_DIR}_tests test_suite.c
md5_test.c
sha3_test.c
shm_rbuff_test.c
- time_utils_test.c
+ time_test.c
)
add_executable(${PARENT_DIR}_test EXCLUDE_FROM_ALL ${${PARENT_DIR}_tests})
diff --git a/src/lib/tests/time_utils_test.c b/src/lib/tests/time_test.c
index 1b9e7a80..65f896bb 100644
--- a/src/lib/tests/time_utils_test.c
+++ b/src/lib/tests/time_test.c
@@ -22,7 +22,7 @@
#define _POSIX_C_SOURCE 200809L
-#include <ouroboros/time_utils.h>
+#include <ouroboros/time.h>
#include <stdio.h>
@@ -66,8 +66,8 @@ static int tv_check(struct timeval * v,
return v->tv_sec == sec && v->tv_usec == usec;
}
-int time_utils_test(int argc,
- char ** argv)
+int time_test(int argc,
+ char ** argv)
{
struct timespec s0;
struct timespec s1;
diff --git a/src/lib/tpm.c b/src/lib/tpm.c
index ae495954..0ef1fda8 100644
--- a/src/lib/tpm.c
+++ b/src/lib/tpm.c
@@ -26,12 +26,12 @@
#include <ouroboros/errno.h>
#include <ouroboros/list.h>
-#include <ouroboros/time_utils.h>
+#include <ouroboros/time.h>
#include <ouroboros/tpm.h>
+#include <assert.h>
#include <pthread.h>
#include <stdlib.h>
-#include <assert.h>
#define TPM_TIMEOUT 1000
@@ -117,8 +117,7 @@ static void tpm_kill(struct tpm * tpm)
static void * tpmgr(void * o)
{
struct timespec dl;
- struct timespec to = {(TPM_TIMEOUT / 1000),
- (TPM_TIMEOUT % 1000) * MILLION};
+ struct timespec to = TIMESPEC_INIT_MS(TPM_TIMEOUT);
struct tpm * tpm = (struct tpm *) o;
while (true) {
@@ -239,12 +238,12 @@ void tpm_stop(struct tpm * tpm)
tpm->state = TPM_NULL;
pthread_mutex_unlock(&tpm->lock);
+
+ pthread_join(tpm->mgr, NULL);
}
void tpm_destroy(struct tpm * tpm)
{
- pthread_join(tpm->mgr, NULL);
-
pthread_mutex_destroy(&tpm->lock);
pthread_cond_destroy(&tpm->cond);
diff --git a/src/lib/utils.c b/src/lib/utils.c
index 6f6a65ae..fdbcd9d9 100644
--- a/src/lib/utils.c
+++ b/src/lib/utils.c
@@ -20,6 +20,10 @@
* Foundation, Inc., http://www.fsf.org/about/contact/.
*/
+#define _POSIX_C_SOURCE 200809L
+
+#include <ouroboros/utils.h>
+
#include <stdlib.h>
#include <string.h>
@@ -52,3 +56,58 @@ char * path_strip(const char * src)
return dst;
}
+
+size_t argvlen(const char ** argv)
+{
+ size_t argc = 0;
+
+ if (argv == NULL)
+ return 0;
+
+ while (*argv++ != NULL)
+ argc++;
+
+ return argc;
+}
+
+void argvfree(char ** argv)
+{
+ char ** argv_dup;
+
+ if (argv == NULL)
+ return;
+
+ argv_dup = argv;
+ while (*argv_dup != NULL)
+ free(*(argv_dup++));
+
+ free(argv);
+}
+
+char ** argvdup(char ** argv)
+{
+ int argc = 0;
+ char ** argv_dup = argv;
+ int i;
+
+ if (argv == NULL)
+ return NULL;
+
+ while (*(argv_dup++) != NULL)
+ argc++;
+
+ argv_dup = malloc((argc + 1) * sizeof(*argv_dup));
+ if (argv_dup == NULL)
+ return NULL;
+
+ for (i = 0; i < argc; ++i) {
+ argv_dup[i] = strdup(argv[i]);
+ if (argv_dup[i] == NULL) {
+ argvfree(argv_dup);
+ return NULL;
+ }
+ }
+
+ argv_dup[argc] = NULL;
+ return argv_dup;
+}