lttd first write (partial)
[ltt-control.git] / ltt / branches / poly / lttd / lttd.c
CommitLineData
617de8e1 1/* lttd
2 *
3 * Linux Trace Toolkit Daemon
4 *
5 * This is a simple daemon that reads a few relayfs channels and save them in a
6 * trace.
7 *
8 *
9 * Copyright 2005 -
10 * Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
11 */
12
13#include <stdio.h>
14#include <errno.h>
15#include <sys/types.h>
16#include <sys/stat.h>
17#include <unistd.h>
18#include <stdlib.h>
19#include <dirent.h>
20#include <string.h>
21
22
23enum {
24 GET_SUBBUF,
25 PUT_SUBBUF,
26 GET_N_BUBBUFS,
27 GET_SUBBUF_SIZE
28};
29
30struct fd_pair {
31 int channel;
32 int trace;
33};
34
35struct channel_trace_fd {
36 struct fd_pair *pair;
37 int num_pairs;
38};
39
40static char *trace_name = NULL;
41static char *channel_name = NULL;
42static int daemon_mode = 0;
43
44
45/* Args :
46 *
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).
50 */
51void show_arguments(void)
52{
53 printf("Please use the following arguments :\n");
54 printf("\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");
59 printf("\n");
60}
61
62
63/* parse_arguments
64 *
65 * Parses the command line arguments.
66 *
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.
69 */
70int parse_arguments(int argc, char **argv)
71{
72 int ret = 0;
73 int argn = 1;
74
75 if(argc == 2) {
76 if(strcmp(argv[1], "-h") == 0) {
77 return 1;
78 }
79 }
80
81 while(argn < argc-1) {
82
83 switch(argv[argn][0]) {
84 case '-':
85 switch(argv[argn][1]) {
86 case 't':
87 trace_name = argv[argn+1];
88 argn++;
89 break;
90 case 'c':
91 channel_name = argv[argn+1];
92 argn++;
93 break;
94 case 'd':
95 daemon_mode = 1;
96 break;
97 default:
98 printf("Invalid argument '%s'.\n", argv[argn]);
99 printf("\n");
100 ret = -1;
101 }
102 break;
103 default:
104 printf("Invalid argument '%s'.\n", argv[argn]);
105 printf("\n");
106 ret = -1;
107 }
108 argn++;
109 }
110
111 if(trace_name == NULL) {
112 printf("Please specify a trace name.\n");
113 printf("\n");
114 ret = -1;
115 }
116
117 if(channel_name == NULL) {
118 printf("Please specify a channel name.\n");
119 printf("\n");
120 ret = -1;
121 }
122
123 return ret;
124}
125
126void show_info(void)
127{
128 printf("Linux Trace Toolkit Trace Daemon\n");
129 printf("\n");
130 printf("Reading from relayfs directory : %s\n", channel_name);
131 printf("Writing to trace directory : %s\n", trace_name);
132 printf("\n");
133}
134
135
136int open_channel_trace_pairs(char *subchannel_name, char *subtrace_name,
137 struct channel_trace_fd *fd_pairs)
138{
139 DIR *channel_dir = opendir(subchannel_name);
140 struct dirent *entry;
141 struct stat stat_buf;
142 int ret;
143 char path_channel[PATH_MAX];
144 int path_channel_len;
145 char *path_channel_ptr;
146 char path_trace[PATH_MAX];
147 int path_trace_len;
148 char *path_trace_ptr;
149
150 if(channel_dir == NULL) {
151 perror(subchannel_name);
152 return ENOENT;
153 }
154
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);
159 if(ret == -1) {
160 perror(subtrace_name);
161 return -1;
162 }
163
164 strncpy(path_channel, subchannel_name, PATH_MAX-1);
165 path_channel_len = strlen(path_channel);
166 path_channel[path_channel_len] = '/';
167 path_channel_len++;
168 path_channel_ptr = path_channel + path_channel_len;
169
170 strncpy(path_trace, subtrace_name, PATH_MAX-1);
171 path_trace_len = strlen(path_trace);
172 path_trace[path_trace_len] = '/';
173 path_trace_len++;
174 path_trace_ptr = path_trace + path_trace_len;
175
176 while((entry = readdir(channel_dir)) != NULL) {
177
178 if(entry->d_name[0] == '.') continue;
179
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);
182
183 ret = stat(path_channel, &stat_buf);
184 if(ret == -1) {
185 perror(path_channel);
186 continue;
187 }
188
189 printf("Channel file : %s\n", path_channel);
190
191 if(S_ISDIR(stat_buf.st_mode)) {
192
193 printf("Entering channel subdirectory...\n");
194 ret = open_channel_trace_pairs(path_channel, path_trace, fd_pairs);
195 if(ret < 0) continue;
196 }
197
198 }
199
200 closedir(channel_dir);
201
202 return 0;
203}
204
205
206int read_channels(struct channel_trace_fd *fd_pairs)
207{
208 return 0;
209}
210
211
212void close_channel_trace_pairs(struct channel_trace_fd *fd_pairs)
213{
214
215}
216
217int main(int argc, char ** argv)
218{
219 int ret;
220 pid_t pid;
221 struct channel_trace_fd fd_pairs = { NULL, 0 };
222
223 ret = parse_arguments(argc, argv);
224
225 if(ret != 0) show_arguments();
226 if(ret < 0) return EINVAL;
227 if(ret > 0) return 0;
228
229 show_info();
230
231 if(daemon_mode) {
232 pid = fork();
233
234 if(pid > 0) {
235 /* parent */
236 return 0;
237 } else if(pid < 0) {
238 /* error */
239 printf("An error occured while forking.\n");
240 return -1;
241 }
242 /* else, we are the child, continue... */
243 }
244
245 if(ret = open_channel_trace_pairs(channel_name, trace_name, &fd_pairs))
246 goto end_main;
247
248 ret = read_channels(&fd_pairs);
249
250 close_channel_trace_pairs(&fd_pairs);
251
252end_main:
253
254 return ret;
255}
This page took 0.030025 seconds and 4 git commands to generate.