void debug_sigsegv () { debug_dump (1); unhook_all (); gui_main_end (0); string_fprintf (stderr, "\n*** Very bad! WeeChat is crashing (SIGSEGV received)" "\n"); if (!log_crash_rename ()) { string_fprintf (stderr, "*** Full crash dump was saved to %s/weechat.log file." "\n", weechat_home); } string_fprintf ( stderr, "***\n" "*** Please help WeeChat developers to fix this bug:\n" "*** 1. If you have a core file, please run: gdb /path/to/weechat core\n" "*** then issue command: \"bt full\" and send result to developers\n" "*** (see user's guide for more info about report of crashes).\n" "*** 2. Otherwise send backtrace (below), only if it is a complete trace.\n" "*** Keep the crash log file, just in case developers ask you some info\n" "*** (be careful, private info like passwords may be in this file).\n\n"); weechat_backtrace (); /* shutdown with error code */ weechat_shutdown (EXIT_FAILURE, 1); }
void weechat_create_home_dir () { char *ptr_weechat_home, *config_weechat_home; struct stat statinfo; /* * weechat_home is not set yet: look for environment variable * "WEECHAT_HOME" */ if (!weechat_home) { ptr_weechat_home = getenv ("WEECHAT_HOME"); if (ptr_weechat_home && ptr_weechat_home[0]) weechat_set_home_path (ptr_weechat_home); } /* weechat_home is still not set: try to use compile time default */ if (!weechat_home) { config_weechat_home = WEECHAT_HOME; if (!config_weechat_home[0]) { string_fprintf (stderr, _("Error: WEECHAT_HOME is undefined, check build " "options\n")); weechat_shutdown (EXIT_FAILURE, 0); /* make C static analyzer happy (never executed) */ return; } weechat_set_home_path (config_weechat_home); } /* if home already exists, it has to be a directory */ if (stat (weechat_home, &statinfo) == 0) { if (!S_ISDIR (statinfo.st_mode)) { string_fprintf (stderr, _("Error: home (%s) is not a directory\n"), weechat_home); weechat_shutdown (EXIT_FAILURE, 0); /* make C static analyzer happy (never executed) */ return; } } /* create home directory; error is fatal */ if (!util_mkdir (weechat_home, 0755)) { string_fprintf (stderr, _("Error: cannot create directory \"%s\"\n"), weechat_home); weechat_shutdown (EXIT_FAILURE, 0); /* make C static analyzer happy (never executed) */ return; } }
void gui_chat_print_lines_waiting_buffer (FILE *f) { char **lines; int num_lines, i; if (gui_chat_lines_waiting_buffer) { lines = string_split (gui_chat_lines_waiting_buffer, "\n", 0, 0, &num_lines); if (lines) { for (i = 0; i < num_lines; i++) { if (!f && gui_init_ok) gui_chat_printf (NULL, "%s", lines[i]); else string_fprintf ((f) ? f : stdout, "%s\n", lines[i]); } string_free_split (lines); } /* * gui_chat_lines_waiting_buffer may be NULL after call to * gui_chat_printf (if not enough memory) */ } if (gui_chat_lines_waiting_buffer) { free (gui_chat_lines_waiting_buffer); gui_chat_lines_waiting_buffer = NULL; } }
void weechat_display_copyright () { string_fprintf (stdout, "\n"); string_fprintf ( stdout, /* TRANSLATORS: "%s %s" after "compiled on" is date and time */ _("WeeChat %s Copyright %s, compiled on %s %s\n" "Developed by Sébastien Helleu <*****@*****.**> " "- %s"), version_get_version_with_git (), WEECHAT_COPYRIGHT_DATE, version_get_compilation_date (), version_get_compilation_time (), WEECHAT_WEBSITE); string_fprintf (stdout, "\n"); }
void weechat_display_usage () { weechat_display_copyright (); string_fprintf (stdout, "\n"); string_fprintf (stdout, _("Usage: %s [option...] [plugin:option...]\n"), weechat_argv0); string_fprintf (stdout, "\n"); string_fprintf ( stdout, _(" -a, --no-connect disable auto-connect to servers at " "startup\n" " -c, --colors display default colors in terminal\n" " -d, --dir <path> set WeeChat home directory " "(default: ~/.weechat)\n" " (environment variable WEECHAT_HOME is " "read if this option is not given)\n" " -h, --help display this help\n" " -l, --license display WeeChat license\n" " -p, --no-plugin don't load any plugin at startup\n" " -P, --plugins <plugins> load only these plugins at startup\n" " (see /help weechat.plugin.autoload)\n" " -r, --run-command <cmd> run command(s) after startup;\n" " many commands can be separated by " "semicolons,\n" " this option can be given multiple " "times\n" " -s, --no-script don't load any script at startup\n" " --upgrade upgrade WeeChat using session files " "(see /help upgrade in WeeChat)\n" " -v, --version display WeeChat version\n" " plugin:option option for plugin (see man weechat)\n")); string_fprintf (stdout, "\n"); /* extra options in headless mode */ if (weechat_headless) { string_fprintf (stdout, _("Extra options in headless mode:\n")); string_fprintf ( stdout, _(" --daemon run WeeChat as a daemon (fork, " "new process group, file descriptors closed);\n")); string_fprintf ( stdout, _(" (by default in headless mode " "WeeChat is blocking and does not run in background)\n")); string_fprintf (stdout, "\n"); } }
void weechat_backtrace_printf (const char *message, ...) { weechat_va_format (message); if (vbuffer) { string_fprintf (stderr, "%s\n", vbuffer); log_printf ("%s", vbuffer); free (vbuffer); } }
void weechat_set_home_path (char *home_path) { char *ptr_home; int dir_length; if (home_path[0] == '~') { /* replace leading '~' by $HOME */ ptr_home = getenv ("HOME"); if (!ptr_home) { string_fprintf (stderr, _("Error: unable to get HOME directory\n")); weechat_shutdown (EXIT_FAILURE, 0); /* make C static analyzer happy (never executed) */ return; } dir_length = strlen (ptr_home) + strlen (home_path + 1) + 1; weechat_home = malloc (dir_length); if (weechat_home) { snprintf (weechat_home, dir_length, "%s%s", ptr_home, home_path + 1); } } else { weechat_home = strdup (home_path); } if (!weechat_home) { string_fprintf (stderr, _("Error: not enough memory for home directory\n")); weechat_shutdown (EXIT_FAILURE, 0); /* make C static analyzer happy (never executed) */ return; } }
void gui_chat_printf_y (struct t_gui_buffer *buffer, int y, const char *message, ...) { struct t_gui_line *ptr_line; int i, num_lines_to_add; if (!gui_buffer_valid (buffer)) return; if (gui_init_ok) { if (!buffer) buffer = gui_buffer_search_main (); if (!buffer || buffer->closing) return; if (buffer->type != GUI_BUFFER_TYPE_FREE) buffer = gui_buffers; if (buffer->type != GUI_BUFFER_TYPE_FREE) return; } weechat_va_format (message); if (!vbuffer) return; utf8_normalize (vbuffer, '?'); /* no message: delete line */ if (!vbuffer[0]) { if (gui_init_ok && (y >= 0)) { for (ptr_line = buffer->own_lines->first_line; ptr_line; ptr_line = ptr_line->next_line) { if (ptr_line->data->y >= y) break; } if (ptr_line && (ptr_line->data->y == y)) { if (ptr_line->next_line) gui_line_clear (ptr_line); else gui_line_free (buffer, ptr_line); gui_buffer_ask_chat_refresh (buffer, 2); } } } else { if (gui_init_ok) { /* if y is negative, add a line -N lines after the last line */ if (y < 0) { y = (buffer->own_lines && buffer->own_lines->last_line) ? buffer->own_lines->last_line->data->y - y : (-1 * y) - 1; } /* compute the number of lines to add before y */ if (buffer->own_lines && buffer->own_lines->last_line) num_lines_to_add = y - buffer->own_lines->last_line->data->y - 1; else num_lines_to_add = y; if (num_lines_to_add > 0) { /* * add empty line(s) before asked line, to ensure there is at * least "y" lines in buffer, and then be able to scroll * properly buffer page by page */ for (i = y - num_lines_to_add; i < y; i++) { gui_line_add_y (buffer, i, ""); } } gui_line_add_y (buffer, y, vbuffer); gui_buffer_ask_chat_refresh (buffer, 1); } else string_fprintf (stdout, "%s\n", vbuffer); } free (vbuffer); }
void weechat_startup_message () { if (weechat_headless) { string_fprintf (stdout, _("WeeChat is running in headless mode " "(Ctrl-C to quit).")); string_fprintf (stdout, "\n"); } if (CONFIG_BOOLEAN(config_startup_display_logo)) { gui_chat_printf ( NULL, "%s ___ __ ______________ _____ \n" "%s __ | / /___________ ____/__ /_______ __ /_\n" "%s __ | /| / /_ _ \\ _ \\ / __ __ \\ __ `/ __/\n" "%s __ |/ |/ / / __/ __/ /___ _ / / / /_/ // /_ \n" "%s ____/|__/ \\___/\\___/\\____/ /_/ /_/\\__,_/ \\__/ ", GUI_COLOR(GUI_COLOR_CHAT_NICK), GUI_COLOR(GUI_COLOR_CHAT_NICK), GUI_COLOR(GUI_COLOR_CHAT_NICK), GUI_COLOR(GUI_COLOR_CHAT_NICK), GUI_COLOR(GUI_COLOR_CHAT_NICK)); } if (CONFIG_BOOLEAN(config_startup_display_version)) { command_version_display (NULL, 0, 0, 0); } if (CONFIG_BOOLEAN(config_startup_display_logo) || CONFIG_BOOLEAN(config_startup_display_version)) { gui_chat_printf ( NULL, "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"); } if (weechat_first_start) { /* message on first run (when weechat.conf is created) */ gui_chat_printf (NULL, ""); gui_chat_printf ( NULL, _("Welcome to WeeChat!\n" "\n" "If you are discovering WeeChat, it is recommended to read at " "least the quickstart guide, and the user's guide if you have " "some time; they explain main WeeChat concepts.\n" "All WeeChat docs are available at: https://weechat.org/doc\n" "\n" "Moreover, there is inline help with /help on all commands and " "options (use Tab key to complete the name).\n" "The command /fset can help to customize WeeChat.\n" "\n" "You can add and connect to an IRC server with /server and " "/connect commands (see /help server).")); gui_chat_printf (NULL, ""); gui_chat_printf (NULL, "---"); gui_chat_printf (NULL, ""); } }
void weechat_parse_args (int argc, char *argv[]) { int i; weechat_argv0 = (argv[0]) ? strdup (argv[0]) : NULL; weechat_upgrading = 0; weechat_home = NULL; weechat_server_cmd_line = 0; weechat_force_plugin_autoload = NULL; weechat_plugin_no_dlclose = 0; for (i = 1; i < argc; i++) { if ((strcmp (argv[i], "-c") == 0) || (strcmp (argv[i], "--colors") == 0)) { gui_color_display_terminal_colors (); weechat_shutdown (EXIT_SUCCESS, 0); } else if ((strcmp (argv[i], "-d") == 0) || (strcmp (argv[i], "--dir") == 0)) { if (i + 1 < argc) { if (weechat_home) free (weechat_home); weechat_home = strdup (argv[++i]); } else { string_fprintf (stderr, _("Error: missing argument for \"%s\" option\n"), argv[i]); weechat_shutdown (EXIT_FAILURE, 0); } } else if ((strcmp (argv[i], "-h") == 0) || (strcmp (argv[i], "--help") == 0)) { weechat_display_usage (); weechat_shutdown (EXIT_SUCCESS, 0); } else if ((strcmp (argv[i], "-l") == 0) || (strcmp (argv[i], "--license") == 0)) { weechat_display_copyright (); string_fprintf (stdout, "\n"); string_fprintf (stdout, "%s%s", WEECHAT_LICENSE_TEXT); weechat_shutdown (EXIT_SUCCESS, 0); } else if (strcmp (argv[i], "--no-dlclose") == 0) { /* * Valgrind works better when dlclose() is not done after plugins * are unloaded, it can display stack for plugins,* otherwise * you'll see "???" in stack for functions of unloaded plugins. * This option disables the call to dlclose(), * it must NOT be used for other purposes! */ weechat_plugin_no_dlclose = 1; } else if (strcmp (argv[i], "--no-gnutls") == 0) { /* * Electric-fence is not working fine when gnutls loads * certificates and Valgrind reports many memory errors with * gnutls. * This option disables the init/deinit of gnutls, * it must NOT be used for other purposes! */ weechat_no_gnutls = 1; } else if (strcmp (argv[i], "--no-gcrypt") == 0) { /* * Valgrind reports many memory errors with gcrypt. * This option disables the init/deinit of gcrypt, * it must NOT be used for other purposes! */ weechat_no_gcrypt = 1; } else if ((strcmp (argv[i], "-p") == 0) || (strcmp (argv[i], "--no-plugin") == 0)) { if (weechat_force_plugin_autoload) free (weechat_force_plugin_autoload); weechat_force_plugin_autoload = strdup ("!*"); } else if ((strcmp (argv[i], "-P") == 0) || (strcmp (argv[i], "--plugins") == 0)) { if (i + 1 < argc) { if (weechat_force_plugin_autoload) free (weechat_force_plugin_autoload); weechat_force_plugin_autoload = strdup (argv[++i]); } else { string_fprintf (stderr, _("Error: missing argument for \"%s\" option\n"), argv[i]); weechat_shutdown (EXIT_FAILURE, 0); } } else if ((strcmp (argv[i], "-r") == 0) || (strcmp (argv[i], "--run-command") == 0)) { if (i + 1 < argc) { if (!weechat_startup_commands) weechat_startup_commands = weelist_new (); weelist_add (weechat_startup_commands, argv[++i], WEECHAT_LIST_POS_END, NULL); } else { string_fprintf (stderr, _("Error: missing argument for \"%s\" option\n"), argv[i]); weechat_shutdown (EXIT_FAILURE, 0); } } else if (strcmp (argv[i], "--upgrade") == 0) { weechat_upgrading = 1; } else if ((strcmp (argv[i], "-v") == 0) || (strcmp (argv[i], "--version") == 0)) { string_fprintf (stdout, version_get_version ()); fprintf (stdout, "\n"); weechat_shutdown (EXIT_SUCCESS, 0); } } }