From: <si...@us...> - 2014-07-30 15:39:16
|
Revision: 946 http://sourceforge.net/p/osmo-pim/code/946 Author: silloz Date: 2014-07-30 15:39:11 +0000 (Wed, 30 Jul 2014) Log Message: ----------- * Restored backup functionality Modified Paths: -------------- trunk/configure.ac trunk/src/backup.c Modified: trunk/configure.ac =================================================================== --- trunk/configure.ac 2014-07-26 15:19:02 UTC (rev 945) +++ trunk/configure.ac 2014-07-30 15:39:11 UTC (rev 946) @@ -77,6 +77,7 @@ have_libarchive=false) if test "x$have_libarchive" = "xtrue"; then libarchive="yes" + libarchive_LIBS="-larchive" AC_DEFINE([HAVE_LIBARCHIVE], [1], [Defined to 1 if compile with libarchive support]) else libarchive="no" @@ -84,15 +85,15 @@ AM_CONDITIONAL([HAVE_LIBARCHIVE], test "x$have_libarchive" = "xtrue") # Checks for libsqlite3 -PKG_CHECK_MODULES(LIBSQLITE3, sqlite3 >= 3.7.0, have_libsqlite3=true, - have_libsqlite3=false) -if test "x$have_libsqlite3" = "xtrue"; then - AC_DEFINE([HAVE_LIBSQLITE3], [1], [Definded to 1 if compile with libsqlite3 support]) - libsqlite3="yes" -else - libsqlite3="no" -fi -AM_CONDITIONAL([HAVE_LIBSQLITE3], test "x$have_libsqlite3" = "xtrue") +#PKG_CHECK_MODULES(LIBSQLITE3, sqlite3 >= 3.7.0, have_libsqlite3=true, +# have_libsqlite3=false) +#if test "x$have_libsqlite3" = "xtrue"; then +# AC_DEFINE([HAVE_LIBSQLITE3], [1], [Definded to 1 if compile with libsqlite3 support]) +# libsqlite3="yes" +#else +# libsqlite3="no" +#fi +#AM_CONDITIONAL([HAVE_LIBSQLITE3], test "x$have_libsqlite3" = "xtrue") # Checks for libical PKG_CHECK_MODULES(LIBICAL, libical >= 0.33, have_libical=true, @@ -201,8 +202,8 @@ if test "x$backup" = "xyes"; then if test "x$libarchive" = "xyes"; then if test "x$libgringotts" = "xyes"; then - dnl AC_DEFINE([BACKUP_SUPPORT], [1], [Defined if backup support is enabled]) - dnl else + AC_DEFINE([BACKUP_SUPPORT], [1], [Defined if backup support is enabled]) + else backup="no" fi else @@ -222,7 +223,7 @@ CFLAGS=${CFLAGS:="$BUILD_CFLAGS -Wall $PLATFORM_CFLAGS -D_GNU_SOURCE"} CXXFLAGS=${CXXFLAGS:="$CFLAGS"} CPPFLAGS="" -LIBS="$gringotts_LIBS" +LIBS="$gringotts_LIBS $libarchive_LIBS" AC_CONFIG_FILES([ Makefile @@ -244,7 +245,6 @@ # WIN32 build AM_CONDITIONAL([WIN32], test "$WIN32" = "yes") -# Backup support: $backup (libgringotts and libarchive are required) echo " Configuration: @@ -252,7 +252,7 @@ Prefix: $prefix Debug enabled: $debug - Backup support: $backup (*** temporarily disabled ***) + Backup support: $backup (libgringotts and libarchive are required) Printing support: $printing HTML renderer: $htmlrender Modified: trunk/src/backup.c =================================================================== --- trunk/src/backup.c 2014-07-26 15:19:02 UTC (rev 945) +++ trunk/src/backup.c 2014-07-30 15:39:11 UTC (rev 946) @@ -38,10 +38,84 @@ #if defined(BACKUP_SUPPORT) && defined(HAVE_LIBGRINGOTTS) #include <libgringotts.h> -#include <libtar.h> +#include <archive.h> +#include <archive_entry.h> /*------------------------------------------------------------------------------*/ +int +tar_archive (const gchar *outname, GUI *appGUI) +{ + struct archive *archive; + struct archive_entry *entry; + struct stat st; + gchar buff[8192]; + gint len; + gint fd; + gint i = 0; + gchar *filename = NULL; + + archive = archive_write_new (); + archive_write_set_format_ustar (archive); + if (archive_write_open_filename (archive, outname) != ARCHIVE_OK) + { + g_printf ("%s\n", archive_error_string (archive)); + return archive_errno (archive); + } + + while ((filename = g_slist_nth_data (appGUI->file_list, i)) != NULL) + { + stat (filename, &st); + entry = archive_entry_new (); + archive_entry_copy_stat (entry, &st); + archive_entry_set_pathname (entry, filename); + archive_write_header (archive, entry); + fd = open (filename, O_RDONLY); + len = read (fd, buff, sizeof (buff)); + while (len > 0) + { + archive_write_data (archive, buff, len); + len = read (fd, buff, sizeof (buff)); + } + close (fd); + archive_entry_free (entry); + i++; + } + + archive_write_finish (archive); + + return ARCHIVE_OK; +} + +/*------------------------------------------------------------------------------*/ + +int +untar_archive (gchar *filename) +{ + struct archive_entry *entry; + struct archive *archive; + + archive = archive_read_new (); + + if ((archive_read_support_compression_all (archive) != ARCHIVE_OK) || + (archive_read_support_format_all (archive) != ARCHIVE_OK) || + (archive_read_open_filename (archive, filename, 8192) != ARCHIVE_OK)) + { + archive_read_finish (archive); + g_printf ("%s\n", archive_error_string (archive)); + return archive_errno (archive); + } + + while (archive_read_next_header (archive, &entry) == ARCHIVE_OK) + archive_read_extract (archive, entry, ARCHIVE_EXTRACT_OWNER | ARCHIVE_EXTRACT_PERM); + + archive_read_finish (archive); + + return ARCHIVE_OK; +} + +/*------------------------------------------------------------------------------*/ + void add_all_files_to_list (gchar *directory, gboolean subdir, GUI *appGUI) { @@ -137,8 +211,7 @@ backup_create (GUI *appGUI) { gchar *home_dirname = NULL; -gchar *fitem = NULL; -gint i, ret, p1len, p2len, tErr; +gint ret, p1len, p2len, tErr; GRG_CTX context; GRG_KEY keyholder; gchar *filename, *password, *bpass1, *bpass2, *tmp_filename; @@ -149,8 +222,6 @@ GtkWidget *vbox1, *alignment, *frame, *label; GtkWidget *bck_p1_entry, *bck_p2_entry; -TAR *tArch; - /* select filename and password */ dialog = gtk_file_chooser_dialog_new (_("Save backup"), @@ -303,26 +374,12 @@ g_chdir (prefs_get_config_dir(appGUI)); /* change directory to cfg home */ g_unlink (tmp_filename); - tErr = i = 0; + tErr = tar_archive (tmp_filename, appGUI); - if (tar_open (&tArch, tmp_filename, NULL, O_WRONLY | O_CREAT | O_EXCL, 0644, TAR_GNU) != -1) { - - while ((fitem = g_slist_nth_data (appGUI->file_list, i)) != NULL) { - if (tar_append_file (tArch, fitem, fitem) != 0) { - tErr = -1; - break; - } - i++; - } - - } else { - tErr = -1; - } - g_chdir (home_dirname); g_free (home_dirname); - if (tErr == -1) { + if (tErr != ARCHIVE_OK) { utl_gui_create_dialog (GTK_MESSAGE_ERROR, _("Cannot create backup!"), GTK_WINDOW(appGUI->main_window)); return; } @@ -565,8 +622,6 @@ const gchar *item_name = NULL; gchar *fitem = NULL, separator[2] = { G_DIR_SEPARATOR, '\0' }; -TAR *tArch; - /* is backup file available? */ tmp_filename = g_strdup (prefs_get_config_filename (BACKUP_TEMPLATE, appGUI)); @@ -576,10 +631,6 @@ return; } - /* is it a TAR archive? */ - - /* FIXME: How to check integrity of TAR archive? */ - /* removing old files */ appGUI->file_list = NULL; @@ -609,10 +660,7 @@ /* untar files */ - if (tar_open (&tArch, tmp_filename, NULL, O_RDONLY, 0, TAR_GNU) >= 0) { - tar_extract_all (tArch, "."); - tar_close (tArch); - } + untar_archive (tmp_filename); /* clean up */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |