libustcomm: change char * to const char * where relevant
[ust.git] / libustcomm / ustcomm.c
index e773f7189fe313f78f0704f1ad907730a715aa38..fd5e360e343a7e495330115d060396bdf4179365 100644 (file)
@@ -23,6 +23,7 @@
 #include <sys/un.h>
 #include <unistd.h>
 #include <poll.h>
+#include <sys/stat.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -30,7 +31,7 @@
 #include <execinfo.h>
 
 #include "ustcomm.h"
-#include "localerr.h"
+#include "usterr.h"
 
 #define UNIX_PATH_MAX 108
 
@@ -66,29 +67,18 @@ char *strdup_malloc(const char *s)
 
 static int signal_process(pid_t pid)
 {
-       int result;
-
-       result = kill(pid, UST_SIGNAL);
-       if(result == -1) {
-               PERROR("kill");
-               return -1;
-       }
-
-       /* FIXME: should wait in a better way */
-       //sleep(1);
-
        return 0;
 }
 
 int pid_is_online(pid_t pid) {
-       return kill(pid, UST_SIGNAL) != -1;
+       return 1;
 }
 
 static int send_message_fd(int fd, const char *msg)
 {
        int result;
 
-       result = send(fd, msg, strlen(msg), 0);
+       result = send(fd, msg, strlen(msg), MSG_NOSIGNAL);
        if(result == -1) {
                PERROR("send");
                return -1;
@@ -378,8 +368,7 @@ static int init_named_socket(const char *name, char **path_out)
        }
 
        if(path_out) {
-               *path_out = "";
-               *path_out = strdupa(addr.sun_path);
+               *path_out = strdup(addr.sun_path);
        }
 
        return fd;
@@ -390,13 +379,24 @@ static int init_named_socket(const char *name, char **path_out)
        return -1;
 }
 
+/*
+ * Return value:
+ *   0: Success, but no reply because recv() returned 0
+ *   1: Success
+ *   -1: Error
+ *
+ * On error, the error message is printed, except on
+ * ECONNRESET, which is normal when the application dies.
+ */
+
 int ustcomm_send_request(struct ustcomm_connection *conn, const char *req, char **reply)
 {
        int result;
 
-       result = send(conn->fd, req, strlen(req), 0);
+       result = send(conn->fd, req, strlen(req), MSG_NOSIGNAL);
        if(result == -1) {
-               PERROR("send");
+               if(errno != EPIPE)
+                       PERROR("send");
                return -1;
        }
 
@@ -406,7 +406,8 @@ int ustcomm_send_request(struct ustcomm_connection *conn, const char *req, char
        *reply = (char *) malloc(MSG_MAX+1);
        result = recv(conn->fd, *reply, MSG_MAX, 0);
        if(result == -1) {
-               PERROR("recv");
+               if(errno != ECONNRESET)
+                       PERROR("recv");
                return -1;
        }
        else if(result == 0) {
@@ -477,6 +478,38 @@ int ustcomm_connect_app(pid_t pid, struct ustcomm_connection *conn)
        return ustcomm_connect_path(path, conn, pid);
 }
 
+static int ensure_dir_exists(const char *dir)
+{
+       struct stat st;
+       int result;
+
+       if(!strcmp(dir, ""))
+               return -1;
+
+       result = stat(dir, &st);
+       if(result == -1 && errno != ENOENT) {
+               return -1;
+       }
+       else if(result == -1) {
+               /* ENOENT */
+               char buf[200];
+               int result;
+
+               result = snprintf(buf, sizeof(buf), "mkdir -p \"%s\"", dir);
+               if(result >= sizeof(buf)) {
+                       ERR("snprintf buffer overflow");
+                       return -1;
+               }
+               result = system(buf);
+               if(result != 0) {
+                       ERR("executing command %s", buf);
+                       return -1;
+               }
+       }
+
+       return 0;
+}
+
 /* Called by an application to initialize its server so daemons can
  * connect to it.
  */
@@ -492,9 +525,15 @@ int ustcomm_init_app(pid_t pid, struct ustcomm_app *handle)
                return -1;
        }
 
+       result = ensure_dir_exists(SOCK_DIR);
+       if(result == -1) {
+               ERR("Unable to create socket directory %s", SOCK_DIR);
+               return -1;
+       }
+
        handle->server.listen_fd = init_named_socket(name, &(handle->server.socketpath));
        if(handle->server.listen_fd < 0) {
-               ERR("error initializing named socket");
+               ERR("Error initializing named socket (%s). Check that directory exists and that it is writable.", name);
                goto free_name;
        }
        free(name);
@@ -521,6 +560,15 @@ int ustcomm_init_ustd(struct ustcomm_ustd *handle, const char *sock_path)
                asprintf(&name, "%s", sock_path);
        }
        else {
+               int result;
+
+               /* Only check if socket dir exists if we are using the default directory */
+               result = ensure_dir_exists(SOCK_DIR);
+               if(result == -1) {
+                       ERR("Unable to create socket directory %s", SOCK_DIR);
+                       return -1;
+               }
+
                asprintf(&name, "%s/%s", SOCK_DIR, "ustd");
        }
 
@@ -539,7 +587,32 @@ free_name:
        return retval;
 }
 
-static char *find_tok(char *str)
+void ustcomm_fini_app(struct ustcomm_app *handle)
+{
+       int result;
+       struct stat st;
+
+       /* Destroy socket */
+       result = stat(handle->server.socketpath, &st);
+       if(result == -1) {
+               PERROR("stat (%s)", handle->server.socketpath);
+               return;
+       }
+
+       /* Paranoid check before deleting. */
+       result = S_ISSOCK(st.st_mode);
+       if(!result) {
+               ERR("The socket we are about to delete is not a socket.");
+               return;
+       }
+
+       result = unlink(handle->server.socketpath);
+       if(result == -1) {
+               PERROR("unlink");
+       }
+}
+
+static const char *find_tok(const char *str)
 {
        while(*str == ' ') {
                str++;
@@ -551,7 +624,7 @@ static char *find_tok(char *str)
        return str;
 }
 
-static char *find_sep(char *str)
+static const char *find_sep(const char *str)
 {
        while(*str != ' ') {
                str++;
@@ -563,11 +636,11 @@ static char *find_sep(char *str)
        return str;
 }
 
-int nth_token_is(char *str, char *token, int tok_no)
+int nth_token_is(const char *str, const char *token, int tok_no)
 {
        int i;
-       char *start;
-       char *end;
+       const char *start;
+       const char *end;
 
        for(i=0; i<=tok_no; i++) {
                str = find_tok(str);
@@ -592,12 +665,12 @@ int nth_token_is(char *str, char *token, int tok_no)
        return 1;
 }
 
-char *nth_token(char *str, int tok_no)
+char *nth_token(const char *str, int tok_no)
 {
        static char *retval = NULL;
        int i;
-       char *start;
-       char *end;
+       const char *start;
+       const char *end;
 
        for(i=0; i<=tok_no; i++) {
                str = find_tok(str);
This page took 0.027012 seconds and 4 git commands to generate.