예제 #1
0
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;
}
예제 #2
0
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);
}
예제 #3
0
/**
 * 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;
}
예제 #4
0
/**
 * 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;
}