3 * Linux Trace Toolkit Daemon
5 * This is a simple daemon that reads a few relayfs channels and save them in a
10 * Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
15 #include <sys/types.h>
35 struct channel_trace_fd
{
40 static char *trace_name
= NULL
;
41 static char *channel_name
= NULL
;
42 static int daemon_mode
= 0;
47 * -t directory Directory name of the trace to write to. Will be created.
48 * -c directory Root directory of the relayfs trace channels.
49 * -d Run in background (daemon).
51 void show_arguments(void)
53 printf("Please use the following arguments :\n");
55 printf("-t directory Directory name of the trace to write to.\n"
56 " It will be created.\n");
57 printf("-c directory Root directory of the relayfs trace channels.\n");
58 printf("-d Run in background (daemon).\n");
65 * Parses the command line arguments.
67 * Returns 1 if the arguments were correct, but doesn't ask for program
68 * continuation. Returns -1 if the arguments are incorrect, or 0 if OK.
70 int parse_arguments(int argc
, char **argv
)
76 if(strcmp(argv
[1], "-h") == 0) {
81 while(argn
< argc
-1) {
83 switch(argv
[argn
][0]) {
85 switch(argv
[argn
][1]) {
87 trace_name
= argv
[argn
+1];
91 channel_name
= argv
[argn
+1];
98 printf("Invalid argument '%s'.\n", argv
[argn
]);
104 printf("Invalid argument '%s'.\n", argv
[argn
]);
111 if(trace_name
== NULL
) {
112 printf("Please specify a trace name.\n");
117 if(channel_name
== NULL
) {
118 printf("Please specify a channel name.\n");
128 printf("Linux Trace Toolkit Trace Daemon\n");
130 printf("Reading from relayfs directory : %s\n", channel_name
);
131 printf("Writing to trace directory : %s\n", trace_name
);
136 int open_channel_trace_pairs(char *subchannel_name
, char *subtrace_name
,
137 struct channel_trace_fd
*fd_pairs
)
139 DIR *channel_dir
= opendir(subchannel_name
);
140 struct dirent
*entry
;
141 struct stat stat_buf
;
143 char path_channel
[PATH_MAX
];
144 int path_channel_len
;
145 char *path_channel_ptr
;
146 char path_trace
[PATH_MAX
];
148 char *path_trace_ptr
;
150 if(channel_dir
== NULL
) {
151 perror(subchannel_name
);
155 //FIXME : check if the directory already exist, and ask the user if he wants
156 //to append to the traces.
157 printf("Creating trace subdirectory %s\n", subtrace_name
);
158 ret
= mkdir(subtrace_name
, S_IRWXU
|S_IRWXG
|S_IRWXO
);
160 perror(subtrace_name
);
164 strncpy(path_channel
, subchannel_name
, PATH_MAX
-1);
165 path_channel_len
= strlen(path_channel
);
166 path_channel
[path_channel_len
] = '/';
168 path_channel_ptr
= path_channel
+ path_channel_len
;
170 strncpy(path_trace
, subtrace_name
, PATH_MAX
-1);
171 path_trace_len
= strlen(path_trace
);
172 path_trace
[path_trace_len
] = '/';
174 path_trace_ptr
= path_trace
+ path_trace_len
;
176 while((entry
= readdir(channel_dir
)) != NULL
) {
178 if(entry
->d_name
[0] == '.') continue;
180 strncpy(path_channel_ptr
, entry
->d_name
, PATH_MAX
- path_channel_len
);
181 strncpy(path_trace_ptr
, entry
->d_name
, PATH_MAX
- path_trace_len
);
183 ret
= stat(path_channel
, &stat_buf
);
185 perror(path_channel
);
189 printf("Channel file : %s\n", path_channel
);
191 if(S_ISDIR(stat_buf
.st_mode
)) {
193 printf("Entering channel subdirectory...\n");
194 ret
= open_channel_trace_pairs(path_channel
, path_trace
, fd_pairs
);
195 if(ret
< 0) continue;
200 closedir(channel_dir
);
206 int read_channels(struct channel_trace_fd
*fd_pairs
)
212 void close_channel_trace_pairs(struct channel_trace_fd
*fd_pairs
)
217 int main(int argc
, char ** argv
)
221 struct channel_trace_fd fd_pairs
= { NULL
, 0 };
223 ret
= parse_arguments(argc
, argv
);
225 if(ret
!= 0) show_arguments();
226 if(ret
< 0) return EINVAL
;
227 if(ret
> 0) return 0;
239 printf("An error occured while forking.\n");
242 /* else, we are the child, continue... */
245 if(ret
= open_channel_trace_pairs(channel_name
, trace_name
, &fd_pairs
))
248 ret
= read_channels(&fd_pairs
);
250 close_channel_trace_pairs(&fd_pairs
);