xref: /aosp_15_r20/system/extras/ioshark/compile_ioshark.c (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
1*288bf522SAndroid Build Coastguard Worker /*
2*288bf522SAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*288bf522SAndroid Build Coastguard Worker  *
4*288bf522SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*288bf522SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*288bf522SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*288bf522SAndroid Build Coastguard Worker  *
8*288bf522SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*288bf522SAndroid Build Coastguard Worker  *
10*288bf522SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*288bf522SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*288bf522SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*288bf522SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*288bf522SAndroid Build Coastguard Worker  * limitations under the License.
15*288bf522SAndroid Build Coastguard Worker  */
16*288bf522SAndroid Build Coastguard Worker 
17*288bf522SAndroid Build Coastguard Worker #include <stdio.h>
18*288bf522SAndroid Build Coastguard Worker #include <sys/time.h>
19*288bf522SAndroid Build Coastguard Worker #include <sys/types.h>
20*288bf522SAndroid Build Coastguard Worker #include <unistd.h>
21*288bf522SAndroid Build Coastguard Worker #include <stdlib.h>
22*288bf522SAndroid Build Coastguard Worker #include <signal.h>
23*288bf522SAndroid Build Coastguard Worker #include <string.h>
24*288bf522SAndroid Build Coastguard Worker #include <sys/stat.h>
25*288bf522SAndroid Build Coastguard Worker #include <errno.h>
26*288bf522SAndroid Build Coastguard Worker #include <fcntl.h>
27*288bf522SAndroid Build Coastguard Worker #include <ctype.h>
28*288bf522SAndroid Build Coastguard Worker #include "ioshark.h"
29*288bf522SAndroid Build Coastguard Worker #include "compile_ioshark.h"
30*288bf522SAndroid Build Coastguard Worker 
31*288bf522SAndroid Build Coastguard Worker char *progname;
32*288bf522SAndroid Build Coastguard Worker 
33*288bf522SAndroid Build Coastguard Worker char in_buf[2048];
34*288bf522SAndroid Build Coastguard Worker 
35*288bf522SAndroid Build Coastguard Worker struct flags_map_s {
36*288bf522SAndroid Build Coastguard Worker 	char *flag_str;
37*288bf522SAndroid Build Coastguard Worker 	int flag;
38*288bf522SAndroid Build Coastguard Worker };
39*288bf522SAndroid Build Coastguard Worker 
40*288bf522SAndroid Build Coastguard Worker #define ARRAY_SIZE(a)	(sizeof(a) / sizeof(a[0]))
41*288bf522SAndroid Build Coastguard Worker 
42*288bf522SAndroid Build Coastguard Worker struct flags_map_s open_flags_map[] = {
43*288bf522SAndroid Build Coastguard Worker 	{ "O_RDONLY", O_RDONLY },
44*288bf522SAndroid Build Coastguard Worker 	{ "O_WRONLY", O_WRONLY },
45*288bf522SAndroid Build Coastguard Worker 	{ "O_RDWR", O_RDWR },
46*288bf522SAndroid Build Coastguard Worker 	{ "O_CREAT", O_CREAT },
47*288bf522SAndroid Build Coastguard Worker 	{ "O_SYNC", O_SYNC },
48*288bf522SAndroid Build Coastguard Worker 	{ "O_TRUNC", O_TRUNC },
49*288bf522SAndroid Build Coastguard Worker 	{ "O_EXCL", O_EXCL },
50*288bf522SAndroid Build Coastguard Worker 	{ "O_APPEND", O_APPEND },
51*288bf522SAndroid Build Coastguard Worker 	{ "O_NOATIME", O_NOATIME },
52*288bf522SAndroid Build Coastguard Worker 	{ "O_ASYNC", O_ASYNC },
53*288bf522SAndroid Build Coastguard Worker 	{ "O_CLOEXEC", O_CLOEXEC },
54*288bf522SAndroid Build Coastguard Worker 	{ "O_DIRECT", O_DIRECT },
55*288bf522SAndroid Build Coastguard Worker 	{ "O_DIRECTORY", O_DIRECTORY },
56*288bf522SAndroid Build Coastguard Worker 	{ "O_LARGEFILE", O_LARGEFILE },
57*288bf522SAndroid Build Coastguard Worker 	{ "O_NOCTTY", O_NOCTTY },
58*288bf522SAndroid Build Coastguard Worker 	{ "O_NOFOLLOW", O_NOFOLLOW },
59*288bf522SAndroid Build Coastguard Worker 	{ "O_NONBLOCK", O_NONBLOCK },
60*288bf522SAndroid Build Coastguard Worker 	{ "O_NDELAY", O_NDELAY },
61*288bf522SAndroid Build Coastguard Worker 	{ "O_PATH", O_PATH }
62*288bf522SAndroid Build Coastguard Worker };
63*288bf522SAndroid Build Coastguard Worker 
64*288bf522SAndroid Build Coastguard Worker struct flags_map_s lseek_action_map[] = {
65*288bf522SAndroid Build Coastguard Worker 	{ "SEEK_SET", SEEK_SET },
66*288bf522SAndroid Build Coastguard Worker 	{ "SEEK_CUR", SEEK_CUR },
67*288bf522SAndroid Build Coastguard Worker 	{ "SEEK_END", SEEK_END }
68*288bf522SAndroid Build Coastguard Worker };
69*288bf522SAndroid Build Coastguard Worker 
70*288bf522SAndroid Build Coastguard Worker struct flags_map_s fileop_map[] = {
71*288bf522SAndroid Build Coastguard Worker 	{ "lseek", IOSHARK_LSEEK },
72*288bf522SAndroid Build Coastguard Worker 	{ "_llseek", IOSHARK_LLSEEK },
73*288bf522SAndroid Build Coastguard Worker 	{ "pread64", IOSHARK_PREAD64 },
74*288bf522SAndroid Build Coastguard Worker 	{ "pwrite64", IOSHARK_PWRITE64 },
75*288bf522SAndroid Build Coastguard Worker 	{ "read", IOSHARK_READ },
76*288bf522SAndroid Build Coastguard Worker 	{ "write", IOSHARK_WRITE },
77*288bf522SAndroid Build Coastguard Worker 	{ "mmap", IOSHARK_MMAP },
78*288bf522SAndroid Build Coastguard Worker 	{ "mmap2", IOSHARK_MMAP2 },
79*288bf522SAndroid Build Coastguard Worker 	{ "openat", IOSHARK_OPEN },
80*288bf522SAndroid Build Coastguard Worker 	{ "fsync", IOSHARK_FSYNC },
81*288bf522SAndroid Build Coastguard Worker 	{ "fdatasync", IOSHARK_FDATASYNC },
82*288bf522SAndroid Build Coastguard Worker 	{ "close", IOSHARK_CLOSE },
83*288bf522SAndroid Build Coastguard Worker 	{ "ftrace", IOSHARK_MAPPED_PREAD }
84*288bf522SAndroid Build Coastguard Worker };
85*288bf522SAndroid Build Coastguard Worker 
86*288bf522SAndroid Build Coastguard Worker struct in_mem_file_op {
87*288bf522SAndroid Build Coastguard Worker 	struct ioshark_file_operation disk_file_op;
88*288bf522SAndroid Build Coastguard Worker 	struct in_mem_file_op *next;
89*288bf522SAndroid Build Coastguard Worker };
90*288bf522SAndroid Build Coastguard Worker 
91*288bf522SAndroid Build Coastguard Worker struct in_mem_file_op *in_mem_file_op_head = NULL, *in_mem_file_op_tail = NULL;
92*288bf522SAndroid Build Coastguard Worker 
usage(void)93*288bf522SAndroid Build Coastguard Worker void usage(void)
94*288bf522SAndroid Build Coastguard Worker {
95*288bf522SAndroid Build Coastguard Worker 	fprintf(stderr, "%s in_file out_file\n", progname);
96*288bf522SAndroid Build Coastguard Worker }
97*288bf522SAndroid Build Coastguard Worker 
98*288bf522SAndroid Build Coastguard Worker void
init_prev_time(struct timeval * tv)99*288bf522SAndroid Build Coastguard Worker init_prev_time(struct timeval *tv)
100*288bf522SAndroid Build Coastguard Worker {
101*288bf522SAndroid Build Coastguard Worker 	tv->tv_sec = tv->tv_usec = 0;
102*288bf522SAndroid Build Coastguard Worker }
103*288bf522SAndroid Build Coastguard Worker 
104*288bf522SAndroid Build Coastguard Worker /*
105*288bf522SAndroid Build Coastguard Worker  * delta ts is the time delta from the previous IO in this tracefile.
106*288bf522SAndroid Build Coastguard Worker  */
107*288bf522SAndroid Build Coastguard Worker static u_int64_t
get_delta_ts(char * buf,struct timeval * prev)108*288bf522SAndroid Build Coastguard Worker get_delta_ts(char *buf, struct timeval *prev)
109*288bf522SAndroid Build Coastguard Worker {
110*288bf522SAndroid Build Coastguard Worker 	struct timeval op_tv, tv_res;
111*288bf522SAndroid Build Coastguard Worker 
112*288bf522SAndroid Build Coastguard Worker 	sscanf(buf, "%lu.%lu", &op_tv.tv_sec, &op_tv.tv_usec);
113*288bf522SAndroid Build Coastguard Worker 	/* First item */
114*288bf522SAndroid Build Coastguard Worker 	if (prev->tv_sec == 0 && prev->tv_usec == 0)
115*288bf522SAndroid Build Coastguard Worker 		tv_res.tv_sec = tv_res.tv_usec = 0;
116*288bf522SAndroid Build Coastguard Worker 	else
117*288bf522SAndroid Build Coastguard Worker 		timersub(&op_tv, prev, &tv_res);
118*288bf522SAndroid Build Coastguard Worker 	*prev = op_tv;
119*288bf522SAndroid Build Coastguard Worker 	return (tv_res.tv_usec + (tv_res.tv_sec * 1000000));
120*288bf522SAndroid Build Coastguard Worker }
121*288bf522SAndroid Build Coastguard Worker 
122*288bf522SAndroid Build Coastguard Worker void
get_tracetype(char * buf,char * trace_type)123*288bf522SAndroid Build Coastguard Worker get_tracetype(char *buf, char *trace_type)
124*288bf522SAndroid Build Coastguard Worker {
125*288bf522SAndroid Build Coastguard Worker 	char *s, *s2;
126*288bf522SAndroid Build Coastguard Worker 
127*288bf522SAndroid Build Coastguard Worker 	*trace_type = '\0';
128*288bf522SAndroid Build Coastguard Worker 	s = strchr(buf, ' ');
129*288bf522SAndroid Build Coastguard Worker 	if (s == NULL) {
130*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr,
131*288bf522SAndroid Build Coastguard Worker 			"%s Malformed Trace Type ? %s\n",
132*288bf522SAndroid Build Coastguard Worker 			progname, __func__);
133*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
134*288bf522SAndroid Build Coastguard Worker 	}
135*288bf522SAndroid Build Coastguard Worker 	while (*s == ' ')
136*288bf522SAndroid Build Coastguard Worker 		s++;
137*288bf522SAndroid Build Coastguard Worker 	if (sscanf(s, "%s", trace_type) != 1) {
138*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr,
139*288bf522SAndroid Build Coastguard Worker 			"%s Malformed Trace Type ? %s\n",
140*288bf522SAndroid Build Coastguard Worker 			progname, __func__);
141*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
142*288bf522SAndroid Build Coastguard Worker 	}
143*288bf522SAndroid Build Coastguard Worker 	if (strcmp(trace_type, "strace") != 0 &&
144*288bf522SAndroid Build Coastguard Worker 	    strcmp(trace_type, "ftrace") != 0) {
145*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr,
146*288bf522SAndroid Build Coastguard Worker 			"%s Unknown/Missing Trace Type (has to be strace|ftrace) %s\n",
147*288bf522SAndroid Build Coastguard Worker 			progname, __func__);
148*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
149*288bf522SAndroid Build Coastguard Worker 	}
150*288bf522SAndroid Build Coastguard Worker 	/*
151*288bf522SAndroid Build Coastguard Worker 	 * Remove the keyword "strace"/"ftrace" from the buffer
152*288bf522SAndroid Build Coastguard Worker 	 */
153*288bf522SAndroid Build Coastguard Worker 	s2 = strchr(s, ' ');
154*288bf522SAndroid Build Coastguard Worker 	if (s2 == NULL) {
155*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr,
156*288bf522SAndroid Build Coastguard Worker 			"%s Malformed Trace Type ? %s\n",
157*288bf522SAndroid Build Coastguard Worker 			progname, __func__);
158*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
159*288bf522SAndroid Build Coastguard Worker 	}
160*288bf522SAndroid Build Coastguard Worker 	while (*s2 == ' ')
161*288bf522SAndroid Build Coastguard Worker 		s2++;
162*288bf522SAndroid Build Coastguard Worker 	if (*s2  == '\0') {
163*288bf522SAndroid Build Coastguard Worker 		/*
164*288bf522SAndroid Build Coastguard Worker 		 * Premature end of input record
165*288bf522SAndroid Build Coastguard Worker 		 */
166*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr,
167*288bf522SAndroid Build Coastguard Worker 			"%s Mal-formed strace/ftrace record %s:%s\n",
168*288bf522SAndroid Build Coastguard Worker 			progname, __func__, buf);
169*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
170*288bf522SAndroid Build Coastguard Worker 	}
171*288bf522SAndroid Build Coastguard Worker 	/* strcpy() expects non-overlapping buffers, but bcopy doesn't */
172*288bf522SAndroid Build Coastguard Worker 	bcopy(s2, s, strlen(s2) + 1);
173*288bf522SAndroid Build Coastguard Worker }
174*288bf522SAndroid Build Coastguard Worker 
175*288bf522SAndroid Build Coastguard Worker void
get_pathname(char * buf,char * pathname,enum file_op file_op)176*288bf522SAndroid Build Coastguard Worker get_pathname(char *buf, char *pathname, enum file_op file_op)
177*288bf522SAndroid Build Coastguard Worker {
178*288bf522SAndroid Build Coastguard Worker 	char *s, *s2, save;
179*288bf522SAndroid Build Coastguard Worker 
180*288bf522SAndroid Build Coastguard Worker 	if (file_op == IOSHARK_MAPPED_PREAD) {
181*288bf522SAndroid Build Coastguard Worker 		s = strchr(buf, '/');
182*288bf522SAndroid Build Coastguard Worker 		if (s == NULL) {
183*288bf522SAndroid Build Coastguard Worker 			fprintf(stderr, "%s: Malformed line: %s\n",
184*288bf522SAndroid Build Coastguard Worker 				__func__, buf);
185*288bf522SAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
186*288bf522SAndroid Build Coastguard Worker 		}
187*288bf522SAndroid Build Coastguard Worker 		s2 = strchr(s, ' ');
188*288bf522SAndroid Build Coastguard Worker 		if (s2 == NULL) {
189*288bf522SAndroid Build Coastguard Worker 			fprintf(stderr, "%s: Malformed line: %s\n",
190*288bf522SAndroid Build Coastguard Worker 				__func__, buf);
191*288bf522SAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
192*288bf522SAndroid Build Coastguard Worker 		}
193*288bf522SAndroid Build Coastguard Worker 	} else {
194*288bf522SAndroid Build Coastguard Worker 		if (file_op == IOSHARK_OPEN)
195*288bf522SAndroid Build Coastguard Worker 			s = strchr(buf, '"');
196*288bf522SAndroid Build Coastguard Worker 		else
197*288bf522SAndroid Build Coastguard Worker 			s = strchr(buf, '<');
198*288bf522SAndroid Build Coastguard Worker 		if (s == NULL) {
199*288bf522SAndroid Build Coastguard Worker 			fprintf(stderr, "%s: Malformed line: %s\n",
200*288bf522SAndroid Build Coastguard Worker 				__func__, buf);
201*288bf522SAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
202*288bf522SAndroid Build Coastguard Worker 		}
203*288bf522SAndroid Build Coastguard Worker 		s += 1;
204*288bf522SAndroid Build Coastguard Worker 		if (file_op == IOSHARK_OPEN)
205*288bf522SAndroid Build Coastguard Worker 			s2 = strchr(s, '"');
206*288bf522SAndroid Build Coastguard Worker 		else
207*288bf522SAndroid Build Coastguard Worker 			s2 = strchr(s, '>');
208*288bf522SAndroid Build Coastguard Worker 		if (s2 == NULL) {
209*288bf522SAndroid Build Coastguard Worker 			fprintf(stderr, "%s: Malformed line: %s\n",
210*288bf522SAndroid Build Coastguard Worker 				__func__, buf);
211*288bf522SAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
212*288bf522SAndroid Build Coastguard Worker 		}
213*288bf522SAndroid Build Coastguard Worker 	}
214*288bf522SAndroid Build Coastguard Worker 	save = *s2;
215*288bf522SAndroid Build Coastguard Worker 	*s2 = '\0';
216*288bf522SAndroid Build Coastguard Worker 	strcpy(pathname, s);
217*288bf522SAndroid Build Coastguard Worker 	*s2 = save;
218*288bf522SAndroid Build Coastguard Worker }
219*288bf522SAndroid Build Coastguard Worker 
220*288bf522SAndroid Build Coastguard Worker void
get_syscall(char * buf,char * syscall)221*288bf522SAndroid Build Coastguard Worker get_syscall(char *buf, char *syscall)
222*288bf522SAndroid Build Coastguard Worker {
223*288bf522SAndroid Build Coastguard Worker 	char *s, *s2;
224*288bf522SAndroid Build Coastguard Worker 
225*288bf522SAndroid Build Coastguard Worker 	s = strchr(buf, ' ');
226*288bf522SAndroid Build Coastguard Worker 	if (s == NULL) {
227*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
228*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
229*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
230*288bf522SAndroid Build Coastguard Worker 	}
231*288bf522SAndroid Build Coastguard Worker 	s += 1;
232*288bf522SAndroid Build Coastguard Worker 	s2 = strchr(s, '(');
233*288bf522SAndroid Build Coastguard Worker 	if (s2 == NULL) {
234*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
235*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
236*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
237*288bf522SAndroid Build Coastguard Worker 	}
238*288bf522SAndroid Build Coastguard Worker 	*s2 = '\0';
239*288bf522SAndroid Build Coastguard Worker 	strcpy(syscall, s);
240*288bf522SAndroid Build Coastguard Worker 	*s2 = '(';
241*288bf522SAndroid Build Coastguard Worker }
242*288bf522SAndroid Build Coastguard Worker 
243*288bf522SAndroid Build Coastguard Worker void
get_mmap_offset_len_prot(char * buf,int * prot,off_t * offset,u_int64_t * len)244*288bf522SAndroid Build Coastguard Worker get_mmap_offset_len_prot(char *buf, int *prot, off_t *offset, u_int64_t *len)
245*288bf522SAndroid Build Coastguard Worker {
246*288bf522SAndroid Build Coastguard Worker 	char *s, *s1;
247*288bf522SAndroid Build Coastguard Worker 	int i;
248*288bf522SAndroid Build Coastguard Worker 	char protstr[128];
249*288bf522SAndroid Build Coastguard Worker 
250*288bf522SAndroid Build Coastguard Worker 	s = strchr(buf, ',');
251*288bf522SAndroid Build Coastguard Worker 	if (s == NULL) {
252*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
253*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
254*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
255*288bf522SAndroid Build Coastguard Worker 	}
256*288bf522SAndroid Build Coastguard Worker 	s += 2;
257*288bf522SAndroid Build Coastguard Worker 	sscanf(s, "%ju", len);
258*288bf522SAndroid Build Coastguard Worker 	s1 = strchr(s, ',');
259*288bf522SAndroid Build Coastguard Worker 	if (s1 == NULL) {
260*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
261*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
262*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
263*288bf522SAndroid Build Coastguard Worker 	}
264*288bf522SAndroid Build Coastguard Worker 	s1 += 2;
265*288bf522SAndroid Build Coastguard Worker 	s = strchr(s1, ',');
266*288bf522SAndroid Build Coastguard Worker 	if (s == NULL) {
267*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
268*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
269*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
270*288bf522SAndroid Build Coastguard Worker 	}
271*288bf522SAndroid Build Coastguard Worker 	*s = '\0';
272*288bf522SAndroid Build Coastguard Worker 	strcpy(protstr, s1);
273*288bf522SAndroid Build Coastguard Worker 	*prot = 0;
274*288bf522SAndroid Build Coastguard Worker 	if (strstr(protstr, "PROT_READ"))
275*288bf522SAndroid Build Coastguard Worker 		*prot |= IOSHARK_PROT_READ;
276*288bf522SAndroid Build Coastguard Worker 	if (strstr(protstr, "PROT_WRITE"))
277*288bf522SAndroid Build Coastguard Worker 		*prot |= IOSHARK_PROT_WRITE;
278*288bf522SAndroid Build Coastguard Worker 	*s = ',';
279*288bf522SAndroid Build Coastguard Worker 	s += 2;
280*288bf522SAndroid Build Coastguard Worker 	for (i = 0 ; i < 2 ; i++) {
281*288bf522SAndroid Build Coastguard Worker 		s = strchr(s, ',');
282*288bf522SAndroid Build Coastguard Worker 		if (s == NULL) {
283*288bf522SAndroid Build Coastguard Worker 			fprintf(stderr, "%s: Malformed line: %s\n",
284*288bf522SAndroid Build Coastguard Worker 				__func__, buf);
285*288bf522SAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
286*288bf522SAndroid Build Coastguard Worker 		}
287*288bf522SAndroid Build Coastguard Worker 		s += 2;
288*288bf522SAndroid Build Coastguard Worker 	}
289*288bf522SAndroid Build Coastguard Worker 	sscanf(s, "%jx", offset);
290*288bf522SAndroid Build Coastguard Worker }
291*288bf522SAndroid Build Coastguard Worker 
292*288bf522SAndroid Build Coastguard Worker void
get_lseek_offset_action(char * buf,enum file_op op,off_t * offset,char * action)293*288bf522SAndroid Build Coastguard Worker get_lseek_offset_action(char *buf, enum file_op op,
294*288bf522SAndroid Build Coastguard Worker 			off_t *offset, char *action)
295*288bf522SAndroid Build Coastguard Worker {
296*288bf522SAndroid Build Coastguard Worker 	char *s, *s2;
297*288bf522SAndroid Build Coastguard Worker 
298*288bf522SAndroid Build Coastguard Worker 	s = strchr(buf, ',');
299*288bf522SAndroid Build Coastguard Worker 	if (s == NULL) {
300*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
301*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
302*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
303*288bf522SAndroid Build Coastguard Worker 	}
304*288bf522SAndroid Build Coastguard Worker 	s += 2;
305*288bf522SAndroid Build Coastguard Worker 	sscanf(s, "%ju", offset);
306*288bf522SAndroid Build Coastguard Worker 	s = strchr(s, ',');
307*288bf522SAndroid Build Coastguard Worker 	if (s == NULL) {
308*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
309*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
310*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
311*288bf522SAndroid Build Coastguard Worker 	}
312*288bf522SAndroid Build Coastguard Worker 	s += 2;
313*288bf522SAndroid Build Coastguard Worker 	if (op == IOSHARK_LLSEEK) {
314*288bf522SAndroid Build Coastguard Worker 		s = strchr(s, ',');
315*288bf522SAndroid Build Coastguard Worker 		if (s == NULL) {
316*288bf522SAndroid Build Coastguard Worker 			fprintf(stderr, "%s: Malformed line: %s\n",
317*288bf522SAndroid Build Coastguard Worker 				__func__, buf);
318*288bf522SAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
319*288bf522SAndroid Build Coastguard Worker 		}
320*288bf522SAndroid Build Coastguard Worker 		s += 2;
321*288bf522SAndroid Build Coastguard Worker 	}
322*288bf522SAndroid Build Coastguard Worker 	s2 = strchr(s, ')');
323*288bf522SAndroid Build Coastguard Worker 	if (s2 == NULL) {
324*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
325*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
326*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
327*288bf522SAndroid Build Coastguard Worker 	}
328*288bf522SAndroid Build Coastguard Worker 	*s2 = '\0';
329*288bf522SAndroid Build Coastguard Worker 	strcpy(action, s);
330*288bf522SAndroid Build Coastguard Worker 	*s2 = ')';
331*288bf522SAndroid Build Coastguard Worker }
332*288bf522SAndroid Build Coastguard Worker 
333*288bf522SAndroid Build Coastguard Worker void
get_rw_len(char * buf,u_int64_t * len)334*288bf522SAndroid Build Coastguard Worker get_rw_len(char *buf,
335*288bf522SAndroid Build Coastguard Worker 	   u_int64_t *len)
336*288bf522SAndroid Build Coastguard Worker {
337*288bf522SAndroid Build Coastguard Worker 	char *s_len;
338*288bf522SAndroid Build Coastguard Worker 
339*288bf522SAndroid Build Coastguard Worker 	s_len = strrchr(buf, ',');
340*288bf522SAndroid Build Coastguard Worker 	if (s_len == NULL) {
341*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
342*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
343*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
344*288bf522SAndroid Build Coastguard Worker 	}
345*288bf522SAndroid Build Coastguard Worker 	sscanf(s_len + 2, "%ju", len);
346*288bf522SAndroid Build Coastguard Worker }
347*288bf522SAndroid Build Coastguard Worker 
348*288bf522SAndroid Build Coastguard Worker void
get_prw64_offset_len(char * buf,off_t * offset,u_int64_t * len)349*288bf522SAndroid Build Coastguard Worker get_prw64_offset_len(char *buf,
350*288bf522SAndroid Build Coastguard Worker 		     off_t *offset,
351*288bf522SAndroid Build Coastguard Worker 		     u_int64_t *len)
352*288bf522SAndroid Build Coastguard Worker {
353*288bf522SAndroid Build Coastguard Worker 	char *s_offset, *s_len;
354*288bf522SAndroid Build Coastguard Worker 
355*288bf522SAndroid Build Coastguard Worker 	s_offset = strrchr(buf, ',');
356*288bf522SAndroid Build Coastguard Worker 	if (s_offset == NULL) {
357*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line 1: %s\n",
358*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
359*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
360*288bf522SAndroid Build Coastguard Worker 	}
361*288bf522SAndroid Build Coastguard Worker 	*s_offset = '\0';
362*288bf522SAndroid Build Coastguard Worker 	s_len = strrchr(buf, ',');
363*288bf522SAndroid Build Coastguard Worker 	if (s_len == NULL) {
364*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line 2: %s\n",
365*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
366*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
367*288bf522SAndroid Build Coastguard Worker 	}
368*288bf522SAndroid Build Coastguard Worker 	*s_offset = ',';
369*288bf522SAndroid Build Coastguard Worker 	sscanf(s_len + 2, "%ju", len);
370*288bf522SAndroid Build Coastguard Worker 	sscanf(s_offset + 2, "%ju", offset);
371*288bf522SAndroid Build Coastguard Worker }
372*288bf522SAndroid Build Coastguard Worker 
373*288bf522SAndroid Build Coastguard Worker 
374*288bf522SAndroid Build Coastguard Worker void
get_ftrace_offset_len(char * buf,off_t * offset,u_int64_t * len)375*288bf522SAndroid Build Coastguard Worker get_ftrace_offset_len(char *buf,
376*288bf522SAndroid Build Coastguard Worker 		      off_t *offset,
377*288bf522SAndroid Build Coastguard Worker 		      u_int64_t *len)
378*288bf522SAndroid Build Coastguard Worker {
379*288bf522SAndroid Build Coastguard Worker 	char *s_offset;
380*288bf522SAndroid Build Coastguard Worker 
381*288bf522SAndroid Build Coastguard Worker 	s_offset = strchr(buf, '/');
382*288bf522SAndroid Build Coastguard Worker 	if (s_offset == NULL) {
383*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line 1: %s\n",
384*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
385*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
386*288bf522SAndroid Build Coastguard Worker 	}
387*288bf522SAndroid Build Coastguard Worker 	s_offset = strchr(s_offset, ' ');
388*288bf522SAndroid Build Coastguard Worker 	if (s_offset == NULL) {
389*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line 2: %s\n",
390*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
391*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
392*288bf522SAndroid Build Coastguard Worker 	}
393*288bf522SAndroid Build Coastguard Worker 	while (*s_offset == ' ')
394*288bf522SAndroid Build Coastguard Worker 		s_offset++;
395*288bf522SAndroid Build Coastguard Worker 	if (sscanf(s_offset, "%ju %ju", offset, len) != 2) {
396*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line 3: %s\n",
397*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
398*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
399*288bf522SAndroid Build Coastguard Worker 	}
400*288bf522SAndroid Build Coastguard Worker }
401*288bf522SAndroid Build Coastguard Worker 
402*288bf522SAndroid Build Coastguard Worker void
get_openat_flags_mode(char * buf,char * flags,mode_t * mode)403*288bf522SAndroid Build Coastguard Worker get_openat_flags_mode(char *buf, char *flags, mode_t *mode)
404*288bf522SAndroid Build Coastguard Worker {
405*288bf522SAndroid Build Coastguard Worker 	char *s, *s2, lookfor;
406*288bf522SAndroid Build Coastguard Worker 
407*288bf522SAndroid Build Coastguard Worker 	s = strchr(buf, ',');
408*288bf522SAndroid Build Coastguard Worker 	if (s == NULL) {
409*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
410*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
411*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
412*288bf522SAndroid Build Coastguard Worker 	}
413*288bf522SAndroid Build Coastguard Worker 	s += 2;
414*288bf522SAndroid Build Coastguard Worker 	s = strchr(s, ',');
415*288bf522SAndroid Build Coastguard Worker 	if (s == NULL) {
416*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
417*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
418*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
419*288bf522SAndroid Build Coastguard Worker 	}
420*288bf522SAndroid Build Coastguard Worker 	s += 2;
421*288bf522SAndroid Build Coastguard Worker 	if (strstr(s, "O_CREAT") == NULL)
422*288bf522SAndroid Build Coastguard Worker 		lookfor = ')';
423*288bf522SAndroid Build Coastguard Worker 	else
424*288bf522SAndroid Build Coastguard Worker 		lookfor = ',';
425*288bf522SAndroid Build Coastguard Worker 	s2 = strchr(s, lookfor);
426*288bf522SAndroid Build Coastguard Worker 	if (s2 == NULL) {
427*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Malformed line: %s\n",
428*288bf522SAndroid Build Coastguard Worker 			__func__, buf);
429*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
430*288bf522SAndroid Build Coastguard Worker 	}
431*288bf522SAndroid Build Coastguard Worker 	*s2 = '\0';
432*288bf522SAndroid Build Coastguard Worker 	strcpy(flags, s);
433*288bf522SAndroid Build Coastguard Worker 	*s2 = lookfor;
434*288bf522SAndroid Build Coastguard Worker 	if (strstr(s, "O_CREAT") != NULL) {
435*288bf522SAndroid Build Coastguard Worker 		s = s2 + 2;
436*288bf522SAndroid Build Coastguard Worker 		s2 = strchr(s, ')');
437*288bf522SAndroid Build Coastguard Worker 		if (s2 == NULL) {
438*288bf522SAndroid Build Coastguard Worker 			fprintf(stderr, "%s: Malformed line: %s\n",
439*288bf522SAndroid Build Coastguard Worker 				__func__, buf);
440*288bf522SAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
441*288bf522SAndroid Build Coastguard Worker 		}
442*288bf522SAndroid Build Coastguard Worker 		*s2 = '\0';
443*288bf522SAndroid Build Coastguard Worker 		sscanf(s, "%o", mode);
444*288bf522SAndroid Build Coastguard Worker 		*s2 = ')';
445*288bf522SAndroid Build Coastguard Worker 	}
446*288bf522SAndroid Build Coastguard Worker }
447*288bf522SAndroid Build Coastguard Worker 
448*288bf522SAndroid Build Coastguard Worker int
lookup_map(char * s,struct flags_map_s * flags_map,int maplen)449*288bf522SAndroid Build Coastguard Worker lookup_map(char *s, struct flags_map_s *flags_map, int maplen)
450*288bf522SAndroid Build Coastguard Worker {
451*288bf522SAndroid Build Coastguard Worker 	int found = 0, flag = 0;
452*288bf522SAndroid Build Coastguard Worker 	int i;
453*288bf522SAndroid Build Coastguard Worker 
454*288bf522SAndroid Build Coastguard Worker 	while (isspace(*s))
455*288bf522SAndroid Build Coastguard Worker 		s++;
456*288bf522SAndroid Build Coastguard Worker 	for (i = 0 ; i < maplen ; i++) {
457*288bf522SAndroid Build Coastguard Worker 		if (strcmp(flags_map[i].flag_str, s) == 0) {
458*288bf522SAndroid Build Coastguard Worker 			flag = flags_map[i].flag;
459*288bf522SAndroid Build Coastguard Worker 			found = 1;
460*288bf522SAndroid Build Coastguard Worker 			break;
461*288bf522SAndroid Build Coastguard Worker 		}
462*288bf522SAndroid Build Coastguard Worker 	}
463*288bf522SAndroid Build Coastguard Worker 	if (found == 0) {
464*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s: Unknown syscall %s\n",
465*288bf522SAndroid Build Coastguard Worker 			__func__, s);
466*288bf522SAndroid Build Coastguard Worker 		exit(1);
467*288bf522SAndroid Build Coastguard Worker 	}
468*288bf522SAndroid Build Coastguard Worker 	return flag;
469*288bf522SAndroid Build Coastguard Worker }
470*288bf522SAndroid Build Coastguard Worker 
471*288bf522SAndroid Build Coastguard Worker int
map_open_flags(char * s)472*288bf522SAndroid Build Coastguard Worker map_open_flags(char *s)
473*288bf522SAndroid Build Coastguard Worker {
474*288bf522SAndroid Build Coastguard Worker 	int flags = 0;
475*288bf522SAndroid Build Coastguard Worker 	char *s1;
476*288bf522SAndroid Build Coastguard Worker 
477*288bf522SAndroid Build Coastguard Worker 	while ((s1 = strchr(s, '|'))) {
478*288bf522SAndroid Build Coastguard Worker 		*s1 = '\0';
479*288bf522SAndroid Build Coastguard Worker 		flags |= lookup_map(s, open_flags_map,
480*288bf522SAndroid Build Coastguard Worker 				    ARRAY_SIZE(open_flags_map));
481*288bf522SAndroid Build Coastguard Worker 		*s1 = '|';
482*288bf522SAndroid Build Coastguard Worker 		s = s1 + 1;
483*288bf522SAndroid Build Coastguard Worker 	}
484*288bf522SAndroid Build Coastguard Worker 	/* Last option */
485*288bf522SAndroid Build Coastguard Worker 	flags |= lookup_map(s, open_flags_map,
486*288bf522SAndroid Build Coastguard Worker 			    ARRAY_SIZE(open_flags_map));
487*288bf522SAndroid Build Coastguard Worker 	return flags;
488*288bf522SAndroid Build Coastguard Worker }
489*288bf522SAndroid Build Coastguard Worker 
490*288bf522SAndroid Build Coastguard Worker int
map_lseek_action(char * s)491*288bf522SAndroid Build Coastguard Worker map_lseek_action(char *s)
492*288bf522SAndroid Build Coastguard Worker {
493*288bf522SAndroid Build Coastguard Worker 	int flags = 0;
494*288bf522SAndroid Build Coastguard Worker 	char *s1;
495*288bf522SAndroid Build Coastguard Worker 
496*288bf522SAndroid Build Coastguard Worker 	while ((s1 = strchr(s, '|'))) {
497*288bf522SAndroid Build Coastguard Worker 		*s1 = '\0';
498*288bf522SAndroid Build Coastguard Worker 		flags |= lookup_map(s, lseek_action_map,
499*288bf522SAndroid Build Coastguard Worker 				    ARRAY_SIZE(lseek_action_map));
500*288bf522SAndroid Build Coastguard Worker 		*s1 = '|';
501*288bf522SAndroid Build Coastguard Worker 		s = s1 + 1;
502*288bf522SAndroid Build Coastguard Worker 	}
503*288bf522SAndroid Build Coastguard Worker 	/* Last option */
504*288bf522SAndroid Build Coastguard Worker 	flags |= lookup_map(s, lseek_action_map,
505*288bf522SAndroid Build Coastguard Worker 			    ARRAY_SIZE(lseek_action_map));
506*288bf522SAndroid Build Coastguard Worker 	return flags;
507*288bf522SAndroid Build Coastguard Worker }
508*288bf522SAndroid Build Coastguard Worker 
509*288bf522SAndroid Build Coastguard Worker enum file_op
map_syscall(char * syscall)510*288bf522SAndroid Build Coastguard Worker map_syscall(char *syscall)
511*288bf522SAndroid Build Coastguard Worker {
512*288bf522SAndroid Build Coastguard Worker 	return lookup_map(syscall, fileop_map,
513*288bf522SAndroid Build Coastguard Worker 			  ARRAY_SIZE(fileop_map));
514*288bf522SAndroid Build Coastguard Worker }
515*288bf522SAndroid Build Coastguard Worker 
516*288bf522SAndroid Build Coastguard Worker /*
517*288bf522SAndroid Build Coastguard Worker  * For each tracefile, we first create in-memory structures, then once
518*288bf522SAndroid Build Coastguard Worker  * we've processed each tracefile completely, we write out the in-memory
519*288bf522SAndroid Build Coastguard Worker  * structures and free them.
520*288bf522SAndroid Build Coastguard Worker  */
main(int argc,char ** argv)521*288bf522SAndroid Build Coastguard Worker int main(int argc, char **argv)
522*288bf522SAndroid Build Coastguard Worker {
523*288bf522SAndroid Build Coastguard Worker 	FILE *fp;
524*288bf522SAndroid Build Coastguard Worker 	char path[512];
525*288bf522SAndroid Build Coastguard Worker 	char syscall[512];
526*288bf522SAndroid Build Coastguard Worker 	char lseek_action_str[512];
527*288bf522SAndroid Build Coastguard Worker 	char *s;
528*288bf522SAndroid Build Coastguard Worker 	char open_flags_str[64];
529*288bf522SAndroid Build Coastguard Worker 	void *db_node;
530*288bf522SAndroid Build Coastguard Worker 	int num_io_operations = 0;
531*288bf522SAndroid Build Coastguard Worker 	struct ioshark_header header;
532*288bf522SAndroid Build Coastguard Worker 	struct ioshark_file_operation *disk_file_op;
533*288bf522SAndroid Build Coastguard Worker 	struct in_mem_file_op *in_mem_fop;
534*288bf522SAndroid Build Coastguard Worker 	struct stat st;
535*288bf522SAndroid Build Coastguard Worker 	char *infile, *outfile;
536*288bf522SAndroid Build Coastguard Worker 	struct timeval prev_time;
537*288bf522SAndroid Build Coastguard Worker 	char trace_type[64];
538*288bf522SAndroid Build Coastguard Worker 
539*288bf522SAndroid Build Coastguard Worker 	progname = argv[0];
540*288bf522SAndroid Build Coastguard Worker 	if (argc != 3) {
541*288bf522SAndroid Build Coastguard Worker 		usage();
542*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
543*288bf522SAndroid Build Coastguard Worker 	}
544*288bf522SAndroid Build Coastguard Worker 	infile = argv[1];
545*288bf522SAndroid Build Coastguard Worker 	outfile = argv[2];
546*288bf522SAndroid Build Coastguard Worker 	if (stat(infile, &st) < 0) {
547*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s Can't stat %s\n",
548*288bf522SAndroid Build Coastguard Worker 			progname, infile);
549*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
550*288bf522SAndroid Build Coastguard Worker 	}
551*288bf522SAndroid Build Coastguard Worker 	if (st.st_size == 0) {
552*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s Empty file %s\n",
553*288bf522SAndroid Build Coastguard Worker 			progname, infile);
554*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
555*288bf522SAndroid Build Coastguard Worker 	}
556*288bf522SAndroid Build Coastguard Worker 	init_prev_time(&prev_time);
557*288bf522SAndroid Build Coastguard Worker 	init_filename_cache();
558*288bf522SAndroid Build Coastguard Worker 	fp = fopen(infile, "r");
559*288bf522SAndroid Build Coastguard Worker 	if (fp == NULL) {
560*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s Can't open %s\n",
561*288bf522SAndroid Build Coastguard Worker 			progname, infile);
562*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
563*288bf522SAndroid Build Coastguard Worker 	}
564*288bf522SAndroid Build Coastguard Worker 	while (fgets(in_buf, 2048, fp)) {
565*288bf522SAndroid Build Coastguard Worker 		s = in_buf;
566*288bf522SAndroid Build Coastguard Worker 		while (isspace(*s))
567*288bf522SAndroid Build Coastguard Worker 			s++;
568*288bf522SAndroid Build Coastguard Worker 		in_mem_fop = malloc(sizeof(struct in_mem_file_op));
569*288bf522SAndroid Build Coastguard Worker 		disk_file_op = &in_mem_fop->disk_file_op;
570*288bf522SAndroid Build Coastguard Worker 		disk_file_op->delta_us = get_delta_ts(s, &prev_time);
571*288bf522SAndroid Build Coastguard Worker 		get_tracetype(s, trace_type);
572*288bf522SAndroid Build Coastguard Worker 		if (strcmp(trace_type, "strace") == 0) {
573*288bf522SAndroid Build Coastguard Worker 			get_syscall(s, syscall);
574*288bf522SAndroid Build Coastguard Worker 			disk_file_op->ioshark_io_op = map_syscall(syscall);
575*288bf522SAndroid Build Coastguard Worker 		} else
576*288bf522SAndroid Build Coastguard Worker 			disk_file_op->ioshark_io_op = map_syscall("ftrace");
577*288bf522SAndroid Build Coastguard Worker 		get_pathname(s, path, disk_file_op->ioshark_io_op);
578*288bf522SAndroid Build Coastguard Worker 		db_node = files_db_add(path);
579*288bf522SAndroid Build Coastguard Worker 		disk_file_op->fileno = files_db_get_fileno(db_node);
580*288bf522SAndroid Build Coastguard Worker 		switch (disk_file_op->ioshark_io_op) {
581*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_LLSEEK:
582*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_LSEEK:
583*288bf522SAndroid Build Coastguard Worker 			get_lseek_offset_action(s,
584*288bf522SAndroid Build Coastguard Worker 					disk_file_op->ioshark_io_op,
585*288bf522SAndroid Build Coastguard Worker 					(off_t *)&disk_file_op->lseek_offset,
586*288bf522SAndroid Build Coastguard Worker 					lseek_action_str);
587*288bf522SAndroid Build Coastguard Worker 			disk_file_op->lseek_action =
588*288bf522SAndroid Build Coastguard Worker 				map_lseek_action(lseek_action_str);
589*288bf522SAndroid Build Coastguard Worker 			if (disk_file_op->lseek_action == SEEK_SET)
590*288bf522SAndroid Build Coastguard Worker 				files_db_update_size(db_node,
591*288bf522SAndroid Build Coastguard Worker 						     disk_file_op->lseek_offset);
592*288bf522SAndroid Build Coastguard Worker 			break;
593*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_PREAD64:
594*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_PWRITE64:
595*288bf522SAndroid Build Coastguard Worker 			get_prw64_offset_len(s,
596*288bf522SAndroid Build Coastguard Worker 					     (off_t *)&disk_file_op->prw_offset,
597*288bf522SAndroid Build Coastguard Worker 					     (u_int64_t *)&disk_file_op->prw_len);
598*288bf522SAndroid Build Coastguard Worker 			files_db_update_size(db_node,
599*288bf522SAndroid Build Coastguard Worker 					     disk_file_op->prw_offset +
600*288bf522SAndroid Build Coastguard Worker 					     disk_file_op->prw_len);
601*288bf522SAndroid Build Coastguard Worker 			break;
602*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_READ:
603*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_WRITE:
604*288bf522SAndroid Build Coastguard Worker 			get_rw_len(s, (u_int64_t *)&disk_file_op->rw_len);
605*288bf522SAndroid Build Coastguard Worker 			files_db_add_to_size(db_node,
606*288bf522SAndroid Build Coastguard Worker 					     disk_file_op->rw_len);
607*288bf522SAndroid Build Coastguard Worker 			break;
608*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_MMAP:
609*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_MMAP2:
610*288bf522SAndroid Build Coastguard Worker 			get_mmap_offset_len_prot(s,
611*288bf522SAndroid Build Coastguard Worker 			            (int *)&disk_file_op->mmap_prot,
612*288bf522SAndroid Build Coastguard Worker 				    (off_t *)&disk_file_op->mmap_offset,
613*288bf522SAndroid Build Coastguard Worker 				    (u_int64_t *)&disk_file_op->mmap_len);
614*288bf522SAndroid Build Coastguard Worker 			files_db_update_size(db_node,
615*288bf522SAndroid Build Coastguard Worker 				     disk_file_op->mmap_offset +
616*288bf522SAndroid Build Coastguard Worker 				     disk_file_op->mmap_len);
617*288bf522SAndroid Build Coastguard Worker 			break;
618*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_OPEN:
619*288bf522SAndroid Build Coastguard Worker 			disk_file_op->open_mode = 0;
620*288bf522SAndroid Build Coastguard Worker 			get_openat_flags_mode(s, open_flags_str,
621*288bf522SAndroid Build Coastguard Worker 				      &disk_file_op->open_mode);
622*288bf522SAndroid Build Coastguard Worker 			disk_file_op->open_flags =
623*288bf522SAndroid Build Coastguard Worker 				map_open_flags(open_flags_str);
624*288bf522SAndroid Build Coastguard Worker 			break;
625*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_FSYNC:
626*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_FDATASYNC:
627*288bf522SAndroid Build Coastguard Worker 			break;
628*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_CLOSE:
629*288bf522SAndroid Build Coastguard Worker 			break;
630*288bf522SAndroid Build Coastguard Worker 		case IOSHARK_MAPPED_PREAD:
631*288bf522SAndroid Build Coastguard Worker 			/* Convert a mmap'ed read into a PREAD64 */
632*288bf522SAndroid Build Coastguard Worker 			disk_file_op->ioshark_io_op = IOSHARK_PREAD64;
633*288bf522SAndroid Build Coastguard Worker 			get_ftrace_offset_len(s,
634*288bf522SAndroid Build Coastguard Worker 					      (off_t *)&disk_file_op->prw_offset,
635*288bf522SAndroid Build Coastguard Worker 					      (u_int64_t *)&disk_file_op->prw_len);
636*288bf522SAndroid Build Coastguard Worker 			files_db_update_size(db_node,
637*288bf522SAndroid Build Coastguard Worker 					     disk_file_op->prw_offset +
638*288bf522SAndroid Build Coastguard Worker 					     disk_file_op->prw_len);
639*288bf522SAndroid Build Coastguard Worker 			break;
640*288bf522SAndroid Build Coastguard Worker 		default:
641*288bf522SAndroid Build Coastguard Worker 			break;
642*288bf522SAndroid Build Coastguard Worker 		}
643*288bf522SAndroid Build Coastguard Worker 		/* Chain at the end */
644*288bf522SAndroid Build Coastguard Worker 		num_io_operations++;
645*288bf522SAndroid Build Coastguard Worker 		in_mem_fop->next = NULL;
646*288bf522SAndroid Build Coastguard Worker 		if (in_mem_file_op_head == NULL) {
647*288bf522SAndroid Build Coastguard Worker 			in_mem_file_op_tail = in_mem_fop;
648*288bf522SAndroid Build Coastguard Worker 			in_mem_file_op_head = in_mem_fop;
649*288bf522SAndroid Build Coastguard Worker 		} else {
650*288bf522SAndroid Build Coastguard Worker 			in_mem_file_op_tail->next = in_mem_fop;
651*288bf522SAndroid Build Coastguard Worker 			in_mem_file_op_tail = in_mem_fop;
652*288bf522SAndroid Build Coastguard Worker 		}
653*288bf522SAndroid Build Coastguard Worker 	}
654*288bf522SAndroid Build Coastguard Worker 	fclose(fp);
655*288bf522SAndroid Build Coastguard Worker 	/*
656*288bf522SAndroid Build Coastguard Worker 	 * Now we can write everything out to the output tracefile.
657*288bf522SAndroid Build Coastguard Worker 	 */
658*288bf522SAndroid Build Coastguard Worker 	fp = fopen(outfile, "w+");
659*288bf522SAndroid Build Coastguard Worker 	if (fp == NULL) {
660*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s Can't open trace.outfile\n",
661*288bf522SAndroid Build Coastguard Worker 			progname);
662*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
663*288bf522SAndroid Build Coastguard Worker 	}
664*288bf522SAndroid Build Coastguard Worker 	header.num_io_operations = num_io_operations;
665*288bf522SAndroid Build Coastguard Worker 	header.num_files = files_db_get_total_obj();
666*288bf522SAndroid Build Coastguard Worker 	if (ioshark_write_header(fp, &header) != 1) {
667*288bf522SAndroid Build Coastguard Worker 		fprintf(stderr, "%s Write error trace.outfile\n",
668*288bf522SAndroid Build Coastguard Worker 			progname);
669*288bf522SAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
670*288bf522SAndroid Build Coastguard Worker 	}
671*288bf522SAndroid Build Coastguard Worker 	files_db_write_objects(fp);
672*288bf522SAndroid Build Coastguard Worker 	while (in_mem_file_op_head != NULL) {
673*288bf522SAndroid Build Coastguard Worker 		struct in_mem_file_op *temp;
674*288bf522SAndroid Build Coastguard Worker 
675*288bf522SAndroid Build Coastguard Worker 		disk_file_op = &in_mem_file_op_head->disk_file_op;
676*288bf522SAndroid Build Coastguard Worker 		if (ioshark_write_file_op(fp, disk_file_op) != 1) {
677*288bf522SAndroid Build Coastguard Worker 			fprintf(stderr, "%s Write error trace.outfile\n",
678*288bf522SAndroid Build Coastguard Worker 				progname);
679*288bf522SAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
680*288bf522SAndroid Build Coastguard Worker 		}
681*288bf522SAndroid Build Coastguard Worker 		temp = in_mem_file_op_head;
682*288bf522SAndroid Build Coastguard Worker 		in_mem_file_op_head = in_mem_file_op_head->next;
683*288bf522SAndroid Build Coastguard Worker 		free(temp);
684*288bf522SAndroid Build Coastguard Worker 	}
685*288bf522SAndroid Build Coastguard Worker 	store_filename_cache();
686*288bf522SAndroid Build Coastguard Worker }
687