/* Copyright (C) 1999 Beau Kuiper
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, or (at your option)
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. */
#include "ftpd.h"
int readbuffer(NEWFILE *file)
{
char inbuf[BUFFERSIZE];
int size, oldsize = STRLENGTH(file->buffer);
size = read(file->fd, inbuf, BUFFERSIZE);
if (size == 0)
file->eof = TRUE;
else if (size == -1)
{
ERRORMSG(strerror(errno));
file->eof = TRUE;
}
if (file->eof)
return(size);
string_cat(&(file->buffer), inbuf, size);
string_filterbadchars_unix(&(file->buffer), oldsize);
return(STRLENGTH(file->buffer) - oldsize);
}
NEWFILE *nfopen(char *filename)
{
NEWFILE *new;
/* if we get null, return null! */
if (!filename)
return(NULL);
new = mallocwrapper(sizeof(NEWFILE));
new->fd = open(filename, O_RDONLY);
if (new->fd == -1)
{
freewrapper(new);
return(NULL);
}
new->buffer = string_new();
new->eof = FALSE;
return(new);
}
NEWFILE *nfdopen(int fd)
{
NEWFILE *new = mallocwrapper(sizeof(NEWFILE));
new->fd = fd;
if (new->fd == -1)
{
freewrapper(new);
return(NULL);
}
new->buffer = string_new();
new->eof = FALSE;
return(new);
}
char *nfgetcs(NEWFILE *file, char testchar)
{
char *bptr, *result;
int slen;
int bufferlen = 0;
int nextbuflen = STRLENGTH(file->buffer);
if (file->eof)
return(NULL);
while((bptr = strchr(STRTOCHAR(file->buffer) + bufferlen, (int)testchar)) == NULL)
{
bufferlen += nextbuflen;
nextbuflen = readbuffer(file);
if (nextbuflen == 0)
{
bptr = STRTOCHAR(file->buffer) + STRLENGTH(file->buffer);
break;
}
else if (nextbuflen == -1)
return(NULL);
}
/* set up the result */
slen = bptr - STRTOCHAR(file->buffer) + 1;
result = mallocwrapper(slen + 1);
memcpy(result, STRTOCHAR(file->buffer), slen);
result[slen] = 0;
/* fix up the buffer */
string_dropfront(&(file->buffer), slen);
return(result);
}
void nfclose(NEWFILE *file)
{
close(file->fd);
freewrapper(file->buffer);
freewrapper(file);
}
syntax highlighted by Code2HTML, v. 0.9.1