aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-02-28 14:02:00 +0100
committerMax Kellermann <max@duempel.org>2009-02-28 14:02:00 +0100
commit2aebbf84606fa6fa5a014ac288eef9bc5d63402e (patch)
tree84d7e8071fe6e8f76e587e31d470d2a2b6b1b686
parent3d6e6416e50a05d937ae770f255b53aa2dc5201f (diff)
directory: added "mtime" property
Remember the modification time of each directory. This is important for archives (which are virtual directories right now), but may also be useful for an automatic update mechanism.
-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 7ffb87d5..9321e953 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 7b2668bc..b009b1ef 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 d03fc7cb..78929f7d 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;
}