--- control-center-2.14.1/capplets/theme-switcher/gnome-theme-installer.c.orig 2006-04-16 16:41:35.000000000 +0200 +++ control-center-2.14.1/capplets/theme-switcher/gnome-theme-installer.c 2006-04-16 17:29:05.000000000 +0200 @@ -139,19 +139,31 @@ transfer_done_targz_idle_cb (gpointer data) { int status; - gchar *command, *filename; + gchar *command, *filename, *gzip, *tar; theme_properties *theme_props = data; + + if (!(gzip = g_find_program_in_path("gzip"))) { + return FALSE; + } + if (!(tar = g_find_program_in_path("tar"))) { + g_free(gzip); + return FALSE; + } /* this should be something more clever and nonblocking */ filename = g_shell_quote(theme_props->filename); - command = g_strdup_printf ("sh -c 'cd \"%s\"; /bin/gzip -d -c < \"%s\" | /bin/tar xf - '", - theme_props->target_tmp_dir, filename); + command = g_strdup_printf ("sh -c 'cd \"%s\"; %s -d -c < \"%s\" | %s xf - '", + theme_props->target_tmp_dir, gzip, filename, tar); g_free(filename); if (g_spawn_command_line_sync (command, NULL, NULL, &status, NULL) && status == 0) { g_free (command); + g_free(gzip); + g_free(tar); return TRUE; } else { g_free (command); + g_free(gzip); + g_free(tar); return FALSE; } } @@ -171,19 +183,31 @@ transfer_done_tarbz2_idle_cb (gpointer data) { int status; - gchar *command, *filename; + gchar *command, *filename, *bzip2, *tar; theme_properties *theme_props = data; + + if (!(bzip2 = g_find_program_in_path("bzip2"))) { + return FALSE; + } + if (!(tar = g_find_program_in_path("tar"))) { + g_free(bzip2); + return FALSE; + } filename = g_shell_quote(theme_props->filename); /* this should be something more clever and nonblocking */ - command = g_strdup_printf ("sh -c 'cd \"%s\"; /usr/bin/bzip2 -d -c < \"%s\" | /bin/tar xf - '", - theme_props->target_tmp_dir, filename); + command = g_strdup_printf ("sh -c 'cd \"%s\"; %s -d -c < \"%s\" | %s xf - '", + theme_props->target_tmp_dir, bzip2, filename, tar); g_free (filename); if (g_spawn_command_line_sync (command, NULL, NULL, &status, NULL) && status == 0) { g_free (command); + g_free(bzip2); + g_free(tar); return TRUE; } else { g_free (command); + g_free(bzip2); + g_free(tar); return FALSE; } } @@ -193,7 +217,7 @@ { GtkWidget *dialog; int len = strlen (path); - gchar *command,**dir, *first_line, *filename; + gchar *command,**dir, *first_line, *filename, *gzip, *bzip2, *tar; int status,theme_type; theme_properties *theme_props; GnomeVFSURI *theme_source_dir, *theme_dest_dir; @@ -205,18 +229,21 @@ theme_props->target_tmp_dir = g_strdup_printf ("%s/.themes/.theme-%u", g_get_home_dir(), g_random_int()); - + + gzip = g_find_program_in_path("gzip"); + bzip2 = g_find_program_in_path("bzip2"); + tar = g_find_program_in_path("tar"); - if (path && len > 7 && ( (!strcmp (path + len - 7, ".tar.gz")) || (!strcmp (path + len - 4, ".tgz")) )) { + if (tar && gzip && path && len > 7 && ( (!strcmp (path + len - 7, ".tar.gz")) || (!strcmp (path + len - 4, ".tgz")) )) { filename = g_shell_quote (path); - command = g_strdup_printf ("sh -c '/bin/gzip -d -c < \"%s\" | /bin/tar ft - | head -n 1'", - filename); + command = g_strdup_printf ("sh -c '%s -d -c < \"%s\" | %s ft - | head -1'", + gzip, filename, tar); theme_props->filetype=TARGZ; g_free (filename); - } else if (path && len > 8 && !strcmp (path + len - 8, ".tar.bz2")) { + } else if (tar && bzip2 && path && len > 8 && !strcmp (path + len - 8, ".tar.bz2")) { filename = g_shell_quote (path); - command = g_strdup_printf ("sh -c '/usr/bin/bzip2 -d -c < \"%s\" | /bin/tar ft - | head -n 1'", - filename); + command = g_strdup_printf ("sh -c '%s -d -c < \"%s\" | %s ft - | head -1'", + bzip2, filename, tar); theme_props->filetype=TARBZ; g_free (filename); } else { @@ -230,6 +257,9 @@ gnome_vfs_unlink(path); g_free (theme_props->target_tmp_dir); g_free (theme_props); + g_free(gzip); + g_free(bzip2); + g_free(tar); return; } @@ -245,6 +275,9 @@ g_free (command); g_free (theme_props->target_tmp_dir); g_free (theme_props); + g_free(gzip); + g_free(bzip2); + g_free(tar); return; } @@ -252,7 +285,7 @@ theme_props->filename=g_strdup(path); if (theme_props->filetype == TARBZ ) { - if (!g_file_test ("/usr/bin/bzip2", G_FILE_TEST_EXISTS)) { + if (!bzip2) { dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, @@ -265,6 +298,9 @@ g_free (theme_props->target_tmp_dir); g_free (theme_props->filename); g_free (theme_props); + g_free(gzip); + g_free(bzip2); + g_free(tar); return; } @@ -281,12 +317,15 @@ g_free (theme_props->filename); g_free (theme_props); g_free (command); + g_free(gzip); + g_free(bzip2); + g_free(tar); return; } } if (theme_props->filetype == TARGZ ) { - if (!g_file_test ("/bin/gzip", G_FILE_TEST_EXISTS)) { + if (!gzip) { dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, @@ -299,6 +338,9 @@ g_free (theme_props->target_tmp_dir); g_free (theme_props->filename); g_free (theme_props); + g_free(gzip); + g_free(bzip2); + g_free(tar); return; } if (!transfer_done_targz_idle_cb(theme_props)) { @@ -314,6 +356,9 @@ g_free (theme_props->filename); g_free (theme_props); g_free (command); + g_free(gzip); + g_free(bzip2); + g_free(tar); return; } } @@ -351,6 +396,9 @@ g_free (theme_props->theme_tmp_dir); g_free (theme_props); g_free (command); + g_free(gzip); + g_free(bzip2); + g_free(tar); return; } else { dialog = gtk_message_dialog_new (NULL, @@ -365,6 +413,9 @@ g_free (theme_props->theme_tmp_dir); g_free (theme_props); g_free (command); + g_free(gzip); + g_free(bzip2); + g_free(tar); return; } /* Move the Dir to the target dir */ @@ -391,6 +442,9 @@ g_free (theme_props->user_message); g_free (theme_props); g_free (command); + g_free(gzip); + g_free(bzip2); + g_free(tar); return; } else { dialog = gtk_message_dialog_new (NULL, @@ -408,6 +462,9 @@ g_free (theme_props->user_message); g_free (theme_props); g_free (command); + g_free(gzip); + g_free(bzip2); + g_free(tar); return; } @@ -416,6 +473,9 @@ g_free (theme_props->target_tmp_dir); g_free (theme_props->filename); g_free (theme_props); + g_free(gzip); + g_free(bzip2); + g_free(tar); } static void