1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
--- 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 <sys/mount.h>
+#include <mntent.h>
+#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
@@ -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;
|