static gboolean li_parse_optionptr(liServer *srv, liWorker *wrk, liServerOptionPtr *sopt, const char *name, liValue *val, liOptionPtrSet *mark) { liOptionPtrValue *oval; gpointer ptr = NULL; LI_FORCE_ASSERT(NULL != srv && NULL != wrk && NULL != sopt && NULL != name && NULL != mark); if (NULL != val && LI_VALUE_LIST == sopt->type && val->type != LI_VALUE_LIST) { li_value_wrap_in_list(val); } if (NULL != val && sopt->type != val->type && sopt->type != LI_VALUE_NONE) { ERROR(srv, "Unexpected value type '%s', expected '%s' for option %s", li_value_type_string(val), li_valuetype_string(sopt->type), name); return FALSE; } if (NULL == sopt->parse_option) { if (NULL == val) { switch (sopt->type) { case LI_VALUE_STRING: ptr = g_string_new((const char*) sopt->default_value); break; default: ptr = NULL; } } else { ptr = li_value_extract_ptr(val); } } else { if (!sopt->parse_option(srv, wrk, sopt->p, sopt->module_index, val, &ptr)) { /* errors should be logged by parse function */ return FALSE; } } if (NULL != ptr) { oval = g_slice_new0(liOptionPtrValue); oval->refcount = 1; oval->sopt = sopt; oval->data.ptr = ptr; } else { oval = NULL; } mark->ndx = sopt->index; mark->value = oval; return TRUE; }
liValue* li_value_to_key_value_list(liValue *val) { if (NULL == val) return NULL; if (LI_VALUE_LIST == val->type) { if (li_value_list_has_len(val, 2) && (LI_VALUE_STRING == li_value_list_type_at(val, 0) || LI_VALUE_NONE == li_value_list_type_at(val, 0))) { /* single key-value pair */ li_value_wrap_in_list(val); return val; } /* verify key-value list properties */ LI_VALUE_FOREACH(lentry, val) if (!li_value_list_has_len(lentry, 2)) return NULL; if (LI_VALUE_STRING != li_value_list_type_at(lentry, 0) && LI_VALUE_NONE != li_value_list_type_at(lentry, 0)) return NULL; LI_VALUE_END_FOREACH() return val; } return NULL; }
static gboolean li_parse_option(liServer *srv, liWorker *wrk, liServerOption *sopt, const char *name, liValue *val, liOptionSet *mark) { LI_FORCE_ASSERT(NULL != srv && NULL != wrk && NULL != sopt && NULL != name && NULL != mark); if (NULL != val && LI_VALUE_LIST == sopt->type && val->type != LI_VALUE_LIST) { li_value_wrap_in_list(val); } if (NULL != val && sopt->type != val->type && sopt->type != LI_VALUE_NONE) { ERROR(srv, "Unexpected value type '%s', expected '%s' for option %s", li_value_type_string(val), li_valuetype_string(sopt->type), name); return FALSE; } if (NULL == sopt->parse_option) { switch (sopt->type) { case LI_VALUE_BOOLEAN: mark->value.boolean = (NULL == val) ? GPOINTER_TO_INT(sopt->default_value) : val->data.boolean; break; case LI_VALUE_NUMBER: mark->value.number = (NULL == val) ? GPOINTER_TO_INT(sopt->default_value) : val->data.number; break; default: ERROR(srv, "Invalid scalar option type '%s' for option %s", li_valuetype_string(sopt->type), name); return FALSE; } } else { if (!sopt->parse_option(srv, wrk, sopt->p, sopt->module_index, val, &mark->value)) { /* errors should be logged by parse function */ return FALSE; } } mark->ndx = sopt->index; return TRUE; }
static liAction* openssl_setenv_create(liServer *srv, liWorker *wrk, liPlugin* p, liValue *val, gpointer userdata) { guint i; liValue *v; guint params = 0; UNUSED(srv); UNUSED(wrk); UNUSED(p); UNUSED(userdata); if (val && val->type == LI_VALUE_STRING) li_value_wrap_in_list(val); if (!val || val->type != LI_VALUE_LIST) { ERROR(srv, "%s", openssl_setenv_config_error); return NULL; } for (i = 0; i < val->data.list->len; i++) { v = g_array_index(val->data.list, liValue*, i); if (v->type != LI_VALUE_STRING) { ERROR(srv, "%s", openssl_setenv_config_error); return NULL; } if (li_strncase_equal(v->data.string, CONST_STR_LEN("client"))) { params |= SE_CLIENT; } else if (li_strncase_equal(v->data.string, CONST_STR_LEN("client-cert"))) { params |= SE_CLIENT_CERT; } else if (li_strncase_equal(v->data.string, CONST_STR_LEN("server"))) { params |= SE_SERVER; } else if (li_strncase_equal(v->data.string, CONST_STR_LEN("server-cert"))) { params |= SE_SERVER_CERT; } else { ERROR(srv, "%s", openssl_setenv_config_error); return NULL; } } return li_action_new_function(openssl_setenv, NULL, NULL, GUINT_TO_POINTER(params)); }