summaryrefslogtreecommitdiff
path: root/monitor_mm.c
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2003-09-01 00:51:03 +0000
committerColin Watson <cjwatson@debian.org>2003-09-01 00:51:03 +0000
commit79cf0b3654d7b597de323153eb57015cdfbd90a4 (patch)
tree274e78bc3369e218e59aa1fcc9b7e90697f424f1 /monitor_mm.c
parentd984a3c6658e950881edcfb2aae464add93f68d4 (diff)
Debian release 3.4p1-1.
Diffstat (limited to 'monitor_mm.c')
-rw-r--r--monitor_mm.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/monitor_mm.c b/monitor_mm.c
index c363036e6..55d1e8e52 100644
--- a/monitor_mm.c
+++ b/monitor_mm.c
@@ -29,6 +29,7 @@ RCSID("$OpenBSD: monitor_mm.c,v 1.6 2002/06/04 23:05:49 markus Exp $");
29#ifdef HAVE_SYS_MMAN_H 29#ifdef HAVE_SYS_MMAN_H
30#include <sys/mman.h> 30#include <sys/mman.h>
31#endif 31#endif
32#include <sys/shm.h>
32 33
33#include "ssh.h" 34#include "ssh.h"
34#include "xmalloc.h" 35#include "xmalloc.h"
@@ -85,8 +86,41 @@ mm_create(struct mm_master *mmalloc, size_t size)
85 mm->mmalloc = mmalloc; 86 mm->mmalloc = mmalloc;
86 87
87#ifdef HAVE_MMAP_ANON_SHARED 88#ifdef HAVE_MMAP_ANON_SHARED
89 mm->shm_not_mmap = 0;
90
88 address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_ANON|MAP_SHARED, 91 address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_ANON|MAP_SHARED,
89 -1, 0); 92 -1, 0);
93
94 if (address == MAP_FAILED) {
95 int shmid;
96
97 shmid = shmget(IPC_PRIVATE, size, IPC_CREAT|S_IRUSR|S_IWUSR);
98 if (shmid != -1) {
99 address = shmat(shmid, NULL, 0);
100 shmctl(shmid, IPC_RMID, NULL);
101 if (address != MAP_FAILED)
102 mm->shm_not_mmap = 1;
103 }
104 }
105
106 if (address == MAP_FAILED) {
107 char tmpname[sizeof(MM_SWAP_TEMPLATE)] = MM_SWAP_TEMPLATE;
108 int tmpfd;
109 int save_errno;
110
111 tmpfd = mkstemp(tmpname);
112 if (tmpfd == -1)
113 fatal("mkstemp(\"%s\"): %s",
114 MM_SWAP_TEMPLATE, strerror(errno));
115 unlink(tmpname);
116 ftruncate(tmpfd, size);
117 address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_SHARED,
118 tmpfd, 0);
119 save_errno = errno;
120 close(tmpfd);
121 errno = save_errno;
122 }
123
90 if (address == MAP_FAILED) 124 if (address == MAP_FAILED)
91 fatal("mmap(%lu): %s", (u_long)size, strerror(errno)); 125 fatal("mmap(%lu): %s", (u_long)size, strerror(errno));
92#else 126#else
@@ -131,6 +165,10 @@ mm_destroy(struct mm_master *mm)
131 mm_freelist(mm->mmalloc, &mm->rb_allocated); 165 mm_freelist(mm->mmalloc, &mm->rb_allocated);
132 166
133#ifdef HAVE_MMAP_ANON_SHARED 167#ifdef HAVE_MMAP_ANON_SHARED
168 if (mm->shm_not_mmap) {
169 if (shmdt(mm->address) == -1)
170 fatal("shmdt(%p): %s", mm->address, strerror(errno));
171 } else
134 if (munmap(mm->address, mm->size) == -1) 172 if (munmap(mm->address, mm->size) == -1)
135 fatal("munmap(%p, %lu): %s", mm->address, (u_long)mm->size, 173 fatal("munmap(%p, %lu): %s", mm->address, (u_long)mm->size,
136 strerror(errno)); 174 strerror(errno));