How to use libcurl
(1). Untar curl-7.21.7.tar.gz to curl-7.21.7
(2). Cross Compile libcurl
Add one script named configure_cr16.sh in curl-7.21.7, the content is as below:
#! /bin/sh
# copy library binaries
#! /bin/sh
export ROOTDIR=$PWD
export PATH=$PATH:/usr/cr16-tools/bin
export CPPFLAGS="-I/usr/cr16-tools/include"
export AR=cr16-uclinux-ar
export AS=cr16-uclinux-as
export LD=cr16-uclinux-ld
export RANLIB=cr16-uclinux-ranlib
export CC=cr16-uclinux-gcc
export NM=cr16-uclinux-nm
CFLAGS="-mcr16cplus -mdata-model=far -mint32 -fPIC -Wall -O2 -static " \
./configure --host=cr16-uclinux \
--enable-dependency-tracking \
--enable-static \
--disable-shared \
--enable-http \
--disable-ftp \
--disable-ldap \
--disable-dict \
--disable-telnet \
--disable-tftp \
--disable-manual \
--disable-nonblocking \
--disable-verbose \
--disable-debug \
--disable-crypto-auth \
--without-pic \
--with-gnu-ld \
--without-ssl \
--enable-threads \
--prefix=$PWD/../curl_release \
--exec-prefix=$PWD/../curl_release
(3). ./configure_cr16.sh && make && make install
libcurl will be in curl_release.
(4). How to use libcurl to download file
size_t writeDataToFileCb(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
size_t len = 0;
len = fwrite(ptr, size, nmemb, stream);
return len;
}
static BOOL testHandle(IN void* pList)
{
struct in_addr IPaddr;
int port;
char *pIPAddr = NULL;
char *pTemp = NULL;
PS_PARAMETER_NODE tempCmdList;
int i = 0;
int nImageNum = 0;
char szIpAddr[64];
char szPort[64];
char szTemp[3][64];
char *szFileName[2];
char szCommand[64];
static BOOL blGlobalInit = FALSE;
CURLcode ret = 0;
CURL *pCurlHandle = NULL;
char szUrl[128];
char szLocalFilePath[128];
FILE *fp = NULL;
long respCode = 0;
long size = 0;
char szTime[64];
printf("\n\n");
/* (1). Init libcurl */
if(blGlobalInit == FALSE)
{
ret = curl_global_init(CURL_GLOBAL_DEFAULT);
if(ret == CURLE_OK)
{
printf("In func: %s(), curl_global_init OK\n", __FUNCTION__);
blGlobalInit = TRUE;
}
else
{
printf("In func: %s(), curl_global_init fail, ret = %d\n", __FUNCTION__, ret);
return 1;
}
}
/* (2). Easy init to get one curl handle */
pCurlHandle = curl_easy_init();
if(pCurlHandle == NULL)
{
printf("In func: %s(), curl_easy_init fail \n", __FUNCTION__);
return 1;
}
/* (3). Construct the URL */
memset(szUrl, (char)0, sizeof(szUrl));
snprintf(szUrl, sizeof(szUrl), "http://%s/%s", szIpAddr, szTemp[0]);
/* (4). Construct local file path and open file */
memset(szLocalFilePath, (char)0, sizeof(szLocalFilePath));
snprintf(szLocalFilePath, sizeof(szLocalFilePath), "/var/%s", szTemp[0]);
fp = fopen(szLocalFilePath, "wb");
if(fp == NULL)
{
printf("In func: %s(), open file (%s) fail \n", __FUNCTION__, szLocalFilePath);
goto exit_testHandle;
}
/* (5). Set URL option */
printf("In func: %s(), szUrl = %s, szLocalFilePath = %s \n", __FUNCTION__, szUrl, szLocalFilePath);
ret = curl_easy_setopt(pCurlHandle, CURLOPT_URL, szUrl);
if(ret != CURLE_OK)
{
printf("In func: %s(), setopt (CURLOPT_URL) fail, ret = %d \n", __FUNCTION__, ret);
goto exit_testHandle;
}
/* (6). Set write function call back */
ret = curl_easy_setopt(pCurlHandle, CURLOPT_WRITEFUNCTION, writeDataToFileCb);
if(ret != CURLE_OK)
{
printf("In func: %s(), setopt (CURLOPT_WRITEFUNCTION) fail, ret = %d \n", __FUNCTION__, ret);
goto exit_testHandle;
}
/* (7). Set the parameter of call back func */
ret = curl_easy_setopt(pCurlHandle, CURLOPT_WRITEDATA, fp);
if(ret != CURLE_OK)
{
printf("In func: %s(), setopt (CURLOPT_WRITEDATA) fail, ret = %d \n", __FUNCTION__, ret);
goto exit_testHandle;
}
/* (8). Begin to perform */
memset(szTime, (char)0, sizeof(szTime));
getCurTime(szTime, sizeof(szTime));
printf("[%s]: In func: %s(), before perform ......\n", szTime, __FUNCTION__);
ret = curl_easy_perform(pCurlHandle);
memset(szTime, (char)0, sizeof(szTime));
getCurTime(szTime, sizeof(szTime));
printf("[%s]: In func: %s(), after perform ......\n", szTime, __FUNCTION__);
if(ret != CURLE_OK)
{
printf("In func: %s(), curl_easy_perform fail, ret = %d \n", __FUNCTION__, ret);
goto exit_testHandle;
}
/* (9). Get response code */
ret= curl_easy_getinfo(pCurlHandle, CURLINFO_RESPONSE_CODE, &respCode);
if(ret != CURLE_OK)
{
printf("In func: %s(), getinfo (CURLINFO_RESPONSE_CODE) fail, ret = %d \n", __FUNCTION__, ret);
goto exit_testHandle;
}
printf("In func: %s(), respCode = %d \n", __FUNCTION__, respCode);
if(respCode != 200)
{
printf("In func: %s(), respCode = %d, download error, delete file\n", __FUNCTION__, respCode);
fclose(fp);
fp = NULL;
goto exit_testHandle;
/* need to delete file */
}
/* (10). Get response code */
ret= curl_easy_getinfo(pCurlHandle, CURLINFO_SIZE_DOWNLOAD, &size);
if(ret != CURLE_OK)
{
printf("In func: %s(), getinfo (CURLINFO_RESPONSE_CODE) fail, ret = %d \n", __FUNCTION__, ret);
goto exit_testHandle;
}
printf("In func: %s(), size = %l \n", __FUNCTION__, size);
exit_testHandle:
curl_easy_cleanup(pCurlHandle);
if(fp != NULL)
fclose(fp);
return 1;
}