summaryrefslogtreecommitdiffstats
path: root/fitsy/mmap.C
diff options
context:
space:
mode:
Diffstat (limited to 'fitsy/mmap.C')
-rw-r--r--fitsy/mmap.C68
1 files changed, 68 insertions, 0 deletions
diff --git a/fitsy/mmap.C b/fitsy/mmap.C
new file mode 100644
index 0000000..2d7d89d
--- /dev/null
+++ b/fitsy/mmap.C
@@ -0,0 +1,68 @@
+// Copyright (C) 1999-2018
+// Smithsonian Astrophysical Observatory, Cambridge, MA, USA
+// For conditions of distribution and use, see copyright notice in "copyright"
+
+#include "mmap.h"
+
+#ifndef __WIN32
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+
+FitsMMap::FitsMMap(const char* fn)
+{
+ // parse the fn and options
+ parse(fn);
+ if (!valid_)
+ return;
+
+ // reset
+ valid_ = 0;
+
+ if (!pName_)
+ return;
+
+ // Map the file.
+ int file = open(pName_, O_RDONLY);
+ if (file == -1)
+ return;
+
+ struct stat info;
+ if (fstat(file, &info) < 0)
+ return;
+
+ // check to see if we have something, we may have a small array
+ if (info.st_size <= 0)
+ return;
+
+ // map it
+ mapsize_ = info.st_size;
+ mapdata_ = (char*)mmap(NULL, mapsize_, PROT_READ, MAP_SHARED, file, 0);
+
+ // close the file
+ close(file);
+
+ // are we valid?
+ if ((long)mapdata_ == -1)
+ return;
+
+ // so far, so good
+ valid_ = 1;
+}
+
+FitsMMap::~FitsMMap()
+{
+ if (mapdata_)
+ munmap((caddr_t)mapdata_, mapsize_);
+}
+
+#else
+
+FitsMMap::FitsMMap(const char* fn) {}
+FitsMMap::~FitsMMap() {}
+
+#endif
+