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
22static 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
40FILE * op_try_open_file(char const * name, char const * mode)
41{
42	return op_do_open_file(name, mode, 0);
43}
44
45
46FILE * op_open_file(char const * name, char const * mode)
47{
48	return op_do_open_file(name, mode, 1);
49}
50
51
52void op_close_file(FILE * fp)
53{
54	if (fclose(fp))
55		perror("oprofiled:op_close_file: ");
56}
57
58
59void 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
77void op_write_u8(FILE * fp, u8 val)
78{
79	op_write_file(fp, &val, sizeof(val));
80}
81
82
83void op_write_u32(FILE * fp, u32 val)
84{
85	op_write_file(fp, &val, sizeof(val));
86}
87
88
89void op_write_u64(FILE * fp, u64 val)
90{
91	op_write_file(fp, &val, sizeof(val));
92}
93
94
95u32 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
126char * 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 */
164unsigned long
165calc_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