aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/directory.h1
-rw-r--r--src/directory_save.c11
-rw-r--r--src/update.c8
3 files changed, 17 insertions, 3 deletions
diff --git a/src/directory.h b/src/directory.h
index 7ffb87d5e..9321e9530 100644
--- a/src/directory.h
+++ b/src/directory.h
@@ -33,6 +33,7 @@ struct directory {
struct dirvec children;
struct songvec songs;
struct directory *parent;
+ time_t mtime;
ino_t inode;
dev_t device;
unsigned stat; /* not needed if ino_t == dev_t == 0 is impossible */
diff --git a/src/directory_save.c b/src/directory_save.c
index 7b2668bc7..b009b1ef5 100644
--- a/src/directory_save.c
+++ b/src/directory_save.c
@@ -28,7 +28,7 @@
#include <assert.h>
#include <string.h>
-#define DIRECTORY_MTIME "mtime: " /* DEPRECATED, noop-read-only */
+#define DIRECTORY_MTIME "mtime: "
#define DIRECTORY_BEGIN "begin: "
#define DIRECTORY_END "end: "
@@ -41,6 +41,9 @@ directory_save(FILE *fp, struct directory *directory)
int retv;
if (!directory_is_root(directory)) {
+ fprintf(fp, DIRECTORY_MTIME "%lu\n",
+ (unsigned long)directory->mtime);
+
retv = fprintf(fp, "%s%s\n", DIRECTORY_BEGIN,
directory_get_path(directory));
if (retv < 0)
@@ -84,8 +87,12 @@ directory_load(FILE *fp, struct directory *directory)
strcpy(key, &(buffer[strlen(DIRECTORY_DIR)]));
if (!fgets(buffer, sizeof(buffer), fp))
FATAL("Error reading db, fgets\n");
- /* for compatibility with db's prior to 0.11 */
+
if (g_str_has_prefix(buffer, DIRECTORY_MTIME)) {
+ directory->mtime =
+ g_ascii_strtoull(buffer + sizeof(DIRECTORY_MTIME) - 1,
+ NULL, 10);
+
if (!fgets(buffer, sizeof(buffer), fp))
FATAL("Error reading db, fgets\n");
}
diff --git a/src/update.c b/src/update.c
index d03fc7cb4..78929f7d2 100644
--- a/src/update.c
+++ b/src/update.c
@@ -360,10 +360,12 @@ update_archive_tree(struct directory *directory, char *name)
*
* @param parent the parent directory the archive file resides in
* @param name the UTF-8 encoded base name of the archive file
+ * @param st stat() information on the archive file
* @param plugin the archive plugin which fits this archive type
*/
static void
update_archive_file(struct directory *parent, const char *name,
+ const struct stat *st,
const struct archive_plugin *plugin)
{
char *path_fs;
@@ -393,6 +395,8 @@ update_archive_file(struct directory *parent, const char *name,
directory->device = DEVICE_INARCHIVE;
}
+ directory->mtime = st->st_mtime;
+
plugin->scan_reset(file);
while ((filepath = plugin->scan_next(file)) != NULL) {
@@ -438,7 +442,7 @@ update_regular_file(struct directory *directory,
}
#ifdef ENABLE_ARCHIVE
} else if ((archive = archive_plugin_from_suffix(suffix))) {
- update_archive_file(directory, name, archive);
+ update_archive_file(directory, name, st, archive);
#endif
}
}
@@ -593,6 +597,8 @@ updateDirectory(struct directory *directory, const struct stat *st)
closedir(dir);
+ directory->mtime = st->st_mtime;
+
return true;
}