void alog_open(char *fname, int use_localtm, int use_markers) { FILE *f; use_localtime = use_localtm; markers = use_markers; if (file != NULL) { warning(0, "Opening an already opened access log"); alog_close(); } if (strlen(fname) > FILENAME_MAX) { error(0, "Access Log filename too long: `%s', cannot open.", fname); return; } if (writers == NULL) writers = gwlist_create(); f = fopen(fname, "a"); if (f == NULL) { error(errno, "Couldn't open logfile `%s'.", fname); return; } file = f; strcpy(filename, fname); info(0, "Started access logfile `%s'.", filename); if (markers) alog("Log begins"); }
int main(int argc, const char **argv) { vector<const char*> args; Config_t config; char *config_file; int i; global_config = &config; //** Make the global point to what's loaded memset(global_config, 0, sizeof(Config_t)); //** init the data global_network = NULL; if (argc < 2) { printf("ibp_server [-d] config_file\n\n"); printf("-d - Run as a daemon\n"); printf("config_file - Configuration file\n"); return(0); } int astart = 1; int daemon = 0; if (strcmp(argv[astart], "-d") == 0) { daemon = 1; argv[astart] = ""; astart++; } config_file = (char *)argv[astart]; argv_to_vec(argc, argv, args); parse_config_options(args); // These are for EBOFS //*** Open the config file ***** printf("Config file: %s\n\n", config_file); GKeyFile *keyfile; GKeyFileFlags flags; GError *error = NULL; keyfile = g_key_file_new(); flags = G_KEY_FILE_NONE; /* Load the GKeyFile from disk or return. */ if (!g_key_file_load_from_file (keyfile, config_file, flags, &error)) { g_error (error->message); return(-1); } //** Parse the global options first *** parse_config(keyfile, &config); init_thread_slots(2*config.server.max_threads); //** Make pigeon holes dns_cache_init(1000); init_subnet_list(config.server.iface[0].hostname); //*** Install the commands: loads Vectable info and parses config options only **** install_commands(keyfile); g_key_file_free(keyfile); //Free the keyfile context set_starttime(); log_preamble(&config); configure_signals(); //** Setup the signal handlers //*** Set up the shutdown variables pthread_mutex_init(&shutdown_lock, NULL); pthread_mutex_unlock(&shutdown_lock); shutdown_now = 0; //*** Make the searchable version of the resources *** config.rl = create_resource_list(config.res, config.n_resources); // log_printf(0, "Looking up resource 2 and printing info.....\n") // print_resource(resource_lookup(config.rl, "2"), log_fd()); init_stats(config.server.stats_size); lock_alloc_init(); //***Launch as a daemon if needed*** if (args.size() == 2) { //*** Launch as a daemon *** if ((strcmp(config.server.logfile, "stdout") == 0) || (strcmp(config.server.logfile, "stderr") == 0)) { log_printf(0, "Can't launch as a daemom because log_file is either stdout or stderr\n"); log_printf(0, "Running in normal mode\n"); } else if (fork() == 0) { //** This is the daemon log_printf(0, "Running as a daemon.\n"); flush_log(); fclose(stdin); //** Need to close all the std* devices ** fclose(stdout); fclose(stderr); char fname[1024]; fname[1023] = '\0'; snprintf(fname, 1023, "%s.stdout", config.server.logfile); assert((stdout = fopen(fname, "w")) != NULL); snprintf(fname, 1023, "%s.stderr", config.server.logfile); assert((stderr = fopen(fname, "w")) != NULL); // stdout = stderr = log_fd(); //** and reassign them to the log device printf("ibp_server.c: STDOUT=STDERR=LOG_FD() dnoes not work!!!!!!!!!!!!!!!!!!!!!!!!\n"); } else { //** Parent exits exit(0); } } // test_alloc(); //** Used for testing allocation speed only //*** Initialize all command data structures. This is mainly 3rd party commands *** initialize_commands(); //** Launch the garbage collection threads for (i=0; i<config.n_resources; i++) launch_resource_cleanup_thread(&(config.res[i])); //*** Start the activity log *** alog_open(); server_loop(&config); //***** Main processing loop ****** //*** Shutdown the activity log *** alog_close(); //*** Destroy all the 3rd party structures *** destroy_commands(); lock_alloc_destroy(); destroy_thread_slots(); shutdown(&config); free_resource_list(config.rl); free_stats(); log_printf(0, "main: Completed shutdown. Exiting\n"); // close_log(); // close_debug(); }
int main(int argc, char **argv) { int cf_index; Cfg *cfg; bb_status = BB_RUNNING; gwlib_init(); start_time = time(NULL); suspended = gwlist_create(); isolated = gwlist_create(); gwlist_add_producer(suspended); gwlist_add_producer(isolated); cf_index = get_and_set_debugs(argc, argv, check_args); if (argv[cf_index] == NULL) cfg_filename = octstr_create("kannel.conf"); else cfg_filename = octstr_create(argv[cf_index]); cfg = cfg_create(cfg_filename); if (cfg_read(cfg) == -1) panic(0, "Couldn't read configuration from `%s'.", octstr_get_cstr(cfg_filename)); dlr_init(cfg); report_versions("bearerbox"); flow_threads = gwlist_create(); if (init_bearerbox(cfg) == NULL) panic(0, "Initialization failed."); info(0, "----------------------------------------"); info(0, GW_NAME " bearerbox II version %s starting", GW_VERSION); gwthread_sleep(5.0); /* give time to threads to register themselves */ if (store_load(dispatch_into_queue) == -1) panic(0, "Cannot start with store-file failing"); info(0, "MAIN: Start-up done, entering mainloop"); if (bb_status == BB_SUSPENDED) { info(0, "Gateway is now SUSPENDED by startup arguments"); } else if (bb_status == BB_ISOLATED) { info(0, "Gateway is now ISOLATED by startup arguments"); gwlist_remove_producer(suspended); } else { smsc2_resume(1); gwlist_remove_producer(suspended); gwlist_remove_producer(isolated); } while (bb_status != BB_SHUTDOWN && bb_status != BB_DEAD && gwlist_producer_count(flow_threads) > 0) { /* debug("bb", 0, "Main Thread: going to sleep."); */ /* * Not infinite sleep here, because we should notice * when all "flow threads" are dead and shutting bearerbox * down. * XXX if all "flow threads" call gwthread_wakeup(MAIN_THREAD_ID), * we can enter infinite sleep then. */ gwthread_sleep(10.0); /* debug("bb", 0, "Main Thread: woken up."); */ if (bb_todo == 0) { continue; } if (bb_todo & BB_LOGREOPEN) { warning(0, "SIGHUP received, catching and re-opening logs"); log_reopen(); alog_reopen(); bb_todo = bb_todo & ~BB_LOGREOPEN; } if (bb_todo & BB_CHECKLEAKS) { warning(0, "SIGQUIT received, reporting memory usage."); gw_check_leaks(); bb_todo = bb_todo & ~BB_CHECKLEAKS; } } if (bb_status == BB_SHUTDOWN || bb_status == BB_DEAD) warning(0, "Killing signal or HTTP admin command received, shutting down..."); /* call shutdown */ bb_shutdown(); /* wait until flow threads exit */ while (gwlist_consume(flow_threads) != NULL) ; info(0, "All flow threads have died, killing core"); bb_status = BB_DEAD; httpadmin_stop(); boxc_cleanup(); smsc2_cleanup(); store_shutdown(); empty_msg_lists(); gwlist_destroy(flow_threads, NULL); gwlist_destroy(suspended, NULL); gwlist_destroy(isolated, NULL); mutex_destroy(status_mutex); alog_close(); /* if we have any */ bb_alog_shutdown(); cfg_destroy(cfg); octstr_destroy(cfg_filename); dlr_shutdown(); /* now really restart */ if (restart) restart_box(argv); gwlib_shutdown(); return 0; }
int main(int argc, char **argv) { int cf_index; int restart = 0; Msg *msg; Cfg *cfg; double heartbeat_freq = DEFAULT_HEARTBEAT; gwlib_init(); cf_index = get_and_set_debugs(argc, argv, NULL); setup_signal_handlers(); if (argv[cf_index] == NULL) config_filename = octstr_create("kannel.conf"); else config_filename = octstr_create(argv[cf_index]); cfg = cfg_create(config_filename); if (cfg_read(cfg) == -1) panic(0, "Couldn't read configuration from `%s'.", octstr_get_cstr(config_filename)); report_versions("wapbox"); cfg = init_wapbox(cfg); info(0, "------------------------------------------------------------"); info(0, GW_NAME " wapbox version %s starting up.", GW_VERSION); sequence_counter = counter_create(); wsp_session_init(&wtp_resp_dispatch_event, &wtp_initiator_dispatch_event, &wap_appl_dispatch, &wap_push_ppg_dispatch_event); wsp_unit_init(&dispatch_datagram, &wap_appl_dispatch); wsp_push_client_init(&wsp_push_client_dispatch_event, &wtp_resp_dispatch_event); if (cfg) wtp_initiator_init(&dispatch_datagram, &wsp_session_dispatch_event, timer_freq); wtp_resp_init(&dispatch_datagram, &wsp_session_dispatch_event, &wsp_push_client_dispatch_event, timer_freq); wap_appl_init(cfg); #if (HAVE_WTLS_OPENSSL) wtls_secmgr_init(); wtls_init(&write_to_bearerbox); #endif if (cfg) { wap_push_ota_init(&wsp_session_dispatch_event, &wsp_unit_dispatch_event); wap_push_ppg_init(&wap_push_ota_dispatch_event, &wap_appl_dispatch, cfg); } wml_init(wml_xml_strict); if (bearerbox_host == NULL) bearerbox_host = octstr_create(BB_DEFAULT_HOST); connect_to_bearerbox(bearerbox_host, bearerbox_port, bearerbox_ssl, NULL /* bearerbox_our_port */); if (cfg) wap_push_ota_bb_address_set(bearerbox_host); program_status = running; if (0 > heartbeat_start(write_to_bearerbox, heartbeat_freq, wap_appl_get_load)) { info(0, GW_NAME "Could not start heartbeat."); } while (program_status != shutting_down) { WAPEvent *dgram; int ret; /* block infinite for reading messages */ ret = read_from_bearerbox(&msg, INFINITE_TIME); if (ret == -1) { error(0, "Bearerbox is gone, restarting"); program_status = shutting_down; restart = 1; break; } else if (ret == 1) /* timeout */ continue; else if (msg == NULL) /* just to be sure, may not happens */ break; if (msg_type(msg) == admin) { if (msg->admin.command == cmd_shutdown) { info(0, "Bearerbox told us to die"); program_status = shutting_down; } else if (msg->admin.command == cmd_restart) { info(0, "Bearerbox told us to restart"); restart = 1; program_status = shutting_down; } /* * XXXX here should be suspend/resume, add RSN */ } else if (msg_type(msg) == wdp_datagram) { switch (msg->wdp_datagram.destination_port) { case CONNECTIONLESS_PORT: case CONNECTION_ORIENTED_PORT: dgram = wap_event_create(T_DUnitdata_Ind); dgram->u.T_DUnitdata_Ind.addr_tuple = wap_addr_tuple_create( msg->wdp_datagram.source_address, msg->wdp_datagram.source_port, msg->wdp_datagram.destination_address, msg->wdp_datagram.destination_port); dgram->u.T_DUnitdata_Ind.user_data = msg->wdp_datagram.user_data; msg->wdp_datagram.user_data = NULL; wap_dispatch_datagram(dgram); break; case WTLS_CONNECTIONLESS_PORT: case WTLS_CONNECTION_ORIENTED_PORT: #if (HAVE_WTLS_OPENSSL) dgram = wtls_unpack_wdp_datagram(msg); if (dgram != NULL) wtls_dispatch_event(dgram); #endif break; default: panic(0,"Bad packet received! This shouldn't happen!"); break; } } else { warning(0, "Received other message than wdp/admin, ignoring!"); } msg_destroy(msg); } info(0, GW_NAME " wapbox terminating."); program_status = shutting_down; heartbeat_stop(ALL_HEARTBEATS); counter_destroy(sequence_counter); if (cfg) wtp_initiator_shutdown(); wtp_resp_shutdown(); wsp_push_client_shutdown(); wsp_unit_shutdown(); wsp_session_shutdown(); wap_appl_shutdown(); radius_acct_shutdown(); if (cfg) { wap_push_ota_shutdown(); wap_push_ppg_shutdown(); } wml_shutdown(); close_connection_to_bearerbox(); alog_close(); wap_map_destroy(); wap_map_user_destroy(); octstr_destroy(device_home); octstr_destroy(bearerbox_host); octstr_destroy(config_filename); /* * Just sleep for a while to get bearerbox chance to restart. * Otherwise we will fail while trying to connect to bearerbox! */ if (restart) { gwthread_sleep(10.0); /* now really restart */ restart_box(argv); } log_close_all(); gwlib_shutdown(); return 0; }