/* * fileio.c - File I/O routines * * Copyright (C) 1998-2003 Gero Kuhlmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: fileio.c,v 1.4 2003/01/25 23:29:44 gkminix Exp $ */ #include #include #include "privlib.h" /* * Global variables exported by this module */ unsigned long write_chksum = 0; /* checksum for all bytes when writing */ /* * Read one block of data */ int nbread(buf, bufsize, infile) __u8 *buf; unsigned int bufsize; int infile; { int ofs; if (bufsize == 0) return(0); /* * We assume here that read() really reads the input file byte by byte, * and also stores each byte into a packed array of bytes. There do exist * systems with a character size different that one byte. How should we * handle those? */ if ((ofs = read(infile, (char *)buf, bufsize)) < 0) { if (!quiet) perror(progname); exit(EXIT_READ); } return(ofs); } /* * Write one block of data to the output file. */ int nbwrite(buf, bufsize, outfile) __u8 *buf; unsigned int bufsize; int outfile; { int j, ofs; if (bufsize == 0) return(0); /* * Write buffer into output file. The same problem with read() above also * applies to write(). Can we assume, that it will write a packed array of * bytes correctly? */ if ((ofs = write(outfile, (char *)buf, bufsize)) < 0) { if (!quiet) perror(progname); exit(EXIT_WRITE); } if (ofs != bufsize) { prnerr0("incorrect number of bytes written"); exit(EXIT_WRITE); } /* Compute the checksum */ for (j = 0; j < ofs; j++) { write_chksum += buf[j]; write_chksum &= 0xffff; } return(ofs); }