git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: First cut at git port to Cygwin

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Oct 8, 2005, 22:06 UTC
Message-ID
<Pine.LNX.4.63.0510090004370.30110@wbgn013.biozentrum.uni-wuerzburg.de>
In-Reply-To
<7vk6gnpvf9.fsf@assigned-by-dhcp.cox.net>
Hi,
On Sat, 8 Oct 2005, Junio C Hamano wrote:
Show 7 quoted lines
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> 
> > Sure. Something like this?
> 
> Not, really.  What I meant was to rip out the writing out
> altogether, and perhaps making sure that the caller never calls
> us without MAP_PRIVATE.
How about this, then?
[PATCH] If NO_MMAP is defined, fake mmap() and munmap()

Since some platforms do not support mmap() at all, and others do only just so, this patch introduces the option to fake mmap() and munmap() by malloc()ing the region explicitely.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
---
 Makefile      |    6 ++++++
 cache.h       |   16 ++++++++++++++++
 compat/mmap.c |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 mailsplit.c   |    1 -
 4 files changed, 73 insertions(+), 1 deletions(-)
 create mode 100644 compat/mmap.c

applies-to: 274542bcbc891cca353c2728ac4075df3d1d2c0d ed334e3e2276fe9d41ed78917544ef6a3fa87eb7

diff --git a/Makefile b/Makefile
index 1bdf4de..7ca77cf 100644
--- a/Makefile
+++ b/Makefile
@@ -27,6 +27,8 @@
 # Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
 # Patrick Mauritz).
 #
+# Define NO_MMAP if you want to avoid mmap.
+#
 # Define WITH_OWN_SUBPROCESS_PY if you want to use with python 2.3.
 #
 # Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
@@ -258,6 +260,10 @@ ifdef NO_STRCASESTR
 	DEFINES += -Dstrcasestr=gitstrcasestr
 	LIB_OBJS += compat/strcasestr.o
 endif
+ifdef NO_MMAP
+	DEFINES += -Dmmap=gitfakemmap -Dmunmap=gitfakemunmap -DNO_MMAP
+	LIB_OBJS += compat/mmap.o
+endif
 ifdef NO_IPV6
 	DEFINES += -DNO_IPV6 -Dsockaddr_storage=sockaddr_in
 endif
diff --git a/cache.h b/cache.h
index 514adb8..5987d4c 100644
--- a/cache.h
+++ b/cache.h
@@ -11,7 +11,9 @@
 #include <string.h>
 #include <errno.h>
 #include <limits.h>
+#ifndef NO_MMAP
 #include <sys/mman.h>
+#endif
 #include <sys/param.h>
 #include <netinet/in.h>
 #include <sys/types.h>
@@ -356,4 +358,18 @@ extern void packed_object_info_detail(st
 /* Dumb servers support */
 extern int update_server_info(int);
 
+#ifdef NO_MMAP
+
+#ifndef PROT_READ
+#define PROT_READ 1
+#define PROT_WRITE 2
+#define MAP_PRIVATE 1
+#define MAP_FAILED ((void*)-1)
+#endif
+
+extern void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
+extern int gitfakemunmap(void *start, size_t length);
+
+#endif
+
 #endif /* CACHE_H */
diff --git a/compat/mmap.c b/compat/mmap.c
new file mode 100644
index 0000000..3f035a0
--- /dev/null
+++ b/compat/mmap.c
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include "../cache.h"
+
+void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)
+{
+	int n = 0;
+
+	if(start != NULL || !(flags & MAP_PRIVATE))
+		die("Invalid usage of gitfakemmap.");
+
+	if(lseek(fd, offset, SEEK_SET)<0) {
+		errno = EINVAL;
+		return MAP_FAILED;
+	}
+
+	start = xmalloc(length);
+	if(start == NULL) {
+		errno = ENOMEM;
+		return MAP_FAILED;
+	}
+
+	while(n < length) {
+		int count = read(fd, start+n, length-n);
+
+		if(count == 0) {
+			memset(start+n, 0, length-n);
+			break;
+		}
+
+		if(count < 0) {
+			free(start);
+			errno = EACCES;
+			return MAP_FAILED;
+		}
+
+		n += count;
+	}
+
+	return start;
+}
+
+int gitfakemunmap(void *start, size_t length)
+{
+	free(start);
+
+	return 0;
+}
+
diff --git a/mailsplit.c b/mailsplit.c
index 7981f87..0f8100d 100644
--- a/mailsplit.c
+++ b/mailsplit.c
@@ -9,7 +9,6 @@
 #include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <sys/mman.h>
 #include <string.h>
 #include <stdio.h>
 #include <ctype.h>
