NXStream *NXOpenMemory(const char *addr, int size, int mode) { NXStream *s; int newMode = mode; if ((int)addr % vm_page_size && (mode != NX_READONLY)) return 0; s = NXStreamCreate(newMode, FALSE); s->functions = &memory_functions; s->buf_base = (unsigned char *)addr; s->buf_size = size; s->buf_left = size; s->buf_ptr = (unsigned char *)addr; s->eof = size; s->flags |= NX_CANSEEK; if (addr) s->flags |= NX_USER_OWNS_BUF; else switch(mode) { case NX_READONLY: break; case NX_WRITEONLY: memory_flush(s); /* get initial buffer */ break; case NX_READWRITE: if (s->flags & NX_READFLAG) { NXChangeBuffer(s); memory_flush(s); /* get initial buffer */ } break; } return (s); }
NXStream *NXOpenFile(int fd, int mode) { NXStream *s; struct file_info *fi; struct stat statInfo; if (fstat(fd, &statInfo) == -1) return NULL; s = NXStreamCreate(mode, TRUE); s->functions = &file_functions; fi = (struct file_info *) malloc(sizeof(struct file_info)); fi->fd = fd; s->info = (char *)fi; s->eof = statInfo.st_size; /* * Stream is only seekable if it's not a socket or a pipe. */ if ( (statInfo.st_mode&S_IFMT) != S_IFSOCK && (statInfo.st_mode&S_IFMT) != S_IFIFO) s->flags |= NX_CANSEEK; return s; }
/* * NXOpenPort: * * open a stream using a ipc descriptor. */ NXStream * NXOpenPort(mach_port_t port, int mode) { #ifdef notyet NXStream *s; InlineMsg *msg; /*??? set the flags */ 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 }
NXStream *NXOpenSmallMemory(int mode){ NXStream *s; int newMode = mode; char *addr; if (mode != NX_WRITEONLY && mode != NX_READWRITE) return NULL; addr = malloc(INITIAL_SIZE); s = NXStreamCreate(newMode, FALSE); s->functions = &cheap_functions; s->buf_base = (unsigned char *)addr; s->buf_size = INITIAL_SIZE; s->buf_left = INITIAL_SIZE; s->buf_ptr = (unsigned char *)addr; s->eof = 0; s->flags |= NX_CANSEEK; switch(mode) { case NX_READWRITE: if (s->flags & NX_READFLAG) { NXChangeBuffer(s); } break; } return (s); }