[PATCH] Convert to using on-the-fly RB trees, no post-traversal.
[blktrace.git] / btt / misc.c
1 /*
2  * blktrace output analysis: generate a timeline & gather statistics
3  *
4  * Copyright (C) 2006 Alan D. Brunelle <Alan.Brunelle@hp.com>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21 #include <stdio.h>
22 #include <string.h>
23 #include <sys/types.h>
24 #include <sys/stat.h>
25 #include <unistd.h>
26
27 #define INLINE_DECLARE
28 #include "globals.h"
29
30 int data_is_native = -1;
31
32 struct blk_io_trace *convert_to_cpu(struct blk_io_trace *t)
33 {
34         if (data_is_native == -1)
35                 check_data_endianness(t->magic);
36
37         trace_to_cpu(t);
38
39         ASSERT(CHECK_MAGIC(t));
40         ASSERT((t->magic & 0xff) == SUPPORTED_VERSION);
41
42         return t;
43 }
44
45 int in_devices(struct blk_io_trace *t)
46 {
47         int i;
48         unsigned int mjr, mnr;
49         char *p = devices;
50
51         if (p == NULL) return 1;        /* Allow anything */
52
53         for (;;) {
54                 i = sscanf(p, "%u,%u;", &mjr, &mnr);
55                 ASSERT(i == 2);
56
57                 if ((mjr == MAJOR(t->device) && (mnr == MINOR(t->device))))
58                         return 1;
59
60                 p = strchr(p, ';');
61                 if (!p)
62                         break;
63                 p++;
64         }
65
66         return 0;
67 }
68
69 unsigned int do_read(int ifd, void *buf, int len)
70 {
71         int n;
72
73         n = read(ifd, buf, len);
74         if (n < 0) {
75                 perror(input_name);
76                 return 1;
77         }
78         else if (0 < n && n < len) {
79                 fprintf(stderr,"Short read on %s\n", input_name);
80                 return 1;
81         }
82         else if (n == 0) /* EOF */
83                 return 1;
84
85         return 0;
86 }
87
88 void add_file(struct file_info **fipp, FILE *fp, char *oname)
89 {
90         struct file_info *fip;
91         
92         fip = malloc(sizeof(struct file_info) + strlen(oname) + 1);
93
94         fip->next = *fipp;
95         *fipp = fip;
96
97         fip->ofp = fp;
98         strcpy(fip->oname, oname);
99 }
100
101 void clean_files(struct file_info **fipp)
102 {
103         struct stat buf;
104         struct file_info *fip;
105
106         while ((fip = *fipp) != NULL) {
107                 *fipp = fip->next;
108
109                 fclose(fip->ofp);
110                 if (!stat(fip->oname, &buf) && (buf.st_size == 0))
111                         unlink(fip->oname);
112                 free(fip);
113         }
114 }
115
116 void dbg_ping(void) {}