]> source.dussan.org Git - rspamd.git/commitdiff
Add common routine to map a file
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 15 Feb 2016 16:29:03 +0000 (16:29 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 15 Feb 2016 16:29:03 +0000 (16:29 +0000)
src/libutil/util.c
src/libutil/util.h

index e715c97cf82d936d11b659d538d1f13ac6d16fa1..30665dfb895b8122aecd7fcfceaa3f3fef58b1a0 100644 (file)
@@ -2117,20 +2117,61 @@ rspamd_file_xopen (const char *fname, int oflags, guint mode)
        struct stat sb;
        int fd;
 
+       if (lstat (fname, &sb) == -1) {
+
+               if (errno != ENOENT) {
+                       return (-1);
+               }
+       }
+       else if (!S_ISREG (sb.st_mode)) {
+               return -1;
+       }
+
 #ifdef HAVE_ONOFOLLOW
        fd = open (fname, oflags | O_NOFOLLOW, mode);
 #else
        fd = open (fname, oflags, mode);
 #endif
 
+       return (fd);
+}
+
+gpointer
+rspamd_file_xmap (const char *fname, guint mode,
+               gsize *size)
+{
+       gint fd;
+       struct stat sb;
+       gpointer map;
+
+       g_assert (fname != NULL);
+       g_assert (size != NULL);
+
+       if (mode & PROT_WRITE) {
+               fd = rspamd_file_xopen (fname, O_RDWR, 0);
+       }
+       else {
+               fd = rspamd_file_xopen (fname, O_RDONLY, 0);
+       }
+
        if (fd == -1) {
-               return (-1);
+               return NULL;
        }
 
        if (fstat (fd, &sb) == -1 || !S_ISREG (sb.st_mode)) {
                close (fd);
-               return (-1);
+
+               return NULL;
        }
 
-       return (fd);
+       map = mmap (NULL, sb.st_size, mode, MAP_SHARED, fd, 0);
+       close (fd);
+
+       if (map == MAP_FAILED) {
+               return NULL;
+       }
+
+       *size = sb.st_size;
+
+       return map;
 }
index 06b6f7d425817d06fe0e1271131d98e7626478e2..43b0eb01bf7b6386a934f75593342cf275d91761 100644 (file)
@@ -441,4 +441,14 @@ struct event_base * event_get_base (struct event *ev);
  */
 int rspamd_file_xopen (const char *fname, int oflags, guint mode);
 
+/**
+ * Map file without following symlinks or special stuff
+ * @param fname filename
+ * @param mode mode to open
+ * @param size target size (must NOT be NULL)
+ * @return pointer to memory (should be freed using munmap) or NULL in case of error
+ */
+gpointer rspamd_file_xmap (const char *fname, guint mode,
+               gsize *size);
+
 #endif