X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fctf.c;h=0f216933b6c06c215e8fba048c23f03e7c24fd22;hb=d86d62f815e8fce21a7efb2cc0811720d62b0c11;hp=8b9441fdd701ea078bd2839b1009af05e5e1b117;hpb=82662ad4362f791f9cd7026652f60708923554f4;p=babeltrace.git diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index 8b9441fd..0f216933 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 @@ -1140,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) { @@ -1149,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; @@ -1167,8 +1258,19 @@ int ctf_open_trace_read(struct ctf_trace *td, const char *path, int flags, ret = -errno; goto error_dirfd; } - strncpy(td->path, path, PATH_MAX); - td->path[PATH_MAX - 1] = '\0'; + 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 (!rescolpath) { + 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. @@ -1224,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) { @@ -1239,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;