From e05fb7b3e36c052baf0dd607ddeb22c0a2b5cbde Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:47:04 +0200 Subject: Adding upstream version 43.2. Signed-off-by: Daniel Baumann --- .../gnome-initial-setup-copy-worker.c | 98 ++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 gnome-initial-setup/gnome-initial-setup-copy-worker.c (limited to 'gnome-initial-setup/gnome-initial-setup-copy-worker.c') diff --git a/gnome-initial-setup/gnome-initial-setup-copy-worker.c b/gnome-initial-setup/gnome-initial-setup-copy-worker.c new file mode 100644 index 0000000..5d8bab0 --- /dev/null +++ b/gnome-initial-setup/gnome-initial-setup-copy-worker.c @@ -0,0 +1,98 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* Copies settings installed from gnome-initial-setup and + * sticks them in the user's profile */ + +#include +#include +#include +#include + +static char * +get_gnome_initial_setup_home_dir (void) +{ + struct passwd pw, *pwp; + char buf[4096]; + + getpwnam_r ("gnome-initial-setup", &pw, buf, sizeof (buf), &pwp); + if (pwp != NULL) + return g_strdup (pwp->pw_dir); + else + return NULL; +} + +static gboolean +file_is_ours (GFile *file) +{ + GFileInfo *info; + uid_t uid; + + info = g_file_query_info (file, + G_FILE_ATTRIBUTE_UNIX_UID, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + NULL, + NULL); + if (!info) + return FALSE; + + uid = g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_UID); + g_object_unref (info); + + return uid == geteuid (); +} + +static void +move_file_from_homedir (GFile *src_base, + GFile *dest_base, + const gchar *path) +{ + GFile *dest = g_file_get_child (dest_base, path); + GFile *dest_parent = g_file_get_parent (dest); + GFile *src = g_file_get_child (src_base, path); + + GError *error = NULL; + + g_file_make_directory_with_parents (dest_parent, NULL, NULL); + + if (!g_file_move (src, dest, G_FILE_COPY_NONE, + NULL, NULL, NULL, &error)) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) { + g_warning ("Unable to move %s to %s: %s", + g_file_get_path (src), + g_file_get_path (dest), + error->message); + } + } +} + +int +main (int argc, + char **argv) +{ + GFile *src; + GFile *dest; + char *initial_setup_homedir; + + initial_setup_homedir = get_gnome_initial_setup_home_dir (); + if (initial_setup_homedir == NULL) + exit (EXIT_SUCCESS); + + src = g_file_new_for_path (initial_setup_homedir); + + if (!g_file_query_exists (src, NULL) || + !file_is_ours (src)) + exit (EXIT_SUCCESS); + + dest = g_file_new_for_path (g_get_home_dir ()); + +#define FILE(path) \ + move_file_from_homedir (src, dest, path); + + FILE (".config/gnome-initial-setup-done"); + FILE (".config/dconf/user"); + FILE (".config/goa-1.0/accounts.conf"); + FILE (".config/monitors.xml"); + FILE (".local/share/keyrings/login.keyring"); + + return EXIT_SUCCESS; +} -- cgit v1.2.3