#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;}
#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;
}