/* * Handle SOCK_DGRAM connection. Always blocking in _arp_resolve() */ static int udp_connect (Socket *socket) { #if defined(USE_IPV6) if (socket->so_family == AF_INET6) { const struct sockaddr_in6 *la = (const struct sockaddr_in6*) socket->local_addr; const struct sockaddr_in6 *ra = (const struct sockaddr_in6*) socket->remote_addr; if (!_UDP6_open (socket, &ra->sin6_addr, la->sin6_port, ra->sin6_port)) { SOCK_DEBUGF ((", no route (udp6)")); SOCK_ERRNO (EHOSTUNREACH); STAT (ip6stats.ip6s_noroute++); return (-1); } } else #endif if (!_UDP_open (socket, socket->remote_addr->sin_addr, socket->local_addr->sin_port, socket->remote_addr->sin_port)) { /* errno already set in udp_open() */ SOCK_DEBUGF ((", %s", socket->udp_sock->err_msg)); return (-1); } if ((socket->so_state & SS_PRIV) && socket->bcast_pool) { /* undo what udp_open() did above. * !!Fix me: clears recv data. */ sock_recv_init ((sock_type*)socket->udp_sock, socket->bcast_pool, socket->pool_size); } socket->so_state &= ~SS_UNCONNECTED; socket->so_state |= SS_ISCONNECTED; return (0); }
int main( int argc, char *argv[] ) { /* int i; */ int status = 0; char *temp; if (argc < 4 ) { outs("SERTN host port program options\n\r"); exit(1); } sock_init(); if (!( host = resolve( argv[1] ))) { outs( "Bad Host\n\r" ); exit(1); } if ( (temp = getenv( TCPTERM )) != NULL ) { /* deal with strncpy limitation */ movmem( temp, termtype, sizeof( termtype )); termtype[ sizeof(termtype) -1 ] = 0; outs("TERMINAL EMULATION :"); outs( termtype ); outs("\n\r"); } else strcpy(termtype, "UNKNOWN"); s = &socketdata; if ( host == my_ip_addr ) { outs("Incomming sessions not supported...\n\r"); sock_wait_established( s, 0, NULL, &status ); exit( -3 ); } if (! tcp_open( s, 0, host, atoi( argv[2]), NULL )) { #ifndef OLD sock_recv_init( s, bigbuf, sizeof( bigbuf ), 0); #endif OLD outs( "Unable to open\n\r"); exit(1); } sock_wait_established( s, sock_delay, NULL, &status ); sock_mode( s, TCP_MODE_NAGLE ); sock_status = 1; /* allow interrupts */ /* move vectors */ moved_vectors = 1; old8 = getvect( 0x08 ); old14 = getvect( 0x014 ); /* setvect( 0x08, (void interrupt (*)())serial_t ); */ setvect( 0x08, tcpport_tick ); setvect( 0x014,ourhandler); /* was serial_2 */ recvtimeout = set_ttimeout( 1 ); outs("Running..."); outs( argv[3] ); outs( "\n\r"); system( argv[ argc-1 ] ); outs("Done, now closing session\n\r"); setvect( 0x014, old14 ); setvect( 0x08, old8 ); moved_vectors = 0; if ( s ) { sock_close( s ); sock_wait_closed( s, sock_delay, NULL, &status ); } sock_err: switch (status) { case 1 : outs("Done.\n\r"); break; case -1: outs("Remote host reset connection."); break; } if (moved_vectors) { setvect( 0x014, old14 ); setvect( 0x08, old8 ); } exit( (status)? 2 : 0); return (0); /* not reached */ }