int nettest1(void) { int err; sockaddr addr; fd = socket_create(SOCK_PROTO_TCP, 0); printf("created socket, fd %d\n", fd); if(fd < 0) return 0; memset(&addr, 0, sizeof(addr)); addr.addr.len = 4; addr.addr.type = ADDR_TYPE_IP; // addr.port = 19; // NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(63,203,215,73); // addr.port = 23; // NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(192,168,0,3); addr.port = 6667; NETADDR_TO_IPV4(addr.addr) = IPV4_DOTADDR_TO_ADDR(209,131,227,242); err = socket_connect(fd, &addr); printf("socket_connect returns %d\n", err); if(err < 0) return err; exit_sem = _kern_sem_create(0, "exit"); _kern_thread_resume_thread(_kern_thread_create_thread("read_thread", &read_thread, NULL)); _kern_thread_resume_thread(_kern_thread_create_thread("write_thread", &write_thread, NULL)); for(;;) _kern_sem_acquire(exit_sem, 1); return 0; }
static int start_console(struct console *con, int *stage) { memset(con, 0, sizeof(struct console)); *stage = 0; con->wait_sem = _kern_sem_create(0, "console wait sem"); if(con->wait_sem < 0) return con->wait_sem; *stage = 1; con->console_fd = open("/dev/console", 0); if(con->console_fd < 0) return con->console_fd; *stage = 2; con->keyboard_fd = open("/dev/keyboard", 0); if(con->keyboard_fd < 0) return con->keyboard_fd; *stage = 3; con->tty_master_fd = open("/dev/tty/master", 0); if(con->tty_master_fd < 0) return con->tty_master_fd; *stage = 4; con->tty_num = ioctl(con->tty_master_fd, _TTY_IOCTL_GET_TTY_NUM, NULL, 0); if(con->tty_num < 0) return con->tty_num; *stage = 5; { char temp[128]; sprintf(temp, "/dev/tty/slave/%d", con->tty_num); con->tty_slave_fd = open(temp, 0); if(con->tty_slave_fd < 0) return con->tty_slave_fd; } *stage = 6; con->keyboard_reader = _kern_thread_create_thread("console reader", &console_reader, con); if(con->keyboard_reader < 0) return con->keyboard_reader; *stage = 7; con->console_writer = _kern_thread_create_thread("console writer", &console_writer, con); if(con->console_writer < 0) return con->console_writer; _kern_thread_set_priority(con->keyboard_reader, 32); _kern_thread_set_priority(con->console_writer, 32); _kern_thread_resume_thread(con->keyboard_reader); _kern_thread_resume_thread(con->console_writer); return 0; }
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; }
int main(int argc, char **argv) { char **spawn_argv; int spawn_argc; int i; proc_id pid; thread_id tid; if(argc < 2) { printf("%s: not enough arguments\n", argv[0]); return -1; } // we're a session leader setsid(); // build an array of args to pass anything we start up spawn_argc = argc - 1; spawn_argv = (char **)malloc(sizeof(char *) * spawn_argc); if(spawn_argv == NULL) return -1; for(i = 0; i < spawn_argc; i++) { spawn_argv[i] = argv[i + 1]; } // register for SIGCHLD signals signal(SIGCHLD, &sigchld_handler); // debug_fd = open("/dev/console", 0); debug_fd = -1; wait_sem = _kern_sem_create(0, "telnetd wait sem"); if(wait_sem < 0) return -1; tty_master_fd = open("/dev/tty/master", 0); if(tty_master_fd < 0) return -2; tty_num = ioctl(tty_master_fd, _TTY_IOCTL_GET_TTY_NUM, NULL, 0); if(tty_num < 0) return -3; { struct tty_flags flags; ioctl(tty_master_fd, _TTY_IOCTL_GET_TTY_FLAGS, &flags, sizeof(flags)); flags.input_flags |= TTY_FLAG_CRNL; ioctl(tty_master_fd, _TTY_IOCTL_SET_TTY_FLAGS, &flags, sizeof(flags)); } { char temp[128]; sprintf(temp, "/dev/tty/slave/%d", tty_num); tty_slave_fd = open(temp, 0); if(tty_slave_fd < 0) return -4; } // move the stdin and stdout out of the way socket_fd = dup(0); // assume stdin, stdout, and stderr are the same socket close(0); close(1); close(2); // set the endpoints to the tty slave endpoint dup2(tty_slave_fd, 0); dup2(tty_slave_fd, 1); dup2(tty_slave_fd, 2); close(tty_slave_fd); // send some options over to the other side send_opts(); // now start the app pid = _kern_proc_create_proc(spawn_argv[0], spawn_argv[0], spawn_argv, spawn_argc, 5, PROC_FLAG_NEW_PGROUP); if(pid < 0) return -1; tid = _kern_thread_create_thread("telnet reader", &telnet_reader, NULL); _kern_thread_set_priority(tid, 30); _kern_thread_resume_thread(tid); tid = _kern_thread_create_thread("telnet writer", &telnet_writer, NULL); _kern_thread_set_priority(tid, 30); _kern_thread_resume_thread(tid); _kern_sem_acquire(wait_sem, 1); return 0; }