AC_SUBST(LIBPULSE_MAINLOOP_GLIB_VERSION_INFO, [0:6:0])
AC_CANONICAL_HOST
-AC_DEFINE_UNQUOTED([CANONICAL_HOST], "$host", [Canonical host string.])
+AC_DEFINE_UNQUOTED([CANONICAL_HOST], "$host_cpu", [Canonical host system architecture string.])
AC_CHECK_PROG([STOW], [stow], [yes], [no])
#endif
#include <errno.h>
+#include <dirent.h>
#include <pulse/xmalloc.h>
#include <pulsecore/core-util.h>
char *machine_id = NULL, *filename_prefix, *full_path;
+ DIR *database_dir = NULL;
+ struct dirent *de;
+
pa_database *f;
pa_assert(!arch_suffix || arch_suffix[0]);
fn,
arch_suffix?".":"", arch_suffix?:"");
+ /* Search for existing database directory entry name matching architecture suffix and filename suffix. */
+ database_dir = opendir(path);
+
+ if (database_dir) {
+ for (;;) {
+ errno = 0;
+ de = readdir(database_dir);
+ if (!de) {
+ if (errno) {
+ pa_log_warn("Unable to search for compatible database file, readdir() failed: %s", pa_cstrerror(errno));
+ /* can continue as if there is no matching database file candidate */
+ }
+
+ break;
+ }
+
+ if (pa_startswith(de->d_name, filename_prefix) && pa_endswith(de->d_name + strlen(filename_prefix), filename_suffix)) {
+ /* candidate filename found, replace filename_prefix with this one if match is not exact */
+
+ if (strlen(de->d_name) != strlen(filename_prefix) + strlen(filename_suffix)) {
+ pa_log_debug("Found compatible database file '%s/%s', using it", path, de->d_name);
+ pa_xfree(filename_prefix);
+ filename_prefix = pa_xstrndup(de->d_name, strlen(de->d_name) - strlen(filename_suffix));
+ }
+
+ break;
+ }
+ }
+
+ closedir(database_dir);
+ } else {
+ pa_log_warn("Unable to search for compatible database file, failed to open directory %s: %s", path, pa_cstrerror(errno));
+ }
+
full_path = pa_sprintf_malloc("%s" PA_PATH_SEP "%s%s", path, filename_prefix, filename_suffix);
f = pa_database_open_internal(full_path, for_write);
/* Database implementation; returns non-empty database filename extension string */
const char* pa_database_get_filename_suffix(void);
-/* This will attempt opening database file matching compiled CANONICAL_HOST identifier.
+/* This will attempt opening database file matching compiled CANONICAL_HOST implementation architecture name prefix,
+ * or new database file will be created and opened with implementation architecture name suffix if required.
* If prependmid is true, file name is augmented with machine id prefix. */
pa_database* pa_database_open(const char *path, const char *fn, bool prependmid, bool for_write);