53#ifndef ZYPP_CURL_SONAME
54#define ZYPP_CURL_SONAME "libcurl.so.4"
58#undef curl_easy_setopt
59#undef curl_easy_getinfo
60#undef curl_multi_setopt
61#undef curl_share_setopt
65void * curl_dl_handle =
nullptr;
66char curl_dl_error[512];
67pthread_once_t curl_dl_once = PTHREAD_ONCE_INIT;
69extern "C" void curl_dl_open()
72 if ( !curl_dl_handle )
77 const char * err = dlerror();
78 snprintf( curl_dl_error,
sizeof(curl_dl_error),
"%s", err ? err :
"cannot load library" );
89void * curl_dl_sym(
const char * name )
91 pthread_once( &curl_dl_once, curl_dl_open );
92 if ( !curl_dl_handle )
94 fprintf( stderr,
"libzypp: cannot load %s: %s\n",
ZYPP_CURL_SONAME, curl_dl_error );
97 void * sym = dlsym( curl_dl_handle, name );
100 const char * err = dlerror();
101 fprintf( stderr,
"libzypp: %s lacks %s: %s\n",
113#define CURL_DL_HIDDEN __attribute__((visibility("hidden")))
116#define CURL_DL_FN( ret, name, proto, args ) \
117CURL_DL_HIDDEN ret name proto \
119 static ret (*fn) proto; \
121 *(void **)&fn = curl_dl_sym( #name ); \
126#define CURL_DL_FN_VOID( name, proto, args ) \
127CURL_DL_HIDDEN void name proto \
129 static void (*fn) proto; \
131 *(void **)&fn = curl_dl_sym( #name ); \
135CURL_DL_FN( CURLcode, curl_global_init, (
long flags), (flags) )
140CURL_DL_FN( const
char *, curl_easy_strerror, (CURLcode code), (code) )
155CURL_DL_FN( const
char *, curl_multi_strerror, (CURLMcode code), (code) )
162 static CURLcode (*
fn)( CURL *, CURLINFO, ... );
166 *(
void **)&
fn = curl_dl_sym(
"curl_easy_getinfo" );
168 arg = va_arg(
ap,
void * );
175 static CURLcode (*
fn)( CURL *, CURLoption, ... );
179 *(
void **)&
fn = curl_dl_sym(
"curl_easy_setopt" );
181 if ( option < CURLOPTTYPE_OBJECTPOINT )
182 ret =
fn(
handle, option, va_arg(
ap,
long ) );
183 else if ( option < CURLOPTTYPE_OFF_T )
184 ret =
fn(
handle, option, va_arg(
ap,
void * ) );
185 else if ( option < CURLOPTTYPE_BLOB )
186 ret =
fn(
handle, option, va_arg(
ap, curl_off_t ) );
188 ret =
fn(
handle, option, va_arg(
ap,
void * ) );
195 static CURLMcode (*
fn)( CURLM *, CURLMoption, ... );
199 *(
void **)&
fn = curl_dl_sym(
"curl_multi_setopt" );
201 if ( option < CURLOPTTYPE_OBJECTPOINT )
202 ret =
fn(
multi, option, va_arg(
ap,
long ) );
203 else if ( option < CURLOPTTYPE_OFF_T )
204 ret =
fn(
multi, option, va_arg(
ap,
void * ) );
205 else if ( option < CURLOPTTYPE_BLOB )
206 ret =
fn(
multi, option, va_arg(
ap, curl_off_t ) );
208 ret =
fn(
multi, option, va_arg(
ap,
void * ) );
CURL handle void p CURLversion age
#define CURL_DL_FN(ret, name, proto, args)
CURL handle void p CURLversion age struct curl_slist list curl_multi_cleanup
CURL handle void p CURLversion age struct curl_slist list CURLM multi curl_multi_remove_handle
CURL handle void p CURLversion age struct curl_slist list CURLM multi CURLM CURL handle CURLM curl_socket_t int ev_bitmask
CURL handle void p CURLversion age struct curl_slist list CURLM multi CURLM CURL handle curl_multi_socket_action
CURL_DL_HIDDEN CURLMcode curl_multi_setopt(CURLM *multi, CURLMoption option,...)
CURL handle void p CURLversion age struct curl_slist list CURLM multi CURLM CURL handle CURLM curl_socket_t int int running_handles CURLINFO va_list ap
CURL handle void p curl_version_info
CURL_DL_HIDDEN CURLcode curl_easy_setopt(CURL *handle, CURLoption option,...)
CURL handle void p CURLversion age struct curl_slist list CURLM multi CURLM CURL handle CURLM curl_socket_t int int running_handles CURLINFO info
CURL handle void p CURLversion age struct curl_slist list CURLM * multi
#define CURL_DL_FN_VOID(name, proto, args)
CURL handle void p CURLversion age struct curl_slist list CURLM multi CURLM CURL handle CURLM curl_socket_t s
CURL handle void p CURLversion age struct curl_slist * list
CURL handle void p CURLversion age struct curl_slist list CURLM multi CURLM CURL handle CURLM curl_socket_t int int * running_handles
return fn(handle, info, arg)
String related utilities and Regular expression matching.