int usys_listen(int *err, uuprocess_t *u, int fd, int backlog)
{
    (void)backlog;

    if( u == 0 )
    {
        *err = ENOTSOCK; // TODO correct?
        return -1;
    }

    CHECK_FD(fd);
    struct uufile *f = GETF(fd);

    struct uusocket *us = f->impl;

    if( ! (f->flags & (UU_FILE_FLAG_NET|UU_FILE_FLAG_TCP)))
    {
        *err = ENOTSOCK;
        return -1;
    }

    if( tcp_listen(us->prot_data) )
        *err = EISCONN;

    return *err ? -1 : 0;
}
ssize_t usys_sendmsg(int *err, uuprocess_t *u, int fd, const struct msghdr *msg, int flags)
{
    (void) msg;

    if( u == 0 )
    {
        *err = ENOTSOCK; // TODO correct?
        return -1;
    }

    CHECK_FD(fd);
    struct uufile *f = GETF(fd);
    int len = 0;

    struct uusocket *us = f->impl;
    (void) us;

    // TODO implement me

    if( ! (f->flags & UU_FILE_FLAG_NET))
    {
        *err = ENOTSOCK;
        return -1;
    }

    if( flags )
        SHOW_ERROR( 0, "I don't know this flag %d", flags );




    *err = ENOSYS;
    return *err ? -1 : len;
}
int usys_getsockopt(int *err, uuprocess_t *u, int fd, int level, int optname, void *optval, socklen_t *optlen)
{
    (void) optname;
    (void) optlen;
    (void) optval;

    if( u == 0 )
    {
        *err = ENOTSOCK; // TODO correct?
        return -1;
    }

    CHECK_FD(fd);
    struct uufile *f = GETF(fd);

    struct uusocket *us = f->impl;
	(void) us;

    if( ! (f->flags & UU_FILE_FLAG_NET))
    {
        *err = ENOTSOCK;
        return -1;
    }

    if( level != SOL_SOCKET )
    {
        *err = ENOPROTOOPT;
        return -1;
    }


    *err = ENOPROTOOPT;
    return *err ? -1 : 0;
}
ssize_t usys_recvfrom(int *err, uuprocess_t *u, int fd, void *buf, size_t buflen, int flags,
                      struct sockaddr *from, socklen_t *fromlen)
{
    if( u == 0 )
    {
        *err = ENOTSOCK; // TODO correct?
        return -1;
    }

    CHECK_FD(fd);
    struct uufile *f = GETF(fd);

    struct uusocket *us = f->impl;

    if( *fromlen < (int)sizeof(struct sockaddr_in) )
    {
        *err = EINVAL;
        return -1;
    }

    if( ! (f->flags & UU_FILE_FLAG_NET))
    {
        *err = ENOTSOCK;
        return -1;
    }

    if( flags )
        SHOW_ERROR( 0, "I don't know this flag %d", flags );

    i4sockaddr tmp_addr;
    //struct sockaddr_in *sfrom = (struct sockaddr_in *)from;

    // FIXME TODO ERR allways times out in 5 sec
    int len = udp_recvfrom( us->prot_data, buf, buflen, &tmp_addr, SOCK_FLAG_TIMEOUT, 5000000L );
    if( len < 0 )
    {
        SHOW_ERROR( 7, "ret = %d", len );
        *err = -len;
        goto ret;
    }

