#### */
+
+JNIEXPORT void JNICALL Java_org_eclipse_linuxtools_lttng_jni_factory_JniTraceVersion_ltt_1getTraceVersion(JNIEnv *env, jobject jobj, jstring tracepath) {
+
+ const gchar *c_pathname = (*env)->GetStringUTFChars(env, tracepath, 0);
+ jint tmpMajorNumber = 0;
+ jint tmpMinorNumber = 0;
+
+ jclass accessClass = (*env)->GetObjectClass(env, jobj);
+ jmethodID accessFunction = (*env)->GetMethodID(env, accessClass, "setTraceVersionFromC", "(II)V");
+
+ struct LttTraceVersion version_number;
+
+ if ( ltt_get_trace_version(c_pathname, &version_number) >= 0) {
+ tmpMajorNumber = version_number.ltt_major_version;
+ tmpMinorNumber = version_number.ltt_minor_version;
+ }
+
+ (*env)->CallVoidMethod(env, jobj, accessFunction, tmpMajorNumber, tmpMinorNumber );
+}
+
+
/*
### TRACE methods ###
#
{
LTT_TRACEFILE_NAME_METADATA = g_quark_from_string("metadata");
}
+
+/*****************************************************************************
+ *Function name
+ * ltt_tracefile_open_header : based on ltt_tracefile_open but it stops
+ * 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
+ * ltt_subbuffer_header_t : the header containing the version number
+ ****************************************************************************/
+static ltt_subbuffer_header_t * ltt_tracefile_open_header(gchar *fileName, LttTracefile *tf)
+{
+ 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);
+ if(tf->fd < 0){
+ g_warning("Unable to open input data file %s\n", fileName);
+ goto end;
+ }
+
+ /* 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:
+ return 0;
+}
+
+
+/*****************************************************************************
+ *Function name
+ * get_version : get the trace version from a metadata_0 trace file
+ *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)
+{
+ gchar abs_path[PATH_MAX];
+ int ret = 0;
+ DIR *dir;
+ 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, "/");
+ strcat(path, entry->d_name);
+ ret = stat(path, &stat_buf);
+ if(ret == -1) {
+ perror(path);
+ continue;
+ }
+ }
+
+ 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);
+ if(ret == -1) {
+ perror(path);
+ continue;
+ }
+
+ 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;
+ }
+
+ return 0;
+
+ open_error:
+ g_free(t);
+ return -1;
+}