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; }
/*-------------------------------------------------------------------------*/ 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; }
/* 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; }
/*-------------------------------------------------------------------------*/ size_t frontpanel_rs232::fp_read(unsigned char *b, size_t len) { CHECK_FD(); return read(fd,b,len); }