Home | History | Annotate | Download | only in libutil
      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 
     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 
     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 
     46 FILE * op_open_file(char const * name, char const * mode)
     47 {
     48 	return op_do_open_file(name, mode, 1);
     49 }
     50 
     51 
     52 void op_close_file(FILE * fp)
     53 {
     54 	if (fclose(fp))
     55 		perror("oprofiled:op_close_file: ");
     56 }
     57 
     58 
     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 
     77 void op_write_u8(FILE * fp, u8 val)
     78 {
     79 	op_write_file(fp, &val, sizeof(val));
     80 }
     81 
     82 
     83 void op_write_u32(FILE * fp, u32 val)
     84 {
     85 	op_write_file(fp, &val, sizeof(val));
     86 }
     87 
     88 
     89 void op_write_u64(FILE * fp, u64 val)
     90 {
     91 	op_write_file(fp, &val, sizeof(val));
     92 }
     93 
     94 
     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 
    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
    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