---
0.99.8.GIT
Previous: Junio C HamanoNext: H. Peter Anvin
Message 45 of 62 in “First cut at git port to Cygwin”
  1. H. Peter AnvinSep 29, 2005
  2. Junio C HamanoSep 29, 2005
  3. H. Peter AnvinSep 29, 2005
  4. Martin LanghoffSep 29, 2005
  5. Junio C HamanoSep 29, 2005
  6. H. Peter AnvinSep 29, 2005
  7. Johannes SchindelinSep 29, 2005
  8. H. Peter AnvinSep 29, 2005
  9. H. Peter AnvinSep 29, 2005
  10. Junio C HamanoSep 30, 2005
  11. H. Peter AnvinSep 30, 2005
  12. H. Peter AnvinSep 30, 2005
  13. Alex RiesenOct 4, 2005
  14. Alex RiesenOct 4, 2005
  15. H. Peter AnvinOct 4, 2005
  16. Christopher FaylorOct 5, 2005
  17. H. Peter AnvinOct 4, 2005
  18. Christopher FaylorOct 5, 2005
  19. H. Peter AnvinOct 5, 2005
  20. Alex RiesenOct 5, 2005
  21. Alex RiesenOct 5, 2005
  22. Christopher FaylorOct 5, 2005
  23. Davide LibenziOct 5, 2005
  24. Christopher FaylorOct 5, 2005
  25. H. Peter AnvinOct 5, 2005
  26. Christopher FaylorOct 5, 2005
  27. Davide LibenziOct 5, 2005
  28. Alex RiesenOct 5, 2005
  29. Christopher FaylorOct 5, 2005
  30. Alex RiesenOct 6, 2005
  31. Alex RiesenOct 6, 2005
  32. Alex RiesenOct 7, 2005
  33. Linus TorvaldsOct 7, 2005
  34. Alex RiesenOct 7, 2005
  35. Alex RiesenOct 7, 2005
  36. Chuck LeverOct 7, 2005
  37. Alex RiesenOct 7, 2005
  38. Linus TorvaldsOct 8, 2005
  39. Elfyn McBratneyOct 8, 2005
  40. Elfyn McBratneyOct 8, 2005
  41. Johannes SchindelinOct 8, 2005
  42. Junio C HamanoOct 8, 2005
  43. Johannes SchindelinOct 8, 2005
  44. Junio C HamanoOct 8, 2005
  45. Johannes SchindelinOct 8, 2005
  46. H. Peter AnvinOct 10, 2005
  47. Johannes SchindelinOct 10, 2005
  48. H. Peter AnvinOct 10, 2005
  49. Johannes SchindelinOct 10, 2005
  50. Junio C HamanoOct 10, 2005
  51. Junio C HamanoOct 10, 2005
  52. H. Peter AnvinOct 10, 2005
  53. Daniel BarkalowOct 10, 2005
  54. Alex RiesenOct 8, 2005
  55. Commit text BEFORE the dashes (Re: First cut at git port to Cygwin)Matthias Urlichs, Oct 9, 2005
  56. Jonas FonsecaOct 5, 2005
  57. Johannes SchindelinOct 5, 2005
  58. Fix symbolic ref validationJonas Fonseca, Oct 5, 2005
  59. Junio C HamanoOct 5, 2005
  60. Alex RiesenOct 7, 2005
  61. Elfyn McBratneyOct 8, 2005
  62. H. Peter AnvinOct 10, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.