fiss-minit

A standalone service supervisor based on minit
Log | Files | Refs | README | LICENSE

openreadclose.c (583B)


      1 #ifndef EMBEDDED
      2 #	define _FILE_OFFSET_BITS 64
      3 #	include <fcntl.h>
      4 #	include <stdlib.h>
      5 #	include <unistd.h>
      6 #endif
      7 
      8 int 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 }