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