    SHOW_FLOW( 8, "flags %x", flags );
    /*
    SHOW_FLOW( 7, "port %d, ip %s", tmp_addr.port, inet_itoa(htonl(NETADDR_TO_IPV4(tmp_addr.addr))) );

    sfrom->sin_port = htons(tmp_addr.port);
    sfrom->sin_addr.s_addr = htonl(NETADDR_TO_IPV4(tmp_addr.addr));
    sfrom->sin_family = PF_INET;
    sfrom->sin_len = sizeof(struct sockaddr_in);

    *fromlen = sfrom->sin_len;
    */
    errno_t rc = sockaddr_int2unix( from, fromlen, &tmp_addr );
    if( rc )
        *fromlen = 0;

ret:
    return *err ? -1 : len;
}
Exemple #5
0
/*-------------------------------------------------------------------------*/
int frontpanel_rs232::fp_read_msg(unsigned char *msg, unsigned long long *ts)
{
	int l;

	CHECK_FD();

	struct pollfd pfd[]=  {{fd, POLLIN|POLLERR|POLLHUP,0}
	};

	while(1) {
		poll(pfd,1,20);
//		u_sleep(10*1000);

		l=fp_read(buf+state,1);
		if (l!=1)		
			return 0;
			
//                printf("%02x ",*(buf+state)); fflush(stdout);
		if (state==0) {
			if (buf[0]==0x5a || buf[0]==0x55) { // 0x55 RAW IR
				state=1;
#if !FPCTL
				timestamp=get_timestamp();
#endif
			}
			if (buf[0]==0xff) { // flash-mode active?
				return 1;
			}
		}
		else if (state==1) {
			if (buf[0]==0x55)
				cmd_length=2;
			else
				cmd_length=get_answer_length(buf[1]);
			if (cmd_length==0) {
				state=0;
				memcpy(msg,buf,2);
				buf[0]=0;
				if (ts)
					*ts=timestamp;
				return 2;
			}
			state++;
		}
		else {
			if (state==1+cmd_length) {
				state=0;
				memcpy(msg,buf,2+cmd_length);
				buf[0]=0;
				if (ts)
					*ts=timestamp;			
				return 2+cmd_length;
			}
			state++;
		}
	}

	return 0;
}
int usys_setsockopt(int *err, uuprocess_t *u, int fd, int level, int optname, const void *optval, socklen_t optlen)
{
    if( u == 0 )
    {
        *err = ENOTSOCK; // TODO correct?
        return -1;
    }

    CHECK_FD(fd);
    struct uufile *f = GETF(fd);

    struct uusocket *us = f->impl;

    if( ! (f->flags & UU_FILE_FLAG_NET) )
    {
        *err = ENOTSOCK;
        return -1;
    }

    if( level != SOL_SOCKET )
    {
        *err = ENOPROTOOPT;
        return -1;
    }

    if( (optname > 0x1000) && (optname < 0x100F) )
    {
        switch(optname)
        {
        }
    }
    else
    {
        // Flags, one bit

        if(optlen != sizeof(int))
        {
            *err = ENOPROTOOPT;
            return -1;
        }
        int set = *(int *)optval;

        if( set )
            us->options |= optname;
        else
            us->options &= ~optname;

        // TODO this 'us->options' is not connected to something in IP stack!
        // so return err yet
        //return 0;
    }



    *err = ENOPROTOOPT;
    return *err ? -1 : 0;
}
Exemple #7
0
/* Check if a descriptor was ready. */
int
fdwatch_check_fd( int fd )
    {
    if ( fd < 0 || fd >= nfiles || fd_rw[fd] == -1 )
	{
	syslog( LOG_ERR, "bad fd (%d) passed to fdwatch_check_fd!", fd );
	return 0;
	}
    return CHECK_FD( fd );
    }
