FILE *freopen(const char *filename, const char *mode, FILE *stream) { int sys_flags; int flags; int fd; if(_set_open_flags(mode, &sys_flags, &flags) || (fd = open(filename, sys_flags)) < 0) { return (FILE*)0; } #if STDIO_SEM _kern_sem_acquire(stream->sid, 1); #endif // STDIO_SEM _flush(stream); close(stream->fd); stream->fd = fd; stream->rpos = stream->buf_pos = 0; stream->flags = flags; #if STDIO_SEM _kern_sem_release(stream->sid, 1); #endif // STDIO_SEM return stream; }
FILE *__create_FILE_struct(int fd, int flags) { FILE *f; /* Allocate the FILE*/ f = (FILE *)calloc(sizeof(FILE),1); if(!f) return (FILE *)0; /* Allocate the buffer*/ f->buf = (unsigned char *)malloc( BUFSIZ * sizeof(char)); if(!f->buf) { free(f); return (FILE *)0; } #if STDIO_SEM char name[32]; /* Create a semaphore*/ snprintf(name, sizeof(name), "%d :FILE", fd); f->sid = _kern_sem_create(1, name); if(f->sid < 0) { free(f->buf); free(f); return (FILE *)0; } #endif // STDIO_SEM /* Fill in FILE values*/ f->rpos = 0; f->buf_pos = 0; f->buf_size = BUFSIZ ; f->fd = fd; f->flags = flags; f->buf_mode = _IOFBF; /* Setup list*/ f->next = __open_file_stack_top; /* Put the FILE in the list*/ #if STDIO_SEM _kern_sem_acquire(__open_file_stack_sem_id, 1); __open_file_stack_top = f; _kern_sem_release(__open_file_stack_sem_id, 1); #else __open_file_stack_top = f; #endif // STDIO_SEM return f; }
static int write_thread(void *args) { char c; ssize_t len; for(;;) { c = getchar(); len = socket_write(fd, &c, sizeof(c)); if(len < 0) { printf("\nsocket_write returns %ld\n", len); break; } } _kern_sem_release(exit_sem, 1); return 0; }
static int console_writer(void *arg) { char buf[1024]; ssize_t len; ssize_t write_len; struct console *con = (struct console *)arg; for(;;) { len = read(con->tty_master_fd, buf, sizeof(buf)); if(len < 0) break; write_len = write(con->console_fd, buf, len); } _kern_sem_release(con->wait_sem, 1); return 0; }
static int read_thread(void *args) { char buf[1024]; ssize_t len; int i; for(;;) { len = socket_read(fd, buf, sizeof(buf)); if(len < 0) { printf("\nsocket_read returns %ld\n", (long)len); break; } for(i=0; i<len; i++) printf("%c", buf[i]); } _kern_sem_release(exit_sem, 1); return 0; }
static int telnet_writer(void *arg) { char buf[4096]; ssize_t len; ssize_t write_len; for(;;) { /* read from the tty's master end */ len = read(tty_master_fd, buf, sizeof(buf)); if(len <= 0) break; write_len = write(socket_fd, buf, len); if(write_len < 0) break; } _kern_sem_release(wait_sem, 1); _kern_exit(0); return 0; }
static int console_reader(void *arg) { char buf[1024]; _key_event kevents[16]; ssize_t len; ssize_t write_len; struct console *con = (struct console *)arg; for(;;) { len = read(con->keyboard_fd, kevents, sizeof(kevents)); if(len < 0) break; len = process_key_events(kevents, len / sizeof(_key_event), buf, sizeof(buf), con->keyboard_fd); if(len <= 0) continue; write_len = write(con->tty_master_fd, buf, len); } _kern_sem_release(con->wait_sem, 1); return 0; }
static int __delete_FILE_struct(int fd) { FILE *fNode, *fPrev; /* Search for the FILE for the file descriptor */ fPrev = (FILE*)0; fNode = __open_file_stack_top; while(fNode != (FILE*)0) { if(fNode->fd == fd) { break; } fPrev = fNode; fNode = fNode->next; } /* If it wasn't found return EOF*/ if(fNode == (FILE*)0) { printf("Error: __delete_FILE_struct"); return EOF; } #if STDIO_SEM /* Wait for the lock */ sem_id sid; sid = fNode->sid; _kern_sem_acquire(sid, 1); #endif /* free the FILE space/semaphore*/ close(fNode->fd); free(fNode->buf); //free(fNode); #if STDIO_SEM /* Do we need to release before we delete? */ _kern_sem_release(sid, 1); _kern_sem_delete(sid); #endif #if STDIO_SEM /* Remove it from the list*/ if(fNode == __open_file_stack_top) { _kern_sem_acquire(__open_file_stack_sem_id, 1); __open_file_stack_top = __open_file_stack_top->next; _kern_sem_release(__open_file_stack_sem_id, 1); } else { _kern_sem_acquire(__open_file_stack_sem_id, 1); fPrev->next = fNode->next; _kern_sem_release(__open_file_stack_sem_id, 1); } #else /* Remove it from the list*/ if(fNode == __open_file_stack_top) __open_file_stack_top = __open_file_stack_top->next; else fPrev->next = fNode->next; #endif /* Free the space*/ free(fNode); return 0; }
static int telnet_reader(void *arg) { unsigned char buf[4096]; unsigned char sb[4096]; ssize_t len; int i; enum { NORMAL = 0, SEEN_IAC, SEEN_OPT_NEGOTIATION, SEEN_SB, IN_SB, } state = NORMAL; int output_start, output_len; int curr_sb_type = 0; int sb_len = 0; char temp[128]; for(;;) { /* read from the socket */ len = read(socket_fd, buf, sizeof(buf)); if(len <= 0) break; output_start = 0; output_len = 0; for(i = 0; i < len; i++) { // try to remove commands switch(state) { case NORMAL: if(buf[i] == IAC) { state = SEEN_IAC; if(output_len > 0) write(tty_master_fd, &buf[output_start], output_len); output_len = 0; write(debug_fd, "NORMAL: IAC\r\n", strlen("NORMAL: IAC\r\n")); } else { output_len++; } break; case SEEN_IAC: sprintf(temp, "SEEN_IAC: 0x%x\r\n", buf[i]); write(debug_fd, temp, strlen(temp)); if(buf[i] == SB) { state = SEEN_SB; } else if(buf[i] == IAC) { output_start = i; output_len = 1; state = NORMAL; } else { state = SEEN_OPT_NEGOTIATION; } break; case SEEN_OPT_NEGOTIATION: sprintf(temp, "SEEN_OPT_NEGOTIATION: 0x%x\r\n", buf[i]); write(debug_fd, temp, strlen(temp)); // we can transition back to normal now, we've eaten this option state = NORMAL; output_len = 0; output_start = i+1; break; case SEEN_SB: sprintf(temp, "SEEN_SB: 0x%x\r\n", buf[i]); write(debug_fd, temp, strlen(temp)); if(buf[i] == SE) { state = NORMAL; output_len = 0; output_start = i+1; } else { curr_sb_type = buf[i]; state = IN_SB; sb_len = 0; } break; case IN_SB: sprintf(temp, "IN_SB: 0x%x\r\n", buf[i]); write(debug_fd, temp, strlen(temp)); if(buf[i] == SE) { state = NORMAL; output_len = 0; output_start = i+1; } else if(buf[i] == IAC) { process_subblock(curr_sb_type, sb, sb_len); } else { sb[sb_len++] = buf[i]; } break; } } if(output_len > 0) write(tty_master_fd, &buf[output_start], output_len); } _kern_sem_release(wait_sem, 1); _kern_exit(0); return 0; }
static void sigchld_handler(int signal) { _kern_sem_release(wait_sem, 1); }