Merge Irssi 0.8.16-rc1
[silc.git] / apps / irssi / src / core / core.c
index 2321208eb086c999c7dd21e00d44ef88671eccf0..b9debbb5c566ecdd4ae842a449253578a72148c2 100644 (file)
@@ -13,9 +13,9 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
 #include "module.h"
@@ -26,7 +26,6 @@
 #include "misc.h"
 
 #include "net-disconnect.h"
-#include "net-sendbuffer.h"
 #include "signals.h"
 #include "settings.h"
 #include "session.h"
@@ -40,6 +39,7 @@
 #include "log.h"
 #include "rawlog.h"
 #include "ignore.h"
+#include "recode.h"
 
 #include "channels.h"
 #include "queries.h"
@@ -48,7 +48,7 @@
 
 #ifdef HAVE_SYS_RESOURCE_H
 #  include <sys/resource.h>
-   struct rlimit orig_core_rlimit;
+   static struct rlimit orig_core_rlimit;
 #endif
 
 void chat_commands_init(void);
@@ -59,6 +59,8 @@ void log_away_deinit(void);
 
 int irssi_gui;
 int irssi_init_finished;
+int reload_config;
+time_t client_start_time;
 
 static char *irssi_dir, *irssi_config_file;
 static GSList *dialog_type_queue, *dialog_text_queue;
@@ -74,15 +76,20 @@ const char *get_irssi_config(void)
         return irssi_config_file;
 }
 
