#ifdef SHLIB
#include "shlib.h"
#endif
#include "defs.h"
#include <stdlib.h>
#include <mach/mach.h>
#include <mach/message.h>
#define BUFSIZE (4*1024 - 8)
static int ipc_flush(register NXStream *s);
static int ipc_fill(register NXStream *s);
static void ipc_change(register NXStream *s);
static void ipc_seek(register NXStream *s, register long offset);
static void ipc_close(register NXStream *s);
static const struct stream_functions ipc_functions = {
NXDefaultRead,
NXDefaultWrite,
ipc_flush,
ipc_fill,
ipc_change,
ipc_seek,
ipc_close,
};
typedef struct {
mach_msg_header_t header;
#ifdef notyet
msg_type_long_t type;
unsigned char data[BUFSIZE];
#endif
} InlineMsg;
static int ipc_flush(register NXStream *s)
{
InlineMsg *msg;
kern_return_t ret;
int flushSize;
flushSize = s->buf_size - s->buf_left;
if (flushSize) {
msg = (InlineMsg *)s->info;
#ifdef notyet
msg->header.msgh_size = flushSize + sizeof(mach_msg_header_t)
+ sizeof(msg_type_long_t);
#else
msg->header.msgh_size = flushSize + sizeof(mach_msg_header_t) ;
#endif
#ifdef notyet
msg->type.msg_type_long_number = flushSize;
#endif
ret = mach_msg_send( (mach_msg_header_t *)msg);
if(ret == MACH_MSG_SUCCESS) {
s->buf_ptr = s->buf_base;
s->buf_left = s->buf_size;
s->offset += flushSize;
return flushSize;
} else
return -1;
} else
return 0;
}
static int ipc_fill(register NXStream *s)
{
InlineMsg *msg;
kern_return_t ret;
msg = (InlineMsg *)s->info;
msg->header.msgh_size = sizeof(InlineMsg);
ret = mach_msg_receive((mach_msg_header_t *)msg);
if (ret != KERN_SUCCESS)
return -1;
else
#ifdef notyet
return msg->type.msg_type_long_number;
#else
return -1;
#endif
}
static void ipc_change(register NXStream *s)
{
}
static void ipc_seek(register NXStream *s, register long offset)
{
}
static void ipc_close(register NXStream *s)
{
InlineMsg *msg;
msg = (InlineMsg *)s->info;
#ifdef notyet
msg->header.msgh_size = sizeof(mach_msg_header_t) + sizeof(msg_type_long_t);
#else
msg->header.msgh_size = sizeof(mach_msg_header_t);
#endif
#ifdef notyet
msg->type.msg_type_long_number = 0;
#endif
(void)mach_msg_send( (mach_msg_header_t *)msg);
}
NXStream *
NXOpenPort(mach_port_t port, int mode)
{
#ifdef notyet
NXStream *s;
InlineMsg *msg;
if (mode == NX_READWRITE)
return NULL;
s = NXStreamCreate(mode, FALSE);
s->functions = &ipc_functions;
msg = (InlineMsg *)malloc(sizeof(InlineMsg));
s->info = (char *)msg;
if (mode == NX_READONLY) {
msg->header.msg_local_port = port;
s->buf_left = 0;
} else {
msg->header.msg_simple = TRUE;
msg->header.msg_type = MSG_TYPE_NORMAL;
msg->header.msg_local_port = PORT_NULL;
msg->header.msg_remote_port = port;
msg->type.msg_type_header.msg_type_inline = TRUE;
msg->type.msg_type_header.msg_type_longform = TRUE;
msg->type.msg_type_header.msg_type_deallocate = FALSE;
msg->type.msg_type_long_name = MSG_TYPE_CHAR;
msg->type.msg_type_long_size = 8;
s->buf_left = BUFSIZE;
}
s->buf_base = s->buf_ptr = msg->data;
s->buf_size = BUFSIZE;
s->flags &= ~NX_CANSEEK;
return s;
#else
return NULL;
#endif
}