static void dopoll(void) { int i; t_fdpoll *fp; fd_set readset, writeset, exceptset; FD_ZERO(&writeset); FD_ZERO(&readset); FD_ZERO(&exceptset); FD_SET(sockfd, &readset); if (protocol == SOCK_STREAM) { for (fp = fdpoll, i = nfdpoll; i--; fp++) FD_SET(fp->fdp_fd, &readset); } if (select(maxfd+1, &readset, &writeset, &exceptset, 0) < 0) { perror("select"); exit(1); } if (protocol == SOCK_STREAM) { for (i = 0; i < nfdpoll; i++) if (FD_ISSET(fdpoll[i].fdp_fd, &readset)) tcpread(&fdpoll[i]); if (FD_ISSET(sockfd, &readset)) doconnect(); } else { if (FD_ISSET(sockfd, &readset)) udpread(); } }
void tcpreadall(int sockid, const char *buff, int len, int maxtime) { smallset_t set; postime_t end = getcurtime() + maxtime, cur; int ret, x; set.init(1); set.set(0, sockid); while (len > 0) { while ((cur = getcurtime()) <= end) { set.init(1); set.set(0, sockid); x = end.after(cur); if (x > 1000) x = 1000; set.wait(x); if (set.isdata(0) || posclient_quitflag) break; } // set.check(); if (!set.isdata(0)) { throw PException("Could not read TCP message: no data"); } ret = tcpread(sockid, buff, len); if (ret == 0) throw PException("TCP client hung up!"); buff += ret; len -= ret; } }
static ber_slen_t sb_stream_read( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len ) { assert( sbiod != NULL); assert( SOCKBUF_VALID( sbiod->sbiod_sb ) ); #if defined(MACOS) /* * MacTCP/OpenTransport */ return tcpread( sbiod->sbiod_sb->sb_fd, 0, (unsigned char *)buf, len, NULL ); #elif defined( HAVE_PCNFS ) || \ defined( HAVE_WINSOCK ) || defined ( __BEOS__ ) /* * PCNFS (under DOS) */ /* * Windows Socket API (under DOS/Windows 3.x) */ /* * 32-bit Windows Socket API (under Windows NT or Windows 95) */ { int rc; rc = recv( sbiod->sbiod_sb->sb_fd, buf, len, 0 ); #ifdef HAVE_WINSOCK if ( rc < 0 ) { int err; err = WSAGetLastError(); errno = err; } #endif return rc; } #elif defined( HAVE_NCSA ) /* * NCSA Telnet TCP/IP stack (under DOS) */ return nread( sbiod->sbiod_sb->sb_fd, buf, len ); #else return read( sbiod->sbiod_sb->sb_fd, buf, len ); #endif }
/*------------------------------------------------------------------------ * tcpgetc - read one character from a TCP pseudo-device *------------------------------------------------------------------------ */ int tcpgetc(struct devsw *pdev) { char ch; int cc; cc = tcpread(pdev, &ch, 1); if (cc < 0) return SYSERR; else if (cc == 0) return EOF; /* else, valid data */ return ch; }
static int master_register(int rfd,uint32_t cuid) { uint32_t i; const uint8_t *rptr; uint8_t *wptr,regbuff[8+73]; wptr = regbuff; put32bit(&wptr,CLTOMA_FUSE_REGISTER); put32bit(&wptr,73); memcpy(wptr,FUSE_REGISTER_BLOB_ACL,64); wptr+=64; put8bit(&wptr,REGISTER_TOOLS); put32bit(&wptr,cuid); put16bit(&wptr,VERSMAJ); put8bit(&wptr,VERSMID); put8bit(&wptr,VERSMIN); if (tcpwrite(rfd,regbuff,8+73)!=8+73) { printf("register to master: send error\n"); return -1; } if (tcpread(rfd,regbuff,9)!=9) { printf("register to master: receive error\n"); return -1; } rptr = regbuff; i = get32bit(&rptr); if (i!=MATOCL_FUSE_REGISTER) { printf("register to master: wrong answer (type)\n"); return -1; } i = get32bit(&rptr); if (i!=1) { printf("register to master: wrong answer (length)\n"); return -1; } if (*rptr) { printf("register to master: %s\n",mfsstrerr(*rptr)); return -1; } return 0; }
static ber_slen_t sb_stream_read( Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len ) { assert( sbiod != NULL); assert( SOCKBUF_VALID( sbiod->sbiod_sb ) ); #if defined(MACOS) /* * MacTCP/OpenTransport */ return tcpread( sbiod->sbiod_sb->sb_fd, 0, (unsigned char *)buf, len, NULL ); #elif defined( HAVE_PCNFS ) || \ defined( HAVE_WINSOCK ) || defined ( __BEOS__ ) /* * PCNFS (under DOS) */ /* * Windows Socket API (under DOS/Windows 3.x) */ /* * 32-bit Windows Socket API (under Windows NT or Windows 95) */ return recv( sbiod->sbiod_sb->sb_fd, (char*)buf, (int)len, 0 ); // This should be safe, as ret will not exceed 2G. #elif defined( HAVE_NCSA ) /* * NCSA Telnet TCP/IP stack (under DOS) */ return nread( sbiod->sbiod_sb->sb_fd, buf, len ); #else return read( sbiod->sbiod_sb->sb_fd, buf, len ); #endif }