| 1 | #include "tcpcalls.h" |
|---|
| 2 | |
|---|
| 3 | int create_service( ushort port ) { |
|---|
| 4 | struct sockaddr_in server_sockaddr; |
|---|
| 5 | int server_socket; |
|---|
| 6 | |
|---|
| 7 | printf( "A" ); fflush( stdout ); |
|---|
| 8 | bzero( &server_sockaddr, sizeof( server_sockaddr ) ); |
|---|
| 9 | printf( "A" ); fflush( stdout ); |
|---|
| 10 | server_sockaddr.sin_port = htons( port ); |
|---|
| 11 | printf( "A" ); fflush( stdout ); |
|---|
| 12 | server_sockaddr.sin_family = AF_INET; |
|---|
| 13 | printf( "A" ); fflush( stdout ); |
|---|
| 14 | server_sockaddr.sin_addr.s_addr = htonl( INADDR_ANY ); |
|---|
| 15 | printf( "A" ); fflush( stdout ); |
|---|
| 16 | server_socket = socket( AF_INET, SOCK_STREAM, 0 ); |
|---|
| 17 | printf( "A" ); fflush( stdout ); |
|---|
| 18 | if( server_socket < 0 ) { |
|---|
| 19 | perror( "socket" ); |
|---|
| 20 | return( -1 ); |
|---|
| 21 | } |
|---|
| 22 | printf( "A" ); fflush( stdout ); |
|---|
| 23 | if( bind( server_socket, &server_sockaddr, sizeof( server_sockaddr ) ) < 0 ) { |
|---|
| 24 | perror( "bind" ); |
|---|
| 25 | close( server_socket ); |
|---|
| 26 | return( -1 ); |
|---|
| 27 | } |
|---|
| 28 | printf( "A" ); fflush( stdout ); |
|---|
| 29 | listen( server_socket, 5 ); |
|---|
| 30 | printf( "A" ); fflush( stdout ); |
|---|
| 31 | return( server_socket ); |
|---|
| 32 | } |
|---|
| 33 | |
|---|
| 34 | static sigjmp_buf envOnCT; static int savemaskOnCT; |
|---|
| 35 | |
|---|
| 36 | void onConnectTimeout() { |
|---|
| 37 | } |
|---|
| 38 | |
|---|
| 39 | int connect_to_server( char *name, ushort port, int timeout_val ) { |
|---|
| 40 | struct sockaddr_in server_sockaddr; |
|---|
| 41 | struct hostent *server_hostent; |
|---|
| 42 | int toserver_socket, i; |
|---|
| 43 | char str[ 255 ]; |
|---|
| 44 | ushort opcode; |
|---|
| 45 | unsigned long hostaddr; |
|---|
| 46 | char server_name[ 255 ]; |
|---|
| 47 | |
|---|
| 48 | if( ( name == NULL ) || ( *name == 0 ) ) { |
|---|
| 49 | strcpy( server_name, "localhost" ); |
|---|
| 50 | } else |
|---|
| 51 | strcpy( server_name, name ); |
|---|
| 52 | |
|---|
| 53 | bzero( &server_sockaddr, sizeof( server_sockaddr ) ); |
|---|
| 54 | |
|---|
| 55 | hostaddr = inet_addr( server_name ); |
|---|
| 56 | if( ( long )hostaddr != ( long )-1 ) { |
|---|
| 57 | bcopy( &hostaddr, &server_sockaddr.sin_addr, sizeof( hostaddr ) ); |
|---|
| 58 | } else { |
|---|
| 59 | server_hostent = gethostbyname( server_name ); |
|---|
| 60 | if( server_hostent == NULL ) |
|---|
| 61 | return( -1 ); |
|---|
| 62 | bcopy( server_hostent->h_addr, &server_sockaddr.sin_addr, server_hostent->h_length ); |
|---|
| 63 | } |
|---|
| 64 | server_sockaddr.sin_family = AF_INET; |
|---|
| 65 | server_sockaddr.sin_port = htons( port ); |
|---|
| 66 | if( ( toserver_socket = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) |
|---|
| 67 | return( -1 ); |
|---|
| 68 | |
|---|
| 69 | signal( SIGALRM, onConnectTimeout ); |
|---|
| 70 | alarm( timeout_val ); |
|---|
| 71 | if( connect( toserver_socket, &server_sockaddr, sizeof( server_sockaddr ) ) < 0 ) |
|---|
| 72 | goto ON_FAIL; |
|---|
| 73 | alarm( 0 ); |
|---|
| 74 | signal( SIGALRM, SIG_IGN ); |
|---|
| 75 | return( toserver_socket ); |
|---|
| 76 | ON_FAIL: |
|---|
| 77 | alarm( 0 ); |
|---|
| 78 | signal( SIGALRM, SIG_IGN ); |
|---|
| 79 | close( toserver_socket ); |
|---|
| 80 | return( -1 ); |
|---|
| 81 | } |
|---|
| 82 | |
|---|
| 83 | int read_short( int sock, ushort *num ) { |
|---|
| 84 | char tmp[ 2 ]; |
|---|
| 85 | int result, len; |
|---|
| 86 | |
|---|
| 87 | *num = ( short )0; |
|---|
| 88 | len = 0; |
|---|
| 89 | while( len < 2 ) { |
|---|
| 90 | result = read( sock, tmp, 2 - len ); |
|---|
| 91 | if( result == -1 ) { |
|---|
| 92 | if( errno == EAGAIN || errno == EWOULDBLOCK ) |
|---|
| 93 | continue; |
|---|
| 94 | } else if( result <= 0 ) |
|---|
| 95 | return( result ); |
|---|
| 96 | len += result; |
|---|
| 97 | } |
|---|
| 98 | |
|---|
| 99 | *num = ntohs( *( ushort * )tmp ); |
|---|
| 100 | return( 2 ); |
|---|
| 101 | } |
|---|
| 102 | |
|---|
| 103 | int write_short( int sock, ushort num ) { |
|---|
| 104 | char tmp[ 2 ]; |
|---|
| 105 | int result; |
|---|
| 106 | |
|---|
| 107 | *( short * )tmp = htons( num ); |
|---|
| 108 | result = write( sock, tmp, 2 ); |
|---|
| 109 | if( result <= 0 ) |
|---|
| 110 | return( result ); |
|---|
| 111 | if( result == 1 ) { |
|---|
| 112 | result = write( sock, tmp +1, 1 ); |
|---|
| 113 | if( result <= 0 ) |
|---|
| 114 | return( result ); |
|---|
| 115 | } |
|---|
| 116 | return( result ); |
|---|
| 117 | } |
|---|
| 118 | |
|---|
| 119 | int read_blk( int sock, ushort *opcode, char *str ) { |
|---|
| 120 | char *ptr = str; |
|---|
| 121 | int result; |
|---|
| 122 | ushort block_len, b; |
|---|
| 123 | |
|---|
| 124 | if( ( result = read_short( sock, opcode ) ) <= 0 ) |
|---|
| 125 | return( result ); |
|---|
| 126 | if( ( result = read_short( sock, &block_len ) ) <= 0 ) |
|---|
| 127 | return( result ); |
|---|
| 128 | b = block_len; |
|---|
| 129 | |
|---|
| 130 | while( block_len > 0 ) { |
|---|
| 131 | result = read( sock, ptr, block_len ); |
|---|
| 132 | if( result == -1 ) { |
|---|
| 133 | if( errno == EAGAIN || errno == EWOULDBLOCK ) |
|---|
| 134 | continue; |
|---|
| 135 | } else if( result <= 0 ) |
|---|
| 136 | return( result ); |
|---|
| 137 | block_len -= result; |
|---|
| 138 | ptr += result; |
|---|
| 139 | } |
|---|
| 140 | return( b ); |
|---|
| 141 | } |
|---|
| 142 | |
|---|
| 143 | int write_blk( int sock, ushort opcode, int block_len, char *str ) { |
|---|
| 144 | char *ptr = str; |
|---|
| 145 | int result; |
|---|
| 146 | |
|---|
| 147 | if( ( result = write_short( sock, opcode ) ) <= 0 ) |
|---|
| 148 | return( result ); |
|---|
| 149 | if( ( result = write_short( sock, block_len ) ) <= 0 ) |
|---|
| 150 | return( result ); |
|---|
| 151 | |
|---|
| 152 | while( block_len > 0 ) { |
|---|
| 153 | result = write( sock, ptr, block_len ); |
|---|
| 154 | if( result <= 0 ) |
|---|
| 155 | return( result ); |
|---|
| 156 | block_len -= result; |
|---|
| 157 | ptr += result; |
|---|
| 158 | } |
|---|
| 159 | return( 1 ); |
|---|
| 160 | } |
|---|