static BusDesktopFile * desktop_file_for_name (BusConfigParser *parser, const char *name, DBusError *error) { BusDesktopFile *desktop_file; DBusList **service_dirs; DBusList *link; DBusError tmp_error; DBusString full_path; DBusString filename; const char *dir; _DBUS_ASSERT_ERROR_IS_CLEAR (error); desktop_file = NULL; if (!_dbus_string_init (&filename)) { BUS_SET_OOM (error); goto out_all; } if (!_dbus_string_init (&full_path)) { BUS_SET_OOM (error); goto out_filename; } if (!_dbus_string_append (&filename, name) || !_dbus_string_append (&filename, ".service")) { BUS_SET_OOM (error); goto out; } service_dirs = bus_config_parser_get_service_dirs (parser); for (link = _dbus_list_get_first_link (service_dirs); link != NULL; link = _dbus_list_get_next_link (service_dirs, link)) { dir = link->data; _dbus_verbose ("Looking at '%s'\n", dir); dbus_error_init (&tmp_error); /* clear the path from last time */ _dbus_string_set_length (&full_path, 0); /* build the full path */ if (!_dbus_string_append (&full_path, dir) || !_dbus_concat_dir_and_file (&full_path, &filename)) { BUS_SET_OOM (error); goto out; } _dbus_verbose ("Trying to load file '%s'\n", _dbus_string_get_data (&full_path)); desktop_file = bus_desktop_file_load (&full_path, &tmp_error); if (desktop_file == NULL) { _DBUS_ASSERT_ERROR_IS_SET (&tmp_error); _dbus_verbose ("Could not load %s: %s: %s\n", _dbus_string_get_const_data (&full_path), tmp_error.name, tmp_error.message); /* we may have failed if the file is not found; this is not fatal */ if (dbus_error_has_name (&tmp_error, DBUS_ERROR_NO_MEMORY)) { dbus_move_error (&tmp_error, error); /* we only bail out on OOM */ goto out; } dbus_error_free (&tmp_error); } /* did we find the desktop file we want? */ if (desktop_file != NULL) break; } /* Didn't find desktop file; set error */ if (desktop_file == NULL) { dbus_set_error (error, DBUS_ERROR_SPAWN_SERVICE_NOT_FOUND, "The name %s was not provided by any .service files", name); } out: _dbus_string_free (&full_path); out_filename: _dbus_string_free (&filename); out_all: return desktop_file; }
static dbus_bool_t check_return_values (const DBusString *full_path) { BusConfigParser *parser; DBusError error; dbus_bool_t retval; const char *user; const char *type; DBusList **dirs; dbus_error_init (&error); retval = FALSE; printf ("Testing values from: %s\n", _dbus_string_get_const_data (full_path)); parser = bus_config_load (full_path, TRUE, NULL, &error); if (parser == NULL) { _DBUS_ASSERT_ERROR_IS_SET (&error); if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) _dbus_verbose ("Failed to load valid file due to OOM\n"); goto finish; } _DBUS_ASSERT_ERROR_IS_CLEAR (&error); /* check user return value is okay */ user = bus_config_parser_get_user (parser); if (user == NULL) { _dbus_warn ("User was NULL!\n"); goto finish; } #if 0 /* the username can be configured in configure.in so this test doesn't work */ if (strcmp (user, "dbus") != 0) { _dbus_warn ("User was invalid; '%s'!\n", user); goto finish; } printf (" <user>dbus</user> OKAY!\n"); #endif /* check type return value is okay */ type = bus_config_parser_get_type (parser); if (type == NULL) { _dbus_warn ("Type was NULL!\n"); goto finish; } if (strcmp (type, "system") != 0) { _dbus_warn ("Type was invalid; '%s'!\n", user); goto finish; } printf (" <type>system</type> OKAY!\n"); /* check dirs return value is okay */ dirs = bus_config_parser_get_service_dirs (parser); if (dirs == NULL) { _dbus_warn ("Service dirs are NULL!\n"); goto finish; } printf (" <standard_system_service_dirs/> OKAY!\n"); /* NOTE: We tested the specific return values in the config-parser tests */ /* woohoo! */ retval = TRUE; finish: if (parser != NULL) bus_config_parser_unref (parser); dbus_error_free (&error); return retval; }