Thread: [Aide-commits] aide branch, master, updated. v0.16a2-9-g5e7f4de
Brought to you by:
hvhaugwitz,
rvdb
From: Hannes v. H. <hvh...@us...> - 2013-05-14 14:15:33
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "aide". The branch, master has been updated via 5e7f4deb7a4cbcd7727e0870e9aacaace479c31a (commit) from 207834ab3eed5bac600b5f37310887ebc08e8cca (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 5e7f4deb7a4cbcd7727e0870e9aacaace479c31a Author: Hannes von Haugwitz <ha...@vo...> Date: Tue May 14 15:43:01 2013 +0200 Replaced fopen.c with the version from curl-7.30.0 diff --git a/ChangeLog b/ChangeLog index 72045eb..4021752 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ 2013-05-14 Hannes von Haugwitz <ha...@vo...> * src/db.c: fixed segfault when dbconf->db_out is NULL + * Replaced fopen.c with the version from curl-7.30.0 2013-05-08 Hannes von Haugwitz <ha...@vo...> * src/compare_db.c: diff --git a/include/fopen.h b/include/fopen.h index 26ad1a6..5682d09 100644 --- a/include/fopen.h +++ b/include/fopen.h @@ -1,39 +1,46 @@ -#include "aide.h" +/* see src/fopen.c for copyright information */ -#ifdef WITH_CURL +#ifndef _FOPEN_H_INCLUDED +#define _FOPEN_H_INCLUDED #include <stdio.h> #include <string.h> -#include <sys/time.h> +#ifndef WIN32 +# include <sys/time.h> +#endif #include <stdlib.h> #include <errno.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 { - enum fcurl_type_e type; /* type of handle */ - union { - CURL *curl; - FILE *file; - } handle; /* handle */ - - char *buffer; /* buffer to store cached data*/ - int buffer_len; /* currently allocated buffers length */ - int buffer_pos; /* end of data in buffer*/ - int still_running; /* Is background url fetch still in progress */ + enum fcurl_type_e type; /* type of handle */ + union { + CURL *curl; + FILE *file; + } handle; /* handle */ + + char *buffer; /* buffer to store cached data*/ + size_t buffer_len; /* currently allocated buffers length */ + size_t buffer_pos; /* end of data in buffer*/ + int still_running; /* Is background url fetch still in progress */ }; typedef struct fcurl_data URL_FILE; /* exported functions */ -URL_FILE *url_fopen(char *url,const char *operation); +URL_FILE *url_fopen(const char *url,const char *operation); int url_fclose(URL_FILE *file); int url_feof(URL_FILE *file); size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file); -char * url_fgets(char *ptr, int size, URL_FILE *file); +char * url_fgets(char *ptr, size_t size, URL_FILE *file); void url_rewind(URL_FILE *file); -#endif +#endif /* _FOPEN_H_INCLUDED */ diff --git a/src/be.c b/src/be.c index dd784e6..2aba66f 100644 --- a/src/be.c +++ b/src/be.c @@ -1,6 +1,6 @@ /* aide, Advanced Intrusion Detection Environment * - * Copyright (C) 1999-2003,2005,2006,2010,2011 Rami Lehti, Pablo + * Copyright (C) 1999-2003,2005,2006,2010,2011,2013 Rami Lehti, Pablo * Virolainen, Richard van den Berg, Hannes von Haugwitz * $Header$ * @@ -29,7 +29,9 @@ #include "db_config.h" #include "db_file.h" #include "report.h" +#ifdef WITH_CURL #include "fopen.h" +#endif #include "be.h" #ifdef WITH_PSQL diff --git a/src/commandconf.c b/src/commandconf.c index 74f6c38..9ad3239 100644 --- a/src/commandconf.c +++ b/src/commandconf.c @@ -1,6 +1,6 @@ /* aide, Advanced Intrusion Detection Environment * - * Copyright (C) 1999-2006,2010,2011 Rami Lehti, Pablo Virolainen, + * Copyright (C) 1999-2006,2010,2011,2013 Rami Lehti, Pablo Virolainen, * Richard van den Berg, Hannes von Haugwitz * $Header$ * @@ -39,7 +39,9 @@ /*for locale support*/ #include "locale-aide.h" /*for locale support*/ +#ifdef WITH_CURL #include "fopen.h" +#endif #define BUFSIZE 4096 #define ZBUFSIZE 16384 diff --git a/src/fopen.c b/src/fopen.c index 1f9c5da..0f57048 100644 --- a/src/fopen.c +++ b/src/fopen.c @@ -13,7 +13,7 @@ * See the main() function at the bottom that shows an app that retrives from a * specified url using fgets() and fread() and saves as two output files. * - * Coyright (c)2003 Simtec Electronics + * Copyright (c) 2003 Simtec Electronics * * Re-implemented by Vincent Sanders <vi...@ky...> with extensive * reference to original curl example code @@ -41,568 +41,357 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This example requires libcurl 7.9.7 or later. + * + * Modified for aide by Hannes von Haugwitz <ha...@vo...> + * based on modifications of previous version by Pablo Virolainen + * (pa...@ip...): + * 2013-05-14: - moved declarations to 'include/fopen.h' + * - removed (unneeded) main method */ -/** - * Modified for aide by Pablo Virolainen (pa...@ip...) - */ - -#include "aide.h" - -#ifdef WITH_CURL - -#include <stdio.h> -#include <string.h> -#include <sys/time.h> -#include <stdlib.h> -#include <errno.h> -#include <curl/curl.h> - #include "fopen.h" /* we use a global one for convenience */ CURLM *multi_handle; /* curl calls this routine to get more data */ -static size_t -write_callback(char *buffer, - size_t size, - size_t nitems, - void *userp) +static size_t write_callback(char *buffer, + size_t size, + size_t nitems, + void *userp) { - char *newbuff; - int rembuff; - - URL_FILE *url = (URL_FILE *)userp; - size *= nitems; - - rembuff=url->buffer_len - url->buffer_pos;//remaining space in buffer - - if(size > rembuff) - { - //not enuf space in buffer - newbuff=realloc(url->buffer,url->buffer_len + (size - rembuff)); - if(newbuff==NULL) - { - size=rembuff; - } - else - { - /* realloc suceeded increase buffer size*/ - url->buffer_len+=size - rembuff; - url->buffer=newbuff; - } - } - - memcpy(&url->buffer[url->buffer_pos], buffer, size); - url->buffer_pos += size; + char *newbuff; + size_t rembuff; - return size; -} + URL_FILE *url = (URL_FILE *)userp; + size *= nitems; -/* use to attempt to fill the read buffer up to requested number of bytes */ -static int -fill_buffer(URL_FILE *file,int want,int waittime) -{ - fd_set fdread; - fd_set fdwrite; - fd_set fdexcep; - int maxfd; - struct timeval timeout; - int rc; - (void) waittime; - - /* only attempt to fill buffer if transactions still running and buffer - * doesnt exceed required size already - */ - if((!file->still_running) || (file->buffer_pos > want)) - return 0; - - /* attempt to fill buffer */ - do - { - FD_ZERO(&fdread); - FD_ZERO(&fdwrite); - FD_ZERO(&fdexcep); - - /* set a suitable timeout to fail on */ - timeout.tv_sec = 60; /* 1 minute */ - timeout.tv_usec = 0; - - /* get file descriptors from the transfers */ - curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); - - rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); - - switch(rc) { - case -1: - /* select error */ - break; - - case 0: - break; - - default: - /* timeout or readable/writable sockets */ - /* note we *could* be more efficient and not wait for - * CURLM_CALL_MULTI_PERFORM to clear here and check it on re-entry - * but that gets messy */ - while(curl_multi_perform(multi_handle, &file->still_running) == - CURLM_CALL_MULTI_PERFORM); - - break; - } - } while(file->still_running && (file->buffer_pos < want)); - return 1; -} + rembuff=url->buffer_len - url->buffer_pos; /* remaining space in buffer */ -/* use to remove want bytes from the front of a files buffer */ -static int -use_buffer(URL_FILE *file,int want) -{ - /* sort out buffer */ - if((file->buffer_pos - want) <=0) - { - /* ditch buffer - write will recreate */ - if(file->buffer) - free(file->buffer); - - file->buffer=NULL; - file->buffer_pos=0; - file->buffer_len=0; + if(size > rembuff) { + /* not enough space in buffer */ + newbuff=realloc(url->buffer,url->buffer_len + (size - rembuff)); + if(newbuff==NULL) { + fprintf(stderr,"callback buffer grow failed\n"); + size=rembuff; } - else - { - /* move rest down make it available for later */ - memmove(file->buffer, - &file->buffer[want], - (file->buffer_pos - want)); - - file->buffer_pos -= want; + else { + /* realloc suceeded increase buffer size*/ + url->buffer_len+=size - rembuff; + url->buffer=newbuff; } - return 0; -} - - - -URL_FILE * -url_fopen(char *url,const char *operation) -{ - /* this code could check for URLs or types in the 'url' and - basicly use the real fopen() for standard files */ - - URL_FILE *file; - (void)operation; - - file = (URL_FILE *)malloc(sizeof(URL_FILE)); - if(!file) - return NULL; + } - memset(file, 0, sizeof(URL_FILE)); + memcpy(&url->buffer[url->buffer_pos], buffer, size); + url->buffer_pos += size; - - - if((file->handle.file=fopen(url,operation))) - { - file->type = CFTYPE_FILE; /* marked as URL */ - } - else - { - /* I know that this is broken. FIXME!!! */ - if (operation[0]=='r') { - /* Read.. */ - file->type = CFTYPE_CURL; /* marked as URL */ - file->handle.curl = curl_easy_init(); - - curl_easy_setopt(file->handle.curl, CURLOPT_URL, url); - curl_easy_setopt(file->handle.curl, CURLOPT_WRITEDATA, file); - curl_easy_setopt(file->handle.curl, CURLOPT_VERBOSE, 0!=0); - curl_easy_setopt(file->handle.curl, CURLOPT_WRITEFUNCTION, write_callback); - - - if(!multi_handle) - multi_handle = curl_multi_init(); - - curl_multi_add_handle(multi_handle, file->handle.curl); - - /* lets start the fetch */ - while(curl_multi_perform(multi_handle, &file->still_running) == - CURLM_CALL_MULTI_PERFORM ); - - if((file->buffer_pos == 0) && (!file->still_running)) - { - /* if still_running is 0 now, we should return NULL */ - - /* make sure the easy handle is not in the multi handle anymore */ - curl_multi_remove_handle(multi_handle, file->handle.curl); - - /* cleanup */ - curl_easy_cleanup(file->handle.curl); - - free(file); - - file = NULL; - } - } else { - /* write ? */ - file->type = CFTYPE_CURL; /* marked as URL */ - file->handle.curl = curl_easy_init(); - - curl_easy_setopt(file->handle.curl, CURLOPT_URL, url); - curl_easy_setopt(file->handle.curl, CURLOPT_UPLOAD, 0==0); - curl_easy_setopt(file->handle.curl, CURLOPT_PUT, 0==0); - curl_easy_setopt(file->handle.curl, CURLOPT_VERBOSE, 0!=0); - - if(!multi_handle) - multi_handle = curl_multi_init(); - - curl_multi_add_handle(multi_handle, file->handle.curl); - - /* lets start the fetch */ - while(curl_multi_perform(multi_handle, &file->still_running) == - CURLM_CALL_MULTI_PERFORM ); - - if((file->buffer_pos == 0) && (!file->still_running)) - { - /* if still_running is 0 now, we should return NULL */ - - /* make sure the easy handle is not in the multi handle anymore */ - curl_multi_remove_handle(multi_handle, file->handle.curl); - - /* cleanup */ - curl_easy_cleanup(file->handle.curl); - - free(file); - - file = NULL; - } - } - } - return file; + return size; } -int -url_fclose(URL_FILE *file) +/* use to attempt to fill the read buffer up to requested number of bytes */ +static int fill_buffer(URL_FILE *file, size_t want) { - int ret=0;/* default is good return */ - - switch(file->type) - { - case CFTYPE_FILE: - ret=fclose(file->handle.file); /* passthrough */ - break; - - case CFTYPE_CURL: - /* make sure the easy handle is not in the multi handle anymore */ - curl_multi_remove_handle(multi_handle, file->handle.curl); - - /* cleanup */ - curl_easy_cleanup(file->handle.curl); - break; - - default: /* unknown or supported type - oh dear */ - ret=EOF; - errno=EBADF; - break; + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; + struct timeval timeout; + int rc; + + /* only attempt to fill buffer if transactions still running and buffer + * doesnt exceed required size already + */ + if((!file->still_running) || (file->buffer_pos > want)) + return 0; + /* attempt to fill buffer */ + do { + int maxfd = -1; + long curl_timeo = -1; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); + + /* set a suitable timeout to fail on */ + timeout.tv_sec = 60; /* 1 minute */ + timeout.tv_usec = 0; + + curl_multi_timeout(multi_handle, &curl_timeo); + if(curl_timeo >= 0) { + timeout.tv_sec = curl_timeo / 1000; + if(timeout.tv_sec > 1) + timeout.tv_sec = 1; + else + timeout.tv_usec = (curl_timeo % 1000) * 1000; } - if(file->buffer) - free(file->buffer);/* free any allocated buffer space */ + /* get file descriptors from the transfers */ + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); - free(file); - - return ret; -} + /* In a real-world program you OF COURSE check the return code of the + function calls. On success, the value of maxfd is guaranteed to be + greater or equal than -1. We call select(maxfd + 1, ...), specially + in case of (maxfd == -1), we call select(0, ...), which is basically + equal to sleep. */ -int -url_feof(URL_FILE *file) -{ - int ret=0; + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); - switch(file->type) - { - case CFTYPE_FILE: - ret=feof(file->handle.file); - break; + switch(rc) { + case -1: + /* select error */ + break; - case CFTYPE_CURL: - if((file->buffer_pos == 0) && (!file->still_running)) - ret = 1; - break; - default: /* unknown or supported type - oh dear */ - ret=-1; - errno=EBADF; - break; + case 0: + default: + /* timeout or readable/writable sockets */ + curl_multi_perform(multi_handle, &file->still_running); + break; } - return ret; + } while(file->still_running && (file->buffer_pos < want)); + return 1; } -size_t url_fwrite(const void *ptr, size_t size, size_t nmemb, URL_FILE *file) +/* use to remove want bytes from the front of a files buffer */ +static int use_buffer(URL_FILE *file,int want) { - size_t want; - switch(file->type) - { - case CFTYPE_FILE: - return fwrite(ptr,size,nmemb,file->handle.file); - break; - - case CFTYPE_CURL: - want = nmemb*size; - if (file->buffer_pos!=NULL) { - return 0; - } - - file->buffer=ptr; - file->buffer_pos=0; - file->buffer_len=want; - fill_buffer(file,want,1); - - break; - default: - //error=EBADF; - return 0; - break; - } - /* not reached */ - return -1; + /* sort out buffer */ + if((file->buffer_pos - want) <=0) { + /* ditch buffer - write will recreate */ + if(file->buffer) + free(file->buffer); + + file->buffer=NULL; + file->buffer_pos=0; + file->buffer_len=0; + } + else { + /* move rest down make it available for later */ + memmove(file->buffer, + &file->buffer[want], + (file->buffer_pos - want)); + + file->buffer_pos -= want; + } + return 0; } - -size_t -url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file) +URL_FILE *url_fopen(const char *url,const char *operation) { - size_t want; + /* this code could check for URLs or types in the 'url' and + basicly use the real fopen() for standard files */ - switch(file->type) - { - case CFTYPE_FILE: - want=fread(ptr,size,nmemb,file->handle.file); - break; + URL_FILE *file; + (void)operation; - case CFTYPE_CURL: - want = nmemb * size; + file = malloc(sizeof(URL_FILE)); + if(!file) + return NULL; - fill_buffer(file,want,1); + memset(file, 0, sizeof(URL_FILE)); - /* check if theres data in the buffer - if not fill_buffer() - * either errored or EOF */ - if(!file->buffer_pos) { - return 0; - } - /* ensure only available data is considered */ - if(file->buffer_pos < want) - want = file->buffer_pos; + if((file->handle.file=fopen(url,operation))) + file->type = CFTYPE_FILE; /* marked as URL */ - /* xfer data to caller */ - memcpy(ptr, file->buffer, want); + else { + file->type = CFTYPE_CURL; /* marked as URL */ + file->handle.curl = curl_easy_init(); - use_buffer(file,want); + curl_easy_setopt(file->handle.curl, CURLOPT_URL, url); + curl_easy_setopt(file->handle.curl, CURLOPT_WRITEDATA, file); + curl_easy_setopt(file->handle.curl, CURLOPT_VERBOSE, 0L); + curl_easy_setopt(file->handle.curl, CURLOPT_WRITEFUNCTION, write_callback); - want = want / size; /* number of items - nb correct op - checked - * with glibc code*/ - break; + if(!multi_handle) + multi_handle = curl_multi_init(); - default: /* unknown or supported type - oh dear */ - want=0; - errno=EBADF; - break; + curl_multi_add_handle(multi_handle, file->handle.curl); - } - return want; -} + /* lets start the fetch */ + curl_multi_perform(multi_handle, &file->still_running); -char * -url_fgets(char *ptr, int size, URL_FILE *file) -{ - int want = size - 1;/* always need to leave room for zero termination */ - int loop; + if((file->buffer_pos == 0) && (!file->still_running)) { + /* if still_running is 0 now, we should return NULL */ - switch(file->type) - { - case CFTYPE_FILE: - ptr = fgets(ptr,size,file->handle.file); - break; + /* make sure the easy handle is not in the multi handle anymore */ + curl_multi_remove_handle(multi_handle, file->handle.curl); - case CFTYPE_CURL: - fill_buffer(file,want,1); - - /* check if theres data in the buffer - if not fill either errored or - * EOF */ - if(!file->buffer_pos) - return NULL; - - /* ensure only available data is considered */ - if(file->buffer_pos < want) - want = file->buffer_pos; - - /*buffer contains data */ - /* look for newline or eof */ - for(loop=0;loop < want;loop++) - { - if(file->buffer[loop] == '\n') - { - want=loop+1;/* include newline */ - break; - } - } - - /* xfer data to caller */ - memcpy(ptr, file->buffer, want); - ptr[want]=0;/* allways null terminate */ - - use_buffer(file,want); - break; + /* cleanup */ + curl_easy_cleanup(file->handle.curl); - default: /* unknown or supported type - oh dear */ - ptr=NULL; - errno=EBADF; - break; - } + free(file); - return ptr;/*success */ + file = NULL; + } + } + return file; } -void -url_rewind(URL_FILE *file) +int url_fclose(URL_FILE *file) { - switch(file->type) - { - case CFTYPE_FILE: - rewind(file->handle.file); /* passthrough */ - break; + int ret=0;/* default is good return */ - case CFTYPE_CURL: - /* halt transaction */ - curl_multi_remove_handle(multi_handle, file->handle.curl); + switch(file->type) { + case CFTYPE_FILE: + ret=fclose(file->handle.file); /* passthrough */ + break; - /* restart */ - curl_multi_add_handle(multi_handle, file->handle.curl); + case CFTYPE_CURL: + /* make sure the easy handle is not in the multi handle anymore */ + curl_multi_remove_handle(multi_handle, file->handle.curl); - /* ditch buffer - write will recreate - resets stream pos*/ - if(file->buffer) - free(file->buffer); + /* cleanup */ + curl_easy_cleanup(file->handle.curl); + break; - file->buffer=NULL; - file->buffer_pos=0; - file->buffer_len=0; + default: /* unknown or supported type - oh dear */ + ret=EOF; + errno=EBADF; + break; + } - break; + if(file->buffer) + free(file->buffer);/* free any allocated buffer space */ - default: /* unknown or supported type - oh dear */ - break; + free(file); - } + return ret; +} +int url_feof(URL_FILE *file) +{ + int ret=0; + + switch(file->type) { + case CFTYPE_FILE: + ret=feof(file->handle.file); + break; + + case CFTYPE_CURL: + if((file->buffer_pos == 0) && (!file->still_running)) + ret = 1; + break; + + default: /* unknown or supported type - oh dear */ + ret=-1; + errno=EBADF; + break; + } + return ret; } +size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file) +{ + size_t want; -/* Small main program to retrieve from a url using fgets and fread saving the - * output to two test files (note the fgets method will corrupt binary files if - * they contain 0 chars */ -/* int */ -/* main(int argc, char *argv[]) */ -/* { */ -/* URL_FILE *handle; */ -/* FILE *outf; */ + switch(file->type) { + case CFTYPE_FILE: + want=fread(ptr,size,nmemb,file->handle.file); + break; -/* int nread; */ -/* char buffer[256]; */ -/* char *url; */ + case CFTYPE_CURL: + want = nmemb * size; -/* if(argc < 2) */ -/* { */ -/* url="http://192.168.7.3/testfile";/\* default to testurl *\/ */ -/* } */ -/* else */ -/* { */ -/* url=argv[1];/\* use passed url *\/ */ -/* } */ + fill_buffer(file,want); -/* /\* copy from url line by line with fgets *\/ */ -/* outf=fopen("fgets.test","w+"); */ -/* if(!outf) */ -/* { */ -/* perror("couldnt open fgets output file\n"); */ -/* return 1; */ -/* } */ + /* check if theres data in the buffer - if not fill_buffer() + * either errored or EOF */ + if(!file->buffer_pos) + return 0; -/* handle = url_fopen(url, "r"); */ -/* if(!handle) */ -/* { */ -/* printf("couldn't url_fopen()\n"); */ -/* fclose(outf); */ -/* return 2; */ -/* } */ + /* ensure only available data is considered */ + if(file->buffer_pos < want) + want = file->buffer_pos; -/* while(!url_feof(handle)) */ -/* { */ -/* url_fgets(buffer,sizeof(buffer),handle); */ -/* fwrite(buffer,1,strlen(buffer),outf); */ -/* } */ + /* xfer data to caller */ + memcpy(ptr, file->buffer, want); -/* url_fclose(handle); */ + use_buffer(file,want); -/* fclose(outf); */ + want = want / size; /* number of items */ + break; + default: /* unknown or supported type - oh dear */ + want=0; + errno=EBADF; + break; -/* /\* Copy from url with fread *\/ */ -/* outf=fopen("fread.test","w+"); */ -/* if(!outf) */ -/* { */ -/* perror("couldnt open fread output file\n"); */ -/* return 1; */ -/* } */ + } + return want; +} + +char *url_fgets(char *ptr, size_t size, URL_FILE *file) +{ + size_t want = size - 1;/* always need to leave room for zero termination */ + size_t loop; + + switch(file->type) { + case CFTYPE_FILE: + ptr = fgets(ptr,size,file->handle.file); + break; + + case CFTYPE_CURL: + fill_buffer(file,want); + + /* check if theres data in the buffer - if not fill either errored or + * EOF */ + if(!file->buffer_pos) + return NULL; + + /* ensure only available data is considered */ + if(file->buffer_pos < want) + want = file->buffer_pos; + + /*buffer contains data */ + /* look for newline or eof */ + for(loop=0;loop < want;loop++) { + if(file->buffer[loop] == '\n') { + want=loop+1;/* include newline */ + break; + } + } -/* handle = url_fopen("testfile", "r"); */ -/* if(!handle) { */ -/* printf("couldn't url_fopen()\n"); */ -/* fclose(outf); */ -/* return 2; */ -/* } */ + /* xfer data to caller */ + memcpy(ptr, file->buffer, want); + ptr[want]=0;/* allways null terminate */ -/* do { */ -/* nread = url_fread(buffer, 1,sizeof(buffer), handle); */ -/* fwrite(buffer,1,nread,outf); */ -/* } while(nread); */ + use_buffer(file,want); -/* url_fclose(handle); */ + break; -/* fclose(outf); */ + default: /* unknown or supported type - oh dear */ + ptr=NULL; + errno=EBADF; + break; + } + return ptr;/*success */ +} -/* /\* Test rewind *\/ */ -/* outf=fopen("rewind.test","w+"); */ -/* if(!outf) */ -/* { */ -/* perror("couldnt open fread output file\n"); */ -/* return 1; */ -/* } */ +void url_rewind(URL_FILE *file) +{ + switch(file->type) { + case CFTYPE_FILE: + rewind(file->handle.file); /* passthrough */ + break; -/* handle = url_fopen("testfile", "r"); */ -/* if(!handle) { */ -/* printf("couldn't url_fopen()\n"); */ -/* fclose(outf); */ -/* return 2; */ -/* } */ + case CFTYPE_CURL: + /* halt transaction */ + curl_multi_remove_handle(multi_handle, file->handle.curl); -/* nread = url_fread(buffer, 1,sizeof(buffer), handle); */ -/* fwrite(buffer,1,nread,outf); */ -/* url_rewind(handle); */ + /* restart */ + curl_multi_add_handle(multi_handle, file->handle.curl); -/* buffer[0]='\n'; */ -/* fwrite(buffer,1,1,outf); */ + /* ditch buffer - write will recreate - resets stream pos*/ + if(file->buffer) + free(file->buffer); -/* nread = url_fread(buffer, 1,sizeof(buffer), handle); */ -/* fwrite(buffer,1,nread,outf); */ + file->buffer=NULL; + file->buffer_pos=0; + file->buffer_len=0; + break; -/* url_fclose(handle); */ - -/* fclose(outf); */ - - -/* return 0;/\* all done *\/ */ -/* } */ - -#endif + default: /* unknown or supported type - oh dear */ + break; + } +} ----------------------------------------------------------------------- Summary of changes: ChangeLog | 1 + include/fopen.h | 41 ++-- src/be.c | 4 +- src/commandconf.c | 4 +- src/fopen.c | 757 +++++++++++++++++++---------------------------------- 5 files changed, 304 insertions(+), 503 deletions(-) hooks/post-receive -- aide |