ssize_t usys_sendto(int *err, uuprocess_t *u, int fd, const void *buf, size_t buflen, int flags, const struct sockaddr *to, socklen_t tolen)
{
    if( u == 0 )
    {
        *err = ENOTSOCK; // TODO correct?
        return -1;
    }

    CHECK_FD(fd);
    struct uufile *f = GETF(fd);

    struct uusocket *us = f->impl;
	(void) us;

    if( tolen < (int)sizeof(struct sockaddr_in) )
    {
        *err = EINVAL;
        return -1;
    }

    if( ! (f->flags & UU_FILE_FLAG_NET))
    {
        *err = ENOTSOCK;
        return -1;
    }

    if( flags )
        SHOW_ERROR( 0, "I don't know this flag %d", flags );

    /*
    struct sockaddr_in *sto = (struct sockaddr_in *)to;

    if( sto->sin_family != PF_INET )
        SHOW_ERROR0( 0, "not inet addr?");
    */

    i4sockaddr tmp_addr;
    errno_t rc = sockaddr_unix2int( &tmp_addr, to, tolen );
    if( rc )
    {
        *err = rc;
        return -1;
    }

    //tmp_addr.port = ntohs(sto->sin_port);
    //NETADDR_TO_IPV4(tmp_addr.addr) = ntohl(sto->sin_addr.s_addr);

    SHOW_FLOW( 8, "flags %x", flags );
    //SHOW_FLOW( 7, "port %d, ip %s", tmp_addr.port, inet_itoa(htonl(NETADDR_TO_IPV4(tmp_addr.addr))) );
    int ret = udp_sendto( us->prot_data, buf, buflen, &tmp_addr);
    if( ret < 0 )
        *err = -ret;

    return *err ? -1 : ret;
}
int usys_connect(int *err, uuprocess_t *u, int fd, const struct sockaddr *_ia, socklen_t addrlen)
{
    if( addrlen < (int)sizeof(struct sockaddr_in) )
    {
        *err = EINVAL;
        return -1;
    }

    if( u == 0 )
    {
        *err = ENOTSOCK; // TODO correct?
        return -1;
    }


    CHECK_FD(fd);
    struct uufile *f = GETF(fd);

    struct uusocket *us = f->impl;

    //if( (u == 0) || ! (f->flags & (UU_FILE_FLAG_NET|UU_FILE_FLAG_TCP)))
    if( (! (f->flags & UU_FILE_FLAG_NET)) || (! (f->flags & UU_FILE_FLAG_TCP))  )
    {
        *err = ENOTSOCK;
        return -1;
    }

    //struct sockaddr_in *ia = (void *)_ia;

    i4sockaddr tmp_addr;
    errno_t rc = sockaddr_unix2int( &tmp_addr, _ia, addrlen );
    if( rc )
    {
        *err = rc;
        return -1;
    }
    /*
    tmp_addr.port = ia->sin_port;
    NETADDR_TO_IPV4(tmp_addr.addr) = ia->sin_addr.s_addr;

    if( ia->sin_family != PF_INET )
        SHOW_ERROR0( 0, "not inet addr?");
    */

    int tret = tcp_connect( us->prot_data, &tmp_addr );

    // TODO ret code!
    if( tret )
        *err = ECONNREFUSED;
    return tret ? -1 : 0;
}
int usys_getpeername(int *err, uuprocess_t *u, int fd, struct sockaddr *name, socklen_t *namelen)
{
    if( u == 0 )
    {
        *err = ENOTSOCK; // TODO correct?
        return -1;
    }

    CHECK_FD(fd);
    struct uufile *f = GETF(fd);

    struct uusocket *us = f->impl;

    if( ! (f->flags & UU_FILE_FLAG_NET))
    {
        *err = ENOTSOCK;
        return -1;
    }

    if( ! (f->flags & UU_FILE_FLAG_TCP) )
    {
        *err = ENOTCONN; // Right?
        return -1;
    }

    /*
    if( (unsigned)(*namelen) < sizeof(struct sockaddr) )
    {
        *err = EINVAL;
        return -1;
    }

    *namelen = sizeof(struct sockaddr);
    */

    i4sockaddr tmp_addr;
    if( tcp_getpeername(us->prot_data, &tmp_addr) )
    {
        *err = ENOTCONN;
        return -1;
    }

    return sockaddr_int2unix( name, namelen, &tmp_addr );
}
int usys_getsockname(int *err, uuprocess_t *u, int fd, struct sockaddr *name, socklen_t *namelen)
{
    if( u == 0 )
    {
        *err = ENOTSOCK; // TODO correct?
        return -1;
    }

    CHECK_FD(fd);
    struct uufile *f = GETF(fd);

    struct uusocket *us = f->impl;

    if( ! (f->flags & UU_FILE_FLAG_NET))
    {
        *err = ENOTSOCK;
        return -1;
    }

    sockaddr_int2unix( name, namelen, &us->addr );
    //*namelen = sizeof(us->addr);
    //*name = us->addr;
    return 0;
}
int usys_accept(int *err, uuprocess_t *u, int fd, struct sockaddr *acc_addr, socklen_t *addrlen)
{
    if( u == 0 )
    {
        *err = ENOTSOCK; // TODO correct?
        return -1;
    }

    CHECK_FD(fd);
    struct uufile *f = GETF(fd);

    struct uusocket *us = f->impl;

    // todo require UU_FILE_FLAG_ACCEPTABLE
    if( ! (f->flags & (UU_FILE_FLAG_NET|UU_FILE_FLAG_TCP)) )
    {
        *err = ENOTSOCK;
        return -1;
    }

    //us->addr = my_addr;

    void *new_socket = NULL;
    i4sockaddr tmp_addr;

    int pe = tcp_accept(us->prot_data, &tmp_addr, &new_socket);

    if( *addrlen >= (int)sizeof(struct sockaddr_in) )
    {
        /*
        struct sockaddr_in ia;

        ia.sin_len = sizeof(struct sockaddr_in);
        ia.sin_port = tmp_addr.port;
        ia.sin_addr.s_addr = NETADDR_TO_IPV4(tmp_addr.addr);
        ia.sin_family = PF_INET;

        *((struct sockaddr_in *)acc_addr) = ia;
        *addrlen = sizeof(struct sockaddr_in);
        */
        if( sockaddr_int2unix( acc_addr, addrlen, &tmp_addr ) )
            *addrlen = 0;
    }
    else
        *addrlen = 0;

    // TODO translate!
    if( pe )
    {
        *err = ECONNABORTED;
        return -1;
    }

    struct uusocket *rus = calloc(1, sizeof(struct uusocket));
    if(rus == 0)
    {
        tcp_close( new_socket );
        *err = ENOMEM;
        return -1;
    }



    uufile_t *rf = create_uufile();
    assert(f);

    rf->ops = &tcpfs_fops;

    rf->pos = 0;
    rf->fs = &tcp_fs;
    rf->impl = rus;
    rf->flags = UU_FILE_FLAG_NET|UU_FILE_FLAG_TCP;

    int rfd = uu_find_fd( u, rf );

    if( rfd < 0 )
    {
        tcp_close( new_socket );
        unlink_uufile( f );
        free( us );
        *err = EMFILE;
        return -1;
    }

    return *err ? -1 : rfd;
}
int usys_bind(int *err, uuprocess_t *u, int fd, const struct sockaddr *addr, socklen_t addrlen)
{
    if( u == 0 )
    {
        *err = ENOTSOCK; // TODO correct?
        return -1;
    }


    CHECK_FD(fd);
    struct uufile *f = GETF(fd);

    struct uusocket *us = f->impl;

    if( ! (f->flags & UU_FILE_FLAG_NET) )
    {
        *err = ENOTSOCK;
        return -1;
    }

    /*
    if(
       (addrlen < my_addr->sa_len) ||
       (addrlen < (int)sizeof(struct sockaddr_in))
      )
    {
        *err = EINVAL;
        return -1;
    }
    */
    //us->addr = *my_addr;

    errno_t rc = sockaddr_unix2int( &us->addr, addr, addrlen );
    if( rc )
    {
        *err = rc;
        return -1;
    }

    int pe;

    if( f->flags & UU_FILE_FLAG_TCP )
    {
        pe = tcp_bind(us->prot_data, &us->addr);
    }
    else if( f->flags & UU_FILE_FLAG_UDP )
    {
        pe = udp_bind(us->prot_data, &us->addr);
    }
    else
    {
        *err = ENOPROTOOPT;
        return -1;
    }

    // TODO translate!
    if( pe )
        *err = EADDRINUSE;

    return *err ? -1 : 0;
}
Exemple #14
0
/*-------------------------------------------------------------------------*/
size_t frontpanel_rs232::fp_read(unsigned char *b, size_t len)
{
	CHECK_FD();
	return read(fd,b,len);
}