Implement shm_open() and shm_unlink(). The shared memory objects are
simply created as files in /boot/var/shared_memory/. The Bootscript clears the directory. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25374 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -57,6 +57,12 @@ exec >/dev/null 2>&1
|
|||||||
SCRIPTS=beos/system/boot
|
SCRIPTS=beos/system/boot
|
||||||
SERVERS=beos/system/servers
|
SERVERS=beos/system/servers
|
||||||
|
|
||||||
|
# clean the shared memory dir
|
||||||
|
shmDir=/boot/var/shared_memory
|
||||||
|
rm -rf $shmDir
|
||||||
|
mkdir $shmDir
|
||||||
|
chmod 777 $shmDir
|
||||||
|
|
||||||
# Set up the environment
|
# Set up the environment
|
||||||
|
|
||||||
export SAFEMODE=`/bin/safemode`
|
export SAFEMODE=`/bin/safemode`
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#ifndef _SYS_MMAN_H
|
#ifndef _SYS_MMAN_H
|
||||||
#define _SYS_MMAN_H
|
#define _SYS_MMAN_H
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
|
||||||
@@ -24,19 +25,17 @@
|
|||||||
// mmap() error return code
|
// mmap() error return code
|
||||||
#define MAP_FAILED ((void*)-1)
|
#define MAP_FAILED ((void*)-1)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
extern void* mmap(void* address, size_t length, int protection, int flags,
|
void* mmap(void* address, size_t length, int protection, int flags,
|
||||||
int fd, off_t offset);
|
int fd, off_t offset);
|
||||||
extern int munmap(void* address, size_t length);
|
int munmap(void* address, size_t length);
|
||||||
|
|
||||||
|
int shm_open(const char* name, int openMode, mode_t permissions);
|
||||||
|
int shm_unlink(const char* name);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
__END_DECLS
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif // _SYS_MMAN_H
|
#endif // _SYS_MMAN_H
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
|
|
||||||
@@ -14,6 +16,73 @@
|
|||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
|
|
||||||
|
|
||||||
|
static const char* kSharedMemoryDir = "/boot/var/shared_memory/";
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
append_string(char*& path, size_t& bytesLeft, const char* toAppend, size_t size)
|
||||||
|
{
|
||||||
|
if (bytesLeft <= size)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
memcpy(path, toAppend, size);
|
||||||
|
path += size;
|
||||||
|
path[0] = '\0';
|
||||||
|
bytesLeft -= size;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
append_string(char*& path, size_t& bytesLeft, const char* toAppend)
|
||||||
|
{
|
||||||
|
return append_string(path, bytesLeft, toAppend, strlen(toAppend));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static status_t
|
||||||
|
shm_name_to_path(const char* name, char* path, size_t pathSize)
|
||||||
|
{
|
||||||
|
if (name == NULL)
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
|
// skip leading slashes
|
||||||
|
while (*name == '/')
|
||||||
|
name++;
|
||||||
|
|
||||||
|
if (*name == '\0')
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
|
// create the path; replace occurrences of '/' by "%s" and '%' by "%%"
|
||||||
|
if (!append_string(path, pathSize, kSharedMemoryDir))
|
||||||
|
return ENAMETOOLONG;
|
||||||
|
|
||||||
|
while (const char* found = strpbrk(name, "%/")) {
|
||||||
|
// append section that doesn't need escaping
|
||||||
|
if (found != name) {
|
||||||
|
if (!append_string(path, pathSize, name, found - name))
|
||||||
|
return ENAMETOOLONG;
|
||||||
|
}
|
||||||
|
|
||||||
|
// append escaped char
|
||||||
|
const char* append = (*found == '%' ? "%%" : "%s");
|
||||||
|
if (!append_string(path, pathSize, append, 2))
|
||||||
|
return ENAMETOOLONG;
|
||||||
|
name = found + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// append remaining string
|
||||||
|
if (!append_string(path, pathSize, name))
|
||||||
|
return ENAMETOOLONG;
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
void*
|
void*
|
||||||
mmap(void* address, size_t length, int protection, int flags, int fd,
|
mmap(void* address, size_t length, int protection, int flags, int fd,
|
||||||
off_t offset)
|
off_t offset)
|
||||||
@@ -71,3 +140,27 @@ munmap(void* address, size_t length)
|
|||||||
{
|
{
|
||||||
RETURN_AND_SET_ERRNO(_kern_unmap_memory(address, length));
|
RETURN_AND_SET_ERRNO(_kern_unmap_memory(address, length));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
shm_open(const char* name, int openMode, mode_t permissions)
|
||||||
|
{
|
||||||
|
char path[PATH_MAX];
|
||||||
|
status_t error = shm_name_to_path(name, path, sizeof(path));
|
||||||
|
if (error != B_OK)
|
||||||
|
RETURN_AND_SET_ERRNO(error);
|
||||||
|
|
||||||
|
return open(path, openMode, permissions);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
shm_unlink(const char* name)
|
||||||
|
{
|
||||||
|
char path[PATH_MAX];
|
||||||
|
status_t error = shm_name_to_path(name, path, sizeof(path));
|
||||||
|
if (error != B_OK)
|
||||||
|
RETURN_AND_SET_ERRNO(error);
|
||||||
|
|
||||||
|
return unlink(path);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user