X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=libustd%2Flibustd.c;h=999e4dadfcf65da35e4f669e7e0ca71fb3e837ef;hb=08b8805efffcad4e0f713272cac6f75390176396;hp=e0d48b589afdbd199bdd9f4bb343f0a2ad10196f;hpb=d159ac37826eaebf4c1d87b8db0c5e5a8ccc0b00;p=ust.git diff --git a/libustd/libustd.c b/libustd/libustd.c index e0d48b5..999e4da 100644 --- a/libustd/libustd.c +++ b/libustd/libustd.c @@ -29,7 +29,8 @@ #include #include -#include "libustd.h" +#include +#include "lowlevel.h" #include "usterr.h" #include "ustcomm.h" @@ -57,8 +58,13 @@ int get_subbuffer(struct buffer_info *buf) int retval; int result; - asprintf(&send_msg, "get_subbuffer %s", buf->name); - result = ustcomm_send_request(&buf->conn, send_msg, &received_msg); + if (asprintf(&send_msg, "get_subbuffer %s", buf->name) < 0) { + ERR("get_subbuffer : asprintf failed (%s)", + buf->name); + retval = -1; + goto end; + } + result = ustcomm_send_request(buf->conn, send_msg, &received_msg); if((result == -1 && (errno == ECONNRESET || errno == EPIPE)) || result == 0) { DBG("app died while being traced"); retval = GET_SUBBUF_DIED; @@ -117,8 +123,13 @@ int put_subbuffer(struct buffer_info *buf) int retval; int result; - asprintf(&send_msg, "put_subbuffer %s %ld", buf->name, buf->consumed_old); - result = ustcomm_send_request(&buf->conn, send_msg, &received_msg); + if (asprintf(&send_msg, "put_subbuffer %s %ld", buf->name, buf->consumed_old) < 0) { + ERR("put_subbuffer : asprintf failed (%s %ld)", + buf->name, buf->consumed_old); + retval = -1; + goto end; + } + result = ustcomm_send_request(buf->conn, send_msg, &received_msg); if(result < 0 && (errno == ECONNRESET || errno == EPIPE)) { retval = PUT_SUBBUF_DIED; goto end; @@ -188,29 +199,37 @@ struct buffer_info *connect_buffer(struct libustd_instance *instance, pid_t pid, char *send_msg; char *received_msg; int result; - char *tmp; - int fd; struct shmid_ds shmds; - buf = (struct buffer_info *) malloc(sizeof(struct buffer_info)); + buf = (struct buffer_info *) zmalloc(sizeof(struct buffer_info)); if(buf == NULL) { ERR("add_buffer: insufficient memory"); return NULL; } + buf->conn = malloc(sizeof(struct ustcomm_connection)); + if(buf->conn == NULL) { + ERR("add_buffer: insufficient memory"); + free(buf); + return NULL; + } + buf->name = bufname; buf->pid = pid; /* connect to app */ - result = ustcomm_connect_app(buf->pid, &buf->conn); + result = ustcomm_connect_app(buf->pid, buf->conn); if(result) { WARN("unable to connect to process, it probably died before we were able to connect"); return NULL; } /* get pidunique */ - asprintf(&send_msg, "get_pidunique"); - result = ustcomm_send_request(&buf->conn, send_msg, &received_msg); + if (asprintf(&send_msg, "get_pidunique") < 0) { + ERR("connect_buffer : asprintf failed (get_pidunique)"); + return NULL; + } + result = ustcomm_send_request(buf->conn, send_msg, &received_msg); free(send_msg); if(result == -1) { ERR("problem in ustcomm_send_request(get_pidunique)"); @@ -229,8 +248,12 @@ struct buffer_info *connect_buffer(struct libustd_instance *instance, pid_t pid, DBG("got pidunique %lld", buf->pidunique); /* get shmid */ - asprintf(&send_msg, "get_shmid %s", buf->name); - result = ustcomm_send_request(&buf->conn, send_msg, &received_msg); + if (asprintf(&send_msg, "get_shmid %s", buf->name) < 0) { + ERR("connect_buffer : asprintf failed (get_schmid %s)", + buf->name); + return NULL; + } + result = ustcomm_send_request(buf->conn, send_msg, &received_msg); free(send_msg); if(result == -1) { ERR("problem in ustcomm_send_request(get_shmid)"); @@ -249,8 +272,12 @@ struct buffer_info *connect_buffer(struct libustd_instance *instance, pid_t pid, DBG("got shmids %d %d", buf->shmid, buf->bufstruct_shmid); /* get n_subbufs */ - asprintf(&send_msg, "get_n_subbufs %s", buf->name); - result = ustcomm_send_request(&buf->conn, send_msg, &received_msg); + if (asprintf(&send_msg, "get_n_subbufs %s", buf->name) < 0) { + ERR("connect_buffer : asprintf failed (get_n_subbufs %s)", + buf->name); + return NULL; + } + result = ustcomm_send_request(buf->conn, send_msg, &received_msg); free(send_msg); if(result == -1) { ERR("problem in ustcomm_send_request(g_n_subbufs)"); @@ -269,8 +296,12 @@ struct buffer_info *connect_buffer(struct libustd_instance *instance, pid_t pid, DBG("got n_subbufs %d", buf->n_subbufs); /* get subbuf size */ - asprintf(&send_msg, "get_subbuf_size %s", buf->name); - result = ustcomm_send_request(&buf->conn, send_msg, &received_msg); + if (asprintf(&send_msg, "get_subbuf_size %s", buf->name) < 0) { + ERR("connect_buffer : asprintf failed (get_subbuf_size %s)", + buf->name); + return NULL; + } + result = ustcomm_send_request(buf->conn, send_msg, &received_msg); free(send_msg); if(result == -1) { ERR("problem in ustcomm_send_request(get_subbuf_size)"); @@ -330,7 +361,7 @@ static void destroy_buffer(struct libustd_callbacks *callbacks, { int result; - result = ustcomm_close_app(&buf->conn); + result = ustcomm_close_app(buf->conn); if(result == -1) { WARN("problem calling ustcomm_close_app"); } @@ -348,6 +379,7 @@ static void destroy_buffer(struct libustd_callbacks *callbacks, if(callbacks->on_close_buffer) callbacks->on_close_buffer(callbacks, buf); + free(buf->conn); free(buf); } @@ -488,7 +520,7 @@ int start_consuming_buffer( DBG("beginning of start_consuming_buffer: args: pid %d bufname %s", pid, bufname); - args = (struct consumer_thread_args *) malloc(sizeof(struct consumer_thread_args)); + args = (struct consumer_thread_args *) zmalloc(sizeof(struct consumer_thread_args)); args->pid = pid; args->bufname = strdup(bufname); @@ -525,7 +557,7 @@ int libustd_start_instance(struct libustd_instance *instance) char *recvbuf; /* check for requests on our public socket */ - result = ustcomm_ustd_recv_message(&instance->comm, &recvbuf, NULL, timeout); + result = ustcomm_ustd_recv_message(instance->comm, &recvbuf, NULL, timeout); if(result == -1 && errno == EINTR) { /* Caught signal */ } @@ -588,10 +620,11 @@ int libustd_start_instance(struct libustd_instance *instance) void libustd_delete_instance(struct libustd_instance *instance) { if(instance->is_init) - ustcomm_fini_ustd(&instance->comm); + ustcomm_fini_ustd(instance->comm); pthread_mutex_destroy(&instance->mutex); free(instance->sock_path); + free(instance->comm); free(instance); } @@ -640,10 +673,16 @@ struct libustd_instance *libustd_new_instance( struct libustd_callbacks *callbacks, char *sock_path) { struct libustd_instance *instance = - malloc(sizeof(struct libustd_instance)); + zmalloc(sizeof(struct libustd_instance)); if(!instance) return NULL; + instance->comm = malloc(sizeof(struct ustcomm_ustd)); + if(!instance->comm) { + free(instance); + return NULL; + } + instance->callbacks = callbacks; instance->quit_program = 0; instance->is_init = 0; @@ -661,7 +700,7 @@ struct libustd_instance *libustd_new_instance( int libustd_init_instance(struct libustd_instance *instance) { int result; - result = ustcomm_init_ustd(&instance->comm, instance->sock_path); + result = ustcomm_init_ustd(instance->comm, instance->sock_path); if(result == -1) { ERR("failed to initialize socket"); return 1;