This source file includes following definitions.
- check_codeset
- OS_Setup
- sigchld_handler_no_subshell
- init_sigchld
- check_sid
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #include <config.h>
33
34 #include <ctype.h>
35 #include <errno.h>
36 #include <locale.h>
37 #include <pwd.h>
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include <string.h>
41 #include <sys/types.h>
42 #include <sys/wait.h>
43 #include <signal.h>
44 #include <unistd.h>
45
46 #include "lib/global.h"
47
48 #include "lib/event.h"
49 #include "lib/tty/tty.h"
50 #include "lib/tty/key.h"
51 #include "lib/tty/mouse.h"
52 #include "lib/skin.h"
53 #include "lib/filehighlight.h"
54 #include "lib/fileloc.h"
55 #include "lib/strutil.h"
56 #include "lib/util.h"
57 #include "lib/vfs/vfs.h"
58
59 #include "filemanager/filemanager.h"
60 #include "filemanager/treestore.h"
61 #include "filemanager/layout.h"
62 #include "filemanager/ext.h"
63 #include "filemanager/command.h"
64 #include "filemanager/panel.h"
65
66 #include "vfs/plugins_init.h"
67
68 #include "events_init.h"
69 #include "args.h"
70 #ifdef ENABLE_SUBSHELL
71 #include "subshell/subshell.h"
72 #endif
73 #include "keymap.h"
74 #include "setup.h"
75
76 #ifdef HAVE_CHARSET
77 #include "lib/charsets.h"
78 #include "selcodepage.h"
79 #endif
80
81 #include "consaver/cons.saver.h"
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 static void
98 check_codeset (void)
99 {
100 const char *current_system_codepage = NULL;
101
102 current_system_codepage = str_detect_termencoding ();
103
104 #ifdef HAVE_CHARSET
105 {
106 const char *_display_codepage;
107
108 _display_codepage = get_codepage_id (mc_global.display_codepage);
109
110 if (strcmp (_display_codepage, current_system_codepage) != 0)
111 {
112 mc_global.display_codepage = get_codepage_index (current_system_codepage);
113 if (mc_global.display_codepage == -1)
114 mc_global.display_codepage = 0;
115
116 mc_config_set_string (mc_global.main_config, CONFIG_MISC_SECTION, "display_codepage",
117 cp_display);
118 }
119 }
120 #endif
121
122 mc_global.utf8_display = str_isutf8 (current_system_codepage);
123 }
124
125
126
127
128 static void
129 OS_Setup (void)
130 {
131 const char *datadir_env;
132
133 mc_shell_init ();
134
135
136
137 datadir_env = g_getenv ("MC_DATADIR");
138 if (datadir_env != NULL)
139 mc_global.sysconfig_dir = g_strdup (datadir_env);
140 else
141 mc_global.sysconfig_dir = g_strdup (SYSCONFDIR);
142
143 mc_global.share_data_dir = g_strdup (DATADIR);
144 }
145
146
147
148 static void
149 sigchld_handler_no_subshell (int sig)
150 {
151 #ifdef __linux__
152 int pid, status;
153
154 if (mc_global.tty.console_flag == '\0')
155 return;
156
157
158
159
160
161
162
163
164 pid = waitpid (cons_saver_pid, &status, WUNTRACED | WNOHANG);
165
166 if (pid == cons_saver_pid)
167 {
168 if (WIFSTOPPED (status))
169 {
170
171 kill (pid, SIGCONT);
172 }
173 else
174 {
175
176 handle_console (CONSOLE_DONE);
177 mc_global.tty.console_flag = '\0';
178 }
179 }
180
181 #endif
182
183 (void) sig;
184 }
185
186
187
188 static void
189 init_sigchld (void)
190 {
191 struct sigaction sigchld_action;
192
193 memset (&sigchld_action, 0, sizeof (sigchld_action));
194 sigchld_action.sa_handler =
195 #ifdef ENABLE_SUBSHELL
196 mc_global.tty.use_subshell ? sigchld_handler :
197 #endif
198 sigchld_handler_no_subshell;
199
200 sigemptyset (&sigchld_action.sa_mask);
201
202 #ifdef SA_RESTART
203 sigchld_action.sa_flags = SA_RESTART;
204 #endif
205
206 if (sigaction (SIGCHLD, &sigchld_action, NULL) == -1)
207 {
208 #ifdef ENABLE_SUBSHELL
209
210
211
212
213 mc_global.tty.use_subshell = FALSE;
214 #endif
215 }
216 }
217
218
219
220
221
222
223
224
225 static gboolean
226 check_sid (void)
227 {
228 pid_t my_sid, old_sid;
229 const char *sid_str;
230
231 sid_str = getenv ("MC_SID");
232 if (sid_str == NULL)
233 return TRUE;
234
235 old_sid = (pid_t) strtol (sid_str, NULL, 0);
236 if (old_sid == 0)
237 return TRUE;
238
239 my_sid = getsid (0);
240 if (my_sid == -1)
241 return TRUE;
242
243
244 return (old_sid != my_sid);
245 }
246
247
248
249
250
251 int
252 main (int argc, char *argv[])
253 {
254 GError *mcerror = NULL;
255 int exit_code = EXIT_FAILURE;
256
257 mc_global.run_from_parent_mc = !check_sid ();
258
259
260 #ifdef HAVE_SETLOCALE
261 (void) setlocale (LC_ALL, "");
262 #endif
263 (void) bindtextdomain (PACKAGE, LOCALEDIR);
264 (void) textdomain (PACKAGE);
265
266
267 str_init_strings (NULL);
268
269 mc_setup_run_mode (argv);
270
271 if (!mc_args_parse (&argc, &argv, "mc", &mcerror))
272 {
273 startup_exit_falure:
274 fprintf (stderr, _("Failed to run:\n%s\n"), mcerror->message);
275 g_error_free (mcerror);
276 startup_exit_ok:
277 mc_shell_deinit ();
278 str_uninit_strings ();
279 return exit_code;
280 }
281
282
283
284
285
286
287 mc_global.tty.xterm_flag = tty_check_term (mc_args__force_xterm);
288
289
290 OS_Setup ();
291
292 if (!g_path_is_absolute (mc_config_get_home_dir ()))
293 {
294 mc_propagate_error (&mcerror, 0, "%s: %s", _("Home directory path is not absolute"),
295 mc_config_get_home_dir ());
296 mc_event_deinit (NULL);
297 goto startup_exit_falure;
298 }
299
300 if (!mc_args_show_info ())
301 {
302 exit_code = EXIT_SUCCESS;
303 goto startup_exit_ok;
304 }
305
306 if (!events_init (&mcerror))
307 goto startup_exit_falure;
308
309 mc_config_init_config_paths (&mcerror);
310 if (mcerror != NULL)
311 {
312 mc_event_deinit (NULL);
313 goto startup_exit_falure;
314 }
315
316 vfs_init ();
317 vfs_plugins_init ();
318
319 load_setup ();
320
321
322 vfs_setup_work_dir ();
323
324
325 mc_tmpdir ();
326
327
328
329 if (!mc_setup_by_args (argc, argv, &mcerror))
330 {
331 vfs_shut ();
332 done_setup ();
333 g_free (saved_other_dir);
334 mc_event_deinit (NULL);
335 goto startup_exit_falure;
336 }
337
338
339
340
341
342 if (mc_global.mc_run_mode == MC_RUN_FULL)
343 {
344 char *buffer;
345 vfs_path_t *vpath;
346
347 buffer = mc_config_get_string (mc_global.panels_config, "Dirs", "other_dir", ".");
348 vpath = vfs_path_from_str (buffer);
349 if (vfs_file_is_local (vpath))
350 saved_other_dir = buffer;
351 else
352 g_free (buffer);
353 vfs_path_free (vpath, TRUE);
354 }
355
356
357
358 init_key ();
359
360
361 handle_console (CONSOLE_INIT);
362
363 #ifdef ENABLE_SUBSHELL
364
365 if (mc_global.mc_run_mode != MC_RUN_FULL && mc_global.run_from_parent_mc)
366 mc_global.tty.use_subshell = FALSE;
367
368 if (mc_global.tty.use_subshell)
369 subshell_get_console_attributes ();
370 #endif
371
372
373 init_sigchld ();
374
375
376 save_stop_handler ();
377
378
379
380 tty_init (!mc_args__nomouse, mc_global.tty.xterm_flag);
381
382
383 check_codeset ();
384
385
386 load_key_defs ();
387
388 keymap_load (!mc_args__nokeymap);
389
390 #ifdef USE_INTERNAL_EDIT
391 macros_list = g_array_new (TRUE, FALSE, sizeof (macros_t));
392 #endif
393
394 tty_init_colors (mc_global.tty.disable_colors, mc_args__force_colors);
395
396 mc_skin_init (NULL, &mcerror);
397 dlg_set_default_colors ();
398 input_set_default_colors ();
399 if (mc_global.mc_run_mode == MC_RUN_FULL)
400 command_set_default_colors ();
401
402 mc_error_message (&mcerror, NULL);
403
404 #ifdef ENABLE_SUBSHELL
405
406
407 if (mc_global.tty.use_subshell && mc_global.run_from_parent_mc)
408 {
409 int r;
410
411 r = query_dialog (_("Warning"),
412 _("GNU Midnight Commander\nis already running on this terminal.\n"
413 "Subshell support will be disabled."),
414 D_ERROR, 2, _("&OK"), _("&Quit"));
415 if (r == 0)
416 {
417
418 ;
419 }
420 else
421 {
422
423 mc_global.midnight_shutdown = TRUE;
424 }
425
426 mc_global.tty.use_subshell = FALSE;
427 }
428
429 if (mc_global.tty.use_subshell)
430 init_subshell ();
431 #endif
432
433 if (!mc_global.midnight_shutdown)
434 {
435
436 if (mc_global.tty.console_flag != '\0')
437 handle_console (CONSOLE_SAVE);
438
439 if (mc_global.tty.alternate_plus_minus)
440 application_keypad_mode ();
441
442
443
444 init_mouse ();
445
446
447
448 enable_bracketed_paste ();
449
450
451 mc_prompt = (geteuid () == 0) ? "# " : "$ ";
452 }
453
454
455 if (mc_global.midnight_shutdown)
456 exit_code = EXIT_SUCCESS;
457 else
458 exit_code = do_nc ()? EXIT_SUCCESS : EXIT_FAILURE;
459
460 disable_bracketed_paste ();
461
462 disable_mouse ();
463
464
465 (void) tree_store_save ();
466
467 keymap_free ();
468
469
470 vfs_shut ();
471
472 flush_extension_file ();
473
474 mc_skin_deinit ();
475 tty_colors_done ();
476
477 tty_shutdown ();
478
479 done_setup ();
480
481 if (mc_global.tty.console_flag != '\0' && (quit & SUBSHELL_EXIT) == 0)
482 handle_console (CONSOLE_RESTORE);
483 if (mc_global.tty.alternate_plus_minus)
484 numeric_keypad_mode ();
485
486 (void) signal (SIGCHLD, SIG_DFL);
487
488 if (mc_global.tty.console_flag != '\0')
489 handle_console (CONSOLE_DONE);
490
491 if (mc_global.mc_run_mode == MC_RUN_FULL && mc_args__last_wd_file != NULL
492 && last_wd_string != NULL && !print_last_revert)
493 {
494 int last_wd_fd;
495
496 last_wd_fd = open (mc_args__last_wd_file, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL,
497 S_IRUSR | S_IWUSR);
498 if (last_wd_fd != -1)
499 {
500 ssize_t ret1;
501 int ret2;
502 ret1 = write (last_wd_fd, last_wd_string, strlen (last_wd_string));
503 ret2 = close (last_wd_fd);
504 (void) ret1;
505 (void) ret2;
506 }
507 }
508 g_free (last_wd_string);
509
510 mc_shell_deinit ();
511
512 done_key ();
513
514 #ifdef USE_INTERNAL_EDIT
515 if (macros_list != NULL)
516 {
517 guint i;
518
519 for (i = 0; i < macros_list->len; i++)
520 {
521 macros_t *macros;
522
523 macros = &g_array_index (macros_list, struct macros_t, i);
524 if (macros != NULL && macros->macro != NULL)
525 (void) g_array_free (macros->macro, TRUE);
526 }
527 (void) g_array_free (macros_list, TRUE);
528 }
529 #endif
530
531 str_uninit_strings ();
532
533 if (mc_global.mc_run_mode != MC_RUN_EDITOR)
534 g_free (mc_run_param0);
535 else
536 g_list_free_full ((GList *) mc_run_param0, (GDestroyNotify) mcedit_arg_free);
537
538 g_free (mc_run_param1);
539 g_free (saved_other_dir);
540
541 mc_config_deinit_config_paths ();
542
543 (void) mc_event_deinit (&mcerror);
544 if (mcerror != NULL)
545 {
546 fprintf (stderr, _("\nFailed while close:\n%s\n"), mcerror->message);
547 g_error_free (mcerror);
548 exit_code = EXIT_FAILURE;
549 }
550
551 (void) putchar ('\n');
552
553 return exit_code;
554 }
555
556