openreadclose.c (583B) download
1#ifndef EMBEDDED
2# define _FILE_OFFSET_BITS 64
3# include <fcntl.h>
4# include <stdlib.h>
5# include <unistd.h>
6#endif
7
8int openreadclose(char* fn, char** buf, size_t* len) {
9 int fd = open(fn, O_RDONLY);
10 if (fd < 0) return -1;
11 if (!*buf) {
12 off_t o = lseek(fd, 0, SEEK_END);
13 if (o < 0 || o > 0x7fffffff) goto error; // impose sanity limits
14 *len = o;
15 *buf = (char*) malloc(*len + 1);
16 if (!*buf) {
17 error:
18 close(fd);
19 return -1;
20 }
21 }
22 *len = pread(fd, *buf, *len, 0);
23 if (*len == (unsigned long) -1)
24 (*buf)[0] = 0;
25 else
26 (*buf)[*len] = 0;
27 return close(fd);
28}