X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Findex%2Findex.c;fp=src%2Fcommon%2Findex%2Findex.c;h=89b4fd769eab98a49137fb08087388caec4469e4;hb=8b833f70b3d3697e74c54f3a2f5efbe5292097ef;hp=0000000000000000000000000000000000000000;hpb=5aaa62a111f332a7c4412558bb9da9b30320eefd;p=lttng-tools.git diff --git a/src/common/index/index.c b/src/common/index/index.c new file mode 100644 index 000000000..89b4fd769 --- /dev/null +++ b/src/common/index/index.c @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2013 - Julien Desfossez + * David Goulet + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License, version 2 only, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#define _GNU_SOURCE +#include +#include + +#include +#include +#include + +#include "index.h" + +/* + * Create the index file associated with a trace file. + * + * Return fd on success, a negative value on error. + */ +int index_create_file(char *path_name, char *stream_name, int uid, int gid, + uint64_t size, uint64_t count) +{ + int ret, fd = -1; + struct lttng_packet_index_file_hdr hdr; + char fullpath[PATH_MAX]; + + ret = snprintf(fullpath, sizeof(fullpath), "%s/" DEFAULT_INDEX_DIR, + path_name); + if (ret < 0) { + PERROR("snprintf index path"); + goto error; + } + + /* Create index directory if necessary. */ + ret = run_as_mkdir(fullpath, S_IRWXU | S_IRWXG, uid, gid); + if (ret < 0) { + if (ret != -EEXIST) { + ERR("Index trace directory creation error"); + goto error; + } + } + + ret = utils_create_stream_file(fullpath, stream_name, size, count, uid, + gid, DEFAULT_INDEX_FILE_SUFFIX); + if (ret < 0) { + goto error; + } + fd = ret; + + memcpy(hdr.magic, INDEX_MAGIC, sizeof(hdr.magic)); + hdr.index_major = htobe32(INDEX_MAJOR); + hdr.index_minor = htobe32(INDEX_MINOR); + + do { + ret = write(fd, &hdr, sizeof(hdr)); + } while (ret < 0 && errno == EINTR); + if (ret < 0) { + PERROR("write index header"); + goto error; + } + + return fd; + +error: + if (fd >= 0) { + int close_ret; + + close_ret = close(fd); + if (close_ret < 0) { + PERROR("close index fd"); + } + } + return ret; +} + +/* + * Write index values to the given fd of size len. + * + * Return 0 on success or else a negative value on error. + */ +int index_write(int fd, struct lttng_packet_index *index, size_t len) +{ + int ret; + + assert(fd >= 0); + assert(index); + + do { + ret = write(fd, index, len); + } while (ret < 0 && errno == EINTR); + if (ret < 0) { + PERROR("writing index file"); + } + + return ret; +}