fopen.c: re-indented, fixed previous mistake

I've made the code intended using curl-style now to look more like other
examples.

My previous "fix" was a bit too invasive but is now fixed again.
This commit is contained in:
Daniel Stenberg 2010-11-04 11:42:27 +01:00
parent 542318b113
commit 809a748124

View File

@ -53,7 +53,11 @@
#include <curl/curl.h> #include <curl/curl.h>
enum fcurl_type_e { CFTYPE_NONE=0, CFTYPE_FILE=1, CFTYPE_CURL=2 }; enum fcurl_type_e {
CFTYPE_NONE=0,
CFTYPE_FILE=1,
CFTYPE_CURL=2
};
struct fcurl_data struct fcurl_data
{ {
@ -83,8 +87,7 @@ void url_rewind(URL_FILE *file);
CURLM *multi_handle; CURLM *multi_handle;
/* curl calls this routine to get more data */ /* curl calls this routine to get more data */
static size_t static size_t write_callback(char *buffer,
write_callback(char *buffer,
size_t size, size_t size,
size_t nitems, size_t nitems,
void *userp) void *userp)
@ -97,36 +100,28 @@ write_callback(char *buffer,
rembuff=url->buffer_len - url->buffer_pos; /* remaining space in buffer */ rembuff=url->buffer_len - url->buffer_pos; /* remaining space in buffer */
if(size > rembuff) if(size > rembuff) {
{
/* not enough space in buffer */ /* not enough space in buffer */
newbuff=realloc(url->buffer,url->buffer_len + (size - rembuff)); newbuff=realloc(url->buffer,url->buffer_len + (size - rembuff));
if(newbuff==NULL) if(newbuff==NULL) {
{
fprintf(stderr,"callback buffer grow failed\n"); fprintf(stderr,"callback buffer grow failed\n");
size=rembuff; size=rembuff;
} }
else else {
{
/* realloc suceeded increase buffer size*/ /* realloc suceeded increase buffer size*/
url->buffer_len+=size - rembuff; url->buffer_len+=size - rembuff;
url->buffer=newbuff; url->buffer=newbuff;
/*printf("Callback buffer grown to %d bytes\n",url->buffer_len);*/
} }
} }
memcpy(&url->buffer[url->buffer_pos], buffer, size); memcpy(&url->buffer[url->buffer_pos], buffer, size);
url->buffer_pos += size; url->buffer_pos += size;
/*fprintf(stderr, "callback %d size bytes\n", size);*/
return size; return size;
} }
/* use to attempt to fill the read buffer up to requested number of bytes */ /* use to attempt to fill the read buffer up to requested number of bytes */
static int static int fill_buffer(URL_FILE *file,int want,int waittime)
fill_buffer(URL_FILE *file,int want,int waittime)
{ {
fd_set fdread; fd_set fdread;
fd_set fdwrite; fd_set fdwrite;
@ -141,8 +136,7 @@ fill_buffer(URL_FILE *file,int want,int waittime)
return 0; return 0;
/* attempt to fill buffer */ /* attempt to fill buffer */
do do {
{
int maxfd = -1; int maxfd = -1;
long curl_timeo = -1; long curl_timeo = -1;
@ -180,6 +174,7 @@ fill_buffer(URL_FILE *file,int want,int waittime)
break; break;
case 0: case 0:
default:
/* timeout or readable/writable sockets */ /* timeout or readable/writable sockets */
curl_multi_perform(multi_handle, &file->still_running); curl_multi_perform(multi_handle, &file->still_running);
break; break;
@ -189,12 +184,10 @@ fill_buffer(URL_FILE *file,int want,int waittime)
} }
/* use to remove want bytes from the front of a files buffer */ /* use to remove want bytes from the front of a files buffer */
static int static int use_buffer(URL_FILE *file,int want)
use_buffer(URL_FILE *file,int want)
{ {
/* sort out buffer */ /* sort out buffer */
if((file->buffer_pos - want) <=0) if((file->buffer_pos - want) <=0) {
{
/* ditch buffer - write will recreate */ /* ditch buffer - write will recreate */
if(file->buffer) if(file->buffer)
free(file->buffer); free(file->buffer);
@ -203,8 +196,7 @@ use_buffer(URL_FILE *file,int want)
file->buffer_pos=0; file->buffer_pos=0;
file->buffer_len=0; file->buffer_len=0;
} }
else else {
{
/* move rest down make it available for later */ /* move rest down make it available for later */
memmove(file->buffer, memmove(file->buffer,
&file->buffer[want], &file->buffer[want],
@ -215,10 +207,7 @@ use_buffer(URL_FILE *file,int want)
return 0; return 0;
} }
URL_FILE *url_fopen(const char *url,const char *operation)
URL_FILE *
url_fopen(const char *url,const char *operation)
{ {
/* this code could check for URLs or types in the 'url' and /* this code could check for URLs or types in the 'url' and
basicly use the real fopen() for standard files */ basicly use the real fopen() for standard files */
@ -233,11 +222,9 @@ url_fopen(const char *url,const char *operation)
memset(file, 0, sizeof(URL_FILE)); memset(file, 0, sizeof(URL_FILE));
if((file->handle.file=fopen(url,operation))) if((file->handle.file=fopen(url,operation)))
{
file->type = CFTYPE_FILE; /* marked as URL */ file->type = CFTYPE_FILE; /* marked as URL */
}
else else {
{
file->type = CFTYPE_CURL; /* marked as URL */ file->type = CFTYPE_CURL; /* marked as URL */
file->handle.curl = curl_easy_init(); file->handle.curl = curl_easy_init();
@ -254,8 +241,7 @@ url_fopen(const char *url,const char *operation)
/* lets start the fetch */ /* lets start the fetch */
curl_multi_perform(multi_handle, &file->still_running); curl_multi_perform(multi_handle, &file->still_running);
if((file->buffer_pos == 0) && (!file->still_running)) if((file->buffer_pos == 0) && (!file->still_running)) {
{
/* if still_running is 0 now, we should return NULL */ /* if still_running is 0 now, we should return NULL */
/* make sure the easy handle is not in the multi handle anymore */ /* make sure the easy handle is not in the multi handle anymore */
@ -272,13 +258,11 @@ url_fopen(const char *url,const char *operation)
return file; return file;
} }
int int url_fclose(URL_FILE *file)
url_fclose(URL_FILE *file)
{ {
int ret=0;/* default is good return */ int ret=0;/* default is good return */
switch(file->type) switch(file->type) {
{
case CFTYPE_FILE: case CFTYPE_FILE:
ret=fclose(file->handle.file); /* passthrough */ ret=fclose(file->handle.file); /* passthrough */
break; break;
@ -295,7 +279,6 @@ url_fclose(URL_FILE *file)
ret=EOF; ret=EOF;
errno=EBADF; errno=EBADF;
break; break;
} }
if(file->buffer) if(file->buffer)
@ -306,13 +289,11 @@ url_fclose(URL_FILE *file)
return ret; return ret;
} }
int int url_feof(URL_FILE *file)
url_feof(URL_FILE *file)
{ {
int ret=0; int ret=0;
switch(file->type) switch(file->type) {
{
case CFTYPE_FILE: case CFTYPE_FILE:
ret=feof(file->handle.file); ret=feof(file->handle.file);
break; break;
@ -321,6 +302,7 @@ url_feof(URL_FILE *file)
if((file->buffer_pos == 0) && (!file->still_running)) if((file->buffer_pos == 0) && (!file->still_running))
ret = 1; ret = 1;
break; break;
default: /* unknown or supported type - oh dear */ default: /* unknown or supported type - oh dear */
ret=-1; ret=-1;
errno=EBADF; errno=EBADF;
@ -329,13 +311,11 @@ url_feof(URL_FILE *file)
return ret; return ret;
} }
size_t size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
{ {
size_t want; size_t want;
switch(file->type) switch(file->type) {
{
case CFTYPE_FILE: case CFTYPE_FILE:
want=fread(ptr,size,nmemb,file->handle.file); want=fread(ptr,size,nmemb,file->handle.file);
break; break;
@ -359,10 +339,7 @@ url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
use_buffer(file,want); use_buffer(file,want);
want = want / size; /* number of items - nb correct op - checked want = want / size; /* number of items */
* with glibc code*/
/*printf("(fread) return %d bytes %d left\n", want,file->buffer_pos);*/
break; break;
default: /* unknown or supported type - oh dear */ default: /* unknown or supported type - oh dear */
@ -374,14 +351,12 @@ url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
return want; return want;
} }
char * char *url_fgets(char *ptr, int size, URL_FILE *file)
url_fgets(char *ptr, int size, URL_FILE *file)
{ {
int want = size - 1;/* always need to leave room for zero termination */ int want = size - 1;/* always need to leave room for zero termination */
int loop; int loop;
switch(file->type) switch(file->type) {
{
case CFTYPE_FILE: case CFTYPE_FILE:
ptr = fgets(ptr,size,file->handle.file); ptr = fgets(ptr,size,file->handle.file);
break; break;
@ -400,10 +375,8 @@ url_fgets(char *ptr, int size, URL_FILE *file)
/*buffer contains data */ /*buffer contains data */
/* look for newline or eof */ /* look for newline or eof */
for(loop=0;loop < want;loop++) for(loop=0;loop < want;loop++) {
{ if(file->buffer[loop] == '\n') {
if(file->buffer[loop] == '\n')
{
want=loop+1;/* include newline */ want=loop+1;/* include newline */
break; break;
} }
@ -415,7 +388,6 @@ url_fgets(char *ptr, int size, URL_FILE *file)
use_buffer(file,want); use_buffer(file,want);
/*printf("(fgets) return %d bytes %d left\n", want,file->buffer_pos);*/
break; break;
default: /* unknown or supported type - oh dear */ default: /* unknown or supported type - oh dear */
@ -427,11 +399,9 @@ url_fgets(char *ptr, int size, URL_FILE *file)
return ptr;/*success */ return ptr;/*success */
} }
void void url_rewind(URL_FILE *file)
url_rewind(URL_FILE *file)
{
switch(file->type)
{ {
switch(file->type) {
case CFTYPE_FILE: case CFTYPE_FILE:
rewind(file->handle.file); /* passthrough */ rewind(file->handle.file); /* passthrough */
break; break;
@ -455,17 +425,13 @@ url_rewind(URL_FILE *file)
default: /* unknown or supported type - oh dear */ default: /* unknown or supported type - oh dear */
break; break;
} }
} }
/* Small main program to retrive from a url using fgets and fread saving the /* Small main program to retrive from a url using fgets and fread saving the
* output to two test files (note the fgets method will corrupt binary files if * output to two test files (note the fgets method will corrupt binary files if
* they contain 0 chars */ * they contain 0 chars */
int int main(int argc, char *argv[])
main(int argc, char *argv[])
{ {
URL_FILE *handle; URL_FILE *handle;
FILE *outf; FILE *outf;
@ -475,32 +441,25 @@ main(int argc, char *argv[])
const char *url; const char *url;
if(argc < 2) if(argc < 2)
{
url="http://192.168.7.3/testfile";/* default to testurl */ url="http://192.168.7.3/testfile";/* default to testurl */
}
else else
{
url=argv[1];/* use passed url */ url=argv[1];/* use passed url */
}
/* copy from url line by line with fgets */ /* copy from url line by line with fgets */
outf=fopen("fgets.test","w+"); outf=fopen("fgets.test","w+");
if(!outf) if(!outf) {
{
perror("couldn't open fgets output file\n"); perror("couldn't open fgets output file\n");
return 1; return 1;
} }
handle = url_fopen(url, "r"); handle = url_fopen(url, "r");
if(!handle) if(!handle) {
{
printf("couldn't url_fopen() %s\n", url); printf("couldn't url_fopen() %s\n", url);
fclose(outf); fclose(outf);
return 2; return 2;
} }
while(!url_feof(handle)) while(!url_feof(handle)) {
{
url_fgets(buffer,sizeof(buffer),handle); url_fgets(buffer,sizeof(buffer),handle);
fwrite(buffer,1,strlen(buffer),outf); fwrite(buffer,1,strlen(buffer),outf);
} }
@ -512,8 +471,7 @@ main(int argc, char *argv[])
/* Copy from url with fread */ /* Copy from url with fread */
outf=fopen("fread.test","w+"); outf=fopen("fread.test","w+");
if(!outf) if(!outf) {
{
perror("couldn't open fread output file\n"); perror("couldn't open fread output file\n");
return 1; return 1;
} }
@ -537,8 +495,7 @@ main(int argc, char *argv[])
/* Test rewind */ /* Test rewind */
outf=fopen("rewind.test","w+"); outf=fopen("rewind.test","w+");
if(!outf) if(!outf) {
{
perror("couldn't open fread output file\n"); perror("couldn't open fread output file\n");
return 1; return 1;
} }