dbus_bool_t bus_config_parser_content (BusConfigParser *parser, const DBusString *content, DBusError *error) { DBusString content_sane; dbus_bool_t retval; retval = FALSE; if (!_dbus_string_init (&content_sane)) { BUS_SET_OOM (error); goto out; } if (!_dbus_string_copy (content, 0, &content_sane, 0)) { BUS_SET_OOM (error); goto out_content; } /* rip out white space */ _dbus_string_chop_white (&content_sane); if (_dbus_string_get_length (&content_sane) == 0) { /* optimise, there is no content */ retval = TRUE; goto out_content; } switch (parser->type) { case ELEMENT_SERVICEDIR: { char *cpath; /* copy the sane data into a char array */ if (!_dbus_string_copy_data(&content_sane, &cpath)) { BUS_SET_OOM (error); goto out_content; } /* append the dynamic char string to service dirs */ if (!_dbus_list_append (&parser->service_dirs, cpath)) { dbus_free (cpath); BUS_SET_OOM (error); goto out_content; } } break; case ELEMENT_SERVICEHELPER: { if (!_dbus_string_copy (&content_sane, 0, &parser->service_helper, 0)) { BUS_SET_OOM (error); goto out_content; } } break; case ELEMENT_USER: { if (!_dbus_string_copy (&content_sane, 0, &parser->user, 0)) { BUS_SET_OOM (error); goto out_content; } } break; case ELEMENT_TYPE: { if (!_dbus_string_copy (&content_sane, 0, &parser->bus_type, 0)) { BUS_SET_OOM (error); goto out_content; } } break; default: { /* we don't care about the others... really */ _dbus_verbose (" CONTENTS We dont care '%s' type '%i'\n", _dbus_string_get_const_data (&content_sane), parser->type); break; } } /* woot! */ retval = TRUE; out_content: _dbus_string_free (&content_sane); out: return retval; }
/** * Split paths into a list of char strings * * @param dirs string with pathes * @param suffix string concated to each path in dirs * @param dir_list contains a list of splitted pathes * return #TRUE is pathes could be splittes,#FALSE in oom case */ dbus_bool_t _dbus_split_paths_and_append (DBusString *dirs, const char *suffix, DBusList **dir_list) { int start; int i; int len; char *cpath; DBusString file_suffix; start = 0; i = 0; _dbus_string_init_const (&file_suffix, suffix); len = _dbus_string_get_length (dirs); while (_dbus_string_find (dirs, start, _DBUS_PATH_SEPARATOR, &i)) { DBusString path; if (!_dbus_string_init (&path)) goto oom; if (!_dbus_string_copy_len (dirs, start, i - start, &path, 0)) { _dbus_string_free (&path); goto oom; } _dbus_string_chop_white (&path); /* check for an empty path */ if (_dbus_string_get_length (&path) == 0) goto next; if (!_dbus_concat_dir_and_file (&path, &file_suffix)) { _dbus_string_free (&path); goto oom; } if (!_dbus_string_copy_data(&path, &cpath)) { _dbus_string_free (&path); goto oom; } if (!_dbus_list_append (dir_list, cpath)) { _dbus_string_free (&path); dbus_free (cpath); goto oom; } next: _dbus_string_free (&path); start = i + 1; } if (start != len) { DBusString path; if (!_dbus_string_init (&path)) goto oom; if (!_dbus_string_copy_len (dirs, start, len - start, &path, 0)) { _dbus_string_free (&path); goto oom; } if (!_dbus_concat_dir_and_file (&path, &file_suffix)) { _dbus_string_free (&path); goto oom; } if (!_dbus_string_copy_data(&path, &cpath)) { _dbus_string_free (&path); goto oom; } if (!_dbus_list_append (dir_list, cpath)) { _dbus_string_free (&path); dbus_free (cpath); goto oom; } _dbus_string_free (&path); } return TRUE; oom: _dbus_list_foreach (dir_list, (DBusForeachFunction)dbus_free, NULL); _dbus_list_clear (dir_list); return FALSE; }
static dbus_bool_t _dbus_read_uuid_file_without_creating (const DBusString *filename, DBusGUID *uuid, DBusError *error) { DBusString contents; DBusString decoded; int end; if (!_dbus_string_init (&contents)) { _DBUS_SET_OOM (error); return FALSE; } if (!_dbus_string_init (&decoded)) { _dbus_string_free (&contents); _DBUS_SET_OOM (error); return FALSE; } if (!_dbus_file_get_contents (&contents, filename, error)) goto error; _dbus_string_chop_white (&contents); if (_dbus_string_get_length (&contents) != DBUS_UUID_LENGTH_HEX) { dbus_set_error (error, DBUS_ERROR_INVALID_FILE_CONTENT, "UUID file '%s' should contain a hex string of length %d, not length %d, with no other text", _dbus_string_get_const_data (filename), DBUS_UUID_LENGTH_HEX, _dbus_string_get_length (&contents)); goto error; } if (!_dbus_string_hex_decode (&contents, 0, &end, &decoded, 0)) { _DBUS_SET_OOM (error); goto error; } if (end == 0) { dbus_set_error (error, DBUS_ERROR_INVALID_FILE_CONTENT, "UUID file '%s' contains invalid hex data", _dbus_string_get_const_data (filename)); goto error; } if (_dbus_string_get_length (&decoded) != DBUS_UUID_LENGTH_BYTES) { dbus_set_error (error, DBUS_ERROR_INVALID_FILE_CONTENT, "UUID file '%s' contains %d bytes of hex-encoded data instead of %d", _dbus_string_get_const_data (filename), _dbus_string_get_length (&decoded), DBUS_UUID_LENGTH_BYTES); goto error; } _dbus_string_copy_to_buffer (&decoded, uuid->as_bytes, DBUS_UUID_LENGTH_BYTES); _dbus_string_free (&decoded); _dbus_string_free (&contents); _DBUS_ASSERT_ERROR_IS_CLEAR (error); return TRUE; error: _DBUS_ASSERT_ERROR_IS_SET (error); _dbus_string_free (&contents); _dbus_string_free (&decoded); return FALSE; }