Create utility methods in the library to support local write to disk
[ltt-control.git] / lttd / lttd.c
index d3c12d5aca6b81e9b1d2da1852f261d4243bc9aa..b43b63765edf97252f26f6866fca4b31e922807d 100644 (file)
@@ -8,6 +8,8 @@
  * CPU hot-plugging is supported using inotify.
  *
  * Copyright 2009-2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright 2010 - Michael Sills-Lavoie <michael.sills-lavoie@polymtl.ca>
+ * Copyright 2010 - Oumarou Dicko <oumarou.dicko@polymtl.ca>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,6 +24,7 @@
  * You should have received a copy of the GNU General Public License along
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
  */
 
 #ifdef HAVE_CONFIG_H
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <signal.h>
 #include <errno.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <sys/stat.h>
 
 #include <liblttd/liblttd.h>
+#include <liblttd/liblttdutils.h>
 
-struct lttd_channel_data {
-       int trace;
-};
+struct liblttd_instance* instance;
 
-struct liblttd_instance *instance;
-static char            path_trace[PATH_MAX];
-static char            *end_path_trace;
-static int             path_trace_len = 0;
 static char            *trace_name = NULL;
 static char            *channel_name = NULL;
 static int             daemon_mode = 0;
@@ -59,13 +53,6 @@ static int           dump_flight_only = 0;
 static int             dump_normal_only = 0;
 static int             verbose_mode = 0;
 
-static __thread int thread_pipe[2];
-
-#define printf_verbose(fmt, args...) \
-  do {                               \
-    if (verbose_mode)                \
-      printf(fmt, ##args);           \
-  } while (0)
 
 /* Args :
  *
@@ -195,152 +182,11 @@ static void handler(int signo)
        liblttd_stop_instance(instance);
 }
 
-int lttd_on_open_channel(struct liblttd_callbacks *data, struct fd_pair *pair, char *relative_channel_path)
-{
-       int open_ret = 0;
-       int ret;
-       struct stat stat_buf;
-       struct lttd_channel_data *channel_data;
-
-       pair->user_data = malloc(sizeof(struct lttd_channel_data));
-       channel_data = pair->user_data;
-
-       strncpy(end_path_trace, relative_channel_path, PATH_MAX - path_trace_len);
-       printf_verbose("Creating trace file %s\n", path_trace);
-
-       ret = stat(path_trace, &stat_buf);
-       if(ret == 0) {
-               if(append_mode) {
-                       printf_verbose("Appending to file %s as requested\n",
-                               path_trace);
-
-                       channel_data->trace = open(path_trace, O_WRONLY, S_IRWXU|S_IRWXG|S_IRWXO);
-                       if(channel_data->trace == -1) {
-                               perror(path_trace);
-                               open_ret = -1;
-                               goto end;
-                       }
-                       ret = lseek(channel_data->trace, 0, SEEK_END);
-                       if (ret < 0) {
-                               perror(path_trace);
-                               open_ret = -1;
-                               close(channel_data->trace);
-                               goto end;
-                       }
-               } else {
-                       printf("File %s exists, cannot open. Try append mode.\n", path_trace);
-                       open_ret = -1;
-                       goto end;
-               }
-       } else {
-               if(errno == ENOENT) {
-                       channel_data->trace = open(path_trace, O_WRONLY|O_CREAT|O_EXCL, S_IRWXU|S_IRWXG|S_IRWXO);
-                       if(channel_data->trace == -1) {
-                               perror(path_trace);
-                               open_ret = -1;
-                               goto end;
-                       }
-               }
-       }
-
-end:
-       return open_ret;
-
-}
-
-int lttd_on_close_channel(struct liblttd_callbacks *data, struct fd_pair *pair)
-{
-       int ret;
-       ret = close(((struct lttd_channel_data *)(pair->user_data))->trace);
-       free(pair->user_data);
-       return ret;
-}
-
-int lttd_on_new_channels_folder(struct liblttd_callbacks *data, char *relative_folder_path)
-{
-       int ret;
-       int open_ret = 0;
-
-       strncpy(end_path_trace, relative_folder_path, PATH_MAX - path_trace_len);
-       printf_verbose("Creating trace subdirectory %s\n", path_trace);
-
-       ret = mkdir(path_trace, S_IRWXU|S_IRWXG|S_IRWXO);
-       if(ret == -1) {
-               if(errno != EEXIST) {
-                       perror(path_trace);
-                       open_ret = -1;
-                       goto end;
-               }
-       }
-
-end:
-       return open_ret;
-}
-
-int lttd_on_read_subbuffer(struct liblttd_callbacks *data, struct fd_pair *pair, unsigned int len)
-{
-       long ret;
-       off_t offset = 0;
-
-       while (len > 0) {
-               printf_verbose("splice chan to pipe offset %lu\n",
-                       (unsigned long)offset);
-               ret = splice(pair->channel, &offset, thread_pipe[1], NULL,
-                       len, SPLICE_F_MOVE | SPLICE_F_MORE);
-               printf_verbose("splice chan to pipe ret %ld\n", ret);
-               if (ret < 0) {
-                       perror("Error in relay splice");
-                       goto write_error;
-               }
-               ret = splice(thread_pipe[0], NULL,
-                       ((struct lttd_channel_data *)(pair->user_data))->trace,
-                       NULL, ret, SPLICE_F_MOVE | SPLICE_F_MORE);
-               printf_verbose("splice pipe to file %ld\n", ret);
-               if (ret < 0) {
-                       perror("Error in file splice");
-                       goto write_error;
-               }
-               len -= ret;
-       }
-
-write_error:
-       return ret;
-}
-
-int lttd_on_new_thread(struct liblttd_callbacks *data, unsigned long thread_num)
-{
-       int ret;
-       ret = pipe(thread_pipe);
-       if (ret < 0) {
-               perror("Error creating pipe");
-               return ret;
-       }
-       return 0;
-}
-
-int lttd_on_close_thread(struct liblttd_callbacks *data, unsigned long thread_num)
-{
-       close(thread_pipe[0]);  /* close read end */
-       close(thread_pipe[1]);  /* close write end */
-       return 0;
-}
-
 int main(int argc, char ** argv)
 {
        int ret = 0;
        struct sigaction act;
 
-       struct liblttd_callbacks callbacks = {
-               lttd_on_open_channel,
-               lttd_on_close_channel,
-               lttd_on_new_channels_folder,
-               lttd_on_read_subbuffer,
-               NULL,
-               lttd_on_new_thread,
-               lttd_on_close_thread,
-               NULL
-       };
-
        ret = parse_arguments(argc, argv);
 
        if(ret != 0) show_arguments();
@@ -368,12 +214,13 @@ int main(int argc, char ** argv)
                        exit(-1);
                }
        }
-       strncpy(path_trace, trace_name, PATH_MAX-1);
-       path_trace_len = strlen(path_trace);
-       end_path_trace = path_trace + path_trace_len;
 
-       instance = liblttd_new_instance(&callbacks, channel_name, num_threads,
+       struct liblttd_callbacks* callbacks = liblttdutils_local_new_callbacks(
+               trace_name, append_mode, verbose_mode);
+
+       instance = liblttd_new_instance(callbacks, channel_name, num_threads,
                dump_flight_only, dump_normal_only, verbose_mode);
+
        if(!instance) {
                perror("An error occured while creating the liblttd instance");
                return ret;
This page took 0.024434 seconds and 4 git commands to generate.