#include #include #include #define BUFLEN 512 int main() { fetchIO *dlf = NULL; FILE *localf = NULL; size_t dl_thisfile = 0, nread = 0; char buffer[BUFLEN]; const char *url = "http://mirror.aarnet.edu.au/pub/archlinux/extra/os/i686/qt-4.5.2-5-i686.pkg.tar.gz"; const char *filename = "localfile"; struct url_stat ust; int ret = 0; int i; /* libfetch does not reset the error code */ fetchLastErrCode = 0; localf = fopen(filename, "wb"); if(localf == NULL) { /* still null? */ return 1; } dlf = fetchXGetURL(url, &ust, ""); if(fetchLastErrCode != 0 || dlf == NULL) { ret = 1; goto cleanup; } while((nread = fetchIO_read(dlf, buffer, BUFLEN)) > 0) { size_t nwritten = 0; nwritten = fwrite(buffer, 1, nread, localf); if((nwritten != nread) || ferror(localf)) { ret = 1; goto cleanup; } dl_thisfile += nread; } for(i = 2; i <= 4096; i *=2) { malloc(i); }; /* did the transfer complete normally? */ if (ust.size != -1 && dl_thisfile < ust.size) { printf("%s appears to be truncated: %jd/%jd bytes\n", filename, (intmax_t)dl_thisfile, (intmax_t)ust.size); ret = -1; goto cleanup; } cleanup: if(localf) { fclose(localf); localf = NULL; } if(dlf) { fetchIO_close(dlf); dlf = NULL; } return ret; }