+++ /dev/null
-#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;
-}