X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libustcomm%2Fustcomm.c;h=ed6d8f121fea0069ac796ccd4162b81a80501746;hb=b0c4126fca44c9fdc9b350ce0e896ec2818fbb3e;hp=dce1e521c5b5c83714d439a00edf07ccb73253dc;hpb=dbd75de7b2c05c98d6171bc531a1ecb23fb7e80d;p=ust.git diff --git a/libustcomm/ustcomm.c b/libustcomm/ustcomm.c index dce1e52..ed6d8f1 100644 --- a/libustcomm/ustcomm.c +++ b/libustcomm/ustcomm.c @@ -18,6 +18,7 @@ /* API used by UST components to communicate with each other via sockets. */ #define _GNU_SOURCE +#include #include #include #include @@ -556,7 +557,7 @@ char *ustcomm_user_sock_dir(void) * -1: error */ -int ustcomm_connect_app(pid_t pid, int *app_fd) +static int connect_app_non_root(pid_t pid, int *app_fd) { int result; int retval = 0; @@ -588,28 +589,85 @@ free_dir_name: return retval; } -int ensure_dir_exists(const char *dir) + + +static int connect_app_root(pid_t pid, int *app_fd) +{ + DIR *tmp_dir; + struct dirent *dirent; + char *sock_name; + int result; + + tmp_dir = opendir(USER_TMP_DIR); + if (!tmp_dir) { + return -1; + } + + while ((dirent = readdir(tmp_dir))) { + if (!strncmp(dirent->d_name, USER_SOCK_DIR_BASE, + strlen(USER_SOCK_DIR_BASE))) { + + if (asprintf(&sock_name, USER_TMP_DIR "/%s/%u", + dirent->d_name, pid) < 0) { + goto close_tmp_dir; + } + + result = ustcomm_connect_path(sock_name, app_fd); + + free(sock_name); + + if (result == 0) { + goto close_tmp_dir; + } + } + } + +close_tmp_dir: + closedir(tmp_dir); + + return result; +} + +int ustcomm_connect_app(pid_t pid, int *app_fd) +{ + *app_fd = 0; + + if (geteuid()) { + return connect_app_non_root(pid, app_fd); + } else { + return connect_app_root(pid, app_fd); + } + +} + +int ensure_dir_exists(const char *dir, mode_t mode) { struct stat st; int result; - if(!strcmp(dir, "")) + if (!strcmp(dir, "")) return -1; result = stat(dir, &st); - if(result == -1 && errno != ENOENT) { + if (result < 0 && errno != ENOENT) { return -1; - } - else if(result == -1) { + } else if (result < 0) { /* ENOENT */ int result; - /* mkdir mode to 0777 */ - result = mkdir_p(dir, S_IRWXU | S_IRWXG | S_IRWXO); + result = mkdir_p(dir, mode); if(result != 0) { ERR("executing in recursive creation of directory %s", dir); return -1; } + } else { + if (st.st_mode != mode) { + result = chmod(dir, mode); + if (result < 0) { + ERR("couldn't set directory mode on %s", dir); + return -1; + } + } } return 0; @@ -780,68 +838,68 @@ int ustcomm_unpack_buffer_info(struct ustcomm_buffer_info *buf_inf) return 0; } -int ustcomm_pack_marker_info(struct ustcomm_header *header, - struct ustcomm_marker_info *marker_inf, +int ustcomm_pack_ust_marker_info(struct ustcomm_header *header, + struct ustcomm_ust_marker_info *ust_marker_inf, const char *trace, const char *channel, - const char *marker) + const char *ust_marker) { int offset = 0; - marker_inf->trace = ustcomm_print_data(marker_inf->data, - sizeof(marker_inf->data), + ust_marker_inf->trace = ustcomm_print_data(ust_marker_inf->data, + sizeof(ust_marker_inf->data), &offset, trace); - if (marker_inf->trace == USTCOMM_POISON_PTR) { + if (ust_marker_inf->trace == USTCOMM_POISON_PTR) { return -ENOMEM; } - marker_inf->channel = ustcomm_print_data(marker_inf->data, - sizeof(marker_inf->data), + ust_marker_inf->channel = ustcomm_print_data(ust_marker_inf->data, + sizeof(ust_marker_inf->data), &offset, channel); - if (marker_inf->channel == USTCOMM_POISON_PTR) { + if (ust_marker_inf->channel == USTCOMM_POISON_PTR) { return -ENOMEM; } - marker_inf->marker = ustcomm_print_data(marker_inf->data, - sizeof(marker_inf->data), + ust_marker_inf->ust_marker = ustcomm_print_data(ust_marker_inf->data, + sizeof(ust_marker_inf->data), &offset, - marker); + ust_marker); - if (marker_inf->marker == USTCOMM_POISON_PTR) { + if (ust_marker_inf->ust_marker == USTCOMM_POISON_PTR) { return -ENOMEM; } - header->size = COMPUTE_MSG_SIZE(marker_inf, offset); + header->size = COMPUTE_MSG_SIZE(ust_marker_inf, offset); return 0; } -int ustcomm_unpack_marker_info(struct ustcomm_marker_info *marker_inf) +int ustcomm_unpack_ust_marker_info(struct ustcomm_ust_marker_info *ust_marker_inf) { - marker_inf->trace = ustcomm_restore_ptr(marker_inf->trace, - marker_inf->data, - sizeof(marker_inf->data)); - if (!marker_inf->trace) { + ust_marker_inf->trace = ustcomm_restore_ptr(ust_marker_inf->trace, + ust_marker_inf->data, + sizeof(ust_marker_inf->data)); + if (!ust_marker_inf->trace) { return -EINVAL; } - marker_inf->channel = ustcomm_restore_ptr(marker_inf->channel, - marker_inf->data, - sizeof(marker_inf->data)); - if (!marker_inf->channel) { + ust_marker_inf->channel = ustcomm_restore_ptr(ust_marker_inf->channel, + ust_marker_inf->data, + sizeof(ust_marker_inf->data)); + if (!ust_marker_inf->channel) { return -EINVAL; } - marker_inf->marker = ustcomm_restore_ptr(marker_inf->marker, - marker_inf->data, - sizeof(marker_inf->data)); - if (!marker_inf->marker) { + ust_marker_inf->ust_marker = ustcomm_restore_ptr(ust_marker_inf->ust_marker, + ust_marker_inf->data, + sizeof(ust_marker_inf->data)); + if (!ust_marker_inf->ust_marker) { return -EINVAL; }