From cd16c77c7b7ca90c3e74de0790878127fe82901f Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Tue, 28 Jan 2014 16:06:12 +0000 Subject: [PATCH] Fixes using --cache-age when using the hawkey backend --- PackageKit.spec | 7 +- master.patch | 639 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 645 insertions(+), 1 deletion(-) diff --git a/PackageKit.spec b/PackageKit.spec index f9550e9..5c174f2 100644 --- a/PackageKit.spec +++ b/PackageKit.spec @@ -6,7 +6,7 @@ Summary: Package management service Name: PackageKit Version: 0.8.16 -Release: 2%{?dist} +Release: 3%{?dist} License: GPLv2+ and LGPLv2+ URL: http://www.packagekit.org Source0: http://www.packagekit.org/releases/%{name}-%{version}.tar.xz @@ -340,6 +340,11 @@ popd > /dev/null %{_datadir}/gtk-doc/html/PackageKit %changelog +* Tue Jan 28 2014 Richard Hughes - 0.8.16-3 +- Backport three patches from master +- Fixes using --cache-age when using the hawkey backend +- Adds the shutdown-after-offline-update mode + * Thu Jan 23 2014 Richard Hughes - 0.8.16-2 - Backport two patches from master to fix up problems in the hawkey backend. diff --git a/master.patch b/master.patch index 5d68283..4770d10 100644 --- a/master.patch +++ b/master.patch @@ -163,3 +163,642 @@ index b069396..40831b9 100644 g_free (verbosity_string); if (commit != NULL) { g_timer_destroy (commit->timer); +diff --git a/backends/hawkey/hif-sack.c b/backends/hawkey/hif-sack.c +index 28c1a65..0c151c3 100644 +--- a/backends/hawkey/hif-sack.c ++++ b/backends/hawkey/hif-sack.c +@@ -34,6 +34,7 @@ + gboolean + hif_sack_add_source (HySack sack, + HifSource *src, ++ guint permissible_cache_age, + HifSackAddFlags flags, + HifState *state, + GError **error) +@@ -54,7 +55,10 @@ hif_sack_add_source (HySack sack, + + /* check repo */ + state_local = hif_state_get_child (state); +- ret = hif_source_check (src, state_local, &error_local); ++ ret = hif_source_check (src, ++ permissible_cache_age, ++ state_local, ++ &error_local); + if (!ret) { + g_debug ("failed to check, attempting update: %s", + error_local->message); +@@ -118,6 +122,7 @@ out: + gboolean + hif_sack_add_sources (HySack sack, + GPtrArray *sources, ++ guint permissible_cache_age, + HifSackAddFlags flags, + HifState *state, + GError **error) +@@ -143,7 +148,12 @@ hif_sack_add_sources (HySack sack, + continue; + + state_local = hif_state_get_child (state); +- ret = hif_sack_add_source (sack, src, flags, state_local, error); ++ ret = hif_sack_add_source (sack, ++ src, ++ permissible_cache_age, ++ flags, ++ state_local, ++ error); + if (!ret) + goto out; + +diff --git a/backends/hawkey/hif-sack.h b/backends/hawkey/hif-sack.h +index abfe7f9..435e95b 100644 +--- a/backends/hawkey/hif-sack.h ++++ b/backends/hawkey/hif-sack.h +@@ -39,11 +39,13 @@ typedef enum { + + gboolean hif_sack_add_source (HySack sack, + HifSource *src, ++ guint permissible_cache_age, + HifSackAddFlags flags, + HifState *state, + GError **error); + gboolean hif_sack_add_sources (HySack sack, + GPtrArray *sources, ++ guint permissible_cache_age, + HifSackAddFlags flags, + HifState *state, + GError **error); +diff --git a/backends/hawkey/hif-source.c b/backends/hawkey/hif-source.c +index fffcc31..3dc5c85 100644 +--- a/backends/hawkey/hif-source.c ++++ b/backends/hawkey/hif-source.c +@@ -44,7 +44,8 @@ struct HifSource { + gchar *id; + gchar *location; /* /var/cache/PackageKit/metadata/fedora */ + gchar *location_tmp; /* /var/cache/PackageKit/metadata/fedora.tmp */ +- gint64 timestamp; ++ gint64 timestamp_generated; /* µs */ ++ gint64 timestamp_modified; /* µs */ + GKeyFile *keyfile; + HifSourceKind kind; + HyRepo repo; +@@ -342,10 +343,48 @@ hif_source_update_state_cb (void *user_data, + } + + /** ++ * hif_source_set_timestamp_modified: ++ */ ++static gboolean ++hif_source_set_timestamp_modified (HifSource *src, GError **error) ++{ ++ gboolean ret = TRUE; ++ gchar *filename; ++ GFile *file; ++ GFileInfo *info; ++ ++ filename = g_build_filename (src->location, "repodata", "repomd.xml", NULL); ++ file = g_file_new_for_path (filename); ++ info = g_file_query_info (file, ++ G_FILE_ATTRIBUTE_TIME_MODIFIED "," ++ G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC, ++ G_FILE_QUERY_INFO_NONE, ++ NULL, ++ error); ++ if (info == NULL) { ++ ret = FALSE; ++ goto out; ++ } ++ src->timestamp_modified = g_file_info_get_attribute_uint64 (info, ++ G_FILE_ATTRIBUTE_TIME_MODIFIED) * G_USEC_PER_SEC; ++ src->timestamp_modified += g_file_info_get_attribute_uint32 (info, ++ G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC); ++out: ++ g_free (filename); ++ g_object_unref (file); ++ if (info != NULL) ++ g_object_unref (info); ++ return ret; ++} ++ ++/** + * hif_source_check: + */ + gboolean +-hif_source_check (HifSource *src, HifState *state, GError **error) ++hif_source_check (HifSource *src, ++ guint permissible_cache_age, ++ HifState *state, ++ GError **error) + { + const gchar *download_list[] = { "primary", + "filelists", +@@ -357,6 +396,7 @@ hif_source_check (HifSource *src, HifState *state, GError **error) + GError *error_local = NULL; + LrYumRepo *yum_repo; + const gchar *urls[] = { "", NULL }; ++ gint64 age_of_data; /* in seconds */ + + /* has the media repo vanished? */ + if (src->kind == HIF_SOURCE_KIND_MEDIA && +@@ -406,7 +446,7 @@ hif_source_check (HifSource *src, HifState *state, GError **error) + + /* get timestamp */ + ret = lr_result_getinfo (src->repo_result, &error_local, +- LRR_YUM_TIMESTAMP, &src->timestamp); ++ LRR_YUM_TIMESTAMP, &src->timestamp_generated); + if (!ret) { + g_set_error (error, + HIF_ERROR, +@@ -417,6 +457,23 @@ hif_source_check (HifSource *src, HifState *state, GError **error) + goto out; + } + ++ /* check metadata age */ ++ if (permissible_cache_age != G_MAXUINT) { ++ ret = hif_source_set_timestamp_modified (src, error); ++ if (!ret) ++ goto out; ++ age_of_data = (g_get_real_time () - src->timestamp_modified) / G_USEC_PER_SEC; ++ if (age_of_data > permissible_cache_age) { ++ ret = FALSE; ++ g_set_error (error, ++ HIF_ERROR, ++ PK_ERROR_ENUM_INTERNAL_ERROR, ++ "cache too old: %"G_GINT64_FORMAT" > %i", ++ age_of_data, permissible_cache_age); ++ goto out; ++ } ++ } ++ + /* create a HyRepo */ + src->repo = hy_repo_create (src->id); + hy_repo_set_string (src->repo, HY_REPO_MD_FN, yum_repo->repomd); +@@ -653,7 +710,7 @@ hif_source_update (HifSource *src, + goto out; + } + if ((flags & HIF_SOURCE_UPDATE_FLAG_FORCE) == 0 || +- timestamp_new < src->timestamp) { ++ timestamp_new < src->timestamp_generated) { + g_debug ("fresh metadata was older than what we have, ignoring"); + goto out; + } +@@ -686,7 +743,7 @@ hif_source_update (HifSource *src, + + /* now setup internal hawkey stuff */ + state_local = hif_state_get_child (state); +- ret = hif_source_check (src, state_local, error); ++ ret = hif_source_check (src, G_MAXUINT, state_local, error); + if (!ret) + goto out; + +diff --git a/backends/hawkey/hif-source.h b/backends/hawkey/hif-source.h +index df4b805..f1d230e 100644 +--- a/backends/hawkey/hif-source.h ++++ b/backends/hawkey/hif-source.h +@@ -62,6 +62,7 @@ gchar *hif_source_get_description (HifSource *src); + HyRepo hif_source_get_repo (HifSource *src); + gboolean hif_source_is_devel (HifSource *src); + gboolean hif_source_check (HifSource *src, ++ guint permissible_cache_age, + HifState *state, + GError **error); + gboolean hif_source_update (HifSource *src, +diff --git a/backends/hawkey/pk-backend-hawkey.c b/backends/hawkey/pk-backend-hawkey.c +index 40831b9..1a10e04 100644 +--- a/backends/hawkey/pk-backend-hawkey.c ++++ b/backends/hawkey/pk-backend-hawkey.c +@@ -593,8 +593,12 @@ hif_utils_add_remote (PkBackendJob *job, + + /* add each repo */ + state_local = hif_state_get_child (state); +- ret = hif_sack_add_sources (sack, job_data->sources, +- flags, state_local, error); ++ ret = hif_sack_add_sources (sack, ++ job_data->sources, ++ pk_backend_job_get_cache_age (job), ++ flags, ++ state_local, ++ error); + if (!ret) + goto out; + +@@ -648,6 +652,13 @@ hif_utils_create_sack_for_filters (PkBackendJob *job, + } + g_timer_reset (priv->repos_timer); + ++ /* if we've specified a specific cache-age then do not use the cache */ ++ if ((flags & HIF_SACK_ADD_FLAG_REMOTE) > 0 && ++ pk_backend_job_get_cache_age (job) != G_MAXUINT) { ++ g_debug ("not reusing sack specific cache age requested"); ++ create_flags &= ~HIF_CREATE_SACK_FLAG_USE_CACHE; ++ } ++ + /* do we have anything in the cache */ + cache_key = g_strdup_printf ("HySack::%i", flags); + if ((create_flags & HIF_CREATE_SACK_FLAG_USE_CACHE) > 0) +@@ -1306,7 +1317,10 @@ pk_backend_get_mime_types (PkBackend *backend) + * pk_backend_refresh_source: + */ + static gboolean +-pk_backend_refresh_source (HifSource *src, HifState *state, GError **error) ++pk_backend_refresh_source (PkBackendJob *job, ++ HifSource *src, ++ HifState *state, ++ GError **error) + { + gboolean ret; + gboolean src_okay; +@@ -1323,7 +1337,10 @@ pk_backend_refresh_source (HifSource *src, HifState *state, GError **error) + + /* is the source up to date? */ + state_local = hif_state_get_child (state); +- src_okay = hif_source_check (src, state_local, &error_local); ++ src_okay = hif_source_check (src, ++ pk_backend_job_get_cache_age (job), ++ state_local, ++ &error_local); + if (!src_okay) { + g_debug ("repo %s not okay [%s], refreshing", + hif_source_get_id (src), error_local->message); +@@ -1424,7 +1441,7 @@ pk_backend_refresh_cache_thread (PkBackendJob *job, + + /* check and download */ + state_local = hif_state_get_child (job_data->state); +- ret = pk_backend_refresh_source (src, state_local, &error); ++ ret = pk_backend_refresh_source (job, src, state_local, &error); + if (!ret) { + pk_backend_job_error_code (job, error->code, "%s", error->message); + g_error_free (error); +@@ -3199,21 +3216,20 @@ out: + } + + /** +- * hif_is_installed_package_name_arch: ++ * hif_is_installed_package_id_name: + */ + static gboolean +-hif_is_installed_package_name_arch (HySack sack, +- const gchar *name, +- const gchar *arch) ++hif_is_installed_package_id_name (HySack sack, const gchar *package_id) + { + gboolean ret; ++ gchar **split; + HyPackageList pkglist = NULL; + HyQuery query = NULL; + + /* run query */ + query = hy_query_create (sack); +- hy_query_filter (query, HY_PKG_NAME, HY_EQ, name); +- hy_query_filter (query, HY_PKG_ARCH, HY_EQ, arch); ++ split = pk_package_id_split (package_id); ++ hy_query_filter (query, HY_PKG_NAME, HY_EQ, split[PK_PACKAGE_ID_NAME]); + hy_query_filter (query, HY_PKG_REPONAME, HY_EQ, HY_SYSTEM_REPO_NAME); + pkglist = hy_query_run (query); + +@@ -3222,21 +3238,34 @@ hif_is_installed_package_name_arch (HySack sack, + + hy_packagelist_free (pkglist); + hy_query_free (query); ++ g_strfreev (split); + return ret; + } + + /** +- * hif_is_installed_package_id: ++ * hif_is_installed_package_id_name_arch: + */ + static gboolean +-hif_is_installed_package_id (HySack sack, const gchar *package_id) ++hif_is_installed_package_id_name_arch (HySack sack, const gchar *package_id) + { + gboolean ret; + gchar **split; ++ HyPackageList pkglist = NULL; ++ HyQuery query = NULL; ++ ++ /* run query */ ++ query = hy_query_create (sack); + split = pk_package_id_split (package_id); +- ret = hif_is_installed_package_name_arch (sack, +- split[PK_PACKAGE_ID_NAME], +- split[PK_PACKAGE_ID_ARCH]); ++ hy_query_filter (query, HY_PKG_NAME, HY_EQ, split[PK_PACKAGE_ID_NAME]); ++ hy_query_filter (query, HY_PKG_ARCH, HY_EQ, split[PK_PACKAGE_ID_ARCH]); ++ hy_query_filter (query, HY_PKG_REPONAME, HY_EQ, HY_SYSTEM_REPO_NAME); ++ pkglist = hy_query_run (query); ++ ++ /* any matches? */ ++ ret = hy_packagelist_count (pkglist) > 0; ++ ++ hy_packagelist_free (pkglist); ++ hy_query_free (query); + g_strfreev (split); + return ret; + } +@@ -3322,7 +3351,7 @@ pk_backend_remove_packages_thread (PkBackendJob *job, GVariant *params, gpointer + + /* ensure packages are already installed */ + for (i = 0; package_ids[i] != NULL; i++) { +- ret = hif_is_installed_package_id (sack, package_ids[i]); ++ ret = hif_is_installed_package_id_name_arch (sack, package_ids[i]); + if (!ret) { + gchar *printable_tmp; + printable_tmp = pk_package_id_to_printable (package_ids[i]); +@@ -3465,7 +3494,7 @@ pk_backend_install_packages_thread (PkBackendJob *job, GVariant *params, gpointe + + /* ensure packages are not already installed */ + for (i = 0; package_ids[i] != NULL; i++) { +- ret = hif_is_installed_package_id (sack, package_ids[i]); ++ ret = hif_is_installed_package_id_name_arch (sack, package_ids[i]); + if (ret) { + gchar *printable_tmp; + printable_tmp = pk_package_id_to_printable (package_ids[i]); +@@ -3729,13 +3758,13 @@ pk_backend_update_packages_thread (PkBackendJob *job, GVariant *params, gpointer + + /* ensure packages are not already installed */ + for (i = 0; package_ids[i] != NULL; i++) { +- ret = hif_is_installed_package_id (sack, package_ids[i]); ++ ret = hif_is_installed_package_id_name (sack, package_ids[i]); + if (!ret) { + gchar *printable_tmp; + printable_tmp = pk_package_id_to_printable (package_ids[i]); + pk_backend_job_error_code (job, + PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, +- "%s is not already installed", ++ "cannot update: %s is not already installed", + printable_tmp); + g_free (printable_tmp); + goto out; +diff --git a/client/pk-console.c b/client/pk-console.c +index 79f1bb5..4f01942 100644 +--- a/client/pk-console.c ++++ b/client/pk-console.c +@@ -1801,7 +1801,7 @@ main (int argc, char *argv[]) + gboolean background = FALSE; + gboolean noninteractive = FALSE; + gboolean only_download = FALSE; +- guint cache_age = 0; ++ guint cache_age = G_MAXUINT; + gint retval_copy = 0; + gboolean plain = FALSE; + gboolean program_version = FALSE; +diff --git a/contrib/systemd-updates/pk-offline-update.c b/contrib/systemd-updates/pk-offline-update.c +index cf0447d..295b2dd 100644 +--- a/contrib/systemd-updates/pk-offline-update.c ++++ b/contrib/systemd-updates/pk-offline-update.c +@@ -33,6 +33,7 @@ + #define PK_OFFLINE_UPDATE_RESULTS_GROUP "PackageKit Offline Update Results" + #define PK_OFFLINE_UPDATE_TRIGGER_FILENAME "/system-update" + #define PK_OFFLINE_UPDATE_RESULTS_FILENAME "/var/lib/PackageKit/offline-update-competed" ++#define PK_OFFLINE_UPDATE_ACTION_FILENAME "/var/lib/PackageKit/offline-update-action" + #define PK_OFFLINE_PREPARED_UPDATE_FILENAME "/var/lib/PackageKit/prepared-update" + + /** +@@ -200,12 +201,6 @@ pk_offline_update_reboot (void) + GError *error = NULL; + GVariant *val = NULL; + +- /* allow testing without rebooting */ +- if (g_getenv ("PK_OFFLINE_UPDATE_TEST") != NULL) { +- g_print ("TESTING, so not rebooting\n"); +- return; +- } +- + /* reboot using systemd */ + sd_journal_print (LOG_INFO, "rebooting"); + pk_offline_update_set_plymouth_mode ("shutdown"); +@@ -245,6 +240,54 @@ out: + } + + /** ++ * pk_offline_update_power_off: ++ **/ ++static void ++pk_offline_update_power_off (void) ++{ ++ GDBusConnection *connection; ++ GError *error = NULL; ++ GVariant *val = NULL; ++ ++ /* reboot using systemd */ ++ sd_journal_print (LOG_INFO, "shutting down"); ++ pk_offline_update_set_plymouth_mode ("shutdown"); ++ /* TRANSLATORS: we've finished doing offline updates */ ++ pk_offline_update_set_plymouth_msg (_("Shutting down after installing updates…")); ++ connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); ++ if (connection == NULL) { ++ sd_journal_print (LOG_WARNING, ++ "Failed to get system bus connection: %s", ++ error->message); ++ g_error_free (error); ++ goto out; ++ } ++ val = g_dbus_connection_call_sync (connection, ++ "org.freedesktop.systemd1", ++ "/org/freedesktop/systemd1", ++ "org.freedesktop.systemd1.Manager", ++ "PowerOff", ++ NULL, ++ NULL, ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ NULL, ++ &error); ++ if (val == NULL) { ++ sd_journal_print (LOG_WARNING, ++ "Failed to power off: %s", ++ error->message); ++ g_error_free (error); ++ goto out; ++ } ++out: ++ if (connection != NULL) ++ g_object_unref (connection); ++ if (val != NULL) ++ g_variant_unref (val); ++} ++ ++/** + * pk_offline_update_write_error: + **/ + static void +@@ -487,6 +530,50 @@ pk_offline_update_sigint_cb (gpointer user_data) + return FALSE; + } + ++typedef enum { ++ PK_OFFLINE_UPDATE_ACTION_NOTHING, ++ PK_OFFLINE_UPDATE_ACTION_REBOOT, ++ PK_OFFLINE_UPDATE_ACTION_POWER_OFF ++} PkOfflineUpdateAction; ++ ++static PkOfflineUpdateAction ++pk_offline_update_get_action (void) ++{ ++ gboolean ret; ++ gchar *action_data = NULL; ++ PkOfflineUpdateAction action; ++ ++ /* allow testing without rebooting */ ++ if (g_getenv ("PK_OFFLINE_UPDATE_TEST") != NULL) { ++ g_print ("TESTING, so not doing action\n"); ++ action = PK_OFFLINE_UPDATE_ACTION_NOTHING; ++ goto out; ++ } ++ ++ ret = g_file_get_contents (PK_OFFLINE_UPDATE_ACTION_FILENAME, ++ &action_data, ++ NULL, ++ NULL); ++ if (!ret) { ++ g_warning ("Failed to get post-update action, using reboot"); ++ action = PK_OFFLINE_UPDATE_ACTION_REBOOT; ++ goto out; ++ } ++ if (g_strcmp0 (action_data, "reboot") == 0) { ++ action = PK_OFFLINE_UPDATE_ACTION_REBOOT; ++ goto out; ++ } ++ if (g_strcmp0 (action_data, "power-off") == 0) { ++ action = PK_OFFLINE_UPDATE_ACTION_POWER_OFF; ++ goto out; ++ } ++ g_warning ("failed to parse action '%s', using reboot", action_data); ++ action = PK_OFFLINE_UPDATE_ACTION_REBOOT; ++out: ++ g_free (action_data); ++ return action; ++} ++ + /** + * main: + **/ +@@ -502,6 +589,7 @@ main (int argc, char *argv[]) + GMainLoop *loop = NULL; + PkResults *results = NULL; + PkTask *task = NULL; ++ PkOfflineUpdateAction action; + PkProgressBar *progressbar = NULL; + + #if (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 35) +@@ -598,7 +686,12 @@ out: + g_timeout_add_seconds (10, pk_offline_update_loop_quit_cb, loop); + g_main_loop_run (loop); + } +- pk_offline_update_reboot (); ++ /* we have to manually either restart or shutdown */ ++ action = pk_offline_update_get_action (); ++ if (action == PK_OFFLINE_UPDATE_ACTION_REBOOT) ++ pk_offline_update_reboot (); ++ else if (action == PK_OFFLINE_UPDATE_ACTION_POWER_OFF) ++ pk_offline_update_power_off (); + g_free (packages_data); + g_strfreev (package_ids); + if (progressbar != NULL) +diff --git a/contrib/systemd-updates/pk-trigger-offline-update.c b/contrib/systemd-updates/pk-trigger-offline-update.c +index 3b59b1d..532bf3d 100644 +--- a/contrib/systemd-updates/pk-trigger-offline-update.c ++++ b/contrib/systemd-updates/pk-trigger-offline-update.c +@@ -30,17 +30,21 @@ + #include + + #define PK_OFFLINE_UPDATE_GENERATOR_FLAG "/system-update" ++#define PK_OFFLINE_UPDATE_ACTION_FILENAME "/var/lib/PackageKit/offline-update-action" + + int + main (int argc, char *argv[]) + { ++ FILE *fp = NULL; + int rc; ++ int retval = EXIT_SUCCESS; + struct passwd *pw; + + /* ensure root user */ + if (getuid () != 0 || geteuid () != 0) { + fprintf (stderr, "This program can only be used using pkexec\n"); +- return EXIT_FAILURE; ++ retval = EXIT_FAILURE; ++ goto out; + } + + if (argc > 1 && strcmp (argv[1], "--cancel") == 0) { +@@ -48,18 +52,34 @@ main (int argc, char *argv[]) + if (rc < 0) { + fprintf (stderr, "Failed to remove file " PK_OFFLINE_UPDATE_GENERATOR_FLAG ": %s\n", + strerror (errno)); +- return EXIT_FAILURE; ++ retval = EXIT_FAILURE; ++ goto out; + } + + return EXIT_SUCCESS; + } + ++ /* open success action */ ++ fp = fopen (PK_OFFLINE_UPDATE_ACTION_FILENAME, "w+"); ++ if (fp == NULL) { ++ fprintf (stderr, "Failed to open %s for writing\n", ++ PK_OFFLINE_UPDATE_ACTION_FILENAME); ++ retval = EXIT_FAILURE; ++ goto out; ++ } ++ if (argc > 1 && strcmp (argv[1], "power-off") == 0) { ++ fputs ("power-off", fp); ++ } else { ++ fputs ("reboot", fp); ++ } ++ + /* create symlink for the systemd-system-update-generator */ + rc = symlink ("/var/cache", PK_OFFLINE_UPDATE_GENERATOR_FLAG); + if (rc < 0) { + fprintf (stderr, "Failed to create symlink: %s\n", + strerror (errno)); +- return EXIT_FAILURE; ++ retval = EXIT_FAILURE; ++ goto out; + } + + /* get UID for username */ +@@ -67,7 +87,8 @@ main (int argc, char *argv[]) + if (pw == NULL) { + fprintf (stderr, "Failed to get PackageKit uid: %s\n", + strerror (errno)); +- return EXIT_FAILURE; ++ retval = EXIT_FAILURE; ++ goto out; + } + + /* change it to the PackageKit user so the daemon can delete +@@ -76,8 +97,11 @@ main (int argc, char *argv[]) + if (rc < 0) { + fprintf (stderr, "Failed to change owner of symlink: %s\n", + strerror (errno)); +- return EXIT_FAILURE; ++ retval = EXIT_FAILURE; ++ goto out; + } +- +- return EXIT_SUCCESS; ++out: ++ if (fp != NULL) ++ fclose (fp); ++ return retval; + } +diff --git a/lib/packagekit-glib2/pk-control.h b/lib/packagekit-glib2/pk-control.h +index a6c3493..3c483e6 100644 +--- a/lib/packagekit-glib2/pk-control.h ++++ b/lib/packagekit-glib2/pk-control.h +@@ -132,13 +132,6 @@ void pk_control_set_proxy2_async (PkControl *control, + gboolean pk_control_set_proxy_finish (PkControl *control, + GAsyncResult *res, + GError **error); +-void pk_control_get_network_state_async (PkControl *control, +- GCancellable *cancellable, +- GAsyncReadyCallback callback, +- gpointer user_data); +-PkNetworkEnum pk_control_get_network_state_finish (PkControl *control, +- GAsyncResult *res, +- GError **error); + void pk_control_get_time_since_action_async (PkControl *control, + PkRoleEnum role, + GCancellable *cancellable,