cleanups
[ust.git] / libustcomm / ustcomm.c
index 5468ad4f9eebe74df02ece68166520de3bb52f06..630f90609cb403ec136f8120edb8b85c171f99ee 100644 (file)
@@ -1,3 +1,20 @@
+/* Copyright (C) 2009  Pierre-Marc Fournier
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+ */
+
 #define _GNU_SOURCE
 #include <sys/types.h>
 #include <signal.h>
@@ -16,8 +33,6 @@
 #include "localerr.h"
 
 #define UNIX_PATH_MAX 108
-#define SOCK_DIR "/tmp/socks"
-#define UST_SIGNAL SIGIO
 
 #define MSG_MAX 1000
 
@@ -49,18 +64,24 @@ char *strdup_malloc(const char *s)
        return retval;
 }
 
-static void signal_process(pid_t pid)
+static int signal_process(pid_t pid)
 {
        int result;
 
        result = kill(pid, UST_SIGNAL);
        if(result == -1) {
                PERROR("kill");
-               return;
+               return -1;
        }
 
        /* FIXME: should wait in a better way */
-       sleep(1);
+       //sleep(1);
+
+       return 0;
+}
+
+int pid_is_online(pid_t pid) {
+       return kill(pid, UST_SIGNAL) != -1;
 }
 
 static int send_message_fd(int fd, const char *msg)
@@ -77,96 +98,47 @@ static int send_message_fd(int fd, const char *msg)
        }
 
        return 1;
-
-//     *reply = (char *) malloc(MSG_MAX+1);
-//     result = recv(fd, *reply, MSG_MAX, 0);
-//     if(result == -1) {
-//             PERROR("recv");
-//             return -1;
-//     }
-//     else if(result == 0) {
-//             return 0;
-//     }
-//     
-//     (*reply)[result] = '\0';
-//
-//     return 1;
-}
-
-static int send_message_path(const char *path, const char *msg, int signalpid)
-{
-       int fd;
-       int result;
-       struct sockaddr_un addr;
-
-       result = fd = socket(PF_UNIX, SOCK_STREAM, 0);
-       if(result == -1) {
-               PERROR("socket");
-               return -1;
-       }
-
-       addr.sun_family = AF_UNIX;
-
-       result = snprintf(addr.sun_path, UNIX_PATH_MAX, "%s", path);
-       if(result >= UNIX_PATH_MAX) {
-               ERR("string overflow allocating socket name");
-               return -1;
-       }
-
-       if(signalpid >= 0)
-               signal_process(signalpid);
-
-       result = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
-       if(result == -1) {
-               PERROR("connect");
-               return -1;
-       }
-
-       return send_message_fd(fd, msg);
 }
 
-///* pid: the pid of the trace process that must receive the msg
-//   msg: pointer to a null-terminated message to send
-//   reply: location where to put the null-terminated string of the reply;
-//       it must be free'd after usage
-// */
-//
-//int send_message_pid(pid_t pid, const char *msg, char **reply)
-//{
-//     int result;
-//     char path[UNIX_PATH_MAX];
-//
-//     result = snprintf(path, UNIX_PATH_MAX, "%s/%d", SOCK_DIR, pid);
-//     if(result >= UNIX_PATH_MAX) {
-//             fprintf(stderr, "string overflow allocating socket name");
-//             return -1;
-//     }
-//
-//     send_message_path(path, msg, reply, pid);
-//
-//     return 0;
-//}
-
 /* Called by an app to ask the consumer daemon to connect to it. */
 
 int ustcomm_request_consumer(pid_t pid, const char *channel)
 {
        char path[UNIX_PATH_MAX];
        int result;
-       char *msg;
+       char *msg=NULL;
+       int retval = 0;
+       struct ustcomm_connection conn;
 
        result = snprintf(path, UNIX_PATH_MAX, "%s/ustd", SOCK_DIR);
        if(result >= UNIX_PATH_MAX) {
-               fprintf(stderr, "string overflow allocating socket name");
+               ERR("string overflow allocating socket name");
                return -1;
        }
 
        asprintf(&msg, "collect %d %s", pid, channel); 
 
-       send_message_path(path, msg, -1);
+       /* don't signal it because it's the daemon */
+       result = ustcomm_connect_path(path, &conn, -1);
+       if(result == -1) {
+               WARN("ustcomm_connect_path failed");
+               retval = -1;
+               goto del_string;
+       }
+
+       result = ustcomm_send_request(&conn, msg, NULL);
+       if(result == -1) {
+               WARN("ustcomm_send_request failed");
+               retval = -1;
+               goto disconnect;
+       }
+
+       disconnect:
+       ustcomm_disconnect(&conn);
+       del_string:
        free(msg);
 
-       return 0;
+       return retval;
 }
 
 /* returns 1 to indicate a message was received
@@ -248,7 +220,8 @@ int ustcomm_recv_message(struct ustcomm_server *server, char **msg, struct ustco
                        idx++;
                }
 
-               result = poll(fds, n_fds, timeout);
+               while((result = poll(fds, n_fds, timeout)) == -1 && errno == EINTR)
+                       /* nothing */;
                if(result == -1) {
                        PERROR("poll");
                        return -1;
@@ -336,7 +309,7 @@ found:
        return src->fd;
 }
 
