From d8c11a7c02aab629b774d45cfceb7d641bbad5ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20K=C3=B6hler?= Date: Mon, 15 Sep 2008 13:13:40 +0000 Subject: [PATCH] Bug #549595, #552306: Correct retval of gnc_int_link_or_make_backup(), add ENOSYS and ENOTSUP. The return value of link(2) on files residing on sshfs will be ENOSYS, on network hfsplus file systems on mac ENOTSUP, so add them to the list of those errnos that trigger copy_file as fallback in gnc_int_link_or_make_backup() or are allowed in gnc_file_be_get_file_lock() showing that hardlinks are not supported. To avoid silent data loss in the case of an unexpected errno in gnc_int_link_or_make_backup(), correctly set the backend error. Patches from Micha Lenk and Boris Zbarsky. BP git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@17524 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/backend/file/gnc-backend-file.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/backend/file/gnc-backend-file.c b/src/backend/file/gnc-backend-file.c index 5db948de1d..b50455d1e8 100644 --- a/src/backend/file/gnc-backend-file.c +++ b/src/backend/file/gnc-backend-file.c @@ -146,9 +146,15 @@ gnc_file_be_get_file_lock (FileBackend *be) /* If hard links aren't supported, just allow the lock. */ if (errno == EPERM # ifdef EOPNOTSUPP - || errno == EOPNOTSUPP + || errno == EOPNOTSUPP # endif - ) +# ifdef ENOTSUP + || errno == ENOTSUP +# endif +# ifdef ENOSYS + || errno == ENOSYS +# endif + ) { be->linkfile = NULL; return TRUE; @@ -395,6 +401,7 @@ copy_file(const char *orig, const char *bkup) static gboolean gnc_int_link_or_make_backup(FileBackend *be, const char *orig, const char *bkup) { + gboolean copy_success = FALSE; int err_ret = #ifdef HAVE_LINK link (orig, bkup) @@ -407,15 +414,21 @@ gnc_int_link_or_make_backup(FileBackend *be, const char *orig, const char *bkup) #ifdef HAVE_LINK if(errno == EPERM # ifdef EOPNOTSUPP - || errno == EOPNOTSUPP + || errno == EOPNOTSUPP # endif - ) +# ifdef ENOTSUP + || errno == ENOTSUP +# endif +# ifdef ENOSYS + || errno == ENOSYS +# endif + ) #endif { - err_ret = copy_file(orig, bkup); + copy_success = copy_file(orig, bkup); } - if(!err_ret) + if(!copy_success) { qof_backend_set_error((QofBackend*)be, ERR_FILEIO_BACKUP_ERROR); PWARN ("unable to make file backup from %s to %s: %s",