int bb_shutdown(void) { static int called = 0; mutex_lock(status_mutex); if (called) { mutex_unlock(status_mutex); return -1; } debug("bb", 0, "Shutting down " GW_NAME "..."); called = 1; set_shutdown_status(); mutex_unlock(status_mutex); #ifndef NO_SMS debug("bb", 0, "shutting down smsc"); smsc2_shutdown(); #endif #ifndef NO_WAP debug("bb", 0, "shutting down udp"); udp_shutdown(); #endif return 0; }
void termination_handler(int sig) { PRINT_DEBUG("**********Terminating *******"); //shutdown all module threads in backwards order of startup //rtm_shutdown(); udp_shutdown(); tcp_shutdown(); icmp_shutdown(); ipv4_shutdown(); arp_shutdown(); interface_shutdown(); //TODO finish daemon_shutdown(); //TODO finish switch_shutdown(); //TODO finish //have each module free data & que/sem //TODO finish each of these //rtm_release(); udp_release(); tcp_release(); icmp_release(); ipv4_release(); arp_release(); interface_release(); daemon_release(); switch_release(); PRINT_DEBUG("FIN"); exit(-1); }
t_stat udp_release (DEVICE *dptr, int32 link) { // Close a link that was created by udp_create() and release any resources // allocated to it. We always return SCPE_OK unless the link specified is // already unused. int32 iret, i; if ((link < 0) || (link >= MAXLINKS)) return SCPE_IERR; if (!udp_links[link].used) return SCPE_IERR; // Close the sockets associated with this connection - that's easy ... iret = closesocket(udp_links[link].rxsock); if (iret != 0) udp_socket_error(link, "closesocket()"); iret = closesocket(udp_links[link].txsock); if (iret != 0) udp_socket_error(link, "closesocket()"); udp_links[link].used = FALSE; sim_debug(IMP_DBG_UDP, dptr, "link %d - closed\n", link); // If we just closed the last link, then call udp_shutdown() ... for (i = 0; i < MAXLINKS; ++i) { if (udp_links[i].used) return SCPE_OK; } return udp_shutdown(dptr); }
void usb_shutdown (void) { udp_shutdown (); }
int main(int argc, char **argv) { int opt; Cfg *cfg = NULL; gwlib_init(); server_port = CONNECTION_ORIENTED_PORT; while ((opt = getopt(argc, argv, "v:meti:p:")) != EOF) { switch (opt) { case 'v': log_set_output_level(atoi(optarg)); break; case 'm': verbose += 1; break; case 'e': verbose += 2; break; case 't': verbose += 4; break; case 'h': help(); exit(0); case 'i': interface_name = octstr_create(optarg); break; case 'p': server_port = atoi(optarg); break; case '?': default: error(0, "Invalid option %c", opt); help(); panic(0, "Stopping."); } } if (optind == argc) { help(); exit(0); } /* get the host or IP of the real wap gw to forward the WDP packets */ wapgw = octstr_create(argv[optind]); /* if no interface was given use 0.0.0.0 */ if (!interface_name) interface_name = octstr_create("*"); report_versions("wapproxy"); /* initialize main inbound and outbound queues */ outgoing_wdp = gwlist_create(); incoming_wdp = gwlist_create(); flow_threads = gwlist_create(); outgoing_wdp_counter = counter_create(); incoming_wdp_counter = counter_create(); /* start the main UDP listening threads */ udp_start(cfg); gwlist_add_producer(outgoing_wdp); debug("bb", 0, "starting WDP routers"); if (gwthread_create(service_router, NULL) == -1) panic(0, "Failed to start a new thread for inbound WDP routing"); if (gwthread_create(wdp_router, NULL) == -1) panic(0, "Failed to start a new thread for outbound WDP routing"); gwthread_sleep(5.0); /* give time to threads to register themselves */ while (gwlist_consume(flow_threads) != NULL) ; udp_shutdown(); gwlist_remove_producer(outgoing_wdp); gwlist_destroy(flow_threads, NULL); gwlist_destroy(incoming_wdp, NULL); gwlist_destroy(outgoing_wdp, NULL); counter_destroy(incoming_wdp_counter); counter_destroy(outgoing_wdp_counter); octstr_destroy(interface_name); octstr_destroy(wapgw); gwlib_shutdown(); return 0; }