fileIo.c   [plain text]


#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "fileIo.h"

int cspWriteFile(
	const char			*fileName,
	const unsigned char	*bytes,
	unsigned			numBytes)
{
	int		rtn;
	int 	fd;
	
	fd = open(fileName, O_RDWR | O_CREAT | O_TRUNC, 0600);
	if(fd <= 0) {
		return errno;
	}
	rtn = lseek(fd, 0, SEEK_SET);
	if(rtn < 0) {
		return errno;
	}
	rtn = write(fd, bytes, (size_t)numBytes);
	if(rtn != (int)numBytes) {
		if(rtn >= 0) {
			printf("writeFile: short write\n");
		}
		rtn = EIO;
	}
	else {
		rtn = 0;
	}
	close(fd);
	return rtn;
}
	
/*
 * Read entire file. 
 */
int cspReadFile(
	const char		*fileName,
	unsigned char	**bytes,		// mallocd and returned
	unsigned		*numBytes)		// returned
{
	int ourRtn = 0;
	int fd;
	char *buf;
	char *thisBuf;
	struct stat	sb;
	unsigned size;
	size_t toMove;
	ssize_t thisMoved;
	int irtn;
	off_t lrtn = 0;
	
	*numBytes = 0;
	*bytes = NULL;
	fd = open(fileName, O_RDONLY, 0);
	if(fd <= 0) {
		perror("open");
		return errno;
	}
	irtn = fstat(fd, &sb);
	if(irtn) {
		ourRtn = errno;
		if(ourRtn == 0) {
			fprintf(stderr, "***Bogus zero error on fstat\n");
			ourRtn = -1;
		}
		else {
			perror("fstat");
		}
		goto errOut;
	}
	size = sb.st_size;
	buf = thisBuf = (char *)malloc(size);
	if(buf == NULL) {
		ourRtn = ENOMEM;
		goto errOut;
	}
	lrtn = lseek(fd, 0, SEEK_SET);
	if(lrtn < 0) {
		ourRtn = errno;
		if(ourRtn == 0) {
			fprintf(stderr, "***Bogus zero error on lseek\n");
			ourRtn = -1;
		}
		else {
			perror("lseek");
		}
		goto errOut;
	}
	toMove = size;
	
	/*
	 * On ppc this read ALWAYS returns the entire file. On i386, not so. 
	 */
	do {
		thisMoved = read(fd, thisBuf, toMove);
		if(thisMoved == 0) {
			/* reading empty file: done */
			break;
		}
		else if(thisMoved < 0) {
			ourRtn = errno;
			perror("read");
			break;
		}
		size_t uThisMoved = (size_t)thisMoved;
		if(uThisMoved != toMove) {
			fprintf(stderr, "===Short read: asked for %ld, got %lu\n", 
				toMove, uThisMoved);
		}
		toMove  -= thisMoved;
		thisBuf += thisMoved;
	} while(toMove);
	
	if(ourRtn == 0) {
		*bytes = (unsigned char *)buf;
		*numBytes = size;
	}
errOut:
	close(fd);
	return ourRtn;
}