#include "kernel_emu.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include "FileSystem.h"
#include "RequestPort.h"
#include "Requests.h"
#include "RequestThread.h"
#include "UserlandFSServer.h"
#include "UserlandRequestHandler.h"
#include "Volume.h"
static status_t
parse_first_path_component(const char *path, int32& length,
int32& nextComponent)
{
status_t error = (path ? B_OK : B_BAD_VALUE);
if (error == B_OK) {
int32 i = 0;
for (; path[i] != '/' && path[i] != '\0'; i++);
if (i == 0 && path[i] != '\0')
i = 1;
length = i;
for (; path[i] == '/' && path[i] != '\0'; i++);
if (path[i] == '\0')
nextComponent = 0;
else
nextComponent = i;
}
return error;
}
int
UserlandFS::KernelEmu::new_path(const char *path, char **copy)
{
if (!copy)
return B_BAD_VALUE;
if (!path) {
*copy = NULL;
return B_OK;
}
int32 len = strlen(path);
if (len < 1)
return B_ENTRY_NOT_FOUND;
bool appendDot = (path[len - 1] == '/');
if (appendDot)
len++;
if (len >= B_PATH_NAME_LENGTH)
return B_NAME_TOO_LONG;
const char *remainder = path;
int32 length, nextComponent;
do {
status_t error
= parse_first_path_component(remainder, length, nextComponent);
if (error != B_OK)
return error;
if (length >= B_FILE_NAME_LENGTH)
error = B_NAME_TOO_LONG;
remainder += nextComponent;
} while (nextComponent != 0);
char *copiedPath = (char*)malloc(len + 1);
if (!copiedPath)
return B_NO_MEMORY;
strcpy(copiedPath, path);
if (appendDot) {
copiedPath[len - 1] = '.';
copiedPath[len] = '\0';
}
*copy = copiedPath;
return B_OK;
}
void
UserlandFS::KernelEmu::free_path(char *p)
{
free(p);
}
static status_t
get_port_and_fs(RequestPort** port, FileSystem** fileSystem)
{
RequestThread* thread = RequestThread::GetCurrentThread();
if (thread) {
*port = thread->GetPort();
*fileSystem = thread->GetFileSystem();
} else {
*port = UserlandFSServer::GetNotificationRequestPort();
*fileSystem = UserlandFSServer::GetFileSystem();
if (!*port || !*fileSystem)
return B_BAD_VALUE;
}
return B_OK;
}
status_t
UserlandFS::KernelEmu::notify_listener(int32 operation, uint32 details,
dev_t device, ino_t oldDirectory, ino_t directory,
ino_t node, const char* oldName, const char* name)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
NotifyListenerRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->operation = operation;
request->details = details;
request->device = device;
request->oldDirectory = oldDirectory;
request->directory = directory;
request->node = node;
error = allocator.AllocateString(request->oldName, oldName);
if (error != B_OK)
return error;
error = allocator.AllocateString(request->name, name);
if (error != B_OK)
return error;
UserlandRequestHandler handler(fileSystem, NOTIFY_LISTENER_REPLY);
NotifyListenerReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
return error;
}
status_t
UserlandFS::KernelEmu::notify_select_event(selectsync *sync, uint8 event,
bool unspecifiedEvent)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
NotifySelectEventRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->sync = sync;
request->event = event;
request->unspecifiedEvent = unspecifiedEvent;
UserlandRequestHandler handler(fileSystem, NOTIFY_SELECT_EVENT_REPLY);
NotifySelectEventReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
return error;
}
status_t
UserlandFS::KernelEmu::notify_query(port_id targetPort, int32 token,
int32 operation, dev_t device, ino_t directory, const char* name,
ino_t node)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
NotifyQueryRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->port = targetPort;
request->token = token;
request->operation = operation;
request->device = device;
request->directory = directory;
request->node = node;
error = allocator.AllocateString(request->name, name);
if (error != B_OK)
return error;
UserlandRequestHandler handler(fileSystem, NOTIFY_QUERY_REPLY);
NotifyQueryReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
return error;
}
status_t
UserlandFS::KernelEmu::get_vnode(dev_t nsid, ino_t vnid, void** node)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
GetVNodeRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = nsid;
request->vnid = vnid;
UserlandRequestHandler handler(fileSystem, GET_VNODE_REPLY);
GetVNodeReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
*node = reply->node;
return error;
}
status_t
UserlandFS::KernelEmu::put_vnode(dev_t nsid, ino_t vnid)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
PutVNodeRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = nsid;
request->vnid = vnid;
UserlandRequestHandler handler(fileSystem, PUT_VNODE_REPLY);
PutVNodeReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
return error;
}
status_t
UserlandFS::KernelEmu::acquire_vnode(dev_t nsid, ino_t vnid)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
AcquireVNodeRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = nsid;
request->vnid = vnid;
UserlandRequestHandler handler(fileSystem, ACQUIRE_VNODE_REPLY);
AcquireVNodeReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
return error;
}
status_t
UserlandFS::KernelEmu::new_vnode(dev_t nsid, ino_t vnid, void* data,
const FSVNodeCapabilities& capabilities)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
NewVNodeRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = nsid;
request->vnid = vnid;
request->node = data;
request->capabilities = capabilities;
UserlandRequestHandler handler(fileSystem, NEW_VNODE_REPLY);
NewVNodeReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
return error;
}
status_t
UserlandFS::KernelEmu::publish_vnode(dev_t nsid, ino_t vnid, void* data,
int type, uint32 flags, const FSVNodeCapabilities& capabilities)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
PublishVNodeRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = nsid;
request->vnid = vnid;
request->node = data;
request->type = type;
request->flags = flags;
request->capabilities = capabilities;
UserlandRequestHandler handler(fileSystem, PUBLISH_VNODE_REPLY);
PublishVNodeReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
return error;
}
status_t
UserlandFS::KernelEmu::publish_vnode(dev_t nsid, ino_t vnid, void* data,
const FSVNodeCapabilities& capabilities)
{
Volume* volume = FileSystem::GetInstance()->VolumeWithID(nsid);
if (volume == NULL)
return B_BAD_VALUE;
int type;
status_t error = volume->GetVNodeType(data, &type);
if (error != B_OK)
return error;
return UserlandFS::KernelEmu::publish_vnode(nsid, vnid, data, type, 0,
capabilities);
}
status_t
UserlandFS::KernelEmu::remove_vnode(dev_t nsid, ino_t vnid)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
RemoveVNodeRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = nsid;
request->vnid = vnid;
UserlandRequestHandler handler(fileSystem, REMOVE_VNODE_REPLY);
RemoveVNodeReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
return error;
}
status_t
UserlandFS::KernelEmu::unremove_vnode(dev_t nsid, ino_t vnid)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
UnremoveVNodeRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = nsid;
request->vnid = vnid;
UserlandRequestHandler handler(fileSystem, UNREMOVE_VNODE_REPLY);
UnremoveVNodeReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
return error;
}
status_t
UserlandFS::KernelEmu::get_vnode_removed(dev_t nsid, ino_t vnid,
bool* removed)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
GetVNodeRemovedRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = nsid;
request->vnid = vnid;
UserlandRequestHandler handler(fileSystem, GET_VNODE_REMOVED_REPLY);
GetVNodeRemovedReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
*removed = reply->removed;
return reply->error;
}
status_t
UserlandFS::KernelEmu::file_cache_create(dev_t mountID, ino_t vnodeID,
off_t size)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
RETURN_ERROR(error);
RequestAllocator allocator(port->GetPort());
FileCacheCreateRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
RETURN_ERROR(error);
request->nsid = mountID;
request->vnid = vnodeID;
request->size = size;
UserlandRequestHandler handler(fileSystem, FILE_CACHE_CREATE_REPLY);
FileCacheCreateReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
RETURN_ERROR(error);
RequestReleaser requestReleaser(port, reply);
RETURN_ERROR(reply->error);
}
status_t
UserlandFS::KernelEmu::file_cache_delete(dev_t mountID, ino_t vnodeID)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
FileCacheDeleteRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = mountID;
request->vnid = vnodeID;
UserlandRequestHandler handler(fileSystem, FILE_CACHE_DELETE_REPLY);
FileCacheDeleteReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
return reply->error;
}
status_t
UserlandFS::KernelEmu::file_cache_set_enabled(dev_t mountID, ino_t vnodeID,
bool enabled)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
FileCacheSetEnabledRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = mountID;
request->vnid = vnodeID;
request->enabled = enabled;
UserlandRequestHandler handler(fileSystem, FILE_CACHE_SET_ENABLED_REPLY);
FileCacheSetEnabledReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
return reply->error;
}
status_t
UserlandFS::KernelEmu::file_cache_set_size(dev_t mountID, ino_t vnodeID,
off_t size)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
FileCacheSetSizeRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = mountID;
request->vnid = vnodeID;
request->size = size;
UserlandRequestHandler handler(fileSystem, FILE_CACHE_SET_SIZE_REPLY);
FileCacheSetSizeReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
return reply->error;
}
status_t
UserlandFS::KernelEmu::file_cache_sync(dev_t mountID, ino_t vnodeID)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
FileCacheSyncRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = mountID;
request->vnid = vnodeID;
UserlandRequestHandler handler(fileSystem, FILE_CACHE_SYNC_REPLY);
FileCacheSyncReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
return reply->error;
}
status_t
UserlandFS::KernelEmu::file_cache_read(dev_t mountID, ino_t vnodeID,
void *cookie, off_t offset, void *bufferBase, size_t *_size)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
FileCacheReadRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = mountID;
request->vnid = vnodeID;
request->cookie = cookie;
request->pos = offset;
request->size = *_size;
UserlandRequestHandler handler(fileSystem, FILE_CACHE_READ_REPLY);
FileCacheReadReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
if (reply->bytesRead > 0) {
memcpy(bufferBase, reply->buffer.GetData(), reply->buffer.GetSize());
RequestAllocator receiptAckAllocator(port->GetPort());
ReceiptAckReply* receiptAck;
if (AllocateRequest(receiptAckAllocator, &receiptAck) == B_OK)
port->SendRequest(&receiptAckAllocator);
}
*_size = reply->bytesRead;
return B_OK;
}
status_t
UserlandFS::KernelEmu::file_cache_write(dev_t mountID, ino_t vnodeID,
void *cookie, off_t offset, const void *buffer, size_t *_size)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
FileCacheWriteRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = mountID;
request->vnid = vnodeID;
request->cookie = cookie;
request->size = *_size;
request->pos = offset;
if (buffer != NULL) {
error = allocator.AllocateData(request->buffer, buffer, *_size, 1,
false, sizeof(DoIterativeFDIORequest));
if (error != B_OK)
return error;
}
UserlandRequestHandler handler(fileSystem, FILE_CACHE_WRITE_REPLY);
FileCacheWriteReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
*_size = reply->bytesWritten;
return reply->error;
}
status_t
UserlandFS::KernelEmu::do_iterative_fd_io(dev_t volumeID, int fd,
int32 requestID, void* cookie, const file_io_vec* vecs, uint32 vecCount)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
DoIterativeFDIORequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = volumeID;
request->fd = fd;
request->request = requestID;
request->cookie = cookie;
if (vecCount > 0) {
vecCount = std::min(vecCount, (uint32)DoIterativeFDIORequest::MAX_VECS);
memcpy(request->vecs, vecs, sizeof(file_io_vec) * vecCount);
}
request->vecCount = vecCount;
UserlandRequestHandler handler(fileSystem, DO_ITERATIVE_FD_IO_REPLY);
DoIterativeFDIOReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
return reply->error;
}
status_t
UserlandFS::KernelEmu::read_from_io_request(dev_t volumeID, int32 requestID,
void* buffer, size_t size)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
ReadFromIORequestRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = volumeID;
request->request = requestID;
request->size = size;
UserlandRequestHandler handler(fileSystem, READ_FROM_IO_REQUEST_REPLY);
ReadFromIORequestReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
if (reply->error != B_OK)
return reply->error;
memcpy(buffer, reply->buffer.GetData(), reply->buffer.GetSize());
RequestAllocator receiptAckAllocator(port->GetPort());
ReceiptAckReply* receiptAck;
if (AllocateRequest(receiptAckAllocator, &receiptAck) == B_OK)
port->SendRequest(&receiptAckAllocator);
return B_OK;
}
status_t
UserlandFS::KernelEmu::write_to_io_request(dev_t volumeID, int32 requestID,
const void* buffer, size_t size)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
WriteToIORequestRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = volumeID;
request->request = requestID;
error = allocator.AllocateData(request->buffer, buffer, size, 1, false);
if (error != B_OK)
return error;
UserlandRequestHandler handler(fileSystem, WRITE_TO_IO_REQUEST_REPLY);
FileCacheWriteReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
return reply->error;
}
status_t
UserlandFS::KernelEmu::notify_io_request(dev_t volumeID, int32 requestID,
status_t status)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
NotifyIORequestRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->nsid = volumeID;
request->request = requestID;
request->status = status;
UserlandRequestHandler handler(fileSystem, NOTIFY_IO_REQUEST_REPLY);
NotifyIORequestReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
return reply->error;
}
status_t
UserlandFS::KernelEmu::add_node_listener(dev_t device, ino_t node, uint32 flags,
void* listener)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
AddNodeListenerRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->device = device;
request->node = node;
request->flags = flags;
request->listener = listener;
UserlandRequestHandler handler(fileSystem, ADD_NODE_LISTENER_REPLY);
AddNodeListenerReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
return reply->error;
}
status_t
UserlandFS::KernelEmu::remove_node_listener(dev_t device, ino_t node,
void* listener)
{
RequestPort* port;
FileSystem* fileSystem;
status_t error = get_port_and_fs(&port, &fileSystem);
if (error != B_OK)
return error;
RequestAllocator allocator(port->GetPort());
RemoveNodeListenerRequest* request;
error = AllocateRequest(allocator, &request);
if (error != B_OK)
return error;
request->device = device;
request->node = node;
request->listener = listener;
UserlandRequestHandler handler(fileSystem, REMOVE_NODE_LISTENER_REPLY);
RemoveNodeListenerReply* reply;
error = port->SendRequest(&allocator, &handler, (Request**)&reply);
if (error != B_OK)
return error;
RequestReleaser requestReleaser(port, reply);
return reply->error;
}
void
UserlandFS::KernelEmu::kernel_debugger(const char *message)
{
debugger(message);
}
void
UserlandFS::KernelEmu::vdprintf(const char *format, va_list args)
{
vprintf(format, args);
}
void
UserlandFS::KernelEmu::dprintf(const char *format, ...)
{
va_list args;
va_start(args, format);
vdprintf(format, args);
va_end(args);
}
void
UserlandFS::KernelEmu::dump_block(const char *buffer, int size,
const char *prefix)
{
}
int
UserlandFS::KernelEmu::add_debugger_command(char *name,
int (*func)(int argc, char **argv), char *help)
{
return B_OK;
}
int
UserlandFS::KernelEmu::remove_debugger_command(char *name,
int (*func)(int argc, char **argv))
{
return B_OK;
}
uint32
UserlandFS::KernelEmu::parse_expression(const char *string)
{
return 0;
}
thread_id
UserlandFS::KernelEmu::spawn_kernel_thread(thread_entry function,
const char *threadName, long priority, void *arg)
{
return spawn_thread(function, threadName, priority, arg);
}