/* * pure-server.c : common server process for PURE network service. * * $Id: pure-server.c,v 1.1 2000/12/30 16:31:42 simm Exp $ */ #include "pure.h" const u_short PURE_PORT_MIN = 1024; const u_short PURE_PORT_MAX = 65535; static int pure_server_listen( net_peer* peer ) { int sock, len; struct sockaddr_in sv; if ( ( sock = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) return -1; len = sizeof( sv ); memset( &sv, 0, len ); sv.sin_family = AF_INET; sv.sin_addr.s_addr = htonl( INADDR_ANY ); if ( PURE_PORT_MIN < peer->bport || peer->eport < PURE_PORT_MAX ) { sv.sin_port = htons( peer->port = peer->bport ); while ( bind( sock, (struct sockaddr*)&sv, len ) < 0 ) { sv.sin_port = htons( ++(peer->port) ); if ( peer->eport < peer->port ) return -2; } } else { sv.sin_port = htons( 0 ); if ( bind( sock, (struct sockaddr*)&sv, len ) < 0 ) return -2; } if ( listen( sock, 1 ) < 0 ) return -3; if ( getsockname( sock, (struct sockaddr*)&sv, &len ) < 0 ) return -4; peer->port = ntohs( sv.sin_port ); return sock; } int pure_server_wait( net_peer* peer, int offset ) { int sock, slen; struct in_addr iaddr; struct sockaddr_in saddr; pure_getmyaddr( peer ); if ( peer->bport < PURE_PORT_MIN || PURE_PORT_MAX < peer->bport ) peer->bport = PURE_PORT_MIN; if ( peer->eport < PURE_PORT_MIN || PURE_PORT_MAX < peer->eport ) peer->eport = PURE_PORT_MAX; if ( peer->eport < peer->bport ) { u_short dummy = peer->eport; peer->eport = peer->bport; peer->bport = dummy; } if ( ( sock = pure_server_listen( peer ) ) < 0 ) return -2; iaddr.s_addr = htonl(peer->address); printf( "[INFO] Listen %s %u %d\n", inet_ntoa(iaddr), peer->port, offset ); slen = sizeof(saddr); peer->handle = accept( sock, (struct sockaddr*)&saddr, &slen ); close( sock ); printf( "[INFO] Connected\n" ); return 0; }