henesyinit from lsubb0c8bdb6 years agoHistory
51 lines · 753 B · C
RawDownload
#include <u.h>#include <libc.h>#include <b.h> void*readf(char*f, void* buf, long n, long* nout){	char	err[ERRMAX];	Dir*	d;	char*	mbuf;	int	fd; 	fd = open(f, OREAD);	if (fd < 0)		return nil;	mbuf = nil;	if (nout == nil)		nout = &n;	d = dirfstat(fd);	if (d == nil)		goto fail; 	if (buf == nil){		n = d->length;		if (n == 0)			n = 16 * 1024; // Next read from a stream.		mbuf = buf = malloc(n + 1);		if (mbuf == nil)			goto fail;	} 	if (d->length == 0)		*nout = read(fd, buf, n);	else		*nout = readn(fd, buf, n);	if (*nout < 0)		goto fail;	if (mbuf != nil)		mbuf[*nout] = 0;	free(d);	close(fd);	return buf;fail:	rerrstr(err, sizeof(err));	free(mbuf);	free(d);	close(fd);	werrstr(err);	*nout = -1;	return nil;}