summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Van Hoof <philip@codeminded.be>2011-09-22 11:49:49 +0200
committerPhilip Van Hoof <philip@codeminded.be>2011-09-23 12:54:46 +0200
commit3fa45aecfe4d770a7261f3a020a7773174b5108e (patch)
treed7cdea3398d7d32d0f2d77e680319d97fa1cae8c
parentf546a584c015da20db663ba0df40c48736249b86 (diff)
downloadtracker-3fa45aecfe4d770a7261f3a020a7773174b5108e.tar.gz
tracker-extract, xmp: Use mmap with a fd with O_NOATIME for xmp files
Conflicts: src/tracker-extract/tracker-extract-xmp.c
-rw-r--r--src/tracker-extract/tracker-extract-xmp.c62
1 files changed, 58 insertions, 4 deletions
diff --git a/src/tracker-extract/tracker-extract-xmp.c b/src/tracker-extract/tracker-extract-xmp.c
index 21ac36bc6..f6f76eb1c 100644
--- a/src/tracker-extract/tracker-extract-xmp.c
+++ b/src/tracker-extract/tracker-extract-xmp.c
@@ -19,6 +19,21 @@
#include "config.h"
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+#include <glib.h>
+#include <glib/gstdio.h>
+
#include <gio/gio.h>
#include <libtracker-extract/tracker-extract.h>
@@ -134,14 +149,51 @@ extract_xmp (const gchar *uri,
TrackerSparqlBuilder *metadata)
{
TrackerXmpData *xd = NULL;
- GError *error = NULL;
gchar *filename;
gchar *contents;
- gsize length;
+ gsize length = 0;
+ int fd;
+ struct stat st;
+
filename = g_filename_from_uri (uri, NULL, NULL);
- if (g_file_get_contents (filename, &contents, &length, &error)) {
+ fd = g_open (filename, O_RDONLY | O_NOATIME, 0);
+
+ if (fd == -1) {
+ g_warning ("Could not open xmp file '%s': %s\n",
+ filename,
+ g_strerror (errno));
+ g_free (filename);
+ return;
+ }
+
+ if (fstat (fd, &st) == -1) {
+ g_warning ("Could not fstat xmp file '%s': %s\n",
+ filename,
+ g_strerror (errno));
+ close (fd);
+ g_free (filename);
+ return;
+ }
+
+ if (st.st_size == 0) {
+ contents = NULL;
+ length = 0;
+ } else {
+ contents = (gchar *) mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+ if (contents == NULL) {
+ g_warning ("Could not mmap xmp file '%s': %s\n",
+ filename,
+ g_strerror (errno));
+ close (fd);
+ g_free (filename);
+ return;
+ }
+ length = st.st_size;
+ }
+
+ if (contents) {
gchar *original_uri;
original_uri = find_orig_uri (filename);
@@ -159,9 +211,11 @@ extract_xmp (const gchar *uri,
g_free (original_uri);
tracker_xmp_free (xd);
- g_free (contents);
+
+ munmap (contents, length);
}
+ close (fd);
g_free (filename);
}