/** * Release resources */ static void scmpc_cleanup(void) { g_source_remove(signal_source); if (prefs.cache_interval > 0) g_source_remove(cache_save_source); if (mpd.idle_source > 0) g_source_remove(mpd.idle_source); if (mpd.check_source > 0) g_source_remove(mpd.check_source); if (mpd.reconnect_source > 0) g_source_remove(mpd.reconnect_source); if (current_song_eligible_for_submission()) queue_add_current_song(); if (prefs.fork) scmpc_pid_remove(); close_signal_pipe(); if (prefs.cache_interval > 0) queue_save(NULL); queue_cleanup(); if (mpd.song_pos) g_timer_destroy(mpd.song_pos); clear_preferences(); as_cleanup(); if (mpd.conn != NULL) mpd_connection_free(mpd.conn); }
static void destroy(void) { g_message("Exiting"); as_save_cache(); as_cleanup(); http_client_finish(); file_cleanup(); g_timer_destroy(timer); g_source_remove(save_source_id); if (prev != NULL) mpd_song_free(prev); }
int main(int argc, char **argv) { daemonize_close_stdin(); parse_cmdline(argc, argv); if (!file_read_config()) g_error("cannot read configuration file\n"); log_init(file_config.log, file_config.verbose); daemonize_init(file_config.daemon_user, file_config.pidfile); if (!file_config.no_daemon) daemonize_detach(); daemonize_write_pidfile(); daemonize_set_user(); #ifndef NDEBUG if (!file_config.no_daemon) #endif daemonize_close_stdout_stderr(); main_loop = g_main_loop_new(NULL, FALSE); lmc_connect(file_config.host, file_config.port); http_client_init(); as_init(file_config.scrobblers); setup_signals(); timer = g_timer_new(); /* set up timeouts */ save_source_id = g_timeout_add_seconds(file_config.journal_interval, timer_save_journal, NULL); /* run the main loop */ g_main_loop_run(main_loop); /* cleanup */ g_message("shutting down\n"); g_source_remove(save_source_id); g_main_loop_unref(main_loop); g_timer_destroy(timer); as_save_cache(); as_cleanup(); http_client_finish(); lmc_disconnect(); file_cleanup(); log_deinit(); daemonize_finish(); return 0; }
int main (int argc, char *argv[]) { ASLogger *logger; int stdin_handle; input_id stdinput; #ifdef WIN32 HANDLE hThread; int fds[2]; #endif /* winsock init */ tcp_startup (); /* setup logging */ logger = as_logger_create (); as_logger_add_output (logger, "stderr"); as_logger_add_output (logger, "ares.log"); AS_DBG ("Logging subsystem started"); /* setup event system */ as_event_init (); /* init lib */ if (!as_init ()) { printf ("FATA: as_init() failed\n"); exit (1); } #ifdef WIN32 /* create console reading thread on windows */ if (socketpair (0, 0, 0, fds) < 0) { printf ("FATAL: socketpair() failed\n"); exit (1); } stdin_handle = fds[1]; hThread = (HANDLE) _beginthreadex (NULL, 0, console_input_func, (void *)fds[0], 0, NULL); if (hThread == (HANDLE) -1 || hThread == (HANDLE) 0) { printf ("FATAL: couldn't start input thread\n"); exit (1); } #else stdin_handle = 0; #endif /* add callback for command handling */ stdinput = input_add (stdin_handle, NULL, INPUT_READ, stdin_cb, 0); #if 0 /* print prompt */ printf ("> "); #endif /* run event loop */ AS_DBG ("Entering event loop"); as_event_loop (); AS_DBG ("Left event loop"); input_remove (stdinput); #if WIN32 /* terminate thread if it is still running and close thread handle */ TerminateThread (hThread, 0); CloseHandle (hThread); #endif /* cleanup lib */ as_cleanup (); /* shutdown */ as_event_shutdown (); as_logger_free (logger); /* winsock shutdown */ tcp_cleanup (); return 0; }