-
- if (uid < 0 || gid < 0) {
- /* Run as current user. */
- ret = _utils_mkdir_recursive_unsafe(path, mode);
- } else {
- ret = run_as_mkdir_recursive(path, mode, uid, gid);
- }
- if (ret < 0) {
- PERROR("mkdir %s, uid %d, gid %d", path ? path : "NULL",
- uid, gid);
- }
-
- return ret;
-}
-
-/*
- * path is the output parameter. It needs to be PATH_MAX len.
- *
- * 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)
-{
- int ret;
- char full_path[PATH_MAX];
- char *path_name_suffix = NULL;
- char *extra = NULL;
-
- ret = snprintf(full_path, sizeof(full_path), "%s/%s",
- path_name, file_name);
- if (ret < 0) {
- PERROR("snprintf create output file");
- goto error;
- }
-
- /* 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;
- }
-
- /*
- * 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';
- } else {
- strncpy(path, full_path, PATH_MAX - 1);
- }
- path[PATH_MAX - 1] = '\0';
- ret = 0;
-
- free(path_name_suffix);
-error_free_suffix:
- free(extra);
-error:
- return ret;
-}
-
-/*
- * Create the stream file on disk.
- *
- * Return 0 on success or else a negative value.
- */
-LTTNG_HIDDEN
-int utils_create_stream_file(const char *path_name, char *file_name, uint64_t size,
- uint64_t count, int uid, int gid, char *suffix)
-{
- int ret, flags, mode;
- char path[PATH_MAX];
-
- ret = utils_stream_file_name(path, path_name, file_name,
- size, count, suffix);
- if (ret < 0) {
- goto error;
- }
-
- /*
- * With the session rotation feature on the relay, we might need to seek
- * and truncate a tracefile, so we need read and write access.
- */
- flags = O_RDWR | O_CREAT | O_TRUNC;
- /* Open with 660 mode */
- mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
-
- if (uid < 0 || gid < 0) {
- ret = open(path, flags, mode);
- } else {
- ret = run_as_open(path, flags, mode, uid, gid);
- }
- if (ret < 0) {
- PERROR("open stream path %s", path);