-static int init_named_socket(char *name, char **path_out)
+static int init_named_socket(const char *name, char **path_out)
 {
        int result;
        int fd;
@@ -390,7 +363,7 @@ static int init_named_socket(char *name, char **path_out)
        return -1;
 }
 
-int ustcomm_send_request(struct ustcomm_connection *conn, char *req, char **reply)
+int ustcomm_send_request(struct ustcomm_connection *conn, const char *req, char **reply)
 {
        int result;
 
@@ -399,9 +372,6 @@ int ustcomm_send_request(struct ustcomm_connection *conn, char *req, char **repl
                PERROR("send");
                return -1;
        }
-       else if(result == 0) {
-               return 0;
-       }
 
        if(!reply)
                return 1;
@@ -421,7 +391,7 @@ int ustcomm_send_request(struct ustcomm_connection *conn, char *req, char **repl
        return 1;
 }
 
-int ustcomm_connect_path(char *path, struct ustcomm_connection *conn, pid_t signalpid)
+int ustcomm_connect_path(const char *path, struct ustcomm_connection *conn, pid_t signalpid)
 {
        int fd;
        int result;
@@ -441,8 +411,13 @@ int ustcomm_connect_path(char *path, struct ustcomm_connection *conn, pid_t sign
                return -1;
        }
 
-       if(signalpid >= 0)
-               signal_process(signalpid);
+       if(signalpid >= 0) {
+               result = signal_process(signalpid);
+               if(result == -1) {
+                       ERR("could not signal process");
+                       return -1;
+               }
+       }
 
        result = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
        if(result == -1) {
@@ -468,18 +443,16 @@ int ustcomm_connect_app(pid_t pid, struct ustcomm_connection *conn)
 
        result = snprintf(path, UNIX_PATH_MAX, "%s/%d", SOCK_DIR, pid);
        if(result >= UNIX_PATH_MAX) {
-               fprintf(stderr, "string overflow allocating socket name");
+               ERR("string overflow allocating socket name");
                return -1;
        }
 
        return ustcomm_connect_path(path, conn, pid);
 }
 
-int ustcomm_disconnect_app(struct ustcomm_connection *conn)
-{
-       close(conn->fd);
-       return 0;
-}
+/* Called by an application to initialize its server so daemons can
+ * connect to it.
+ */
 
 int ustcomm_init_app(pid_t pid, struct ustcomm_app *handle)
 {
@@ -508,6 +481,10 @@ free_name:
        return -1;
 }
 
+/* Used by the daemon to initialize its server so applications
+ * can connect to it.
+ */
+
 int ustcomm_init_ustd(struct ustcomm_ustd *handle)
 {
        int result;
@@ -521,7 +498,7 @@ int ustcomm_init_ustd(struct ustcomm_ustd *handle)
 
        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 at %s", name);
                goto free_name;
        }
        free(name);
This page took 0.025391 seconds and 4 git commands to generate.