X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Futils.c;h=b16cdc97c2738ad70c23624fc91295c3317b1a66;hb=b34cbebfc8e60a678782bcffdf4ff8fc12de037e;hp=d8cb4a60f1574a936fab23bcf3a9535b2875a136;hpb=2d85110833f3ffc12a62b3c13b39216d6fd769d8;p=lttng-tools.git diff --git a/src/common/utils.c b/src/common/utils.c index d8cb4a60f..b16cdc97c 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -25,8 +25,10 @@ #include #include #include +#include #include +#include #include "utils.h" @@ -36,7 +38,7 @@ * /tmp/test1 does, the real path is returned. In normal time, realpath(3) * fails if the end point directory does not exist. */ -__attribute__((visibility("hidden"))) +LTTNG_HIDDEN char *utils_expand_path(const char *path) { const char *end_path = path; @@ -89,7 +91,7 @@ error: /* * Create a pipe in dst. */ -__attribute__((visibility("hidden"))) +LTTNG_HIDDEN int utils_create_pipe(int *dst) { int ret; @@ -112,7 +114,7 @@ int utils_create_pipe(int *dst) * Make sure the pipe opened by this function are closed at some point. Use * utils_close_pipe(). */ -__attribute__((visibility("hidden"))) +LTTNG_HIDDEN int utils_create_pipe_cloexec(int *dst) { int ret, i; @@ -141,7 +143,7 @@ error: /* * Close both read and write side of the pipe. */ -__attribute__((visibility("hidden"))) +LTTNG_HIDDEN void utils_close_pipe(int *src) { int i, ret; @@ -166,7 +168,7 @@ void utils_close_pipe(int *src) /* * Create a new string using two strings range. */ -__attribute__((visibility("hidden"))) +LTTNG_HIDDEN char *utils_strdupdelim(const char *begin, const char *end) { char *str; @@ -187,7 +189,7 @@ error: /* * Set CLOEXEC flag to the give file descriptor. */ -__attribute__((visibility("hidden"))) +LTTNG_HIDDEN int utils_set_fd_cloexec(int fd) { int ret; @@ -210,7 +212,7 @@ end: /* * Create pid file to the given path and filename. */ -__attribute__((visibility("hidden"))) +LTTNG_HIDDEN int utils_create_pid_file(pid_t pid, const char *filepath) { int ret; @@ -241,7 +243,7 @@ error: * * On success, return 0 else a negative error code. */ -__attribute__((visibility("hidden"))) +LTTNG_HIDDEN int utils_mkdir_recursive(const char *path, mode_t mode) { char *p, tmp[PATH_MAX]; @@ -301,3 +303,86 @@ int utils_mkdir_recursive(const char *path, mode_t mode) error: return ret; } + +/* + * Create the stream tracefile on disk. + * + * Return 0 on success or else a negative value. + */ +int utils_create_stream_file(char *path_name, char *file_name, uint64_t size, + uint64_t count, int uid, int gid) +{ + int ret, out_fd; + char full_path[PATH_MAX], *path_name_id = NULL, *path; + + assert(path_name); + assert(file_name); + + ret = snprintf(full_path, sizeof(full_path), "%s/%s", + path_name, file_name); + if (ret < 0) { + PERROR("snprintf create output file"); + goto error; + } + + /* + * If we split the trace in multiple files, we have to add the count at the + * end of the tracefile name + */ + if (size > 0) { + ret = asprintf(&path_name_id, "%s_%" PRIu64, full_path, count); + if (ret < 0) { + PERROR("Allocating path name ID"); + goto error; + } + path = path_name_id; + } else { + path = full_path; + } + + /* Open with 660 mode */ + out_fd = run_as_open(path, O_WRONLY | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, uid, gid); + if (out_fd < 0) { + PERROR("open stream path %s", path); + goto error_open; + } + ret = out_fd; + +error_open: + free(path_name_id); +error: + return ret; +} + +/* + * Change the output tracefile according to the given size and count The + * new_count pointer is set during this operation. + * + * From the consumer, the stream lock MUST be held before calling this function + * because we are modifying the stream status. + * + * Return 0 on success or else a negative value. + */ +int utils_rotate_stream_file(char *path_name, char *file_name, uint64_t size, + uint64_t count, int uid, int gid, int out_fd, uint64_t *new_count) +{ + int ret; + + ret = close(out_fd); + if (ret < 0) { + PERROR("Closing tracefile"); + goto error; + } + + if (count > 0) { + *new_count = (*new_count + 1) % count; + } else { + (*new_count)++; + } + + return utils_create_stream_file(path_name, file_name, size, *new_count, + uid, gid); +error: + return ret; +}