static ssize_t socket_write(struct idesc *desc, const void *buff,
                            size_t size) {
    int ret;
    struct msghdr msg;
    struct iovec iov;
    struct sock *sk = (struct sock *)desc;

    assert(desc);
    assert(desc->idesc_ops == &task_idx_ops_socket);

    if (sk->shutdown_flag & (SHUT_WR + 1))
        return -EPIPE;

    msg.msg_name = NULL;
    msg.msg_namelen = 0;
    msg.msg_iov = &iov;
    msg.msg_iovlen = 1;
    msg.msg_flags = 0;

    iov.iov_base = (void *)buff;
    iov.iov_len = size;

    ret = ksendmsg(sk, &msg, desc->idesc_flags);
    if (ret != 0) {
        return ret;
    }

    return iov.iov_len;
}
Example #2
0
/* open? write */
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags) {
	int ret;
	struct msghdr msg_;

	struct sock *sk;

	socket_idesc_check(sockfd, sk);

	if (sk->shutdown_flag & (SHUT_WR + 1))
		return SET_ERRNO(EPIPE);

	/* TODO remove this */
	if (flags != 0) {
		LOG_ERROR("sendmsg", "flags are not supported");
		return SET_ERRNO(EOPNOTSUPP);
	}

	if ((msg == NULL) || (msg->msg_iov == NULL)
			|| (msg->msg_iovlen == 0)) {
		return SET_ERRNO(EINVAL);
	}
	memcpy(&msg_, msg, sizeof (msg_));
	msg_.msg_flags = flags;

	ret = ksendmsg(sk, &msg_, sk->idesc.idesc_flags);
	if (ret < 0) {
		return SET_ERRNO(-ret);
	}
	return ret;
}
Example #3
0
void
systime_tick(void){

    /* keep track of real time */
    systime += PROC_TIME;

#ifdef USE_PROC
    struct Proc *p;

    wakeup( &systime );

    for(p=(struct Proc*)proclist; p; p=p->next){
        /* check timeouts */
        if( p->state & PRS_BLOCKED ){
            if( p->timeout && p->timeout <= systime ){
                p->timeout = 0;
                sigunblock(p);
                if( p->wchan != WCHAN_NEVER )
                    ksendmsg(p, MSG_TIMEOUT);
            }
        }

        /* handle alarm clocks */
        if( p->alarm && p->alarm <= get_time() ){
            p->alarm = 0;
            if( p->state & PRS_BLOCKED )
                sigunblock(p);
            ksendmsg(p, MSG_ALARM);
        }
    }

    if( currproc && (--timeremain <= 0) ){
        sched_yield();
    }
#endif

}
Example #4
0
static void
serial_irq(int unit){
    USART_TypeDef *addr = com[unit].addr;

    int sr = addr->ISR;

    //kprintf("s %d %x\n", unit, sr);

    if( sr & SR_TXE ){
        /* transmitter empty */
        //blink(1);
        addr->CR1 &= ~ 0xC0;	// disable TXE irq
        wakeup( addr );
    }

    if( sr & SR_RXNE ){
        /* got a char */
        int ch = addr->RDR;
        int i;

        /* special control char ? */
        for(i=0; i<sizeof(com[unit].file.cchars); i++){
            if(com[unit].file.cchars[i] && ch == com[unit].file.cchars[i]){
                sigunblock( com[unit].file.ccpid );
                ksendmsg( com[unit].file.ccpid, MSG_CCHAR_0 + i );
                return;
            }
        }

        if( com[unit].len < SERIAL_QUEUE_SIZE ){
            /* queue it up */
            com[unit].queue[ com[unit].head++ ] = ch;
            com[unit].head %= SERIAL_QUEUE_SIZE;
            com[unit].len ++;
            /* flow control */
#if 0
            if( com[unit].len > SERIAL_QUEUE_HIWATER ){
                /* almost full - drop RTS */
                /* com[unit].status |= COMSTAT_THROTTLED; */
            }
#endif
            wakeup( &com[unit].len );
        }
    }
}
Example #5
0
/* open? write */
ssize_t sendto(int sockfd, const void *buff, size_t size,
		int flags, const struct sockaddr *addr,
		socklen_t addrlen) {
	int ret;
	struct msghdr msg;
	struct iovec iov;

	struct sock *sk;

	socket_idesc_check(sockfd, sk);

	if (sk->shutdown_flag & (SHUT_WR + 1))
		return SET_ERRNO(EPIPE);

//	if (!size)
//		return 0;

	/* TODO remove this */
	if (flags != 0) {
		LOG_ERROR("sendto", "flags are not supported");
		return SET_ERRNO(EOPNOTSUPP);
	}

	msg.msg_name = (void *)addr;
	msg.msg_namelen = addrlen;
	msg.msg_iov = &iov;
	msg.msg_iovlen = 1;
	msg.msg_flags = flags;

	iov.iov_base = (void *)buff;
	iov.iov_len = size;

	ret = ksendmsg(sk, &msg, sk->idesc.idesc_flags);
	if (ret < 0) {
		return SET_ERRNO(-ret);
	}
	return ret;
}
Example #6
0
File: pcterm.c Project: jaw0/osj5
void
kbdirq(struct intrframe *fr){
    int c, i;
    const char *cs=0;
    struct Kbd *k = &term.kbd;	/* we only support one, for now */

    c = inb( k->port );

    /* make or break */
    if( c & 0x80 ){
        /* break */
        c &= 0x7f;

        switch( scan_codes[c].type ){
        case SCROLL:
            k->state &= ~SCROLL;
            break;
        case SHIFT:
            k->state &= ~SHIFT;
            break;
        case ALT:
            k->state &= ~ALT;
            break;
        case CTL:
            k->state &= ~CTL;
            break;
        }
    }else{
        /* make */
        switch( scan_codes[c].type ){

        case SHIFT:
            k->state |= SHIFT;
            break;
        case ALT:
            k->state |= ALT;
            break;
        case CTL:
            k->state |= CTL;
            break;
        case NUM:
            k->state ^= NUM;
            break;
        case CAPS:
            k->state ^= CAPS;
            break;
        case NONE:
            break;
        case ASCII:
        case FUNC:
            if( k->state & CTL )
                cs = scan_codes[c].ctl;
            else if( k->state & (SHIFT | CAPS) )
                cs = scan_codes[c].shift;
            else
                cs = scan_codes[c].unshift;
            break;

        case KP:
            if( c == 83 && k->state & CTL && k->state & ALT ){
                /* ctl-alt-del detected */
#ifdef USE_GDB
                if( bootflags & BOOT_USEGDB )
                    breakpoint();
                else
#endif
                {
                    E9PRINTF(("\n<C-A-Del>\nrebooting\n"));
                    kprintf("\nrebooting...");
                    reboot();
                }

            }
            if( k->state & CTL )
                cs = scan_codes[c].ctl;
            else if( k->state & (SHIFT | NUM) )
                cs = scan_codes[c].shift;
            else
                cs = scan_codes[c].unshift;
            break;


        }

        /* special control char ? */
        for(i=0; i<sizeof(term.file.cchars); i++){
            if(cs && term.file.cchars[i] && *cs == term.file.cchars[i]){
                sigunblock( term.file.ccpid );
                ksendmsg( term.file.ccpid, MSG_CCHAR_0 + i );
                return;
            }
        }

        /* enqueue chars */
        while( cs && *cs ){
            if( k->len < PCTERM_QUEUE_SIZE ){
                k->queue[ k->head++ ] = (k->state & ALT) ? (0x80 | *cs) : *cs;
                k->head %= PCTERM_QUEUE_SIZE;
                k->len ++;
            }
            /* else just drop it */

            cs++;
        }
        wakeup(k);
    }
}