1e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/* 2e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * This file contains format parsing code for blkparse, allowing you to 3e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * customize the individual action format and generel output format. 4e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 5e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <stdio.h> 6e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <string.h> 7e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <stdlib.h> 8e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <unistd.h> 9e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <ctype.h> 10e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include <time.h> 11e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 12e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include "blktrace.h" 13e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 14e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define VALID_SPECS "ABCDFGIMPQRSTUWX" 15e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 16e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define HEADER "%D %2c %8s %5T.%9t %5p %2a %3d " 17e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 18e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic char *override_format[256]; 19e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 20e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic inline int valid_spec(int spec) 21e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 22e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return strchr(VALID_SPECS, spec) != NULL; 23e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 24e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 25e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid set_all_format_specs(char *option) 26e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 27e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char *p; 28e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 29e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat for (p = VALID_SPECS; *p; p++) 30e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (override_format[(int)(*p)] == NULL) 31e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat override_format[(int)(*p)] = strdup(option); 32e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 33e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 34e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatint add_format_spec(char *option) 35e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 36e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int spec = optarg[0]; 37e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 38e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (!valid_spec(spec)) { 39e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(stderr,"Bad format specifier %c\n", spec); 40e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 1; 41e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 42e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (optarg[1] != ',') { 43e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(stderr,"Bad format specifier - need ',' %s\n", option); 44e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 1; 45e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 46e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat option += 2; 47e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 48e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat override_format[spec] = strdup(option); 49e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 50e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return 0; 51e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 52e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 53e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic inline void fill_rwbs(char *rwbs, struct blk_io_trace *t) 54e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 55e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int w = t->action & BLK_TC_ACT(BLK_TC_WRITE); 56e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int a = t->action & BLK_TC_ACT(BLK_TC_AHEAD); 57e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int b = t->action & BLK_TC_ACT(BLK_TC_BARRIER); 58e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int s = t->action & BLK_TC_ACT(BLK_TC_SYNC); 59e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int m = t->action & BLK_TC_ACT(BLK_TC_META); 60e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int d = t->action & BLK_TC_ACT(BLK_TC_DISCARD); 61e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int i = 0; 62e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 63e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (d) 64e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat rwbs[i++] = 'D'; 65e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else if (w) 66e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat rwbs[i++] = 'W'; 67e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else if (t->bytes) 68e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat rwbs[i++] = 'R'; 69e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else 70e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat rwbs[i++] = 'N'; 71e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (a) 72e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat rwbs[i++] = 'A'; 73e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (b) 74e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat rwbs[i++] = 'B'; 75e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (s) 76e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat rwbs[i++] = 'S'; 77e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (m) 78e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat rwbs[i++] = 'M'; 79e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 80e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat rwbs[i] = '\0'; 81e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 82e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 83e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic const char * 84e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatprint_time(unsigned long long timestamp) 85e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 86e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat static char timebuf[128]; 87e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct tm *tm; 88e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat time_t sec; 89e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long nsec; 90e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 91e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat sec = abs_start_time.tv_sec + SECONDS(timestamp); 92e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat nsec = abs_start_time.tv_nsec + NANO_SECONDS(timestamp); 93e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (nsec >= 1000000000) { 94e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat nsec -= 1000000000; 95e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat sec += 1; 96e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 97e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 98e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat tm = localtime(&sec); 99e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat snprintf(timebuf, sizeof(timebuf), 100e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat "%02u:%02u:%02u.%06lu", 101e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat tm->tm_hour, 102e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat tm->tm_min, 103e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat tm->tm_sec, 104e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat nsec / 1000); 105e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return timebuf; 106e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 107e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 108e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic inline int pdu_rest_is_zero(unsigned char *pdu, int len) 109e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 110e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat static char zero[4096]; 111e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 112e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return !memcmp(pdu, zero, len); 113e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 114e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 115e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic char *dump_pdu(unsigned char *pdu_buf, int pdu_len) 116e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 117e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat static char p[4096]; 118e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int i, len; 119e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 120e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (!pdu_buf || !pdu_len) 121e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return NULL; 122e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 123e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat for (len = 0, i = 0; i < pdu_len; i++) { 124e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (i) 125e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat len += sprintf(p + len, " "); 126e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 127e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat len += sprintf(p + len, "%02x", pdu_buf[i]); 128e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 129e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat /* 130e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * usually dump for cdb dumps where we can see lots of 131e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * zeroes, stop when the rest is just zeroes and indicate 132e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * so with a .. appended 133e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 134e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (!pdu_buf[i] && pdu_rest_is_zero(pdu_buf + i, pdu_len - i)) { 135e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat sprintf(p + len, " .."); 136e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 137e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 138e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 139e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 140e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return p; 141e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 142e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 143e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#define pdu_start(t) (((void *) (t) + sizeof(struct blk_io_trace))) 144e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 145e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic unsigned int get_pdu_int(struct blk_io_trace *t) 146e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 147e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u64 *val = pdu_start(t); 148e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 149e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return be64_to_cpu(*val); 150e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 151e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 152e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic void get_pdu_remap(struct blk_io_trace *t, struct blk_io_trace_remap *r) 153e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 154e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct blk_io_trace_remap *__r = pdu_start(t); 155e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat __u64 sector_from = __r->sector_from; 156e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 157e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat r->device_from = be32_to_cpu(__r->device_from); 158e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat r->device_to = be32_to_cpu(__r->device_to); 159e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat r->sector_from = be64_to_cpu(sector_from); 160e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 161e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 162e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic void print_field(char *act, struct per_cpu_info *pci, 163e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct blk_io_trace *t, unsigned long long elapsed, 164e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int pdu_len, unsigned char *pdu_buf, char field, 165e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int minus, int has_w, int width) 166e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 167e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char format[64]; 168e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 169e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (has_w) { 170e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (minus) 171e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat sprintf(format, "%%-%d", width); 172e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else 173e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat sprintf(format, "%%%d", width); 174e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } else 175e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat sprintf(format, "%%"); 176e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 177e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat switch (field) { 178e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'a': 179e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "s"), act); 180e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 181e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'c': 182e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "d"), pci->cpu); 183e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 184e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'C': { 185e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char *name = find_process_name(t->pid); 186e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 187e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "s"), name); 188e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 189e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 190e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'd': { 191e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char rwbs[6]; 192e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 193e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fill_rwbs(rwbs, t); 194e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "s"), rwbs); 195e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 196e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 197e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'D': /* format width ignored */ 198e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp,"%3d,%-3d", MAJOR(t->device), MINOR(t->device)); 199e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 200e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'e': 201e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "d"), t->error); 202e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 203e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'M': 204e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "d"), MAJOR(t->device)); 205e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 206e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'm': 207e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "d"), MINOR(t->device)); 208e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 209e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'n': 210e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "u"), t_sec(t)); 211e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 212e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'N': 213e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "u"), t->bytes); 214e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 215e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'p': 216e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "u"), t->pid); 217e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 218e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'P': { /* format width ignored */ 219e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char *p = dump_pdu(pdu_buf, pdu_len); 220e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (p) 221e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%s", p); 222e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 223e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 224e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 's': 225e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "ld"), t->sequence); 226e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 227e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'S': 228e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "lu"), t->sector); 229e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 230e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 't': 231e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat sprintf(format, "%%0%dlu", has_w ? width : 9); 232e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, format, NANO_SECONDS(t->time)); 233e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 234e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'T': 235e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "d"), SECONDS(t->time)); 236e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 237e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'u': 238e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (elapsed == -1ULL) { 239e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(stderr, "Expecting elapsed value\n"); 240e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat exit(1); 241e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 242e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "llu"), elapsed / 1000); 243e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 244e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'U': 245e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "u"), get_pdu_int(t)); 246e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 247e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'z': 248e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, strcat(format, "s"), print_time(t->time)); 249e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 250e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat default: 251e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp,strcat(format, "c"), field); 252e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 253e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 254e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 255e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 256e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic char *parse_field(char *act, struct per_cpu_info *pci, 257e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct blk_io_trace *t, unsigned long long elapsed, 258e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int pdu_len, unsigned char *pdu_buf, 259e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char *master_format) 260e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 261e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int minus = 0; 262e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int has_w = 0; 263e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int width = 0; 264e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char *p = master_format; 265e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 266e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (*p == '-') { 267e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat minus = 1; 268e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat p++; 269e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 270e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (isdigit(*p)) { 271e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat has_w = 1; 272e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat do { 273e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat width = (width * 10) + (*p++ - '0'); 274e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } while ((*p) && (isdigit(*p))); 275e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 276e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (*p) { 277e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat print_field(act, pci, t, elapsed, pdu_len, pdu_buf, *p++, 278e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat minus, has_w, width); 279e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 280e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return p; 281e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 282e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 283e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatstatic void process_default(char *act, struct per_cpu_info *pci, 284e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct blk_io_trace *t, unsigned long long elapsed, 285e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat int pdu_len, unsigned char *pdu_buf) 286e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 287e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat struct blk_io_trace_remap r = { .device_from = 0, }; 288e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char rwbs[6]; 289e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char *name; 290e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 291e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fill_rwbs(rwbs, t); 292e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 293e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat /* 294e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * For remaps we have to modify the device using the remap structure 295e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * passed up. 296e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 297e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (act[0] == 'A') { 298e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat get_pdu_remap(t, &r); 299e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->device = r.device_to; 300e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 301e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 302e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat /* 303e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * The header is always the same 304e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 305e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%3d,%-3d %2d %8d %5d.%09lu %5u %2s %3s ", 306e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat MAJOR(t->device), MINOR(t->device), pci->cpu, t->sequence, 307e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (int) SECONDS(t->time), (unsigned long) NANO_SECONDS(t->time), 308e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->pid, act, rwbs); 309e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 310e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat name = find_process_name(t->pid); 311e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 312e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat switch (act[0]) { 313e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'R': /* Requeue */ 314e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'C': /* Complete */ 315e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (t->action & BLK_TC_ACT(BLK_TC_PC)) { 316e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char *p = dump_pdu(pdu_buf, pdu_len); 317e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (p) 318e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "(%s) ", p); 319e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "[%d]\n", t->error); 320e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } else { 321e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (elapsed != -1ULL) { 322e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (t_sec(t)) 323e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%llu + %u (%8llu) [%d]\n", 324e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (unsigned long long) t->sector, 325e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t_sec(t), elapsed, t->error); 326e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else 327e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%llu (%8llu) [%d]\n", 328e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (unsigned long long) t->sector, 329e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat elapsed, t->error); 330e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } else { 331e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (t_sec(t)) 332e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%llu + %u [%d]\n", 333e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (unsigned long long) t->sector, 334e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t_sec(t), t->error); 335e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else 336e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%llu [%d]\n", 337e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (unsigned long long) t->sector, 338e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t->error); 339e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 340e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 341e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 342e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 343e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'D': /* Issue */ 344e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'I': /* Insert */ 345e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'Q': /* Queue */ 346e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'B': /* Bounce */ 347e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (t->action & BLK_TC_ACT(BLK_TC_PC)) { 348e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char *p; 349e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%u ", t->bytes); 350e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat p = dump_pdu(pdu_buf, pdu_len); 351e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (p) 352e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "(%s) ", p); 353e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "[%s]\n", name); 354e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } else { 355e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (elapsed != -1ULL) { 356e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (t_sec(t)) 357e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%llu + %u (%8llu) [%s]\n", 358e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (unsigned long long) t->sector, 359e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t_sec(t), elapsed, name); 360e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else 361e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "(%8llu) [%s]\n", elapsed, 362e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat name); 363e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } else { 364e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (t_sec(t)) 365e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%llu + %u [%s]\n", 366e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (unsigned long long) t->sector, 367e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat t_sec(t), name); 368e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else 369e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "[%s]\n", name); 370e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 371e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 372e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 373e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 374e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'M': /* Back merge */ 375e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'F': /* Front merge */ 376e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'G': /* Get request */ 377e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'S': /* Sleep request */ 378e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (t_sec(t)) 379e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%llu + %u [%s]\n", 380e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (unsigned long long) t->sector, t_sec(t), name); 381e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else 382e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "[%s]\n", name); 383e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 384e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 385e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'P': /* Plug */ 386e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "[%s]\n", name); 387e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 388e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 389e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'U': /* Unplug IO */ 390e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'T': /* Unplug timer */ 391e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "[%s] %u\n", name, get_pdu_int(t)); 392e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 393e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 394e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'A': /* remap */ 395e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat get_pdu_remap(t, &r); 396e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%llu + %u <- (%d,%d) %llu\n", 397e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (unsigned long long) t->sector, t_sec(t), 398e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat MAJOR(r.device_from), MINOR(r.device_from), 399e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat (unsigned long long) r.sector_from); 400e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 401e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 402e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'X': /* Split */ 403e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%llu / %u [%s]\n", (unsigned long long) t->sector, 404e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat get_pdu_int(t), name); 405e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 406e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 407e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'm': /* Message */ 408e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%*s\n", pdu_len, pdu_buf); 409e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 410e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 411e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat default: 412e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(stderr, "Unknown action %c\n", act[0]); 413e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 414e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 415e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 416e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 417e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 418e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid process_fmt(char *act, struct per_cpu_info *pci, struct blk_io_trace *t, 419e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned long long elapsed, int pdu_len, 420e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned char *pdu_buf) 421e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 422e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat char *p = override_format[(int) *act]; 423e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 424e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (!p) { 425e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat process_default(act, pci, t, elapsed, pdu_len, pdu_buf); 426e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat return; 427e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 428e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 429e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat while (*p) { 430e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat switch (*p) { 431e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case '%': /* Field specifier */ 432e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat p++; 433e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat if (*p == '%') 434e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%c", *p++); 435e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else if (!*p) 436e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%c", '%'); 437e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat else 438e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat p = parse_field(act, pci, t, elapsed, 439e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat pdu_len, pdu_buf, p); 440e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 441e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case '\\': { /* escape */ 442e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat switch (p[1]) { 443e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'b': fprintf(ofp, "\b"); break; 444e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'n': fprintf(ofp, "\n"); break; 445e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 'r': fprintf(ofp, "\r"); break; 446e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat case 't': fprintf(ofp, "\t"); break; 447e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat default: 448e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(stderr, 449e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat "Invalid escape char in format %c\n", 450e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat p[1]); 451e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat exit(1); 452e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat /*NOTREACHED*/ 453e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 454e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat p += 2; 455e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 456e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 457e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat default: 458e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat fprintf(ofp, "%c", *p++); 459e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat break; 460e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 461e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat } 462e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat} 463e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 464e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 465