1 /**
2 * @file op_fileio.c
3 * Reading from / writing to files
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author John Levon
9 * @author Philippe Elie
10 */
11
12 #include <unistd.h>
13
14 #include "op_fileio.h"
15
16 #include "op_libiberty.h"
17
18 #include <errno.h>
19 #include <string.h>
20 #include <stdlib.h>
21
op_do_open_file(char const * name,char const * mode,int fatal)22 static FILE * op_do_open_file(char const * name, char const * mode, int fatal)
23 {
24 FILE * fp;
25
26 fp = fopen(name, mode);
27
28 if (!fp) {
29 if (fatal) {
30 fprintf(stderr,"oprofiled:op_do_open_file: %s: %s",
31 name, strerror(errno));
32 exit(EXIT_FAILURE);
33 }
34 }
35
36 return fp;
37 }
38
39
op_try_open_file(char const * name,char const * mode)40 FILE * op_try_open_file(char const * name, char const * mode)
41 {
42 return op_do_open_file(name, mode, 0);
43 }
44
45
op_open_file(char const * name,char const * mode)46 FILE * op_open_file(char const * name, char const * mode)
47 {
48 return op_do_open_file(name, mode, 1);
49 }
50
51
op_close_file(FILE * fp)52 void op_close_file(FILE * fp)
53 {
54 if (fclose(fp))
55 perror("oprofiled:op_close_file: ");
56 }
57
58
op_write_file(FILE * fp,void const * buf,size_t size)59 void op_write_file(FILE * fp, void const * buf, size_t size)
60 {
61 size_t written;
62
63 if (size == 0)
64 return;
65
66 written = fwrite(buf, size, 1, fp);
67
68 if (written != 1) {
69 fprintf(stderr,
70 "oprofiled:op_write_file: wrote less than expected: %lu bytes.\n",
71 (unsigned long)size);
72 exit(EXIT_FAILURE);
73 }
74 }
75
76
op_write_u8(FILE * fp,u8 val)77 void op_write_u8(FILE * fp, u8 val)
78 {
79 op_write_file(fp, &val, sizeof(val));
80 }
81
82
op_write_u32(FILE * fp,u32 val)83 void op_write_u32(FILE * fp, u32 val)
84 {
85 op_write_file(fp, &val, sizeof(val));
86 }
87
88
op_write_u64(FILE * fp,u64 val)89 void op_write_u64(FILE * fp, u64 val)
90 {
91 op_write_file(fp, &val, sizeof(val));
92 }
93
94
op_read_int_from_file(char const * filename,int fatal)95 u32 op_read_int_from_file(char const * filename, int fatal)
96 {
97 FILE * fp;
98 u32 value;
99
100 fp = fopen(filename, "r");
101 if (fp == NULL) {
102 if (!fatal)
103 return (u32)-1;
104 fprintf(stderr,
105 "op_read_int_from_file: Failed to open %s, reason %s\n",
106 filename, strerror(errno));
107 exit(EXIT_FAILURE);
108 }
109
110 if (fscanf(fp, "%u", &value) != 1) {
111 fclose(fp);
112 if (!fatal)
113 return (u32)-1;
114 fprintf(stderr,
115 "op_read_int_from_file: Failed to convert contents of file %s to integer\n",
116 filename);
117 exit(EXIT_FAILURE);
118 }
119
120 fclose(fp);
121
122 return value;
123 }
124
125
op_get_line(FILE * fp)126 char * op_get_line(FILE * fp)
127 {
128 char * buf;
129 char * cp;
130 int c;
131 size_t max = 512;
132
133 buf = xmalloc(max);
134 cp = buf;
135
136 while (1) {
137 switch (c = getc(fp)) {
138 case EOF:
139 free(buf);
140 return NULL;
141 break;
142
143 case '\n':
144 case '\0':
145 *cp = '\0';
146 return buf;
147 break;
148
149 default:
150 *cp = (char)c;
151 cp++;
152 if (((size_t)(cp - buf)) == max) {
153 buf = xrealloc(buf, max + 128);
154 cp = buf + max;
155 max += 128;
156 }
157 break;
158 }
159 }
160 }
161
162
163 /* FIXME the debug info stuff should be handled by binutils */
164 unsigned long
calc_crc32(unsigned long crc,unsigned char * buf,size_t len)165 calc_crc32(unsigned long crc, unsigned char * buf, size_t len)
166 {
167 static const unsigned long crc32_table[256] =
168 {
169 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
170 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
171 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
172 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
173 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
174 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
175 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
176 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
177 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
178 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
179 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
180 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
181 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
182 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
183 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
184 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
185 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
186 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
187 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
188 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
189 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
190 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
191 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
192 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
193 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
194 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
195 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
196 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
197 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
198 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
199 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
200 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
201 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
202 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
203 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
204 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
205 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
206 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
207 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
208 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
209 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
210 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
211 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
212 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
213 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
214 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
215 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
216 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
217 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
218 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
219 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
220 0x2d02ef8d
221 };
222 unsigned char * end;
223
224 crc = ~crc & 0xffffffff;
225 for (end = buf + len; buf < end; ++buf)
226 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
227 return ~crc & 0xffffffff;
228 }
229