From dabc314b71378f585fac2753149f3358e32ec621 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Wed, 4 Nov 2020 15:36:52 +0100 Subject: [PATCH] common: Fix duplicate implementation of try_make_homedir. * g10/openfile.c (try_make_homedir): Move core of the code to ... * common/homedir.c (gnupg_maybe_make_homedir): new. * sm/keydb.c (try_make_homedir): Implement using new function. * common/homedir.c: Include i18n.h. * po/POTFILES.in: Add common/homedir.c. Signed-off-by: Werner Koch --- common/homedir.c | 33 +++++++++++++++++++++++++++++++++ common/util.h | 1 + g10/openfile.c | 30 ++++++------------------------ po/POTFILES.in | 1 + sm/keydb.c | 25 +------------------------ 5 files changed, 42 insertions(+), 48 deletions(-) diff --git a/common/homedir.c b/common/homedir.c index 15475c256..830b1e2ce 100644 --- a/common/homedir.c +++ b/common/homedir.c @@ -61,6 +61,7 @@ #include "util.h" #include "sysutils.h" +#include "i18n.h" #include "zb32.h" /* The GnuPG homedir. This is only accessed by the functions @@ -489,6 +490,38 @@ gnupg_set_homedir (const char *newdir) } +/* Create the homedir directory only if the supplied directory name is + * the same as the default one. This way we avoid to create arbitrary + * directories when a non-default home directory is used. To cope + * with HOME, we do compare only the suffix if we see that the default + * homedir does start with a tilde. If the mkdir fails the function + * terminates the process. If QUIET is set not diagnostic is printed + * on homedir creation. */ +void +gnupg_maybe_make_homedir (const char *fname, int quiet) +{ + const char *defhome = standard_homedir (); + + if ( +#ifdef HAVE_W32_SYSTEM + ( !compare_filenames (fname, defhome) ) +#else + ( *defhome == '~' + && (strlen(fname) >= strlen (defhome+1) + && !strcmp(fname+strlen(fname)-strlen(defhome+1), defhome+1 ) )) + || (*defhome != '~' && !compare_filenames( fname, defhome ) ) +#endif + ) + { + if (gnupg_mkdir (fname, "-rwx")) + log_fatal ( _("can't create directory '%s': %s\n"), + fname, strerror(errno) ); + else if (!quiet ) + log_info ( _("directory '%s' created\n"), fname ); + } +} + + /* Return the homedir. The returned string is valid until another * gnupg-set-homedir call. This is always an absolute directory name. * The function replaces the former global var opt.homedir. */ diff --git a/common/util.h b/common/util.h index 7217a5208..18217af7b 100644 --- a/common/util.h +++ b/common/util.h @@ -260,6 +260,7 @@ const char *get_keyalgo_string (enum gcry_pk_algos algo, const char *standard_homedir (void); const char *default_homedir (void); void gnupg_set_homedir (const char *newdir); +void gnupg_maybe_make_homedir (const char *fname, int quiet); const char *gnupg_homedir (void); int gnupg_default_homedir_p (void); const char *gnupg_daemon_rootdir (void); diff --git a/g10/openfile.c b/g10/openfile.c index be186bd81..12a232a19 100644 --- a/g10/openfile.c +++ b/g10/openfile.c @@ -369,36 +369,18 @@ open_sigfile (const char *sigfilename, progress_filter_context_t *pfx) } +/* Create the directory only if the supplied directory name is the + same as the default one. This way we avoid to create arbitrary + directories when a non-default home directory is used. To cope + with HOME, we do compare only the suffix if we see that the default + homedir does start with a tilde. */ void try_make_homedir (const char *fname) { - const char *defhome = standard_homedir (); - - /* Create the directory only if the supplied directory name is the - same as the default one. This way we avoid to create arbitrary - directories when a non-default home directory is used. To cope - with HOME, we do compare only the suffix if we see that the - default homedir does start with a tilde. */ if ( opt.dry_run || opt.no_homedir_creation ) return; - if ( -#ifdef HAVE_W32_SYSTEM - ( !compare_filenames (fname, defhome) ) -#else - ( *defhome == '~' - && (strlen(fname) >= strlen (defhome+1) - && !strcmp(fname+strlen(fname)-strlen(defhome+1), defhome+1 ) )) - || (*defhome != '~' && !compare_filenames( fname, defhome ) ) -#endif - ) - { - if (gnupg_mkdir (fname, "-rwx")) - log_fatal ( _("can't create directory '%s': %s\n"), - fname, strerror(errno) ); - else if (!opt.quiet ) - log_info ( _("directory '%s' created\n"), fname ); - } + gnupg_maybe_make_homedir (fname, opt.quiet); } diff --git a/po/POTFILES.in b/po/POTFILES.in index 28d0f3602..a5a23398e 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -28,6 +28,7 @@ common/ksba-io-support.c common/utf8conv.c common/dotlock.c common/init.c +common/homedir.c g10/armor.c g10/build-packet.c diff --git a/sm/keydb.c b/sm/keydb.c index 71b98d764..e092e4a01 100644 --- a/sm/keydb.c +++ b/sm/keydb.c @@ -168,33 +168,10 @@ gpgsm_keydb_deinit_session_data (ctrl_t ctrl) static void try_make_homedir (const char *fname) { - const char *defhome = standard_homedir (); - - /* Create the directory only if the supplied directory name is the - same as the default one. This way we avoid to create arbitrary - directories when a non-default home directory is used. To cope - with HOME, we do compare only the suffix if we see that the - default homedir does start with a tilde. */ if ( opt.dry_run || opt.no_homedir_creation ) return; - if ( -#ifdef HAVE_W32_SYSTEM - ( !compare_filenames (fname, defhome) ) -#else - ( *defhome == '~' - && (strlen(fname) >= strlen (defhome+1) - && !strcmp(fname+strlen(fname)-strlen(defhome+1), defhome+1 ) )) - || (*defhome != '~' && !compare_filenames( fname, defhome ) ) -#endif - ) - { - if (gnupg_mkdir (fname, "-rwx")) - log_info (_("can't create directory '%s': %s\n"), - fname, strerror(errno) ); - else if (!opt.quiet ) - log_info (_("directory '%s' created\n"), fname); - } + gnupg_maybe_make_homedir (fname, opt.quiet); }