aboutsummaryrefslogtreecommitdiffstats
path: root/src/directory.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/directory.c')
-rw-r--r--src/directory.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/src/directory.c b/src/directory.c
index c8c3c9372..06a39d7bf 100644
--- a/src/directory.c
+++ b/src/directory.c
@@ -845,14 +845,14 @@ int printDirectoryInfo(int fd, const char *name)
return 0;
}
-static void writeDirectoryInfo(FILE * fp, Directory * directory)
+static void writeDirectoryInfo(int fd, Directory * directory)
{
ListNode *node = (directory->subDirectories)->firstNode;
Directory *subDirectory;
int retv;
if (directory->path) {
- retv = fprintf(fp, "%s%s\n", DIRECTORY_BEGIN,
+ retv = fdprintf(fd, DIRECTORY_BEGIN "%s\n",
getDirectoryPath(directory));
if (retv < 0) {
ERROR("Failed to write data to database file: %s\n",strerror(errno));
@@ -862,19 +862,19 @@ static void writeDirectoryInfo(FILE * fp, Directory * directory)
while (node != NULL) {
subDirectory = (Directory *) node->data;
- retv = fprintf(fp, "%s%s\n", DIRECTORY_DIR, node->key);
+ retv = fdprintf(fd, DIRECTORY_DIR "%s\n", node->key);
if (retv < 0) {
ERROR("Failed to write data to database file: %s\n",strerror(errno));
return;
}
- writeDirectoryInfo(fp, subDirectory);
+ writeDirectoryInfo(fd, subDirectory);
node = node->nextNode;
}
- writeSongInfoFromList(fp, directory->songs);
+ writeSongInfoFromList(fd, directory->songs);
if (directory->path) {
- retv = fprintf(fp, "%s%s\n", DIRECTORY_END,
+ retv = fdprintf(fd, DIRECTORY_END "%s\n",
getDirectoryPath(directory));
if (retv < 0) {
ERROR("Failed to write data to database file: %s\n",strerror(errno));
@@ -1029,7 +1029,7 @@ int checkDirectoryDB(void)
int writeDirectoryDB(void)
{
- FILE *fp;
+ int fd;
char *dbFile = getDbFile();
struct stat st;
@@ -1042,22 +1042,27 @@ int writeDirectoryDB(void)
DEBUG("writing DB\n");
- while (!(fp = fopen(dbFile, "w")) && errno == EINTR);
- if (!fp) {
+ while (((fd = open(dbFile, O_WRONLY|O_TRUNC|O_CREAT)) < 0) &&
+ errno == EINTR);
+ if (fd < 0) {
ERROR("unable to write to db file \"%s\": %s\n",
dbFile, strerror(errno));
return -1;
}
- /* block signals when writing the db so we don't get a corrupted db */
- fprintf(fp, "%s\n", DIRECTORY_INFO_BEGIN);
- fprintf(fp, "%s%s\n", DIRECTORY_MPD_VERSION, VERSION);
- fprintf(fp, "%s%s\n", DIRECTORY_FS_CHARSET, getFsCharset());
- fprintf(fp, "%s\n", DIRECTORY_INFO_END);
+ /*
+ * TODO: block signals when writing the db so we don't get a corrupted
+ * db (or unexpected failures). fdprintf() needs better error handling
+ */
+ fdprintf(fd,
+ DIRECTORY_INFO_BEGIN "\n"
+ DIRECTORY_MPD_VERSION VERSION "\n"
+ DIRECTORY_FS_CHARSET "%s\n"
+ DIRECTORY_INFO_END "\n", getFsCharset());
- writeDirectoryInfo(fp, mp3rootDirectory);
+ writeDirectoryInfo(fd, mp3rootDirectory);
- while (fclose(fp) && errno == EINTR);
+ xclose(fd);
if (stat(dbFile, &st) == 0)
directory_dbModTime = st.st_mtime;