static int getpkt (Bns *bns, char **seedp, int fixedsize, int *pktsize, int *seedsize) { int retcode ; if ( fixedsize != 0 ) { SIZE_BUFFER (char *, *seedp, *seedsize, fixedsize ) ; retcode = bnsget(bns, *seedp, BYTES, fixedsize ) ; *pktsize = fixedsize ; } else if ( (retcode = bnsget ( bns, *seedp, BYTES, 64 )) == 0 ) {
int main (int argc, char **argv) { int c ; char *liss_server ; int timeout = 10; int verbose = 0 ; int defaultport = 4000 ; unsigned char *seed ; int fd = -1 ; Bns *bns=0 ; elog_init (argc, argv); announce(0,0) ; while ((c = getopt (argc, argv, "v")) != -1) { switch (c) { case 'v': verbose++ ; break; default: usage (); } } if (argc - optind < 1) usage (); allot(unsigned char *, seed, SIZE) ; for(;optind < argc;optind++) { liss_server = argv[optind] ; elog_notify(0, "opening %s\n", liss_server) ; fd = open_socket ( liss_server, defaultport ) ; if ( fd < 0 ) { elog_complain ( 1, "Can't open liss server %s", liss_server ) ; } else { int out ; bns = bnsnew(fd, 8192) ; bnsuse_sockio(bns) ; bnstimeout ( bns, timeout*1000 ) ; bnsclr(bns) ; bns->fd = fd ; elog_notify(0, "reading %d bytes from %s\n", SIZE, liss_server) ; if ( bnsget(bns, seed, BYTES, SIZE ) == 0 ) { out = open(liss_server, O_WRONLY | O_CREAT, 0664 ) ; if ( out == 0 ) { elog_die (0, "Can't open %s to write", liss_server) ; } elog_notify(0, "writing %d bytes from %s\n", SIZE, liss_server) ; if ( write(out, seed, SIZE) != SIZE ) { elog_complain(0, "failed to write %d bytes to %s", SIZE, liss_server) ; } if ( close(out) != 0 ) { elog_complain(0, "failed to close %s", liss_server) ; } } else { elog_complain(0, "Failed to read data from %s", liss_server) ; } if ( bnsclose(bns) != 0 ) { elog_complain(0, "failed to close bns #%d for %s", fd, liss_server) ; } } } return 0 ; }
int more_packet_data( ImportThread *it ) { int rc; unsigned char c; int bns_errno; unsigned char bytecount[2]; unsigned char *bytecountp; int retcode = 0; while( ( rc = bnsget( it->bnsin, &c, BYTES, 1 ) ) == 0 ) { switch( it->sync_state ) { case STREAM_SEARCH: if( c == 0x9c ) { it->nbytes = 0; APPEND_BUFFER( it->buf, it->bufsize, it->nbytes, c ); it->sync_state = STREAM_CONFIRM; } else { BAD_BYTE( "search", c ); } break; case STREAM_CONFIRM: if( c == 0xa5 ) { APPEND_BUFFER( it->buf, it->bufsize, it->nbytes, c ); it->sync_state = STREAM_ACCUMULATE; bnsget( it->bnsin, bytecount, BYTES, 1 ); bnsget( it->bnsin, bytecount+1, BYTES, 1 ); APPEND_BUFFER( it->buf, it->bufsize, it->nbytes, bytecount[0] ); APPEND_BUFFER( it->buf, it->bufsize, it->nbytes, bytecount[1] ); bytecountp = &bytecount[0]; vs2hs( &bytecountp, &it->intake_packet_bytecount, 1 ); if( VeryVerbose ) { elog_notify( 0, "Receiving a %d-byte packet...\n", it->intake_packet_bytecount ); } } else { it->sync_state = STREAM_SEARCH; it->nbytes = 0; BAD_BYTE( "search", c ); } break; case STREAM_ACCUMULATE: APPEND_BUFFER( it->buf, it->bufsize, it->nbytes, c ); if( it->nbytes == it->intake_packet_bytecount ) { it->sync_state = STREAM_SEARCH; return 1; } break; default: BAD_BYTE( "default", c ); it->sync_state = STREAM_SEARCH; break; } } if( bnserr( it->bnsin ) != 0 ) { bns_errno = bnserrno( it->bnsin ); if( Verbose ) { if( bns_errno == ECONNRESET ) { elog_complain( 1, "'%s': Connection reset by peer\n", it->name ); } else { elog_complain( 1, "'%s': bns error %d\n", it->name, bns_errno ); } } retcode = -1; } else if( bnseof( it->bnsin ) ) { if( Verbose ) { elog_complain( 1, "'%s': Connection closed by remote " "export module\n", it->name ); } retcode = -1; } return retcode; }