--- mpd-0.17.6.orig/src/db/simple_db_plugin.c 2013-08-01 09:15:41.000000000 +0200 +++ mpd-0.17.6/src/db/simple_db_plugin.c 2013-10-17 17:51:34.000000000 +0200 @@ -28,6 +28,9 @@ #include "conf.h" #include "directory.h" +#include +#include +#include #include #include #include @@ -128,8 +131,8 @@ simple_db_check(struct simple_db *db, GE return false; } - /* Check if we can write to the directory */ - if (access(dirPath, X_OK | W_OK)) { + /* Check if we can change into the directory */ + if (access(dirPath, X_OK)) { g_set_error(error_r, simple_db_quark(), errno, "Can't create db file in \"%s\": %s", dirPath, g_strerror(errno)); @@ -159,9 +162,9 @@ simple_db_check(struct simple_db *db, GE } /* And check that we can write to it */ - if (access(db->path, R_OK | W_OK)) { + if (access(db->path, R_OK)) { g_set_error(error_r, simple_db_quark(), errno, - "Can't open db file \"%s\" for reading/writing: %s", + "Can't open db file \"%s\" for reading: %s", db->path, g_strerror(errno)); return false; } @@ -305,6 +308,9 @@ simple_db_save(struct db *_db, GError ** { struct simple_db *db = (struct simple_db *)_db; struct directory *music_root = db->root; + struct mntent *mnt; + int remount; + FILE *f; db_lock(); @@ -317,6 +323,26 @@ simple_db_save(struct db *_db, GError ** db_unlock(); g_debug("writing DB"); + + remount = 0; + /* check if /data is mounted read-only */ + if ((f = setmntent("/proc/mounts", "r")) == NULL) + g_message("Checking /proc/mounts failed"); + + while ((mnt = getmntent(f)) != NULL) { + if (strcmp(mnt->mnt_dir, "/data") == 0 && + hasmntopt(mnt, MNTOPT_RO) != NULL) { + remount = 1; + } + } + endmntent(f); + + if (remount) { + if (mount("","/data",0,MS_REMOUNT,0)<0) { + g_error("Remounting /data rw failed"); + } + g_message("Mounted /data successfully in read-write mode"); + } FILE *fp = fopen(db->path, "w"); if (!fp) { @@ -338,6 +364,16 @@ simple_db_save(struct db *_db, GError ** fclose(fp); + if (remount) { + sync(); + if (mount("","/data",0,MS_REMOUNT|MS_RDONLY,0)<0) { + g_error("Remounting /data ro failed"); + } + g_message("Mounted /data successfully in read-only mode"); + } + + g_message("Successfully written database to file: %s", db->path); + struct stat st; if (stat(db->path, &st) == 0) db->mtime = st.st_mtime;