X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fctf.c;h=752213ec1d74cc26ef1866b08b2f36646c256b3f;hb=73d159163aa1c2b8e9da78ade3ded6ef1c81513f;hp=0af34aab01412b6c558b0157bf550d30b87b9a59;hpb=f571dfb1ed9909c45274be95489e10f5c1432ff3;p=babeltrace.git diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index 0af34aab..752213ec 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -55,7 +55,7 @@ extern int yydebug; static -struct trace_descriptor *ctf_open_trace(const char *path, int flags, +struct trace_descriptor *ctf_open_trace(const char *collection_path, const char *path, int flags, void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset, int whence), FILE *metadata_fp); static @@ -606,9 +606,10 @@ int ctf_open_trace_metadata_stream_read(struct ctf_trace *td, FILE **fp, * \0). This is the allocated size, not the actual string size. */ out = open_memstream(buf, &size); - if (out == NULL) + if (out == NULL) { + perror("Metadata open_memstream"); return -errno; - + } for (;;) { ret = ctf_open_trace_metadata_packet_read(td, in, out); if (ret) { @@ -623,6 +624,10 @@ int ctf_open_trace_metadata_stream_read(struct ctf_trace *td, FILE **fp, fclose(in); /* open for reading */ *fp = fmemopen(*buf, strlen(*buf), "rb"); + if (!*fp) { + perror("Metadata fmemopen"); + return -errno; + } return 0; } @@ -660,6 +665,7 @@ int ctf_open_trace_metadata_read(struct ctf_trace *td, fp = fdopen(metadata_stream->pos.fd, "r"); if (!fp) { fprintf(stdout, "[error] Unable to open metadata stream.\n"); + perror("Metadata stream open"); ret = -errno; goto end_stream; } @@ -1097,8 +1103,10 @@ int ctf_open_file_stream_read(struct ctf_trace *td, const char *path, int flags, struct ctf_file_stream *file_stream; ret = openat(td->dirfd, path, flags); - if (ret < 0) + if (ret < 0) { + perror("File stream openat()"); goto error; + } file_stream = g_new0(struct ctf_file_stream, 1); if (move_pos_slow) { @@ -1132,8 +1140,98 @@ error: return ret; } +static void +init_domain_name(struct ctf_trace *td) +{ + char *start, *end; + + start = td->path + strlen(td->collection_path); + while (start[0] == '/') + start++; /* skip / */ + end = strchr(start, '/'); + if (!end) + end = start + strlen(start); + memcpy(td->domain, start, end - start); + td->domain[end - start] = '\0'; +} + +static void +init_proc_name(struct ctf_trace *td) +{ + char buf[PATH_MAX]; + char *start, *end; + + if (td->domain[0] == '\0') + return; + memcpy(buf, td->path, PATH_MAX); + start = buf + strlen(td->collection_path); + while (start[0] == '/') + start++; /* skip / */ + start = strchr(start, '/'); /* get begin of domain content */ + if (!start) + return; + while (start[0] == '/') + start++; /* skip / */ + /* find last -, skips time */ + end = strrchr(start, '-'); + if (!end) + return; + *end = '\0'; + /* find previous -, skips date */ + end = strrchr(start, '-'); + if (!end) + return; + *end = '\0'; + /* find previous -, skips pid */ + end = strrchr(start, '-'); + if (!end) + return; + *end = '\0'; + + memcpy(td->procname, start, end - start); + td->procname[end - start] = '\0'; +} + +static void +init_vpid(struct ctf_trace *td) +{ + char buf[PATH_MAX]; + char *start, *end; + + if (td->domain[0] == '\0') + return; + memcpy(buf, td->path, PATH_MAX); + start = buf + strlen(td->collection_path); + while (start[0] == '/') + start++; /* skip / */ + start = strchr(start, '/'); /* get begin of domain content */ + if (!start) + return; + while (start[0] == '/') + start++; /* skip / */ + /* find last -, skips time */ + end = strrchr(start, '-'); + if (!end) + return; + *end = '\0'; + /* find previous -, skips date */ + end = strrchr(start, '-'); + if (!end) + return; + *end = '\0'; + /* find previous -, skips pid */ + start = strrchr(start, '-'); + if (!start) + return; + start++; /* skip - */ + + memcpy(td->vpid, start, end - start); + td->vpid[end - start] = '\0'; +} + static -int ctf_open_trace_read(struct ctf_trace *td, const char *path, int flags, +int ctf_open_trace_read(struct ctf_trace *td, const char *collection_path, + const char *path, int flags, void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset, int whence), FILE *metadata_fp) { @@ -1141,6 +1239,7 @@ int ctf_open_trace_read(struct ctf_trace *td, const char *path, int flags, struct dirent *dirent; struct dirent *diriter; size_t dirent_len; + char *respath, *rescolpath; td->flags = flags; @@ -1155,9 +1254,23 @@ int ctf_open_trace_read(struct ctf_trace *td, const char *path, int flags, td->dirfd = open(path, 0); if (td->dirfd < 0) { fprintf(stdout, "[error] Unable to open trace directory file descriptor.\n"); - ret = -ENOENT; + perror("Trace directory open"); + ret = -errno; goto error_dirfd; } + rescolpath = realpath(collection_path, td->collection_path); + if (!rescolpath) { + fprintf(stdout, "[error] collection path resolution failure\n"); + return -EINVAL; + } + respath = realpath(path, td->path); + if (!respath) { + fprintf(stdout, "[error] path resolution failure\n"); + return -EINVAL; + } + init_domain_name(td); + init_proc_name(td); + init_vpid(td); /* * Keep the metadata file separate. @@ -1213,7 +1326,7 @@ error: } static -struct trace_descriptor *ctf_open_trace(const char *path, int flags, +struct trace_descriptor *ctf_open_trace(const char *collection_path, const char *path, int flags, void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset, int whence), FILE *metadata_fp) { @@ -1228,7 +1341,7 @@ struct trace_descriptor *ctf_open_trace(const char *path, int flags, fprintf(stdout, "[error] Path missing for input CTF trace.\n"); goto error; } - ret = ctf_open_trace_read(td, path, flags, move_pos_slow, metadata_fp); + ret = ctf_open_trace_read(td, collection_path, path, flags, move_pos_slow, metadata_fp); if (ret) goto error; break;