Example #1
0
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;
}
Example #2
0
File: main.c Project: travisg/newos
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;
}
Example #4
0
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;
}