X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fcommon%2Futils.c;h=2f132a0603c8d9891d1280ef1912709b3b3c9013;hb=40804255e7a6acd6fa76c41ee8e4e1cc2cefa49c;hp=aada37fe707d156bc0a22425e2c0ad04a291b81e;hpb=28ab59d0baef178a8629ec9fb517ba75efb46ea8;p=lttng-tools.git diff --git a/src/common/utils.c b/src/common/utils.c index aada37fe7..2f132a060 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include "utils.h" @@ -679,16 +680,20 @@ int utils_mkdir(const char *path, mode_t mode, int uid, int gid) { int ret; struct lttng_directory_handle handle; - struct lttng_credentials creds = { + const struct lttng_credentials creds = { .uid = (uid_t) uid, .gid = (gid_t) gid, }; - (void) lttng_directory_handle_init(&handle, NULL); + ret = lttng_directory_handle_init(&handle, NULL); + if (ret) { + goto end; + } ret = lttng_directory_handle_create_subdirectory_as_user( &handle, path, mode, (uid >= 0 || gid >= 0) ? &creds : NULL); lttng_directory_handle_fini(&handle); +end: return ret; } @@ -703,80 +708,60 @@ int utils_mkdir_recursive(const char *path, mode_t mode, int uid, int gid) { int ret; struct lttng_directory_handle handle; - struct lttng_credentials creds = { + const struct lttng_credentials creds = { .uid = (uid_t) uid, .gid = (gid_t) gid, }; - (void) lttng_directory_handle_init(&handle, NULL); + ret = lttng_directory_handle_init(&handle, NULL); + if (ret) { + goto end; + } ret = lttng_directory_handle_create_subdirectory_recursive_as_user( &handle, path, mode, (uid >= 0 || gid >= 0) ? &creds : NULL); lttng_directory_handle_fini(&handle); +end: return ret; } /* - * path is the output parameter. It needs to be PATH_MAX len. + * out_stream_path is the output parameter. * * Return 0 on success or else a negative value. */ -static int utils_stream_file_name(char *path, - const char *path_name, const char *file_name, - uint64_t size, uint64_t count, - const char *suffix) +LTTNG_HIDDEN +int utils_stream_file_path(const char *path_name, const char *file_name, + uint64_t size, uint64_t count, const char *suffix, + char *out_stream_path, size_t stream_path_len) { int ret; - char full_path[PATH_MAX]; - char *path_name_suffix = NULL; - char *extra = NULL; + char count_str[MAX_INT_DEC_LEN(count) + 1] = {}; + const char *path_separator; - ret = snprintf(full_path, sizeof(full_path), "%s/%s", - path_name, file_name); - if (ret < 0) { - PERROR("snprintf create output file"); - goto error; + if (path_name && path_name[strlen(path_name) - 1] == '/') { + path_separator = ""; + } else { + path_separator = "/"; } - /* Setup extra string if suffix or/and a count is needed. */ - if (size > 0 && suffix) { - ret = asprintf(&extra, "_%" PRIu64 "%s", count, suffix); - } else if (size > 0) { - ret = asprintf(&extra, "_%" PRIu64, count); - } else if (suffix) { - ret = asprintf(&extra, "%s", suffix); - } - if (ret < 0) { - PERROR("Allocating extra string to name"); - goto error; + path_name = path_name ? : ""; + suffix = suffix ? : ""; + if (size > 0) { + ret = snprintf(count_str, sizeof(count_str), "_%" PRIu64, + count); + assert(ret > 0 && ret < sizeof(count_str)); } - /* - * If we split the trace in multiple files, we have to add the count at - * the end of the tracefile name. - */ - if (extra) { - ret = asprintf(&path_name_suffix, "%s%s", full_path, extra); - if (ret < 0) { - PERROR("Allocating path name with extra string"); - goto error_free_suffix; - } - strncpy(path, path_name_suffix, PATH_MAX - 1); - path[PATH_MAX - 1] = '\0'; + ret = snprintf(out_stream_path, stream_path_len, "%s%s%s%s%s", + path_name, path_separator, file_name, count_str, + suffix); + if (ret < 0 || ret >= stream_path_len) { + ERR("Truncation occurred while formatting stream path"); + ret = -1; } else { - ret = lttng_strncpy(path, full_path, PATH_MAX); - if (ret) { - ERR("Failed to copy stream file name"); - goto error_free_suffix; - } + ret = 0; } - path[PATH_MAX - 1] = '\0'; - ret = 0; - - free(path_name_suffix); -error_free_suffix: - free(extra); -error: return ret; } @@ -790,10 +775,10 @@ int utils_create_stream_file(const char *path_name, char *file_name, uint64_t si uint64_t count, int uid, int gid, char *suffix) { int ret, flags, mode; - char path[PATH_MAX]; + char path[LTTNG_PATH_MAX]; - ret = utils_stream_file_name(path, path_name, file_name, - size, count, suffix); + ret = utils_stream_file_path(path_name, file_name, + size, count, suffix, path, sizeof(path)); if (ret < 0) { goto error; } @@ -828,10 +813,10 @@ int utils_unlink_stream_file(const char *path_name, char *file_name, uint64_t si uint64_t count, int uid, int gid, char *suffix) { int ret; - char path[PATH_MAX]; + char path[LTTNG_PATH_MAX]; - ret = utils_stream_file_name(path, path_name, file_name, - size, count, suffix); + ret = utils_stream_file_path(path_name, file_name, size, count, suffix, + path, sizeof(path)); if (ret < 0) { goto error; }