/* disconnect from given host */ int disconnect_from (char *host) { struct hostent *h; struct sockaddr_in serv_addr; int socket; int i; h = gethostbyname (host); if (h == NULL) { printf ("[EE] Unknown host '%s'\n", host); return 0; } memcpy ((char *) &serv_addr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); socket = dump_lookup_neighbor (serv_addr.sin_addr); if (socket == 0) { printf ("[EE] No connection to host '%s'\n", host); return 0; } /* printf ("[+] disconnecting : del_neighbor \n"); dump_del_neighbor (serv_addr.sin_addr); printf ("[+] disconnecting : del_myid \n"); dump_del_myid (socket); printf ("[+] disconnecting : close \n"); close (socket); */ dump_disconnect (socket); for (i = 2; i < sd_num; i++) { if (sd_list[i] == socket) sd_list[i] = 0; /* XXX dirty */ } return 0; }
/* receive callback */ void *dump_receive_cb(int s) { pkt_t *pkt; #if __DEBUG_DUMP__ printf("[DUMP] dump_receive_cb [%d]\n", s); #endif /* clean recently seen tables */ dump_clean_recently_seen(); /* read an entire packet */ pkt = dump_recv_pkt(s); if (pkt == (pkt_t *) (-1)) { #if __DEBUG_DUMP__ printf("[DUMP] error -> disconnecting\n"); #endif dump_disconnect(s); return (void *) (-1); } #if __DEBUG_DUMP__ printf("[DUMP] ----recv-----\n"); dump_print_pkt(pkt); printf("[DUMP] -------------\n"); #endif /* if packet readed */ if (pkt != NULL) { /* determine packet type */ switch (ntohs(pkt->type)) { case RR: dump_receive_RR(pkt); dump_free(pkt); break; case Rr: dump_receive_Rr(pkt); dump_free(pkt); break; case DATA: pkt = dump_receive_DATA(pkt); /* need some mem free */ #if !defined(ERESI_INTERNAL) if (pkt < 0) { printf("[EE] error while forwaring data\n"); } #endif return pkt; break; default: #if !defined(ERESI_INTERNAL) fprintf(stderr, "[EE] Unknown packet type %u \n", ntohs(pkt->type)); #endif /* XXX anything to add ? */ exit(-1); } } return NULL; }