int cmd_import( REPLY *r, const char *addr_str) { char addrbuf[FULL_ADDSTRLEN+1]; IP addr; int rc; /* If the address contains no port - use the default port */ if( (rc = addr_parse_full( &addr, addr_str, DHT_PORT, gconf->af )) == ADDR_PARSE_SUCCESS ) { if( kad_ping( &addr ) == 0 ) { r_printf( r, "Send ping to: %s\n", str_addr( &addr, addrbuf ) ); return 0; } else { r_printf( r, "Failed to send ping.\n" ); return 1; } } else if( rc == ADDR_PARSE_CANNOT_RESOLVE ) { r_printf( r, "Failed to resolve address.\n" ); return 1; } else if( rc == ADDR_PARSE_NO_ADDR_FOUND ) { r_printf( r, "Failed to aquire address of required protocol.\n" ); return 1; } else { r_printf( r, "Failed to parse address.\n" ); return 1; } }
void handle_mcast( int rc, int sock_recv ) { char addrbuf[FULL_ADDSTRLEN+1]; char buf[512]; IP c_addr; socklen_t addrlen; int rc_recv; if( g_mcast_time <= time_now_sec() ) { if( kad_count_nodes( 0 ) == 0 ) { /* Join multicast group if possible */ if( g_mcast_registered == 0 && multicast_set_groups( sock_recv, &g_lpd_addr, gconf->dht_ifname, 1 ) == 0 ) { log_info( "LPD: No peers known. Joined multicast group." ); g_mcast_registered = 1; } if( g_mcast_registered == 1 ) { log_info( "LPD: Send multicast message to find nodes." ); /* Create message */ snprintf( buf, sizeof(buf), msg_fmt, str_addr( &g_lpd_addr, addrbuf ), atoi( gconf->dht_port ), g_infohash ); mcast_send_packets( buf, gconf->dht_ifname ); } } /* Cap number of received packets to 10 per minute */ g_packet_limit = 5 * PACKET_LIMIT_MAX; /* Try again in ~5 minutes */ g_mcast_time = time_add_min( 5 ); } if( rc <= 0 ) { return; } /* Reveice multicast ping */ addrlen = sizeof(IP); rc_recv = recvfrom( sock_recv, buf, sizeof(buf), 0, (struct sockaddr*) &c_addr, (socklen_t*) &addrlen ); if( rc_recv < 0 ) { log_warn( "LPD: Cannot receive multicast message: %s", strerror( errno ) ); return; } if( g_packet_limit < 0 ) { /* Too much traffic - leave multicast group for now */ if( g_mcast_registered == 1 && multicast_set_groups( sock_recv, &g_lpd_addr, gconf->dht_ifname, 0 ) == 0 ) { log_warn( "LPD: Too much traffic. Left multicast group." ); g_mcast_registered = 0; } return; } else { g_packet_limit--; } if( rc_recv >= sizeof(buf) ) { return; } else { buf[rc_recv] = '\0'; } int port = parse_packet( buf ); if( port > 0 ) { port_set( &c_addr, port ); log_debug( "LPD: Ping lonely peer at %s", str_addr( &c_addr, addrbuf ) ); kad_ping( &c_addr ); } else { log_debug( "LPD: Received invalid packet on multicast group." ); } }