#include "asterisk.h"
#include <curl/curl.h>
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/config.h"
#include "asterisk/module.h"
#include "asterisk/lock.h"
#include "asterisk/utils.h"
Go to the source code of this file.
Functions | |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static struct ast_config * | config_curl (const char *url, const char *unused, const char *file, struct ast_config *cfg, struct ast_flags flags, const char *sugg_incl, const char *who_asked) |
static int | destroy_curl (const char *url, const char *unused, const char *keyfield, const char *lookup, va_list ap) |
Execute an DELETE query. | |
static int | load_module (void) |
static struct ast_variable * | realtime_curl (const char *url, const char *unused, va_list ap) |
Execute a curl query and return ast_variable list. | |
static struct ast_config * | realtime_multi_curl (const char *url, const char *unused, va_list ap) |
Excute an Select query and return ast_config list. | |
static int | require_curl (const char *url, const char *unused, va_list ap) |
static int | store_curl (const char *url, const char *unused, va_list ap) |
Execute an INSERT query. | |
static int | unload_module (void) |
static int | update_curl (const char *url, const char *unused, const char *keyfield, const char *lookup, va_list ap) |
Execute an UPDATE query. | |
Variables | |
static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Realtime Curl configuration" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "a9c98e5d177805051735cb5b0b16b0a0" , .load = load_module, .unload = unload_module, } |
static struct ast_module_info * | ast_module_info = &__mod_info |
static struct ast_config_engine | curl_engine |
Definition in file res_config_curl.c.
static void __reg_module | ( | void | ) | [static] |
Definition at line 562 of file res_config_curl.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 562 of file res_config_curl.c.
static struct ast_config* config_curl | ( | const char * | url, | |
const char * | unused, | |||
const char * | file, | |||
struct ast_config * | cfg, | |||
struct ast_flags | flags, | |||
const char * | sugg_incl, | |||
const char * | who_asked | |||
) | [static] |
Definition at line 455 of file res_config_curl.c.
References ast_category_append(), ast_category_new(), ast_config_get_current_category(), ast_config_internal_load(), ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_create(), ast_str_set(), ast_strlen_zero(), ast_uri_decode(), ast_uri_encode(), ast_variable_append(), ast_variable_new(), LOG_ERROR, pbx_substitute_variables_helper(), S_OR, ast_str::str, and strsep().
00456 { 00457 struct ast_str *query; 00458 char buf1[200]; 00459 char *stringp, *line, *pair, *key; 00460 const int EncodeSpecialChars = 1, bufsize = 256000; 00461 int last_cat_metric = -1, cat_metric = -1; 00462 struct ast_category *cat=NULL; 00463 char *buffer, *cur_cat = ""; 00464 char *category = "", *var_name = "", *var_val = ""; 00465 struct ast_flags loader_flags = { 0 }; 00466 00467 if (!ast_custom_function_find("CURL")) { 00468 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00469 return NULL; 00470 } 00471 00472 if (!(query = ast_str_create(1000))) 00473 return NULL; 00474 00475 if (!(buffer = ast_malloc(bufsize))) { 00476 ast_free(query); 00477 return NULL; 00478 } 00479 00480 ast_uri_encode(file, buf1, sizeof(buf1), EncodeSpecialChars); 00481 ast_str_set(&query, 0, "${CURL(%s/static?file=%s)}", url, buf1); 00482 00483 /* Do the CURL query */ 00484 pbx_substitute_variables_helper(NULL, query->str, buffer, bufsize); 00485 00486 /* Line oriented output */ 00487 stringp = buffer; 00488 cat = ast_config_get_current_category(cfg); 00489 00490 while ((line = strsep(&stringp, "\r\n"))) { 00491 if (ast_strlen_zero(line)) 00492 continue; 00493 00494 while ((pair = strsep(&line, "&"))) { 00495 key = strsep(&pair, "="); 00496 ast_uri_decode(key); 00497 if (pair) 00498 ast_uri_decode(pair); 00499 00500 if (!strcasecmp(key, "category")) 00501 category = S_OR(pair, ""); 00502 else if (!strcasecmp(key, "var_name")) 00503 var_name = S_OR(pair, ""); 00504 else if (!strcasecmp(key, "var_val")) 00505 var_val = S_OR(pair, ""); 00506 else if (!strcasecmp(key, "cat_metric")) 00507 cat_metric = pair ? atoi(pair) : 0; 00508 } 00509 00510 if (!strcmp(var_name, "#include")) { 00511 if (!ast_config_internal_load(var_val, cfg, loader_flags, "", who_asked)) 00512 return NULL; 00513 } 00514 00515 if (strcmp(category, cur_cat) || last_cat_metric != cat_metric) { 00516 if (!(cat = ast_category_new(category, "", 99999))) 00517 break; 00518 cur_cat = category; 00519 last_cat_metric = cat_metric; 00520 ast_category_append(cfg, cat); 00521 } 00522 ast_variable_append(cat, ast_variable_new(var_name, var_val, "")); 00523 } 00524 00525 ast_free(buffer); 00526 ast_free(query); 00527 return cfg; 00528 }
static int destroy_curl | ( | const char * | url, | |
const char * | unused, | |||
const char * | keyfield, | |||
const char * | lookup, | |||
va_list | ap | |||
) | [static] |
Execute an DELETE query.
url | ||
unused | ||
keyfield | where clause field | |
lookup | value of field for where clause | |
ap | list containing one or more field/value set(s) |
number | of rows affected | |
-1 | on failure |
Definition at line 356 of file res_config_curl.c.
References ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_append(), ast_str_create(), ast_str_set(), ast_uri_encode(), LOG_ERROR, pbx_substitute_variables_helper(), and ast_str::str.
00357 { 00358 struct ast_str *query; 00359 char buf1[200], buf2[200]; 00360 const char *newparam, *newval; 00361 char *stringp; 00362 int i, rowcount = -1; 00363 const int EncodeSpecialChars = 1, bufsize = 100; 00364 char *buffer; 00365 00366 if (!ast_custom_function_find("CURL")) { 00367 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00368 return -1; 00369 } 00370 00371 if (!(query = ast_str_create(1000))) 00372 return -1; 00373 00374 if (!(buffer = ast_malloc(bufsize))) { 00375 ast_free(query); 00376 return -1; 00377 } 00378 00379 ast_uri_encode(keyfield, buf1, sizeof(buf1), EncodeSpecialChars); 00380 ast_uri_encode(lookup, buf2, sizeof(buf2), EncodeSpecialChars); 00381 ast_str_set(&query, 0, "${CURL(%s/destroy,%s=%s&", url, buf1, buf2); 00382 00383 for (i = 0; (newparam = va_arg(ap, const char *)); i++) { 00384 newval = va_arg(ap, const char *); 00385 ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); 00386 ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); 00387 ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); 00388 } 00389 va_end(ap); 00390 00391 ast_str_append(&query, 0, ")}"); 00392 pbx_substitute_variables_helper(NULL, query->str, buffer, bufsize); 00393 00394 /* Line oriented output */ 00395 stringp = buffer; 00396 while (*stringp <= ' ') 00397 stringp++; 00398 sscanf(stringp, "%d", &rowcount); 00399 00400 ast_free(buffer); 00401 ast_free(query); 00402 00403 if (rowcount >= 0) 00404 return (int)rowcount; 00405 00406 return -1; 00407 }
static int load_module | ( | void | ) | [static] |
Definition at line 548 of file res_config_curl.c.
References ast_config_engine_register(), ast_load_resource(), ast_log(), ast_module_check(), AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_verb, curl_engine, and LOG_ERROR.
00549 { 00550 if (!ast_module_check("res_curl.so")) { 00551 if (ast_load_resource("res_curl.so") != AST_MODULE_LOAD_SUCCESS) { 00552 ast_log(LOG_ERROR, "Cannot load res_curl, so res_config_curl cannot be loaded\n"); 00553 return AST_MODULE_LOAD_DECLINE; 00554 } 00555 } 00556 00557 ast_config_engine_register(&curl_engine); 00558 ast_verb(1, "res_config_curl loaded.\n"); 00559 return 0; 00560 }
static struct ast_variable* realtime_curl | ( | const char * | url, | |
const char * | unused, | |||
va_list | ap | |||
) | [static] |
Execute a curl query and return ast_variable list.
url | The base URL from which to retrieve data | |
unused | Not currently used | |
ap | list containing one or more field/operator/value set. |
var | on success | |
NULL | on failure |
Definition at line 56 of file res_config_curl.c.
References ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_append(), ast_str_create(), ast_str_set(), ast_strlen_zero(), ast_uri_decode(), ast_uri_encode(), ast_variable_new(), LOG_ERROR, pbx_substitute_variables_helper(), S_OR, ast_str::str, strsep(), and var.
00057 { 00058 struct ast_str *query; 00059 char buf1[200], buf2[200]; 00060 const char *newparam, *newval; 00061 char *stringp, *pair, *key; 00062 int i; 00063 struct ast_variable *var=NULL, *prev=NULL; 00064 const int EncodeSpecialChars = 1, bufsize = 64000; 00065 char *buffer; 00066 00067 if (!ast_custom_function_find("CURL")) { 00068 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00069 return NULL; 00070 } 00071 00072 if (!(query = ast_str_create(1000))) 00073 return NULL; 00074 00075 if (!(buffer = ast_malloc(bufsize))) { 00076 ast_free(query); 00077 return NULL; 00078 } 00079 00080 ast_str_set(&query, 0, "${CURL(%s/single,", url); 00081 00082 for (i = 0; (newparam = va_arg(ap, const char *)); i++) { 00083 newval = va_arg(ap, const char *); 00084 ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); 00085 ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); 00086 ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); 00087 } 00088 va_end(ap); 00089 00090 ast_str_append(&query, 0, ")}"); 00091 pbx_substitute_variables_helper(NULL, query->str, buffer, bufsize); 00092 00093 /* Remove any trailing newline characters */ 00094 if ((stringp = strchr(buffer, '\r')) || (stringp = strchr(buffer, '\n'))) 00095 *stringp = '\0'; 00096 00097 stringp = buffer; 00098 while ((pair = strsep(&stringp, "&"))) { 00099 key = strsep(&pair, "="); 00100 ast_uri_decode(key); 00101 if (pair) 00102 ast_uri_decode(pair); 00103 00104 if (!ast_strlen_zero(key)) { 00105 if (prev) { 00106 prev->next = ast_variable_new(key, S_OR(pair, ""), ""); 00107 if (prev->next) 00108 prev = prev->next; 00109 } else 00110 prev = var = ast_variable_new(key, S_OR(pair, ""), ""); 00111 } 00112 } 00113 00114 ast_free(buffer); 00115 ast_free(query); 00116 return var; 00117 }
static struct ast_config* realtime_multi_curl | ( | const char * | url, | |
const char * | unused, | |||
va_list | ap | |||
) | [static] |
Excute an Select query and return ast_config list.
url | ||
unused | ||
ap | list containing one or more field/operator/value set. |
struct | ast_config pointer on success | |
NULL | on failure |
Definition at line 128 of file res_config_curl.c.
References ast_category_append(), ast_category_new(), ast_category_rename(), ast_config_new(), ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_append(), ast_str_create(), ast_str_set(), ast_strdupa, ast_strlen_zero(), ast_uri_decode(), ast_uri_encode(), ast_variable_append(), ast_variable_new(), LOG_ERROR, pbx_substitute_variables_helper(), S_OR, ast_str::str, strsep(), and var.
00129 { 00130 struct ast_str *query; 00131 char buf1[200], buf2[200]; 00132 const char *newparam, *newval; 00133 char *stringp, *line, *pair, *key, *initfield = NULL; 00134 int i; 00135 const int EncodeSpecialChars = 1, bufsize = 256000; 00136 struct ast_variable *var=NULL; 00137 struct ast_config *cfg=NULL; 00138 struct ast_category *cat=NULL; 00139 char *buffer; 00140 00141 if (!ast_custom_function_find("CURL")) { 00142 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00143 return NULL; 00144 } 00145 00146 if (!(query = ast_str_create(1000))) 00147 return NULL; 00148 00149 if (!(buffer = ast_malloc(bufsize))) { 00150 ast_free(query); 00151 return NULL; 00152 } 00153 00154 ast_str_set(&query, 0, "${CURL(%s/multi,", url); 00155 00156 for (i = 0; (newparam = va_arg(ap, const char *)); i++) { 00157 newval = va_arg(ap, const char *); 00158 if (i == 0) { 00159 char *op; 00160 initfield = ast_strdupa(newparam); 00161 if ((op = strchr(initfield, ' '))) 00162 *op = '\0'; 00163 } 00164 ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); 00165 ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); 00166 ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); 00167 } 00168 va_end(ap); 00169 00170 ast_str_append(&query, 0, ")}"); 00171 00172 /* Do the CURL query */ 00173 pbx_substitute_variables_helper(NULL, query->str, buffer, bufsize); 00174 00175 if (!(cfg = ast_config_new())) 00176 goto exit_multi; 00177 00178 /* Line oriented output */ 00179 stringp = buffer; 00180 while ((line = strsep(&stringp, "\r\n"))) { 00181 if (ast_strlen_zero(line)) 00182 continue; 00183 00184 if (!(cat = ast_category_new("", "", 99999))) 00185 continue; 00186 00187 while ((pair = strsep(&line, "&"))) { 00188 key = strsep(&pair, "="); 00189 ast_uri_decode(key); 00190 if (pair) 00191 ast_uri_decode(pair); 00192 00193 if (!strcasecmp(key, initfield) && pair) 00194 ast_category_rename(cat, pair); 00195 00196 if (!ast_strlen_zero(key)) { 00197 var = ast_variable_new(key, S_OR(pair, ""), ""); 00198 ast_variable_append(cat, var); 00199 } 00200 } 00201 ast_category_append(cfg, cat); 00202 } 00203 00204 exit_multi: 00205 ast_free(buffer); 00206 ast_free(query); 00207 return cfg; 00208 }
static int require_curl | ( | const char * | url, | |
const char * | unused, | |||
va_list | ap | |||
) | [static] |
Definition at line 409 of file res_config_curl.c.
References ast_custom_function_find(), ast_log(), ast_str_append(), ast_str_create(), ast_str_set(), ast_uri_encode(), LOG_ERROR, pbx_substitute_variables_helper(), RQ_CHAR, RQ_DATE, RQ_DATETIME, RQ_FLOAT, RQ_INTEGER1, RQ_INTEGER2, RQ_INTEGER3, RQ_INTEGER4, RQ_INTEGER8, RQ_UINTEGER1, RQ_UINTEGER2, RQ_UINTEGER3, RQ_UINTEGER4, RQ_UINTEGER8, ast_str::str, and type.
00410 { 00411 struct ast_str *query; 00412 char *elm, field[256], buffer[128]; 00413 int type, size; 00414 const int EncodeSpecialChars = 1; 00415 00416 if (!ast_custom_function_find("CURL")) { 00417 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00418 return -1; 00419 } 00420 00421 if (!(query = ast_str_create(100))) { 00422 return -1; 00423 } 00424 00425 ast_str_set(&query, 0, "${CURL(%s/require,", url); 00426 00427 while ((elm = va_arg(ap, char *))) { 00428 type = va_arg(ap, require_type); 00429 size = va_arg(ap, int); 00430 ast_uri_encode(elm, field, sizeof(field), EncodeSpecialChars); 00431 ast_str_append(&query, 0, "%s=%s%%3A%d", field, 00432 type == RQ_CHAR ? "char" : 00433 type == RQ_INTEGER1 ? "integer1" : 00434 type == RQ_UINTEGER1 ? "uinteger1" : 00435 type == RQ_INTEGER2 ? "integer2" : 00436 type == RQ_UINTEGER2 ? "uinteger2" : 00437 type == RQ_INTEGER3 ? "integer3" : 00438 type == RQ_UINTEGER3 ? "uinteger3" : 00439 type == RQ_INTEGER4 ? "integer4" : 00440 type == RQ_UINTEGER4 ? "uinteger4" : 00441 type == RQ_INTEGER8 ? "integer8" : 00442 type == RQ_UINTEGER8 ? "uinteger8" : 00443 type == RQ_DATE ? "date" : 00444 type == RQ_DATETIME ? "datetime" : 00445 type == RQ_FLOAT ? "float" : 00446 "unknown", size); 00447 } 00448 va_end(ap); 00449 00450 ast_str_append(&query, 0, ")}"); 00451 pbx_substitute_variables_helper(NULL, query->str, buffer, sizeof(buffer)); 00452 return atoi(buffer); 00453 }
static int store_curl | ( | const char * | url, | |
const char * | unused, | |||
va_list | ap | |||
) | [static] |
Execute an INSERT query.
url | ||
unused | ||
ap | list containing one or more field/value set(s) |
number | of rows affected | |
-1 | on failure |
Definition at line 291 of file res_config_curl.c.
References ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_append(), ast_str_create(), ast_str_set(), ast_uri_encode(), LOG_ERROR, pbx_substitute_variables_helper(), and ast_str::str.
00292 { 00293 struct ast_str *query; 00294 char buf1[200], buf2[200]; 00295 const char *newparam, *newval; 00296 char *stringp; 00297 int i, rowcount = -1; 00298 const int EncodeSpecialChars = 1, bufsize = 100; 00299 char *buffer; 00300 00301 if (!ast_custom_function_find("CURL")) { 00302 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00303 return -1; 00304 } 00305 00306 if (!(query = ast_str_create(1000))) 00307 return -1; 00308 00309 if (!(buffer = ast_malloc(bufsize))) { 00310 ast_free(query); 00311 return -1; 00312 } 00313 00314 ast_str_set(&query, 0, "${CURL(%s/store,", url); 00315 00316 for (i = 0; (newparam = va_arg(ap, const char *)); i++) { 00317 newval = va_arg(ap, const char *); 00318 ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); 00319 ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); 00320 ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); 00321 } 00322 va_end(ap); 00323 00324 ast_str_append(&query, 0, ")}"); 00325 pbx_substitute_variables_helper(NULL, query->str, buffer, bufsize); 00326 00327 stringp = buffer; 00328 while (*stringp <= ' ') 00329 stringp++; 00330 sscanf(stringp, "%d", &rowcount); 00331 00332 ast_free(buffer); 00333 ast_free(query); 00334 00335 if (rowcount >= 0) 00336 return (int)rowcount; 00337 00338 return -1; 00339 }
static int unload_module | ( | void | ) | [static] |
Definition at line 541 of file res_config_curl.c.
References ast_config_engine_deregister(), ast_verb, and curl_engine.
00542 { 00543 ast_config_engine_deregister(&curl_engine); 00544 ast_verb(1, "res_config_curl unloaded.\n"); 00545 return 0; 00546 }
static int update_curl | ( | const char * | url, | |
const char * | unused, | |||
const char * | keyfield, | |||
const char * | lookup, | |||
va_list | ap | |||
) | [static] |
Execute an UPDATE query.
url | ||
unused | ||
keyfield | where clause field | |
lookup | value of field for where clause | |
ap | list containing one or more field/value set(s). |
number | of rows affected | |
-1 | on failure |
Definition at line 225 of file res_config_curl.c.
References ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_append(), ast_str_create(), ast_str_set(), ast_uri_encode(), LOG_ERROR, pbx_substitute_variables_helper(), and ast_str::str.
00226 { 00227 struct ast_str *query; 00228 char buf1[200], buf2[200]; 00229 const char *newparam, *newval; 00230 char *stringp; 00231 int i, rowcount = -1; 00232 const int EncodeSpecialChars = 1, bufsize = 100; 00233 char *buffer; 00234 00235 if (!ast_custom_function_find("CURL")) { 00236 ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); 00237 return -1; 00238 } 00239 00240 if (!(query = ast_str_create(1000))) 00241 return -1; 00242 00243 if (!(buffer = ast_malloc(bufsize))) { 00244 ast_free(query); 00245 return -1; 00246 } 00247 00248 ast_uri_encode(keyfield, buf1, sizeof(buf1), EncodeSpecialChars); 00249 ast_uri_encode(lookup, buf2, sizeof(buf2), EncodeSpecialChars); 00250 ast_str_set(&query, 0, "${CURL(%s/update?%s=%s,", url, buf1, buf2); 00251 00252 for (i = 0; (newparam = va_arg(ap, const char *)); i++) { 00253 newval = va_arg(ap, const char *); 00254 ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); 00255 ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); 00256 ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); 00257 } 00258 va_end(ap); 00259 00260 ast_str_append(&query, 0, ")}"); 00261 pbx_substitute_variables_helper(NULL, query->str, buffer, bufsize); 00262 00263 /* Line oriented output */ 00264 stringp = buffer; 00265 while (*stringp <= ' ') 00266 stringp++; 00267 sscanf(stringp, "%d", &rowcount); 00268 00269 ast_free(buffer); 00270 ast_free(query); 00271 00272 if (rowcount >= 0) 00273 return (int)rowcount; 00274 00275 return -1; 00276 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Realtime Curl configuration" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "a9c98e5d177805051735cb5b0b16b0a0" , .load = load_module, .unload = unload_module, } [static] |
Definition at line 562 of file res_config_curl.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 562 of file res_config_curl.c.
struct ast_config_engine curl_engine [static] |