gboolean mc_fhl_init_from_standard_files (mc_fhl_t * fhl) { gchar *name; gboolean ok; /* ${XDG_CONFIG_HOME}/mc/filehighlight.ini */ name = mc_config_get_full_path (MC_FHL_INI_FILE); ok = mc_fhl_read_ini_file (fhl, name); g_free (name); if (ok) return TRUE; /* ${sysconfdir}/mc/filehighlight.ini */ name = g_build_filename (mc_global.sysconfig_dir, MC_FHL_INI_FILE, (char *) NULL); ok = mc_fhl_read_ini_file (fhl, name); g_free (name); if (ok) return TRUE; /* ${datadir}/mc/filehighlight.ini */ name = g_build_filename (mc_global.share_data_dir, MC_FHL_INI_FILE, (char *) NULL); ok = mc_fhl_read_ini_file (fhl, name); g_free (name); return ok; }
void ext_cmd (void) { char *buffer; char *extdir; int dir; dir = 0; if (geteuid () == 0) { dir = query_dialog (_("Extension file edit"), _("Which extension file you want to edit?"), D_NORMAL, 2, _("&User"), _("&System Wide")); } extdir = concat_dir_and_file (mc_global.sysconfig_dir, MC_LIB_EXT); if (dir == 0) { buffer = mc_config_get_full_path (MC_FILEBIND_FILE); check_for_default (extdir, buffer); do_edit (buffer); g_free (buffer); } else if (dir == 1) { if (!exist_file (extdir)) { g_free (extdir); extdir = concat_dir_and_file (mc_global.share_data_dir, MC_LIB_EXT); } do_edit (extdir); } g_free (extdir); flush_extension_file (); }
/** * Write history to the ${XDG_CACHE_HOME}/mc/history file */ void dlg_save_history (WDialog * h) { char *profile; int i; if (num_history_items_recorded == 0) /* this is how to disable */ return; profile = mc_config_get_full_path (MC_HISTORY_FILE); i = open (profile, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); if (i != -1) close (i); /* Make sure the history is only readable by the user */ if (chmod (profile, S_IRUSR | S_IWUSR) != -1 || errno == ENOENT) { ev_history_load_save_t event_data; event_data.cfg = mc_config_init (profile, FALSE); event_data.receiver = NULL; /* get all histories in dialog */ mc_event_raise (h->event_group, MCEVENT_HISTORY_SAVE, &event_data); mc_config_save_file (event_data.cfg, NULL); mc_config_deinit (event_data.cfg); } g_free (profile); }
/* event callback */ gboolean clipboard_file_from_ext_clip (const gchar * event_group_name, const gchar * event_name, gpointer init_data, gpointer data) { char *tmp, *cmd; const char *d = getenv ("DISPLAY"); (void) event_group_name; (void) event_name; (void) init_data; (void) data; if (d == NULL || clipboard_paste_path == NULL || clipboard_paste_path[0] == '\0') return TRUE; tmp = mc_config_get_full_path (EDIT_CLIP_FILE); cmd = g_strconcat (clipboard_paste_path, " > ", tmp, " 2>/dev/null", (char *) NULL); if (cmd != NULL) my_system (EXECUTE_AS_SHELL, mc_global.tty.shell, cmd); g_free (cmd); g_free (tmp); return TRUE; }
gboolean save_setup (gboolean save_options, gboolean save_panel_options) { gboolean ret = TRUE; saving_setup = 1; save_hotlist (); if (save_panel_options) save_panel_types (); if (save_options) { char *tmp_profile; save_config (); save_layout (); panels_save_options (); save_panelize (); /* directory_history_save (); */ #ifdef ENABLE_VFS_FTP mc_config_set_string (mc_main_config, CONFIG_MISC_SECTION, "ftpfs_password", ftpfs_anonymous_passwd); if (ftpfs_proxy_host) mc_config_set_string (mc_main_config, CONFIG_MISC_SECTION, "ftp_proxy_host", ftpfs_proxy_host); #endif /* ENABLE_VFS_FTP */ #ifdef HAVE_CHARSET mc_config_set_string (mc_main_config, CONFIG_MISC_SECTION, "display_codepage", get_codepage_id (mc_global.display_codepage)); mc_config_set_string (mc_main_config, CONFIG_MISC_SECTION, "source_codepage", get_codepage_id (default_source_codepage)); mc_config_set_string (mc_main_config, CONFIG_MISC_SECTION, "autodetect_codeset", autodetect_codeset); #endif /* HAVE_CHARSET */ #ifdef HAVE_ASPELL mc_config_set_string (mc_main_config, CONFIG_MISC_SECTION, "spell_language", spell_language); #endif /* HAVE_ASPELL */ mc_config_set_string (mc_main_config, CONFIG_MISC_SECTION, "clipboard_store", clipboard_store_path); mc_config_set_string (mc_main_config, CONFIG_MISC_SECTION, "clipboard_paste", clipboard_paste_path); tmp_profile = mc_config_get_full_path (MC_CONFIG_FILE); ret = mc_config_save_to_file (mc_main_config, tmp_profile, NULL); g_free (tmp_profile); } saving_setup = 0; return ret; }
/* event callback */ gboolean clipboard_text_from_file (const gchar * event_group_name, const gchar * event_name, gpointer init_data, gpointer data) { char buf[BUF_LARGE]; FILE *f; char *fname = NULL; gboolean first = TRUE; ev_clipboard_text_from_file_t *event_data = (ev_clipboard_text_from_file_t *) data; (void) event_group_name; (void) event_name; (void) init_data; fname = mc_config_get_full_path (EDIT_CLIP_FILE); f = fopen (fname, "r"); g_free (fname); if (f == NULL) { event_data->ret = FALSE; return TRUE; } *(event_data->text) = NULL; while (fgets (buf, sizeof (buf), f)) { size_t len; len = strlen (buf); if (len > 0) { if (buf[len - 1] == '\n') buf[len - 1] = '\0'; if (first) { first = FALSE; *(event_data->text) = g_strdup (buf); } else { /* remove \n on EOL */ char *tmp; tmp = g_strconcat (*(event_data->text), " ", buf, (char *) NULL); g_free (*(event_data->text)); *(event_data->text) = tmp; } } } fclose (f); event_data->ret = (*(event_data->text) != NULL); return TRUE; }
void edit_mc_menu_cmd (void) { char *buffer; char *menufile; int dir = 0; dir = query_dialog (_("Menu edit"), _("Which menu file do you want to edit?"), D_NORMAL, geteuid ()? 2 : 3, _("&Local"), _("&User"), _("&System Wide")); menufile = concat_dir_and_file (mc_global.sysconfig_dir, MC_GLOBAL_MENU); if (!exist_file (menufile)) { g_free (menufile); menufile = concat_dir_and_file (mc_global.share_data_dir, MC_GLOBAL_MENU); } switch (dir) { case 0: buffer = g_strdup (MC_LOCAL_MENU); check_for_default (menufile, buffer); chmod (buffer, 0600); break; case 1: buffer = mc_config_get_full_path (MC_USERMENU_FILE); check_for_default (menufile, buffer); break; case 2: buffer = concat_dir_and_file (mc_global.sysconfig_dir, MC_GLOBAL_MENU); if (!exist_file (buffer)) { g_free (buffer); buffer = concat_dir_and_file (mc_global.share_data_dir, MC_GLOBAL_MENU); } break; default: g_free (menufile); return; } do_edit (buffer); g_free (buffer); g_free (menufile); }
void save_setup_cmd (void) { char *d1; const char *d2; d1 = mc_config_get_full_path (MC_CONFIG_FILE); d2 = strip_home_and_password (d1); g_free (d1); if (save_setup (TRUE, TRUE)) message (D_NORMAL, _("Setup"), _("Setup saved to %s"), d2); else message (D_ERROR, _("Setup"), _("Unable to save setup to %s"), d2); }
static void save_tree (WTree * tree) { int error; (void) tree; error = tree_store_save (); if (error) { char *tree_name; tree_name = mc_config_get_full_path (MC_TREESTORE_FILE); fprintf (stderr, _("Cannot open the %s file for writing:\n%s\n"), tree_name, unix_error_string (error)); g_free (tree_name); } }
/** * Read histories from the ${XDG_CACHE_HOME}/mc/history file */ static void dlg_read_history (WDialog * h) { char *profile; ev_history_load_save_t event_data; if (num_history_items_recorded == 0) /* this is how to disable */ return; profile = mc_config_get_full_path (MC_HISTORY_FILE); event_data.cfg = mc_config_init (profile, TRUE); event_data.receiver = NULL; /* create all histories in dialog */ mc_event_raise (h->event_group, MCEVENT_HISTORY_LOAD, &event_data); mc_config_deinit (event_data.cfg); g_free (profile); }
void edit_fhl_cmd (void) { char *buffer = NULL; char *fhlfile = NULL; int dir; dir = 0; if (geteuid () == 0) { dir = query_dialog (_("Highlighting groups file edit"), _("Which highlighting file you want to edit?"), D_NORMAL, 2, _("&User"), _("&System Wide")); } fhlfile = concat_dir_and_file (mc_global.sysconfig_dir, MC_FHL_INI_FILE); if (dir == 0) { buffer = mc_config_get_full_path (MC_FHL_INI_FILE); check_for_default (fhlfile, buffer); do_edit (buffer); g_free (buffer); } else if (dir == 1) { if (!exist_file (fhlfile)) { g_free (fhlfile); fhlfile = concat_dir_and_file (mc_global.sysconfig_dir, MC_FHL_INI_FILE); } do_edit (fhlfile); } g_free (fhlfile); /* refresh highlighting rules */ mc_fhl_free (&mc_filehighlight); mc_filehighlight = mc_fhl_new (TRUE); }
GList * history_get (const char *input_name) { GList *hist = NULL; char *profile; mc_config_t *cfg; if (num_history_items_recorded == 0) /* this is how to disable */ return NULL; if ((input_name == NULL) || (*input_name == '\0')) return NULL; profile = mc_config_get_full_path (MC_HISTORY_FILE); cfg = mc_config_init (profile); hist = history_load (cfg, input_name); mc_config_deinit (cfg); g_free (profile); return hist; }
const char * setup_init (void) { if (profile_name == NULL) { char *profile; profile = mc_config_get_full_path (MC_CONFIG_FILE); if (!exist_file (profile)) { char *inifile; inifile = mc_build_filename (mc_global.sysconfig_dir, "mc.ini", NULL); if (exist_file (inifile)) { g_free (profile); profile = inifile; } else { g_free (inifile); inifile = mc_build_filename (mc_global.share_data_dir, "mc.ini", NULL); if (!exist_file (inifile)) g_free (inifile); else { g_free (profile); profile = inifile; } } } profile_name = profile; } return profile_name; }
char * expand_format (struct WEdit *edit_widget, char c, gboolean do_quote) { WPanel *panel = NULL; char *(*quote_func) (const char *, int); char *fname = NULL; char *result; char c_lc; #ifndef USE_INTERNAL_EDIT (void) edit_widget; #endif if (c == '%') return g_strdup ("%"); switch (mc_global.mc_run_mode) { case MC_RUN_FULL: if (g_ascii_islower ((gchar) c)) panel = current_panel; else { if (get_other_type () != view_listing) return g_strdup (""); panel = other_panel; } fname = g_strdup (panel->dir.list[panel->selected].fname); break; #ifdef USE_INTERNAL_EDIT case MC_RUN_EDITOR: fname = edit_get_file_name (edit_widget); break; #endif default: /* other modes don't use formats */ return g_strdup (""); } if (do_quote) quote_func = name_quote; else quote_func = fake_name_quote; c_lc = g_ascii_tolower ((gchar) c); switch (c_lc) { case 'f': case 'p': result = (*quote_func) (fname, 0); goto ret; case 'x': result = (*quote_func) (extension (fname), 0); goto ret; case 'd': { char *cwd; char *qstr; if (panel) cwd = g_strdup (vfs_path_as_str (panel->cwd_vpath)); else cwd = vfs_get_current_dir (); qstr = (*quote_func) (cwd, 0); g_free (cwd); result = qstr; goto ret; } case 'i': /* indent equal number cursor position in line */ #ifdef USE_INTERNAL_EDIT if (edit_widget) { result = g_strnfill (edit_get_curs_col (edit_widget), ' '); goto ret; } #endif break; case 'y': /* syntax type */ #ifdef USE_INTERNAL_EDIT if (edit_widget) { const char *syntax_type = edit_get_syntax_type (edit_widget); if (syntax_type != NULL) { result = g_strdup (syntax_type); goto ret; } } #endif break; case 'k': /* block file name */ case 'b': /* block file name / strip extension */ { #ifdef USE_INTERNAL_EDIT if (edit_widget) { char *file; file = mc_config_get_full_path (EDIT_BLOCK_FILE); result = (*quote_func) (file, 0); g_free (file); goto ret; } #endif if (c_lc == 'b') { result = strip_ext ((*quote_func) (fname, 0)); goto ret; } break; } case 'n': /* strip extension in editor */ #ifdef USE_INTERNAL_EDIT if (edit_widget) { result = strip_ext ((*quote_func) (fname, 0)); goto ret; } #endif break; case 'm': /* menu file name */ if (menu) { result = (*quote_func) (menu, 0); goto ret; } break; case 's': if (!panel || !panel->marked) { result = (*quote_func) (fname, 0); goto ret; } /* Fall through */ case 't': case 'u': { GString *block; int i; if (panel == NULL) { result = g_strdup (""); goto ret; } block = g_string_sized_new (16); for (i = 0; i < panel->dir.len; i++) if (panel->dir.list[i].f.marked) { char *tmp; tmp = (*quote_func) (panel->dir.list[i].fname, 0); g_string_append (block, tmp); g_string_append_c (block, ' '); g_free (tmp); if (c_lc == 'u') do_file_mark (panel, i, 0); } result = g_string_free (block, FALSE); goto ret; } /* sub case block */ } /* switch */ result = g_strdup ("% "); result[1] = c; ret: g_free (fname); return result; }
static mc_config_t * load_setup_get_keymap_profile_config (gboolean load_from_file) { /* TODO: IMHO, in future, this function shall be placed in mcconfig module. */ mc_config_t *keymap_config; char *share_keymap, *sysconfig_keymap; char *fname, *fname2; /* 0) Create default keymap */ keymap_config = create_default_keymap (); if (!load_from_file) return keymap_config; /* load and merge global keymaps */ /* 1) /usr/share/mc (mc_global.share_data_dir) */ share_keymap = g_build_filename (mc_global.share_data_dir, GLOBAL_KEYMAP_FILE, NULL); load_setup_init_config_from_file (&keymap_config, share_keymap, TRUE); /* 2) /etc/mc (mc_global.sysconfig_dir) */ sysconfig_keymap = g_build_filename (mc_global.sysconfig_dir, GLOBAL_KEYMAP_FILE, NULL); load_setup_init_config_from_file (&keymap_config, sysconfig_keymap, TRUE); /* then load and merge one of user-defined keymap */ /* 3) --keymap=<keymap> */ fname = load_setup_get_full_config_name (NULL, mc_args__keymap_file); if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0) { load_setup_init_config_from_file (&keymap_config, fname, TRUE); goto done; } g_free (fname); /* 4) getenv("MC_KEYMAP") */ fname = load_setup_get_full_config_name (NULL, g_getenv ("MC_KEYMAP")); if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0) { load_setup_init_config_from_file (&keymap_config, fname, TRUE); goto done; } g_free (fname); /* 5) main config; [Midnight Commander] -> keymap */ fname2 = mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, "keymap", NULL); if (fname2 != NULL && *fname2 != '\0') fname = load_setup_get_full_config_name (NULL, fname2); g_free (fname2); if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0) { load_setup_init_config_from_file (&keymap_config, fname, TRUE); goto done; } g_free (fname); /* 6) ${XDG_CONFIG_HOME}/mc/mc.keymap */ fname = mc_config_get_full_path (GLOBAL_KEYMAP_FILE); load_setup_init_config_from_file (&keymap_config, fname, TRUE); done: g_free (fname); g_free (sysconfig_keymap); g_free (share_keymap); return keymap_config; }
static void init_subshell_child (const char *pty_name) { char *init_file = NULL; pid_t mc_sid; (void) pty_name; setsid (); /* Get a fresh terminal session */ /* Make sure that it has become our controlling terminal */ /* Redundant on Linux and probably most systems, but just in case: */ #ifdef TIOCSCTTY ioctl (subshell_pty_slave, TIOCSCTTY, 0); #endif /* Configure its terminal modes and window size */ /* Set up the pty with the same termios flags as our own tty */ if (tcsetattr (subshell_pty_slave, TCSANOW, &shell_mode)) { fprintf (stderr, "Cannot set pty terminal modes: %s\r\n", unix_error_string (errno)); my_exit (FORK_FAILURE); } /* Set the pty's size (80x25 by default on Linux) according to the */ /* size of the real terminal as calculated by ncurses, if possible */ tty_resize (subshell_pty_slave); /* Set up the subshell's environment and init file name */ /* It simplifies things to change to our home directory here, */ /* and the user's startup file may do a 'cd' command anyway */ { int ret; ret = chdir (mc_config_get_home_dir ()); /* FIXME? What about when we re-run the subshell? */ (void) ret; } /* Set MC_SID to prevent running one mc from another */ mc_sid = getsid (0); if (mc_sid != -1) { char sid_str[BUF_SMALL]; g_snprintf (sid_str, sizeof (sid_str), "MC_SID=%ld", (long) mc_sid); putenv (g_strdup (sid_str)); } switch (subshell_type) { case BASH: init_file = mc_config_get_full_path ("bashrc"); if (access (init_file, R_OK) == -1) { g_free (init_file); init_file = g_strdup (".bashrc"); } /* Make MC's special commands not show up in bash's history */ putenv ((char *) "HISTCONTROL=ignorespace"); /* Allow alternative readline settings for MC */ { char *input_file = mc_config_get_full_path ("inputrc"); if (access (input_file, R_OK) == 0) { char *putenv_str = g_strconcat ("INPUTRC=", input_file, NULL); putenv (putenv_str); g_free (putenv_str); } g_free (input_file); } break; /* TODO: Find a way to pass initfile to TCSH and ZSH */ case TCSH: case ZSH: case FISH: break; default: fprintf (stderr, __FILE__ ": unimplemented subshell type %d\r\n", subshell_type); my_exit (FORK_FAILURE); } /* Attach all our standard file descriptors to the pty */ /* This is done just before the fork, because stderr must still */ /* be connected to the real tty during the above error messages; */ /* otherwise the user will never see them. */ dup2 (subshell_pty_slave, STDIN_FILENO); dup2 (subshell_pty_slave, STDOUT_FILENO); dup2 (subshell_pty_slave, STDERR_FILENO); close (subshell_pipe[READ]); close (subshell_pty_slave); /* These may be FD_CLOEXEC, but just in case... */ /* Close master side of pty. This is important; apart from */ /* freeing up the descriptor for use in the subshell, it also */ /* means that when MC exits, the subshell will get a SIGHUP and */ /* exit too, because there will be no more descriptors pointing */ /* at the master side of the pty and so it will disappear. */ close (mc_global.tty.subshell_pty); /* Execute the subshell at last */ switch (subshell_type) { case BASH: execl (mc_global.tty.shell, "bash", "-rcfile", init_file, (char *) NULL); break; case TCSH: execl (mc_global.tty.shell, "tcsh", (char *) NULL); break; case ZSH: /* Use -g to exclude cmds beginning with space from history * and -Z to use the line editor on non-interactive term */ execl (mc_global.tty.shell, "zsh", "-Z", "-g", (char *) NULL); break; case FISH: execl (mc_global.tty.shell, "fish", (char *) NULL); break; } /* If we get this far, everything failed miserably */ g_free (init_file); my_exit (FORK_FAILURE); }
void save_file_position (const vfs_path_t * filename_vpath, long line, long column, off_t offset, GArray * bookmarks) { static size_t filepos_max_saved_entries = 0; char *fn, *tmp_fn; FILE *f, *tmp_f; char buf[MC_MAXPATHLEN + 100]; size_t i; const size_t len = vfs_path_len (filename_vpath); gboolean src_error = FALSE; if (filepos_max_saved_entries == 0) filepos_max_saved_entries = mc_config_get_int (mc_main_config, CONFIG_APP_SECTION, "filepos_max_saved_entries", 1024); fn = mc_config_get_full_path (MC_FILEPOS_FILE); if (fn == NULL) goto early_error; mc_util_make_backup_if_possible (fn, TMP_SUFFIX); /* open file */ f = fopen (fn, "w"); if (f == NULL) goto open_target_error; tmp_fn = g_strdup_printf ("%s" TMP_SUFFIX, fn); tmp_f = fopen (tmp_fn, "r"); if (tmp_f == NULL) { src_error = TRUE; goto open_source_error; } /* put the new record */ if (line != 1 || column != 0 || bookmarks != NULL) { if (fprintf (f, "%s %ld;%ld;%" PRIuMAX, vfs_path_as_str (filename_vpath), line, column, (uintmax_t) offset) < 0) goto write_position_error; if (bookmarks != NULL) for (i = 0; i < bookmarks->len && i < MAX_SAVED_BOOKMARKS; i++) if (fprintf (f, ";%zu", g_array_index (bookmarks, size_t, i)) < 0) goto write_position_error; if (fprintf (f, "\n") < 0) goto write_position_error; } i = 1; while (fgets (buf, sizeof (buf), tmp_f) != NULL) { if (buf[len] == ' ' && strncmp (buf, vfs_path_as_str (filename_vpath), len) == 0 && strchr (&buf[len + 1], ' ') == NULL) continue; fprintf (f, "%s", buf); if (++i > filepos_max_saved_entries) break; } write_position_error: fclose (tmp_f); open_source_error: g_free (tmp_fn); fclose (f); if (src_error) mc_util_restore_from_backup_if_possible (fn, TMP_SUFFIX); else mc_util_unlink_backup_if_possible (fn, TMP_SUFFIX); open_target_error: g_free (fn); early_error: if (bookmarks != NULL) g_array_free (bookmarks, TRUE); }
void load_file_position (const vfs_path_t * filename_vpath, long *line, long *column, off_t * offset, GArray ** bookmarks) { char *fn; FILE *f; char buf[MC_MAXPATHLEN + 100]; const size_t len = vfs_path_len (filename_vpath); /* defaults */ *line = 1; *column = 0; *offset = 0; /* open file with positions */ fn = mc_config_get_full_path (MC_FILEPOS_FILE); f = fopen (fn, "r"); g_free (fn); if (f == NULL) return; /* prepare array for serialized bookmarks */ if (bookmarks != NULL) *bookmarks = g_array_sized_new (FALSE, FALSE, sizeof (size_t), MAX_SAVED_BOOKMARKS); while (fgets (buf, sizeof (buf), f) != NULL) { const char *p; gchar **pos_tokens; /* check if the filename matches the beginning of string */ if (strncmp (buf, vfs_path_as_str (filename_vpath), len) != 0) continue; /* followed by single space */ if (buf[len] != ' ') continue; /* and string without spaces */ p = &buf[len + 1]; if (strchr (p, ' ') != NULL) continue; pos_tokens = g_strsplit (p, ";", 3 + MAX_SAVED_BOOKMARKS); if (pos_tokens[0] == NULL) { *line = 1; *column = 0; *offset = 0; } else { *line = strtol (pos_tokens[0], NULL, 10); if (pos_tokens[1] == NULL) { *column = 0; *offset = 0; } else { *column = strtol (pos_tokens[1], NULL, 10); if (pos_tokens[2] == NULL) *offset = 0; else if (bookmarks != NULL) { size_t i; *offset = (off_t) g_ascii_strtoll (pos_tokens[2], NULL, 10); for (i = 0; i < MAX_SAVED_BOOKMARKS && pos_tokens[3 + i] != NULL; i++) { size_t val; val = strtoul (pos_tokens[3 + i], NULL, 10); g_array_append_val (*bookmarks, val); } } } } g_strfreev (pos_tokens); } fclose (f); }
int regex_command_for (void *target, const vfs_path_t * filename_vpath, const char *action, vfs_path_t ** script_vpath) { char *p, *q, *r, c; size_t file_len; gboolean found = FALSE; gboolean error_flag = FALSE; int ret = 0; struct stat mystat; int view_at_line_number; char *include_target; int include_target_len; int have_type = 0; /* Flag used by regex_check_type() */ if (filename_vpath == NULL) return 0; if (script_vpath != NULL) *script_vpath = NULL; /* Check for the special View:%d parameter */ if (strncmp (action, "View:", 5) == 0) { view_at_line_number = atoi (action + 5); action = "View"; } else { view_at_line_number = 0; } if (data == NULL) { char *extension_file; gboolean mc_user_ext = TRUE; gboolean home_error = FALSE; extension_file = mc_config_get_full_path (MC_FILEBIND_FILE); if (!exist_file (extension_file)) { g_free (extension_file); check_stock_mc_ext: extension_file = mc_build_filename (mc_global.sysconfig_dir, MC_LIB_EXT, NULL); if (!exist_file (extension_file)) { g_free (extension_file); extension_file = mc_build_filename (mc_global.share_data_dir, MC_LIB_EXT, NULL); } mc_user_ext = FALSE; } g_file_get_contents (extension_file, &data, NULL, NULL); g_free (extension_file); if (data == NULL) return 0; if (strstr (data, "default/") == NULL) { if (strstr (data, "regex/") == NULL && strstr (data, "shell/") == NULL && strstr (data, "type/") == NULL) { g_free (data); data = NULL; if (!mc_user_ext) { char *title; title = g_strdup_printf (_(" %s%s file error"), mc_global.sysconfig_dir, MC_LIB_EXT); message (D_ERROR, title, _("The format of the %smc.ext " "file has changed with version 3.0. It seems that " "the installation failed. Please fetch a fresh " "copy from the Midnight Commander package."), mc_global.sysconfig_dir); g_free (title); return 0; } home_error = TRUE; goto check_stock_mc_ext; } } if (home_error) { char *filebind_filename; char *title; filebind_filename = mc_config_get_full_path (MC_FILEBIND_FILE); title = g_strdup_printf (_("%s file error"), filebind_filename); message (D_ERROR, title, _("The format of the %s file has " "changed with version 3.0. You may either want to copy " "it from %smc.ext or use that file as an example of how to write it."), filebind_filename, mc_global.sysconfig_dir); g_free (filebind_filename); g_free (title); } } mc_stat (filename_vpath, &mystat); include_target = NULL; include_target_len = 0; file_len = vfs_path_len (filename_vpath); for (p = data; *p != '\0'; p++) { for (q = p; *q == ' ' || *q == '\t'; q++) ; if (*q == '\n' || *q == '\0') p = q; /* empty line */ if (*p == '#') /* comment */ while (*p != '\0' && *p != '\n') p++; if (*p == '\n') continue; if (*p == '\0') break; if (p == q) { /* i.e. starts in the first column, should be * keyword/descNL */ gboolean case_insense; found = FALSE; q = strchr (p, '\n'); if (q == NULL) q = strchr (p, '\0'); c = *q; *q = '\0'; if (include_target) { if ((strncmp (p, "include/", 8) == 0) && (strncmp (p + 8, include_target, include_target_len) == 0)) found = TRUE; } else if (strncmp (p, "regex/", 6) == 0) { mc_search_t *search; p += 6; case_insense = (strncmp (p, "i/", 2) == 0); if (case_insense) p += 2; search = mc_search_new (p, -1); if (search != NULL) { search->search_type = MC_SEARCH_T_REGEX; search->is_case_sensitive = !case_insense; found = mc_search_run (search, vfs_path_as_str (filename_vpath), 0, file_len, NULL); mc_search_free (search); } } else if (strncmp (p, "directory/", 10) == 0) { if (S_ISDIR (mystat.st_mode) && mc_search (p + 10, vfs_path_as_str (filename_vpath), MC_SEARCH_T_REGEX)) found = TRUE; } else if (strncmp (p, "shell/", 6) == 0) { int (*cmp_func) (const char *s1, const char *s2, size_t n) = strncmp; p += 6; case_insense = (strncmp (p, "i/", 2) == 0); if (case_insense) { p += 2; cmp_func = strncasecmp; } if (*p == '.' && file_len >= (size_t) (q - p)) { if (cmp_func (p, vfs_path_as_str (filename_vpath) + file_len - (q - p), q - p) == 0) found = TRUE; } else { if ((size_t) (q - p) == file_len && cmp_func (p, vfs_path_as_str (filename_vpath), q - p) == 0) found = TRUE; } } else if (strncmp (p, "type/", 5) == 0) { GError *error = NULL; p += 5; case_insense = (strncmp (p, "i/", 2) == 0); if (case_insense) p += 2; found = regex_check_type (filename_vpath, p, &have_type, case_insense, &error); if (error != NULL) { g_error_free (error); error_flag = TRUE; /* leave it if file cannot be opened */ } } else if (strncmp (p, "default/", 8) == 0) found = TRUE; *q = c; p = q; if (*p == '\0') break; } else { /* List of actions */ p = q; q = strchr (p, '\n'); if (q == NULL) q = strchr (p, '\0'); if (found && !error_flag) { r = strchr (p, '='); if (r != NULL) { c = *r; *r = '\0'; if (strcmp (p, "Include") == 0) { char *t; include_target = p + 8; t = strchr (include_target, '\n'); if (t != NULL) *t = '\0'; include_target_len = strlen (include_target); if (t != NULL) *t = '\n'; *r = c; p = q; found = FALSE; if (*p == '\0') break; continue; } if (strcmp (action, p) != 0) *r = c; else { *r = c; for (p = r + 1; *p == ' ' || *p == '\t'; p++) ; /* Empty commands just stop searching * through, they don't do anything */ if (p < q) { vfs_path_t *sv; sv = exec_extension (target, filename_vpath, r + 1, view_at_line_number); if (script_vpath != NULL) *script_vpath = sv; else exec_cleanup_script (sv); ret = 1; } break; } } } p = q; if (*p == '\0') break; } } if (error_flag) ret = -1; return ret; }
gboolean user_menu_cmd (struct WEdit * edit_widget, const char *menu_file, int selected_entry) { char *p; char *data, **entries; int max_cols, menu_lines, menu_limit; int col, i, accept_entry = 1; int selected, old_patterns; gboolean res = FALSE; gboolean interactive = TRUE; if (!vfs_current_is_local ()) { message (D_ERROR, MSG_ERROR, "%s", _("Cannot execute commands on non-local filesystems")); return FALSE; } if (menu_file != NULL) menu = g_strdup (menu_file); else menu = g_strdup (edit_widget ? EDIT_LOCAL_MENU : MC_LOCAL_MENU); if (!exist_file (menu) || !menu_file_own (menu)) { if (menu_file != NULL) { message (D_ERROR, MSG_ERROR, _("Cannot open file %s\n%s"), menu, unix_error_string (errno)); MC_PTR_FREE (menu); return FALSE; } g_free (menu); if (edit_widget) menu = mc_config_get_full_path (EDIT_HOME_MENU); else menu = mc_config_get_full_path (MC_USERMENU_FILE); if (!exist_file (menu)) { g_free (menu); menu = mc_build_filename (mc_config_get_home_dir (), edit_widget ? EDIT_GLOBAL_MENU : MC_GLOBAL_MENU, NULL); if (!exist_file (menu)) { g_free (menu); menu = mc_build_filename (mc_global.sysconfig_dir, edit_widget ? EDIT_GLOBAL_MENU : MC_GLOBAL_MENU, NULL); if (!exist_file (menu)) { g_free (menu); menu = mc_build_filename (mc_global.share_data_dir, edit_widget ? EDIT_GLOBAL_MENU : MC_GLOBAL_MENU, NULL); } } } } if (!g_file_get_contents (menu, &data, NULL, NULL)) { message (D_ERROR, MSG_ERROR, _("Cannot open file%s\n%s"), menu, unix_error_string (errno)); MC_PTR_FREE (menu); return FALSE; } max_cols = 0; selected = 0; menu_limit = 0; entries = 0; /* Parse the menu file */ old_patterns = easy_patterns; p = check_patterns (data); for (menu_lines = col = 0; *p; str_next_char (&p)) { if (menu_lines >= menu_limit) { char **new_entries; menu_limit += MAX_ENTRIES; new_entries = g_try_realloc (entries, sizeof (new_entries[0]) * menu_limit); if (new_entries == NULL) break; entries = new_entries; new_entries += menu_limit; while (--new_entries >= &entries[menu_lines]) *new_entries = NULL; } if (col == 0 && !entries[menu_lines]) { if (*p == '#') { /* show prompt if first line of external script is #interactive */ if (selected_entry >= 0 && strncmp (p, "#silent", 7) == 0) interactive = FALSE; /* A commented menu entry */ accept_entry = 1; } else if (*p == '+') { if (*(p + 1) == '=') { /* Combined adding and default */ p = test_line (edit_widget, p + 1, &accept_entry); if (selected == 0 && accept_entry) selected = menu_lines; } else { /* A condition for adding the entry */ p = test_line (edit_widget, p, &accept_entry); } } else if (*p == '=') { if (*(p + 1) == '+') { /* Combined adding and default */ p = test_line (edit_widget, p + 1, &accept_entry); if (selected == 0 && accept_entry) selected = menu_lines; } else { /* A condition for making the entry default */ i = 1; p = test_line (edit_widget, p, &i); if (selected == 0 && i) selected = menu_lines; } } else if (*p != ' ' && *p != '\t' && str_isprint (p)) { /* A menu entry title line */ if (accept_entry) entries[menu_lines] = p; else accept_entry = 1; } } if (*p == '\n') { if (entries[menu_lines]) { menu_lines++; accept_entry = 1; } max_cols = max (max_cols, col); col = 0; } else { if (*p == '\t') *p = ' '; col++; } } if (menu_lines == 0) { message (D_ERROR, MSG_ERROR, _("No suitable entries found in %s"), menu); res = FALSE; } else { if (selected_entry >= 0) selected = selected_entry; else { Listbox *listbox; max_cols = min (max (max_cols, col), MAX_ENTRY_LEN); /* Create listbox */ listbox = create_listbox_window (menu_lines, max_cols + 2, _("User menu"), "[Menu File Edit]"); /* insert all the items found */ for (i = 0; i < menu_lines; i++) { p = entries[i]; LISTBOX_APPEND_TEXT (listbox, (unsigned char) p[0], extract_line (p, p + MAX_ENTRY_LEN), p); } /* Select the default entry */ listbox_select_entry (listbox->list, selected); selected = run_listbox (listbox); } if (selected >= 0) { execute_menu_command (edit_widget, entries[selected], interactive); res = TRUE; } do_refresh (); } easy_patterns = old_patterns; MC_PTR_FREE (menu); g_free (entries); g_free (data); return res; }
void load_setup (void) { const char *profile; size_t i; const char *kt; #ifdef HAVE_CHARSET char *buffer; load_codepages_list (); #endif /* HAVE_CHARSET */ profile = setup_init (); /* mc.lib is common for all users, but has priority lower than ${XDG_CONFIG_HOME}/mc/ini. FIXME: it's only used for keys and treestore now */ global_profile_name = g_build_filename (mc_global.sysconfig_dir, MC_GLOBAL_CONFIG_FILE, (char *) NULL); if (!exist_file (global_profile_name)) { g_free (global_profile_name); global_profile_name = g_build_filename (mc_global.share_data_dir, MC_GLOBAL_CONFIG_FILE, (char *) NULL); } panels_profile_name = mc_config_get_full_path (MC_PANELS_FILE); mc_main_config = mc_config_init (profile, FALSE); if (!exist_file (panels_profile_name)) setup__move_panels_config_into_separate_file (profile); mc_panels_config = mc_config_init (panels_profile_name, FALSE); /* Load integer boolean options */ for (i = 0; int_options[i].opt_name != NULL; i++) *int_options[i].opt_addr = mc_config_get_int (mc_main_config, CONFIG_APP_SECTION, int_options[i].opt_name, *int_options[i].opt_addr); #ifndef USE_INTERNAL_EDIT /* reset forced in case of build without internal editor */ use_internal_edit = 0; #endif /* USE_INTERNAL_EDIT */ if (option_tab_spacing <= 0) option_tab_spacing = DEFAULT_TAB_SPACING; #ifdef USE_INTERNAL_EDIT if (option_word_wrap_line_length <= 0) option_word_wrap_line_length = DEFAULT_WRAP_LINE_LENGTH; #endif /* USE_INTERNAL_EDIT */ /* overwrite old_esc_mode_timeout */ kt = getenv ("KEYBOARD_KEY_TIMEOUT_US"); if ((kt != NULL) && (kt[0] != '\0')) old_esc_mode_timeout = atoi (kt); /* Load string options */ for (i = 0; str_options[i].opt_name != NULL; i++) *str_options[i].opt_addr = mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, str_options[i].opt_name, str_options[i].opt_defval); load_layout (); panels_load_options (); load_panelize (); startup_left_mode = setup__load_panel_state ("New Left Panel"); startup_right_mode = setup__load_panel_state ("New Right Panel"); /* At least one of the panels is a listing panel */ if (startup_left_mode != view_listing && startup_right_mode != view_listing) startup_left_mode = view_listing; boot_current_is_left = mc_config_get_bool (mc_panels_config, "Dirs", "current_is_left", TRUE); /* Load time formats */ user_recent_timeformat = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "timeformat_recent", FMTTIME); user_old_timeformat = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "timeformat_old", FMTYEAR); #ifdef ENABLE_VFS_FTP ftpfs_proxy_host = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "ftp_proxy_host", "gate"); ftpfs_ignore_chattr_errors = mc_config_get_bool (mc_main_config, CONFIG_APP_SECTION, "ignore_ftp_chattr_errors", TRUE); ftpfs_init_passwd (); #endif /* ENABLE_VFS_FTP */ /* The default color and the terminal dependent color */ mc_global.tty.setup_color_string = mc_config_get_string (mc_main_config, "Colors", "base_color", ""); mc_global.tty.term_color_string = mc_config_get_string (mc_main_config, "Colors", getenv ("TERM"), ""); mc_global.tty.color_terminal_string = mc_config_get_string (mc_main_config, "Colors", "color_terminals", ""); /* Load the directory history */ /* directory_history_load (); */ /* Remove the temporal entries */ #ifdef HAVE_CHARSET if (codepages->len > 1) { buffer = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "display_codepage", ""); if (buffer[0] != '\0') { mc_global.display_codepage = get_codepage_index (buffer); cp_display = get_codepage_id (mc_global.display_codepage); } g_free (buffer); buffer = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "source_codepage", ""); if (buffer[0] != '\0') { default_source_codepage = get_codepage_index (buffer); mc_global.source_codepage = default_source_codepage; /* May be source_codepage doesn't need this */ cp_source = get_codepage_id (mc_global.source_codepage); } g_free (buffer); } autodetect_codeset = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "autodetect_codeset", ""); if ((autodetect_codeset[0] != '\0') && (strcmp (autodetect_codeset, "off") != 0)) is_autodetect_codeset_enabled = TRUE; g_free (init_translation_table (mc_global.source_codepage, mc_global.display_codepage)); buffer = (char *) get_codepage_id (mc_global.display_codepage); if (buffer != NULL) mc_global.utf8_display = str_isutf8 (buffer); #endif /* HAVE_CHARSET */ #ifdef HAVE_ASPELL spell_language = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "spell_language", "en"); #endif /* HAVE_ASPELL */ clipboard_store_path = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "clipboard_store", ""); clipboard_paste_path = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "clipboard_paste", ""); }