static JSBool jss_set_value(JSContext *cx, JSObject *obj, jsval idval, jsval *vp) { jsval v = *vp; js_setting_t *jss = JS_GetPrivate(cx, obj); if(jss->jss_freezed) return JS_TRUE; assert(jss->jss_s != NULL); JSBool b; int32 i32; JSString *str; // We need to be a bit more strict about value types here so // it's not possible to just use js_prop_set_from_jsval() switch(settings_get_type(jss->jss_s)) { case SETTING_INT: if(!JS_ValueToInt32(cx, v, &i32)) return JS_FALSE; setting_set(jss->jss_s, SETTING_INT, i32); break; case SETTING_BOOL: if(!JS_ValueToBoolean(cx, v, &b)) return JS_FALSE; setting_set(jss->jss_s, SETTING_BOOL, b); break; case SETTING_STRING: str = JS_ValueToString(cx, v); if(str == NULL) return JS_FALSE; setting_set(jss->jss_s, SETTING_STRING, JS_GetStringBytes(str)); break; case SETTING_MULTIOPT: str = JS_ValueToString(cx, v); if(str == NULL) return JS_FALSE; setting_set(jss->jss_s, SETTING_STRING, JS_GetStringBytes(str)); break; } return JS_TRUE; }
void glw_settings_adj_size(int delta) { if(delta == 0) setting_set(glw_settings.gs_setting_size, SETTING_INT, 0); else settings_add_int(glw_settings.gs_setting_size, delta); }
/** * Set all values specified by vector of strings to setting set. Setting name * is separated from it's argument with one or more characters defined by * @link SETTING_NAME_SEPARATORS@endlink. * * @retval ISC_R_SUCCESS All strings in argument vector were processed and set. * @retval Others Memory or parsing errors. * * @warning One string in argument vector is limited to * @link SETTING_LINE_MAXLENGTH@endlink. * * @note * @code{.txt} * Calling settings_set_fill() with argument array * * {"setting1 value 1 ", * "bind_dn cn=Directory manager" } * * will result in setting values to two separate settings: * * "setting1" = "value 1 " * "bind_dn" = "cn=Directory manager" * * Please note the positions of white spaces. * @endcode */ isc_result_t settings_set_fill(settings_set_t *set, const char *const *argv) { isc_result_t result; int i; const char *name; char *value; for (i = 0; argv[i] != NULL; i++) { char buff[SETTING_LINE_MAXLENGTH] = ""; CHECK(isc_string_copy(buff, SETTING_LINE_MAXLENGTH, argv[i])); value = buff; name = isc_string_separate(&value, SETTING_NAME_SEPARATORS); if (name == NULL || value == NULL) CLEANUP_WITH(ISC_R_UNEXPECTEDEND); value += strspn(value, SETTING_NAME_SEPARATORS); if (setting_find(name, set, ISC_FALSE, ISC_TRUE, NULL) != ISC_R_NOTFOUND) { log_error("multiple definitions of setting '%s' in " "set of settings '%s'", name, set->name); CLEANUP_WITH(ISC_R_EXISTS); } result = setting_set(name, set, value); if (result != ISC_R_SUCCESS && result != ISC_R_IGNORE) goto cleanup; } return ISC_R_SUCCESS; cleanup: log_error_r("cannot parse settings from '%s': " "problematic configuration line:" "\n%s\n" "error code", set->name, argv[i]); /* TODO: Free memory in case of error. */ return result; }
/** * Change setting 'name' to value specified by attribute 'attr_name' in LDAP * entry. Setting is un-set if specified value is missing in LDAP entry. * * @warning Multi-value attributes are no supported. * * @retval ISC_R_SUCCESS Setting was changed (set or unset). * @retval ISC_R_IGNORE Setting wasn't changed because value in settings set * and LDAP entry was same. * @retval ISC_R_NOTFOUND Required setting was not found in given set. * @retval Others Memory allocation or conversion errors. */ isc_result_t setting_update_from_ldap_entry(const char *name, settings_set_t *set, const char *attr_name, ldap_entry_t *entry) { isc_result_t result; setting_t *setting = NULL; ldap_valuelist_t values; CHECK(setting_find(name, set, ISC_FALSE, ISC_FALSE, &setting)); result = ldap_entry_getvalues(entry, attr_name, &values); if (result == ISC_R_NOTFOUND || HEAD(values) == NULL) { CHECK(setting_unset(name, set)); log_debug(2, "setting '%s' (%s) was deleted in object %s", name, attr_name, ldap_entry_logname(entry)); return ISC_R_SUCCESS; } else if (result != ISC_R_SUCCESS) { goto cleanup; } if (HEAD(values) != TAIL(values)) { log_bug("multi-value attributes are not supported: attribute " "'%s' in %s", attr_name, ldap_entry_logname(entry)); return ISC_R_NOTIMPLEMENTED; } CHECK(setting_set(name, set, HEAD(values)->value)); log_debug(2, "setting '%s' (%s) was changed to '%s' in %s", name, attr_name, HEAD(values)->value, ldap_entry_logname(entry)); cleanup: if (result == ISC_R_NOTFOUND) log_bug("setting '%s' was not found in settings set '%s'", name, set->name); return result; }