if (NumBytes == 0)
return MemoryBlock();
- int fd = -1;
+ // On platforms that have it, we can use MAP_ANON to get a memory-mapped
+ // page without file backing, but we need a fallback of opening /dev/zero
+ // for strictly POSIX platforms instead.
+ int fd;
+#if defined(MAP_ANON)
+ fd = -1;
+#else
+ fd = open("/dev/zero", O_RDWR);
+ if (fd == -1) {
+ EC = std::error_code(errno, std::generic_category());
+ return MemoryBlock();
+ }
+#endif
- int MMFlags = MAP_PRIVATE | MAP_ANON;
+ int MMFlags = MAP_PRIVATE;
+#if defined(MAP_ANON)
+ MMFlags |= MAP_ANON;
+#endif
int Protect = getPosixProtectionFlags(PFlags);
#if defined(__NetBSD__) && defined(PROT_MPROTECT)
void *Addr = ::mmap(reinterpret_cast<void *>(Start), NumBytes, Protect,
MMFlags, fd, 0);
if (Addr == MAP_FAILED) {
- if (NearBlock) //Try again without a near hint
+ if (NearBlock) { //Try again without a near hint
+#if !defined(MAP_ANON)
+ close(fd);
+#endif
return allocateMappedMemory(NumBytes, nullptr, PFlags, EC);
+ }
EC = std::error_code(errno, std::generic_category());
+#if !defined(MAP_ANON)
+ close(fd);
+#endif
return MemoryBlock();
}
+#if !defined(MAP_ANON)
+ close(fd);
+#endif
+
MemoryBlock Result;
Result.Address = Addr;
Result.Size = NumBytes;
static char *
getprogpath(char ret[PATH_MAX], const char *bin)
{
- char *pv, *s, *t;
-
/* First approach: absolute path. */
if (bin[0] == '/') {
if (test_dir(ret, "/", bin) == 0)
}
/* Third approach: $PATH */
+ char *pv;
if ((pv = getenv("PATH")) == nullptr)
return nullptr;
- s = pv = strdup(pv);
- if (!pv)
+ char *s = strdup(pv);
+ if (!s)
return nullptr;
- while ((t = strsep(&s, ":")) != nullptr) {
+ char *state;
+ for (char *t = strtok_r(s, ":", &state); t != nullptr;
+ t = strtok_r(nullptr, ":", &state)) {
if (test_dir(ret, t, bin) == 0) {
- free(pv);
+ free(s);
return ret;
}
}
- free(pv);
+ free(s);
return nullptr;
}
#endif // __FreeBSD__ || __NetBSD__ || __FreeBSD_kernel__
unsigned Columns = 0;
-#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TERMIOS_H)
+#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TERMIOS_H) \
+ && !(defined(_XOPEN_SOURCE) || defined(_POSIX_C_SOURCE))
// Try to determine the width of the terminal.
struct winsize ws;
if (ioctl(FileID, TIOCGWINSZ, &ws) == 0)