compat: rename {,notmuch_}canonicalize_file_name

When compat canonicalize_file_name was introduced, it was limited to
C code only because it was used by C code only during that time.

>From 5ec6fd4d, (lib/open: check for split configuration when creating
database., 2021-02-16), lib/open.cc, which is C++, relies on the
existent of canonicalize_file_name.

However, we can't blindly enable canonicalize_file_name for C++ code,
because different implementation has different additional signature for
C++ and users can arbitrarily add -DHAVE_CANONICALIZE_FILE_NAME=0 to
{C,CXX}FLAGS.

Let's move our implementation into a util library.

Helped-by: Tomi Ollila <tomi.ollila@iki.fi>
Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
This commit is contained in:
Đoàn Trần Công Danh 2021-04-24 08:05:37 +07:00 committed by David Bremner
parent 62f03b6ab8
commit 441a327051
7 changed files with 38 additions and 20 deletions

View file

@ -5,10 +5,6 @@ extra_cflags += -I$(srcdir)/$(dir)
notmuch_compat_srcs := notmuch_compat_srcs :=
ifneq ($(HAVE_CANONICALIZE_FILE_NAME),1)
notmuch_compat_srcs += $(dir)/canonicalize_file_name.c
endif
ifneq ($(HAVE_GETLINE),1) ifneq ($(HAVE_GETLINE),1)
notmuch_compat_srcs += $(dir)/getline.c $(dir)/getdelim.c notmuch_compat_srcs += $(dir)/getline.c $(dir)/getdelim.c
endif endif

View file

@ -37,14 +37,6 @@ extern "C" {
#define _POSIX_PTHREAD_SEMANTICS 1 #define _POSIX_PTHREAD_SEMANTICS 1
#endif #endif
#if ! HAVE_CANONICALIZE_FILE_NAME
/* we only call this function from C, and this makes testing easier */
#ifndef __cplusplus
char *
canonicalize_file_name (const char *path);
#endif
#endif
#if ! HAVE_GETLINE #if ! HAVE_GETLINE
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>

View file

@ -3,6 +3,7 @@
#include "database-private.h" #include "database-private.h"
#include "parse-time-vrp.h" #include "parse-time-vrp.h"
#include "path-util.h"
#if HAVE_XAPIAN_DB_RETRY_LOCK #if HAVE_XAPIAN_DB_RETRY_LOCK
#define DB_ACTION (Xapian::DB_CREATE_OR_OPEN | Xapian::DB_RETRY_LOCK) #define DB_ACTION (Xapian::DB_CREATE_OR_OPEN | Xapian::DB_RETRY_LOCK)
@ -612,9 +613,9 @@ notmuch_database_create_with_config (const char *database_path,
_set_database_path (notmuch, database_path); _set_database_path (notmuch, database_path);
if (key_file && ! split) { if (key_file && ! split) {
char *mail_root = canonicalize_file_name ( char *mail_root = notmuch_canonicalize_file_name (
g_key_file_get_value (key_file, "database", "mail_root", NULL)); g_key_file_get_value (key_file, "database", "mail_root", NULL));
char *db_path = canonicalize_file_name (database_path); char *db_path = notmuch_canonicalize_file_name (database_path);
split = (mail_root && (0 != strcmp (mail_root, db_path))); split = (mail_root && (0 != strcmp (mail_root, db_path)));

View file

@ -24,6 +24,7 @@
#include <netdb.h> #include <netdb.h>
#include <assert.h> #include <assert.h>
#include "path-util.h"
#include "unicode-util.h" #include "unicode-util.h"
static const char toplevel_config_comment[] = static const char toplevel_config_comment[] =
@ -327,7 +328,7 @@ notmuch_conffile_save (notmuch_conffile_t *config)
} }
/* Try not to overwrite symlinks. */ /* Try not to overwrite symlinks. */
filename = canonicalize_file_name (config->filename); filename = notmuch_canonicalize_file_name (config->filename);
if (! filename) { if (! filename) {
if (errno == ENOENT) { if (errno == ENOENT) {
filename = strdup (config->filename); filename = strdup (config->filename);

View file

@ -6,7 +6,7 @@ extra_cflags += -I$(srcdir)/$(dir)
libnotmuch_util_c_srcs := $(dir)/xutil.c $(dir)/error_util.c $(dir)/hex-escape.c \ libnotmuch_util_c_srcs := $(dir)/xutil.c $(dir)/error_util.c $(dir)/hex-escape.c \
$(dir)/string-util.c $(dir)/talloc-extra.c $(dir)/zlib-extra.c \ $(dir)/string-util.c $(dir)/talloc-extra.c $(dir)/zlib-extra.c \
$(dir)/util.c $(dir)/gmime-extra.c $(dir)/crypto.c \ $(dir)/util.c $(dir)/gmime-extra.c $(dir)/crypto.c \
$(dir)/repair.c \ $(dir)/repair.c $(dir)/path-util.c \
$(dir)/unicode-util.c $(dir)/unicode-util.c
libnotmuch_util_modules := $(libnotmuch_util_c_srcs:.c=.o) libnotmuch_util_modules := $(libnotmuch_util_c_srcs:.c=.o)

View file

@ -1,12 +1,21 @@
#include "compat.h" /*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#define _GNU_SOURCE
#include "path-util.h"
#include <limits.h> #include <limits.h>
#undef _GNU_SOURCE
#include <stdlib.h> #include <stdlib.h>
char * char *
canonicalize_file_name (const char *path) notmuch_canonicalize_file_name (const char *path)
{ {
#ifdef PATH_MAX #if HAVE_CANONICALIZE_FILE_NAME
return canonicalize_file_name (path);
#elif defined(PATH_MAX)
char *resolved_path = malloc (PATH_MAX + 1); char *resolved_path = malloc (PATH_MAX + 1);
if (resolved_path == NULL) if (resolved_path == NULL)
return NULL; return NULL;

19
util/path-util.h Normal file
View file

@ -0,0 +1,19 @@
/*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#ifndef NOTMUCH_UTIL_PATH_UTIL_H_
#define NOTMUCH_UTIL_PATH_UTIL_H_
#ifdef __cplusplus
extern "C" {
#endif
char *
notmuch_canonicalize_file_name (const char *path);
#ifdef __cplusplus
}
#endif
#endif /* NOTMUCH_UTIL_PATH_UTIL_H_ */