/* TCPIP マネージャの初期化 */ ER init_tcpip () { if (!initialized) { init_timer (); init_link (); init_ip (); init_udp (); init_tcp (); init_arp (); initialized = 1; } return (E_OK); }
/* MAIN ROUTINE. */ void dnsdbd_init(void){ unsigned int i=0; pthread_t pt_a,pt_s; struct in_addr show_ip; struct passwd *p; /* SET GLOBAL "~/.dnsdb-cache" PATH. */ if(!(p=getpwuid(getuid()))&&(i=strlen(p->pw_dir))){ if(!(cachefile=(char *)malloc(13+1))) print_msg(1,"malloc() failed."); memset(cachefile,0,(13+1)); strcpy(cachefile,"/.dnsdb-cache"); } else{ if(!(cachefile=(char *)malloc(i+13+1))) print_msg(1,"malloc() failed."); memset(cachefile,0,(i+13+1)); sprintf(cachefile,"%s/.dnsdb-cache",p->pw_dir); } /* BEGIN INITIALIZATION. */ print_msg(0,"bringing up MySQL connection to \"%s\"...",SQL_SERVER); while(db_init()){ print_msg(0,"MySQL connection \"%s\" failed... (wait)",SQL_SERVER); sleep(5); } print_msg(0,"creating (if not exists) 'db' table...",SQL_SERVER); db_printf(DNSDB_TABLE); if((show_ip.s_addr=ip_i=get_last_ip())) print_msg(0,"using cached IP from \"%s\"...",cachefile); else{ print_msg(0,"no usable IP from \"%s\"...",cachefile); show_ip.s_addr=init_ip(); } if(((ip_i>>24)&0xff)!=1) print_msg(1,"the starting ip must start with a 1... (xxx.xxx.xxx.1)"); print_msg(0,"setting initial base IP to \"%s\"...",inet_ntoa(show_ip)); print_msg(0,"deleting any non-DUP MySQL entries..."); db_printf("DELETE FROM db WHERE rsp<%u",MIN_RESPONSE); print_msg(0,"deleting any MySQL entries in the starting /24..."); db_printf("DELETE FROM db WHERE id>%u AND id<%u",r_32(ip_i),r_32(ip_i)+254); print_msg(0,"bringing dns_get_answers_t() thread up..."); if(pthread_create(&pt_a,0,(void*(*)(void *))dns_get_answers_t,0)) print_msg(1,"thread creation failed."); print_msg(0,"waiting for confirmation..."); while(!gat&&!nexit)sleep(1); if(!nexit){ print_msg(0,"bringing dns_scan_t() thread up..."); if(pthread_create(&pt_s,0,(void*(*)(void *))dns_scan_t,0)) print_msg(1,"thread creation failed."); /* GOOD TO KNOW, AS ITS COMPILED IN AND SHOWN NOWHERES ELSE. */ print_msg(0,"sending %u(%.2fk/s) packets/requests per second...", PACKETS_PER_SEC,((float)((20+8+18+strlen(RESOLV_DOMAIN))*PACKETS_PER_SEC) /1024)); print_msg(0,"idle, collecting replies... (hit ENTER for current ip)"); while(!nexit){ /* MIGHT AS WELL HAVE A WAY TO SHOW THE CURRENT IP LOCATION. */ if(getchar()=='\n'){ show_ip.s_addr=ip_i; print_msg(0,"current ip: %s",inet_ntoa(show_ip)); } } } return; }
int main (int argc, char **argv) { evutil_socket_t delay_sock, multicast_sock; struct event *udp_client_event, *multicast_listener_event, *signal_event, *discover_event, *telnet, *telnet_ref; opterr = 0; int opt; while ((opt = getopt (argc, argv, "u:U:t:T:v:s")) != -1) { switch (opt) { case 'u': delay_port = atoi(optarg); if(!delay_port) { fprintf(stderr, "bledny port opoznien\n"); return 1; } break; case 'U': ui_port = atoi(optarg); if(!ui_port) { fprintf(stderr, "bledny port telnetu\n"); return 1; } break; case 't': delay_ref = atof(optarg); if(delay_ref == 0.0) { fprintf(stderr, "bledny czas pomiedzy mierzeniem opoznien\n"); return 1; } break; case 'T': discovery_ref = atof(optarg); if(discovery_ref == 0.0) { fprintf(stderr, "bledny czas pomiedzy odkrywaniem komputerow\n"); return 1; } break; case 'v': ui_ref = atof(optarg); if(ui_ref == 0.0) { fprintf(stderr, "bledny czas pomiedzy odkrywaniem odswierzaniem ui\n" ); return 1; } case 's': ssh_tcp = 1; break; default: fprintf(stderr, "bledna opcja\n"); return 1; } } init_data(); init_ip(); init_mdns(ssh_tcp); main_loop = event_base_new(); delay_sock = get_delay_sock(); multicast_sock = get_multi_sock(); udp_client_event = event_new(main_loop, delay_sock, EV_READ|EV_PERSIST, udp_delays_ans_cb, NULL); if(!udp_client_event) { fprintf(stderr, "nie udalo sie utworzyc eventu serwera udp\n"); exit(-1); } if(event_add(udp_client_event, NULL) == -1) { fprintf(stderr, "nie udalo sie przylaczyc eventu serwera udp\n"); exit(-1); } multicast_listener_event = event_new(main_loop, multicast_sock, EV_READ|EV_PERSIST, multicast_rcv_cb, NULL); if(!multicast_listener_event) { fprintf(stderr, "nie udalo sie utworzyc eventu serwera multicast\n"); exit(-1); } if(event_add(multicast_listener_event, NULL) == -1) { fprintf(stderr, "nie udalo sie przylaczyc eventu serwera multicast\n"); exit(-1); } discover_event = event_new(main_loop, multicast_sock, EV_TIMEOUT|EV_PERSIST, multicast_discover_cb, NULL); if(!discover_event || event_add(discover_event, &disc_tv) < 0) { fprintf(stderr, "odkrywnie nie uruchomilo sie\n"); exit(-1); } signal_event = evsignal_new(main_loop, SIGINT, sigint_cb, (void *)main_loop); if (!signal_event || event_add(signal_event, NULL)<0) { fprintf(stderr, "Could not create/add a signal event!\n"); return 1; } evutil_socket_t uisock = socket(PF_INET, SOCK_STREAM, 0); struct sockaddr_in uiadrr; uiadrr.sin_family = AF_INET; uiadrr.sin_addr.s_addr = htonl(INADDR_ANY); uiadrr.sin_port = htons(ui_port); if(uisock == -1 || evutil_make_listen_socket_reuseable(uisock) || evutil_make_socket_nonblocking(uisock)) { return 1; } bind(uisock, (struct sockaddr*)&uiadrr, (socklen_t)sizeof(uiadrr)); listen(uisock, 5); telnet = event_new(main_loop, uisock, EV_READ|EV_PERSIST, telnet_cb, NULL); event_add(telnet, NULL); telnet_ref = event_new(main_loop, uisock, EV_TIMEOUT|EV_PERSIST, telnet_refresh_cb, NULL); event_add(telnet_ref, &ui_tv); if(event_base_dispatch(main_loop) == -1) { fprintf(stderr, "nie udalo sie uruchomic glownej petli\n"); exit(-1); } event_free(signal_event); event_free(multicast_listener_event); event_free(udp_client_event); event_base_free(main_loop); close(delay_sock); close(multicast_sock); return 0; }