/* from marker.c */
extern long marker_update_fields_offsets(struct marker_info *info, const char *data);
+extern void marker_update_event_fields_offsets(GArray *fields_offsets,
+ struct marker_info *info);
/* Tracefile names used in this file */
perror("Cannot map block for tracefile");
goto close_file;
}
-
+
+ /* Create fields offset table */
+ tf->event.fields_offsets = g_array_sized_new(FALSE, FALSE,
+ sizeof(struct LttField), 1);
+ if (!tf->event.fields_offsets)
+ goto close_file;
+
return 0;
/* Error */
close(t->fd);
if (t->buf_index)
g_array_free(t->buf_index, TRUE);
+ g_array_free(t->event.fields_offsets, TRUE);
}
/****************************************************************************
if (info->size != -1)
size = info->size;
else
- size = marker_update_fields_offsets(marker_get_info_from_id(tf->mdata,
- tf->event.event_id), tf->event.data);
+ size = marker_update_fields_offsets(info, tf->event.data);
+ /* Update per-tracefile offsets */
+ marker_update_event_fields_offsets(tf->event.fields_offsets, info);
}
tf->event.data_size = size;
/*****************************************************************************
*Function name
* ltt_tracefile_open_header : based on ltt_tracefile_open but it stops
- * when it gets the header
- *Input params
+ * when it gets the header
+ *Input params
* fileName : path to the tracefile
* tf : the tracefile (metadata_0) where the header will be read
*Return value
struct stat lTDFStat; /* Trace data file status */
ltt_subbuffer_header_t *header;
int page_size = getpagesize();
-
+
/* open the file */
tf->long_name = g_quark_from_string(fileName);
tf->fd = open(fileName, O_RDONLY);
g_warning("Unable to open input data file %s\n", fileName);
goto end;
}
-
- /* Get the file's status */
+
+ /* Get the file's status */
if(fstat(tf->fd, &lTDFStat) < 0){
g_warning("Unable to get the status of the input data file %s\n", fileName);
goto close_file;
}
-
+
/* Is the file large enough to contain a trace */
if(lTDFStat.st_size < (off_t)(ltt_subbuffer_header_size())) {
g_print("The input data file %s does not contain a trace\n", fileName);
goto close_file;
}
-
+
/* Temporarily map the buffer start header to get trace information */
/* Multiple of pages aligned head */
tf->buffer.head = mmap(0,PAGE_ALIGN(ltt_subbuffer_header_size()), PROT_READ, MAP_PRIVATE, tf->fd, 0);
-
+
if(tf->buffer.head == MAP_FAILED) {
perror("Error in allocating memory for buffer of tracefile");
goto close_file;
}
g_assert( ( (gulong)tf->buffer.head&(8-1) ) == 0); // make sure it's aligned.
-
+
header = (ltt_subbuffer_header_t *)tf->buffer.head;
-
+
return header;
-
+
close_file:
close(tf->fd);
end:
/*****************************************************************************
*Function name
* get_version : get the trace version from a metadata_0 trace file
- *Input params
+ *Input params
* pathname : path to the trace
* version_number : the struct that will get the version number
*Return value
* int : 1 if succeed, -1 if error
****************************************************************************/
-int ltt_get_trace_version(const gchar *pathname, struct LttTraceVersion *version_number)
+int ltt_get_trace_version(const gchar *pathname, struct LttTraceVersion *version_number)
{
gchar abs_path[PATH_MAX];
int ret = 0;
struct dirent *entry;
struct stat stat_buf;
gchar path[PATH_MAX];
-
+
LttTracefile tmp_tf;
LttTrace * t;
ltt_subbuffer_header_t *header;
-
+
t = g_new(LttTrace, 1);
-
+
get_absolute_pathname(pathname, abs_path);
-
+
/* Test to see if it looks like a trace */
dir = opendir(abs_path);
-
+
if(dir == NULL) {
perror(abs_path);
goto open_error;
}
-
+
while((entry = readdir(dir)) != NULL) {
strcpy(path, abs_path);
strcat(path, "/");
continue;
}
}
-
- closedir(dir);
+
+ closedir(dir);
dir = opendir(abs_path);
-
+
while((entry = readdir(dir)) != NULL) {
if(entry->d_name[0] == '.') continue;
if(g_strcmp0(entry->d_name, "metadata_0") != 0) continue;
-
+
strcpy(path, abs_path);
strcat(path, "/");
strcat(path, entry->d_name);
perror(path);
continue;
}
-
- header = ltt_tracefile_open_header(path, &tmp_tf);
-
+
+ header = ltt_tracefile_open_header(path, &tmp_tf);
+
if(header == NULL) {
g_info("Error getting the header %s", path);
continue; /* error opening the tracefile : bad magic number ? */
}
-
- version_number->ltt_major_version = header->major_version;
- version_number->ltt_minor_version = header->minor_version;
+
+ version_number->ltt_major_version = header->major_version;
+ version_number->ltt_minor_version = header->minor_version;
}
-
+
return 0;
-
+
open_error:
g_free(t);
return -1;