diff --git a/emu.h b/emu.h index 087bfb9..8764a1c 100644 --- a/emu.h +++ b/emu.h @@ -267,9 +267,6 @@ struct ovni_ethread { /* The process associated with this thread */ struct ovni_eproc *proc; - /* Stream fd */ - int stream_fd; - enum ethread_state state; int is_running; int is_active; @@ -296,6 +293,9 @@ struct ovni_ethread { /* These pointers keep a linked list of threads in each CPU */ struct ovni_ethread *prev; struct ovni_ethread *next; + + /* Trace file path */ + char tracefile[PATH_MAX]; }; /* State of each emulated process */ diff --git a/trace.c b/trace.c index 4b19c83..d94b79a 100644 --- a/trace.c +++ b/trace.c @@ -85,13 +85,15 @@ load_thread(struct ovni_ethread *thread, struct ovni_eproc *proc, int index, int thread->gindex = total_threads++; thread->state = TH_ST_UNKNOWN; thread->proc = proc; - thread->stream_fd = open(filepath, O_RDWR); - if(thread->stream_fd == -1) + if(strlen(filepath) >= PATH_MAX) { - perror("open"); + err("filepath too large: %s\n", filepath); return -1; } + + strcpy(thread->tracefile, filepath); + return 0; } @@ -388,8 +390,15 @@ static int load_stream_buf(struct ovni_stream *stream, struct ovni_ethread *thread) { struct stat st; + int fd; - if(fstat(thread->stream_fd, &st) < 0) + if((fd = open(thread->tracefile, O_RDWR)) == -1) + { + perror("open"); + return -1; + } + + if(fstat(fd, &st) < 0) { perror("fstat"); return -1; @@ -402,12 +411,13 @@ load_stream_buf(struct ovni_stream *stream, struct ovni_ethread *thread) stream->buf = NULL; stream->active = 0; + /* No need to do anything else */ return 0; } stream->size = st.st_size; stream->buf = mmap(NULL, stream->size, PROT_READ | PROT_WRITE, - MAP_SHARED, thread->stream_fd, 0); + MAP_SHARED, fd, 0); if(stream->buf == MAP_FAILED) { @@ -417,6 +427,13 @@ load_stream_buf(struct ovni_stream *stream, struct ovni_ethread *thread) stream->active = 1; + /* No need to keep the fd open */ + if(close(fd)) + { + perror("close"); + return -1; + } + return 0; }