+static void sig_reload_config(int signo)
+{
+        reload_config = TRUE;
+}
+
 static void read_settings(void)
 {
 #ifndef WIN32
        static int signals[] = {
-               SIGHUP, SIGINT, SIGQUIT, SIGTERM,
+               SIGINT, SIGQUIT, SIGTERM,
                SIGALRM, SIGUSR1, SIGUSR2
        };
        static char *signames[] = {
-               "hup", "int", "quit", "term",
+               "int", "quit", "term",
                "alrm", "usr1", "usr2"
        };
 
@@ -95,6 +102,10 @@ static void read_settings(void)
        sigemptyset (&act.sa_mask);
        act.sa_flags = 0;
 
+       /* reload config on SIGHUP */
+        act.sa_handler = sig_reload_config;
+       sigaction(SIGHUP, &act, NULL);
+
        for (n = 0; n < sizeof(signals)/sizeof(signals[0]); n++) {
                act.sa_handler = find_substr(ignores, signames[n]) ?
                        SIG_IGN : SIG_DFL;
@@ -142,51 +153,58 @@ static void sig_init_finished(void)
         g_slist_free(dialog_text_queue);
 }
 
-void core_init_paths(int argc, char *argv[])
+static char *fix_path(const char *str)
+{
+       char *new_str = convert_home(str);
+       if (!g_path_is_absolute(new_str)) {
+               char *tmp_str = new_str;
+               new_str = g_strdup_printf("%s/%s", g_get_current_dir(), tmp_str);
+               g_free(tmp_str);
+       }
+       return new_str;
+}
+
+void core_register_options(void)
 {
-       static struct poptOption options[] = {
-               { "config", 0, POPT_ARG_STRING, NULL, 0, "Configuration file location (~/.irssi/config)", "PATH" },
-               { "home", 0, POPT_ARG_STRING, NULL, 0, "Irssi home dir location (~/.irssi)", "PATH" },
-               { NULL, '\0', 0, NULL }
+       static GOptionEntry options[] = {
+               { "config", 0, 0, G_OPTION_ARG_STRING, &irssi_config_file, "Configuration file location (~/.irssi/config)", "PATH" },
+               { "home", 0, 0, G_OPTION_ARG_STRING, &irssi_dir, "Irssi home dir location (~/.irssi)", "PATH" },
+               { NULL }
        };
+
+       args_register(options);
+       session_register_options();
+}
+
+void core_preinit(const char *path)
+{
+       const char *home;
        char *str;
-       int n, len;
-
-       for (n = 1; n < argc; n++) {
-               if (strncmp(argv[n], "--home=", 7) == 0) {
-                        g_free_not_null(irssi_dir);
-                        irssi_dir = convert_home(argv[n]+7);
-                        len = strlen(irssi_dir);
-                       if (irssi_dir[len-1] == G_DIR_SEPARATOR)
-                               irssi_dir[len-1] = '\0';
-               } else if (strncmp(argv[n], "--config=", 9) == 0) {
-                        g_free_not_null(irssi_config_file);
-                       irssi_config_file = convert_home(argv[n]+9);
-               }
-       }
+       int len;
+
+       if (irssi_dir == NULL) {
+               home = g_get_home_dir();
+               if (home == NULL)
+                       home = ".";
 
-       if (irssi_dir != NULL && !g_path_is_absolute(irssi_dir)) {
+               irssi_dir = g_strdup_printf(IRSSI_DIR_FULL, home);
+       } else {
                str = irssi_dir;
-               irssi_dir = g_strdup_printf("%s/%s", g_get_current_dir(), str);
+               irssi_dir = fix_path(str);
                g_free(str);
+               len = strlen(irssi_dir);
+               if (irssi_dir[len-1] == G_DIR_SEPARATOR)
+                       irssi_dir[len-1] = '\0';
        }
-
-       if (irssi_config_file != NULL &&
-           !g_path_is_absolute(irssi_config_file)) {
+       if (irssi_config_file == NULL)
+               irssi_config_file = g_strdup_printf("%s/"IRSSI_HOME_CONFIG, irssi_dir);
+       else {
                str = irssi_config_file;
-               irssi_config_file =
-                       g_strdup_printf("%s/%s", g_get_current_dir(), str);
+               irssi_config_file = fix_path(str);
                g_free(str);
        }
 
-       args_register(options);
-
-        if (irssi_dir == NULL)
-               irssi_dir = g_strdup_printf(IRSSI_DIR_FULL, g_get_home_dir());
-       if (irssi_config_file == NULL)
-               irssi_config_file = g_strdup_printf("%s/config", irssi_dir);
-
-       session_set_binary(argv[0]);
+       session_set_binary(path);
 }
 
 static void sig_irssi_init_finished(void)
@@ -194,10 +212,11 @@ static void sig_irssi_init_finished(void)
         irssi_init_finished = TRUE;
 }
 
-void core_init(int argc, char *argv[])
+void core_init(void)
 {
        dialog_type_queue = NULL;
        dialog_text_queue = NULL;
+       client_start_time = time(NULL);
 
        modules_init();
 #ifndef WIN32
@@ -205,7 +224,6 @@ void core_init(int argc, char *argv[])
 #endif
 
        net_disconnect_init();
-       net_sendbuffer_init();
        signals_init();
 
        signal_add_first("gui dialog", (SIGNAL_FUNC) sig_gui_dialog);
@@ -225,6 +243,7 @@ void core_init(int argc, char *argv[])
        log_init();
        log_away_init();
        rawlog_init();
+       recode_init();
 
        channels_init();
        queries_init();
@@ -233,7 +252,7 @@ void core_init(int argc, char *argv[])
        chat_commands_init();
 
        settings_add_str("misc", "ignore_signals", "");
-       settings_add_bool("misc", "override_coredump_limit", TRUE);
+       settings_add_bool("misc", "override_coredump_limit", FALSE);
 
 #ifdef HAVE_SYS_RESOURCE_H
        getrlimit(RLIMIT_CORE, &orig_core_rlimit);
@@ -249,6 +268,8 @@ void core_init(int argc, char *argv[])
 
 void core_deinit(void)
 {
+       module_uniq_destroy("WINDOW ITEM TYPE");
+
        signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
        signal_remove("irssi init finished", (SIGNAL_FUNC) sig_irssi_init_finished);
 
@@ -258,6 +279,7 @@ void core_deinit(void)
        queries_deinit();
        channels_deinit();
 
+       recode_deinit();
        rawlog_deinit();
        log_away_deinit();
        log_deinit();
@@ -273,7 +295,6 @@ void core_deinit(void)
        commands_deinit();
        settings_deinit();
        signals_deinit();
-       net_sendbuffer_deinit();
        net_disconnect_deinit();
 
 #ifndef WIN32