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;
}
Exemple #3
0
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;
}
Exemple #4
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;
}
Exemple #5
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;
}
Exemple #6
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;
}
Exemple #7
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;
}
Exemple #9
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;
}
Exemple #10
0
static void sigchld_handler(int signal)
{
	_kern_sem_release(wait_sem, 1);
}