]> git.proxmox.com Git - libgit2.git/blobdiff - src/unix/map.c
New upstream version 1.4.3+dfsg.1
[libgit2.git] / src / unix / map.c
index 9dcae5845c83f58e1b6397a4bd8ef0574497c7e1..23fcb786e5ab3a4d396a78f92025c868bf760885 100644 (file)
@@ -1,20 +1,38 @@
 /*
- * Copyright (C) 2009-2012 the libgit2 contributors
+ * Copyright (C) the libgit2 contributors. All rights reserved.
  *
  * This file is part of libgit2, distributed under the GNU GPL v2 with
  * a Linking Exception. For full terms see the included COPYING file.
  */
-#include <git2/common.h>
 
-#ifndef GIT_WIN32
+#include "common.h"
+
+#if !defined(GIT_WIN32) && !defined(NO_MMAP)
 
 #include "map.h"
 #include <sys/mman.h>
+#include <unistd.h>
 #include <errno.h>
 
-int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offset)
+int git__page_size(size_t *page_size)
 {
-       int mprot = 0;
+       long sc_page_size = sysconf(_SC_PAGE_SIZE);
+       if (sc_page_size < 0) {
+               git_error_set(GIT_ERROR_OS, "can't determine system page size");
+               return -1;
+       }
+       *page_size = (size_t) sc_page_size;
+       return 0;
+}
+
+int git__mmap_alignment(size_t *alignment)
+{
+  return git__page_size(alignment);
+}
+
+int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, off64_t offset)
+{
+       int mprot = PROT_READ;
        int mflag = 0;
 
        GIT_MMAP_VALIDATE(out, len, prot, flags);
@@ -23,19 +41,19 @@ int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offs
        out->len = 0;
 
        if (prot & GIT_PROT_WRITE)
-               mprot = PROT_WRITE;
-       else if (prot & GIT_PROT_READ)
-               mprot = PROT_READ;
+               mprot |= PROT_WRITE;
 
        if ((flags & GIT_MAP_TYPE) == GIT_MAP_SHARED)
                mflag = MAP_SHARED;
        else if ((flags & GIT_MAP_TYPE) == GIT_MAP_PRIVATE)
                mflag = MAP_PRIVATE;
+       else
+               mflag = MAP_SHARED;
 
        out->data = mmap(NULL, len, mprot, mflag, fd, offset);
 
        if (!out->data || out->data == MAP_FAILED) {
-               giterr_set(GITERR_OS, "Failed to mmap. Could not write data");
+               git_error_set(GIT_ERROR_OS, "failed to mmap. Could not write data");
                return -1;
        }
 
@@ -46,8 +64,10 @@ int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, git_off_t offs
 
 int p_munmap(git_map *map)
 {
-       assert(map != NULL);
+       GIT_ASSERT_ARG(map);
        munmap(map->data, map->len);
+       map->data = NULL;
+       map->len = 0;
 
        return 0;
 }