From dce0b474515fd2d9f74882c7b59ab6c00da51388 Mon Sep 17 00:00:00 2001 From: Pierre-Marc Fournier Date: Thu, 28 Jan 2010 12:28:13 -0500 Subject: [PATCH] libustcomm: create default socket directory if it does not exist Applies to socket and trace app. --- libustcomm/ustcomm.c | 47 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/libustcomm/ustcomm.c b/libustcomm/ustcomm.c index 2bd86eb..6ddd6d8 100644 --- a/libustcomm/ustcomm.c +++ b/libustcomm/ustcomm.c @@ -478,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. */ @@ -493,6 +525,12 @@ 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 (%s). Check that directory exists and that it is writable.", name); @@ -522,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"); } -- 2.34.1