1b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan/*
2b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * Copyright (C) 2016 The Android Open Source Project
3b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan *
4b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * Licensed under the Apache License, Version 2.0 (the "License");
5b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * you may not use this file except in compliance with the License.
6b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * You may obtain a copy of the License at
7b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan *
8b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan *      http://www.apache.org/licenses/LICENSE-2.0
9b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan *
10b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * Unless required by applicable law or agreed to in writing, software
11b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * distributed under the License is distributed on an "AS IS" BASIS,
12b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * See the License for the specific language governing permissions and
14b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * limitations under the License.
15b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan */
16b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
17b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include <stdio.h>
18b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include <sys/time.h>
19b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include <sys/types.h>
20b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include <unistd.h>
21b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include <stdlib.h>
22b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include <signal.h>
23b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include <string.h>
24b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include <sys/stat.h>
25b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include <sys/errno.h>
26b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include <fcntl.h>
27b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include <ctype.h>
28b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include "ioshark.h"
29b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#include "compile_ioshark.h"
30b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
31b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanchar *progname;
32b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
33b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanchar in_buf[2048];
34b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
35b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstruct flags_map_s {
36b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *flag_str;
37b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	int flag;
38b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan};
39b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
40b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#define ARRAY_SIZE(a)	(sizeof(a) / sizeof(a[0]))
41b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
42b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstruct flags_map_s open_flags_map[] = {
43b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_RDONLY", O_RDONLY },
44b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_WRONLY", O_WRONLY },
45b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_RDWR", O_RDWR },
46b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_CREAT", O_CREAT },
47b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_SYNC", O_SYNC },
48b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_TRUNC", O_TRUNC },
49b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_EXCL", O_EXCL },
50b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_APPEND", O_APPEND },
51b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_NOATIME", O_NOATIME },
52b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_ASYNC", O_ASYNC },
53b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_CLOEXEC", O_CLOEXEC },
54b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_DIRECT", O_DIRECT },
55b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_DIRECTORY", O_DIRECTORY },
56b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_LARGEFILE", O_LARGEFILE },
57b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_NOCTTY", O_NOCTTY },
58b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_NOFOLLOW", O_NOFOLLOW },
59b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_NONBLOCK", O_NONBLOCK },
60b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_NDELAY", O_NDELAY },
61b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "O_PATH", O_PATH }
62b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan};
63b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
64b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstruct flags_map_s lseek_action_map[] = {
65b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "SEEK_SET", SEEK_SET },
66b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "SEEK_CUR", SEEK_CUR },
67b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "SEEK_END", SEEK_END }
68b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan};
69b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
70b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstruct flags_map_s fileop_map[] = {
71b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "lseek", IOSHARK_LSEEK },
72b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "_llseek", IOSHARK_LLSEEK },
73b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "pread64", IOSHARK_PREAD64 },
74b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "pwrite64", IOSHARK_PWRITE64 },
75b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "read", IOSHARK_READ },
76b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "write", IOSHARK_WRITE },
77b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "mmap", IOSHARK_MMAP },
78b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "mmap2", IOSHARK_MMAP2 },
79b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "openat", IOSHARK_OPEN },
80b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "fsync", IOSHARK_FSYNC },
81b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	{ "fdatasync", IOSHARK_FDATASYNC },
829d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	{ "close", IOSHARK_CLOSE },
839d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	{ "ftrace", IOSHARK_MAPPED_PREAD }
84b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan};
85b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
86b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstruct in_mem_file_op {
87b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	struct ioshark_file_operation disk_file_op;
88b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	struct in_mem_file_op *next;
89b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan};
90b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
91b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstruct in_mem_file_op *in_mem_file_op_head = NULL, *in_mem_file_op_tail = NULL;
92b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
93b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid usage(void)
94b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
95b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	fprintf(stderr, "%s in_file out_file\n", progname);
96b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
97b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
989d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasanvoid
999d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasaninit_prev_time(struct timeval *tv)
1009d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan{
1019d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	tv->tv_sec = tv->tv_usec = 0;
1029d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan}
1039d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan
1049d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan/*
1059d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan * delta ts is the time delta from the previous IO in this tracefile.
1069d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan */
1079d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasanstatic u_int64_t
1089d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasanget_delta_ts(char *buf, struct timeval *prev)
109b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
110b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	struct timeval op_tv, tv_res;
111b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
112b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	sscanf(buf, "%lu.%lu", &op_tv.tv_sec, &op_tv.tv_usec);
1139d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	/* First item */
1149d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	if (prev->tv_sec == 0 && prev->tv_usec == 0)
1159d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		tv_res.tv_sec = tv_res.tv_usec = 0;
1169d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	else
1179d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		timersub(&op_tv, prev, &tv_res);
1189d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	*prev = op_tv;
119b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	return (tv_res.tv_usec + (tv_res.tv_sec * 1000000));
120b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
121b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
122b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid
1239d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasanget_tracetype(char *buf, char *trace_type)
124b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
1259d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	char *s, *s2;
126b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
1279d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	*trace_type = '\0';
1289d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	s = strchr(buf, ' ');
129b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s == NULL) {
1309d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		fprintf(stderr,
1319d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			"%s Malformed Trace Type ? %s\n",
1329d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			progname, __func__);
133b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
134b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
1359d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	while (*s == ' ')
1369d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		s++;
1379d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	if (sscanf(s, "%s", trace_type) != 1) {
1389d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		fprintf(stderr,
1399d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			"%s Malformed Trace Type ? %s\n",
1409d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			progname, __func__);
1419d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		exit(EXIT_FAILURE);
1429d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	}
1439d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	if (strcmp(trace_type, "strace") != 0 &&
1449d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	    strcmp(trace_type, "ftrace") != 0) {
1459d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		fprintf(stderr,
1469d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			"%s Unknown/Missing Trace Type (has to be strace|ftrace) %s\n",
1479d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			progname, __func__);
1489d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		exit(EXIT_FAILURE);
1499d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	}
1509d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	/*
1519d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	 * Remove the keyword "strace"/"ftrace" from the buffer
1529d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	 */
1539d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	s2 = strchr(s, ' ');
154b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s2 == NULL) {
1559d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		fprintf(stderr,
1569d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			"%s Malformed Trace Type ? %s\n",
1579d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			progname, __func__);
1589d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		exit(EXIT_FAILURE);
1599d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	}
1609d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	while (*s2 == ' ')
1619d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		s2++;
1629d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	if (*s2  == '\0') {
1639d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		/*
1649d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		 * Premature end of input record
1659d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		 */
1669d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		fprintf(stderr,
1679d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			"%s Mal-formed strace/ftrace record %s:%s\n",
1689d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			progname, __func__, buf);
169b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
170b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
1719d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	/* strcpy() expects non-overlapping buffers, but bcopy doesn't */
1729d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	bcopy(s2, s, strlen(s2) + 1);
1739d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan}
1749d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan
1759d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasanvoid
1769d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasanget_pathname(char *buf, char *pathname, enum file_op file_op)
1779d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan{
1789d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	char *s, *s2, save;
1799d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan
1809d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	if (file_op == IOSHARK_MAPPED_PREAD) {
1819d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		s = strchr(buf, '/');
1829d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		if (s == NULL) {
1839d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			fprintf(stderr, "%s: Malformed line: %s\n",
1849d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan				__func__, buf);
1859d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			exit(EXIT_FAILURE);
1869d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		}
1879d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		s2 = strchr(s, ' ');
1889d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		if (s2 == NULL) {
1899d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			fprintf(stderr, "%s: Malformed line: %s\n",
1909d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan				__func__, buf);
1919d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			exit(EXIT_FAILURE);
1929d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		}
1939d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	} else {
1949d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		if (file_op == IOSHARK_OPEN)
1959d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			s = strchr(buf, '"');
1969d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		else
1979d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			s = strchr(buf, '<');
1989d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		if (s == NULL) {
1999d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			fprintf(stderr, "%s: Malformed line: %s\n",
2009d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan				__func__, buf);
2019d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			exit(EXIT_FAILURE);
2029d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		}
2039d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		s += 1;
2049d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		if (file_op == IOSHARK_OPEN)
2059d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			s2 = strchr(s, '"');
2069d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		else
2079d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			s2 = strchr(s, '>');
2089d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		if (s2 == NULL) {
2099d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			fprintf(stderr, "%s: Malformed line: %s\n",
2109d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan				__func__, buf);
2119d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			exit(EXIT_FAILURE);
2129d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		}
2139d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	}
214b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	save = *s2;
215b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s2 = '\0';
216b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	strcpy(pathname, s);
217b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s2 = save;
218b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
219b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
220b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid
221b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanget_syscall(char *buf, char *syscall)
222b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
223b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *s, *s2;
224b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
225b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s = strchr(buf, ' ');
226b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s == NULL) {
227b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
228b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
229b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
230b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
231b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s += 1;
232b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s2 = strchr(s, '(');
233b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s2 == NULL) {
234b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
235b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
236b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
237b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
238b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s2 = '\0';
239b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	strcpy(syscall, s);
240b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s2 = '(';
241b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
242b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
243b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid
244b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanget_mmap_offset_len_prot(char *buf, int *prot, off_t *offset, u_int64_t *len)
245b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
246b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *s, *s1;
247b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	int i;
248b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char protstr[128];
249b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
250b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s = strchr(buf, ',');
251b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s == NULL) {
252b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
253b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
254b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
255b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
256b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s += 2;
257b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	sscanf(s, "%ju", len);
258b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s1 = strchr(s, ',');
259b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s1 == NULL) {
260b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
261b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
262b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
263b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
264b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s1 += 2;
265b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s = strchr(s1, ',');
266b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s == NULL) {
267b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
268b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
269b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
270b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
271b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s = '\0';
272b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	strcpy(protstr, s1);
273b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*prot = 0;
274b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (strstr(protstr, "PROT_READ"))
275b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		*prot |= IOSHARK_PROT_READ;
276b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (strstr(protstr, "PROT_WRITE"))
277b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		*prot |= IOSHARK_PROT_WRITE;
278b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s = ',';
279b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s += 2;
280b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	for (i = 0 ; i < 2 ; i++) {
281b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		s = strchr(s, ',');
282b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		if (s == NULL) {
283b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			fprintf(stderr, "%s: Malformed line: %s\n",
284b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				__func__, buf);
285b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			exit(EXIT_FAILURE);
286b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		}
287b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		s += 2;
288b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
289b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	sscanf(s, "%jx", offset);
290b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
291b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
292b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid
293b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanget_lseek_offset_action(char *buf, enum file_op op,
294b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			off_t *offset, char *action)
295b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
296b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *s, *s2;
297b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
298b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s = strchr(buf, ',');
299b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s == NULL) {
300b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
301b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
302b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
303b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
304b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s += 2;
305b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	sscanf(s, "%ju", offset);
306b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s = strchr(s, ',');
307b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s == NULL) {
308b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
309b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
310b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
311b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
312b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s += 2;
313b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (op == IOSHARK_LLSEEK) {
314b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		s = strchr(s, ',');
315b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		if (s == NULL) {
316b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			fprintf(stderr, "%s: Malformed line: %s\n",
317b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				__func__, buf);
318b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			exit(EXIT_FAILURE);
319b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		}
320b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		s += 2;
321b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
322b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s2 = strchr(s, ')');
323b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s2 == NULL) {
324b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
325b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
326b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
327b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
328b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s2 = '\0';
329b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	strcpy(action, s);
330b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s2 = ')';
331b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
332b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
333b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid
334b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanget_rw_len(char *buf,
335b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	   u_int64_t *len)
336b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
337b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *s_len;
338b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
339b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s_len = strrchr(buf, ',');
340b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s_len == NULL) {
341b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
342b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
343b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
344b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
345b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	sscanf(s_len + 2, "%ju", len);
346b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
347b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
348b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid
349b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanget_prw64_offset_len(char *buf,
350b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		     off_t *offset,
351b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		     u_int64_t *len)
352b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
353b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *s_offset, *s_len;
354b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
355b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s_offset = strrchr(buf, ',');
356b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s_offset == NULL) {
357b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line 1: %s\n",
358b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
359b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
360b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
361b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s_offset = '\0';
362b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s_len = strrchr(buf, ',');
363b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s_len == NULL) {
364b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line 2: %s\n",
365b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
366b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
367b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
368b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s_offset = ',';
369b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	sscanf(s_len + 2, "%ju", len);
370b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	sscanf(s_offset + 2, "%ju", offset);
371b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
372b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
3739d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan
3749d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasanvoid
3759d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasanget_ftrace_offset_len(char *buf,
3769d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		      off_t *offset,
3779d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		      u_int64_t *len)
3789d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan{
3799d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	char *s_offset;
3809d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan
3819d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	s_offset = strchr(buf, '/');
3829d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	if (s_offset == NULL) {
3839d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		fprintf(stderr, "%s: Malformed line 1: %s\n",
3849d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			__func__, buf);
3859d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		exit(EXIT_FAILURE);
3869d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	}
3879d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	s_offset = strchr(s_offset, ' ');
3889d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	if (s_offset == NULL) {
3899d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		fprintf(stderr, "%s: Malformed line 2: %s\n",
3909d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			__func__, buf);
3919d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		exit(EXIT_FAILURE);
3929d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	}
3939d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	while (*s_offset == ' ')
3949d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		s_offset++;
3959d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	if (sscanf(s_offset, "%ju %ju", offset, len) != 2) {
3969d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		fprintf(stderr, "%s: Malformed line 3: %s\n",
3979d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			__func__, buf);
3989d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		exit(EXIT_FAILURE);
3999d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	}
4009d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan}
4019d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan
402b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid
403b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanget_openat_flags_mode(char *buf, char *flags, mode_t *mode)
404b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
405b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *s, *s2, lookfor;
406b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
407b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s = strchr(buf, ',');
408b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s == NULL) {
409b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
410b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
411b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
412b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
413b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s += 2;
414b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s = strchr(s, ',');
415b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s == NULL) {
416b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
417b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
418b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
419b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
420b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s += 2;
421b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (strstr(s, "O_CREAT") == NULL)
422b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		lookfor = ')';
423b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	else
424b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		lookfor = ',';
425b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	s2 = strchr(s, lookfor);
426b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (s2 == NULL) {
427b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Malformed line: %s\n",
428b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, buf);
429b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
430b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
431b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s2 = '\0';
432b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	strcpy(flags, s);
433b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*s2 = lookfor;
434b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (strstr(s, "O_CREAT") != NULL) {
435b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		s = s2 + 2;
436b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		s2 = strchr(s, ')');
437b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		if (s2 == NULL) {
438b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			fprintf(stderr, "%s: Malformed line: %s\n",
439b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				__func__, buf);
440b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			exit(EXIT_FAILURE);
441b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		}
442b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		*s2 = '\0';
443b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		sscanf(s, "%o", mode);
444b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		*s2 = ')';
445b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
446b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
447b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
448b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanint
449b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanlookup_map(char *s, struct flags_map_s *flags_map, int maplen)
450b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
451b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	int found = 0, flag = 0;
452b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	int i;
453b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
454b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	while (isspace(*s))
455b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		s++;
456b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	for (i = 0 ; i < maplen ; i++) {
457b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		if (strcmp(flags_map[i].flag_str, s) == 0) {
458b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			flag = flags_map[i].flag;
459b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			found = 1;
460b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			break;
461b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		}
462b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
463b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (found == 0) {
464b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s: Unknown syscall %s\n",
465b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			__func__, s);
466b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(1);
467b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
468b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	return flag;
469b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
470b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
471b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanint
472b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanmap_open_flags(char *s)
473b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
474b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	int flags = 0;
475b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *s1;
476b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
477b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	while ((s1 = strchr(s, '|'))) {
478b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		*s1 = '\0';
479b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		flags |= lookup_map(s, open_flags_map,
480b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				    ARRAY_SIZE(open_flags_map));
481b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		*s1 = '|';
482b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		s = s1 + 1;
483b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
484b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	/* Last option */
485b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	flags |= lookup_map(s, open_flags_map,
486b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			    ARRAY_SIZE(open_flags_map));
487b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	return flags;
488b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
489b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
490b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanint
491b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanmap_lseek_action(char *s)
492b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
493b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	int flags = 0;
494b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *s1;
495b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
496b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	while ((s1 = strchr(s, '|'))) {
497b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		*s1 = '\0';
498b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		flags |= lookup_map(s, lseek_action_map,
499b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				    ARRAY_SIZE(lseek_action_map));
500b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		*s1 = '|';
501b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		s = s1 + 1;
502b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
503b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	/* Last option */
504b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	flags |= lookup_map(s, lseek_action_map,
505b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			    ARRAY_SIZE(lseek_action_map));
506b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	return flags;
507b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
508b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
509b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanenum file_op
510b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanmap_syscall(char *syscall)
511b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
512b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	return lookup_map(syscall, fileop_map,
513b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			  ARRAY_SIZE(fileop_map));
514b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
515b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
516b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan/*
517b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * For each tracefile, we first create in-memory structures, then once
518b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * we've processed each tracefile completely, we write out the in-memory
519b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * structures and free them.
520b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan */
521b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanint main(int argc, char **argv)
522b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
523b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	FILE *fp;
524b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char path[512];
525b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char syscall[512];
526b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char lseek_action_str[512];
527b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *s;
528b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char open_flags_str[64];
529b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	void *db_node;
530b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	int num_io_operations = 0;
531b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	struct ioshark_header header;
532b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	struct ioshark_file_operation *disk_file_op;
533b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	struct in_mem_file_op *in_mem_fop;
534b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	struct stat st;
535b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *infile, *outfile;
5369d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	struct timeval prev_time;
5379d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	char trace_type[64];
538b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
539b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	progname = argv[0];
540b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (argc != 3) {
541b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		usage();
542b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
543b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
544b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	infile = argv[1];
545b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	outfile = argv[2];
546b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (stat(infile, &st) < 0) {
547b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s Can't stat %s\n",
548b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			progname, infile);
549b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
550b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
551b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (st.st_size == 0) {
552b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s Empty file %s\n",
553b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			progname, infile);
554b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
555b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
5569d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan	init_prev_time(&prev_time);
55702f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasan	init_filename_cache();
558b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	fp = fopen(infile, "r");
559b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (fp == NULL) {
560b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s Can't open %s\n",
561b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			progname, infile);
562b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
563b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
564b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	while (fgets(in_buf, 2048, fp)) {
565b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		s = in_buf;
566b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		while (isspace(*s))
567b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			s++;
568b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		in_mem_fop = malloc(sizeof(struct in_mem_file_op));
569b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		disk_file_op = &in_mem_fop->disk_file_op;
5709d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		disk_file_op->delta_us = get_delta_ts(s, &prev_time);
5719d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		get_tracetype(s, trace_type);
5729d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		if (strcmp(trace_type, "strace") == 0) {
5739d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			get_syscall(s, syscall);
5749d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			disk_file_op->file_op = map_syscall(syscall);
5759d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		} else
5769d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			disk_file_op->file_op = map_syscall("ftrace");
577b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		get_pathname(s, path, disk_file_op->file_op);
578b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		db_node = files_db_add(path);
579b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		disk_file_op->fileno = files_db_get_fileno(db_node);
580b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		switch (disk_file_op->file_op) {
581b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_LLSEEK:
582b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_LSEEK:
583b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			get_lseek_offset_action(s,
584b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan					disk_file_op->file_op,
585b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan					&disk_file_op->lseek_offset,
586b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan					lseek_action_str);
587b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			disk_file_op->lseek_action =
588b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				map_lseek_action(lseek_action_str);
589b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			if (disk_file_op->lseek_action == SEEK_SET)
590b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				files_db_update_size(db_node,
591b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan						     disk_file_op->lseek_offset);
592b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			break;
593b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_PREAD64:
594b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_PWRITE64:
595b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			get_prw64_offset_len(s,
596b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan					     &disk_file_op->prw_offset,
597b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan					     (u_int64_t *)&disk_file_op->prw_len);
598b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			files_db_update_size(db_node,
599b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan					     disk_file_op->prw_offset +
600b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan					     disk_file_op->prw_len);
601b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			break;
602b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_READ:
603b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_WRITE:
604b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			get_rw_len(s, (u_int64_t *)&disk_file_op->rw_len);
605b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			files_db_add_to_size(db_node,
606b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan					     disk_file_op->rw_len);
607b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			break;
608b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_MMAP:
609b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_MMAP2:
610b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			get_mmap_offset_len_prot(s,
611b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				    &disk_file_op->mmap_prot,
612b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				    &disk_file_op->mmap_offset,
613b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				    (u_int64_t *)&disk_file_op->mmap_len);
614b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			files_db_update_size(db_node,
615b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				     disk_file_op->mmap_offset +
616b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				     disk_file_op->mmap_len);
617b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			break;
618b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_OPEN:
619b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			disk_file_op->open_mode = 0;
620b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			get_openat_flags_mode(s, open_flags_str,
621b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				      &disk_file_op->open_mode);
622b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			disk_file_op->open_flags =
623b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				map_open_flags(open_flags_str);
624b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			break;
625b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_FSYNC:
626b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_FDATASYNC:
627b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			break;
628b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		case IOSHARK_CLOSE:
629b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			break;
6309d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan		case IOSHARK_MAPPED_PREAD:
6319d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			/* Convert a mmap'ed read into a PREAD64 */
6329d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			disk_file_op->file_op = IOSHARK_PREAD64;
6339d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			get_ftrace_offset_len(s,
6349d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan					      &disk_file_op->prw_offset,
6359d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan					      (u_int64_t *)&disk_file_op->prw_len);
6369d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			files_db_update_size(db_node,
6379d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan					     disk_file_op->prw_offset +
6389d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan					     disk_file_op->prw_len);
6399d00a124c5591198264ffedf0ba4c73bddfc346fMohan Srinivasan			break;
640b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		default:
641b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			break;
642b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		}
643b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		/* Chain at the end */
644b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		num_io_operations++;
645b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		in_mem_fop->next = NULL;
646b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		if (in_mem_file_op_head == NULL) {
647b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			in_mem_file_op_tail = in_mem_fop;
648b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			in_mem_file_op_head = in_mem_fop;
649b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		} else {
650b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			in_mem_file_op_tail->next = in_mem_fop;
651b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			in_mem_file_op_tail = in_mem_fop;
652b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		}
653b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
654b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	fclose(fp);
655b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	/*
656b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	 * Now we can write everything out to the output tracefile.
657b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	 */
658b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	fp = fopen(outfile, "w+");
659b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (fp == NULL) {
660b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s Can't open trace.outfile\n",
661b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			progname);
662b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
663b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
664b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	header.num_io_operations = num_io_operations;
665b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	header.num_files = files_db_get_total_obj();
666b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (fwrite(&header, sizeof(struct ioshark_header), 1, fp) != 1) {
667b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		fprintf(stderr, "%s Write error trace.outfile\n",
668b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			progname);
669b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		exit(EXIT_FAILURE);
670b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
671b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	files_db_write_objects(fp);
672b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	while (in_mem_file_op_head != NULL) {
673b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		struct in_mem_file_op *temp;
674b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
675b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		disk_file_op = &in_mem_file_op_head->disk_file_op;
676b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		if (fwrite(disk_file_op,
677b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			   sizeof(struct ioshark_file_operation), 1, fp) != 1) {
678b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			fprintf(stderr, "%s Write error trace.outfile\n",
679b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan				progname);
680b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			exit(EXIT_FAILURE);
681b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		}
682b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		temp = in_mem_file_op_head;
683b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		in_mem_file_op_head = in_mem_file_op_head->next;
684b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		free(temp);
685b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	}
68602f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasan	store_filename_cache();
687b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
688