diff options
author | Sébastien Helleu <flashcode@flashtux.org> | 2018-03-11 09:59:39 +0100 |
---|---|---|
committer | Sébastien Helleu <flashcode@flashtux.org> | 2018-03-11 09:59:39 +0100 |
commit | 805717e9ec3f66c960928bca607eceb871438fae (patch) | |
tree | c1832f0815bd8ade4530ed3948f55f0672103184 /src/gui/curses/headless/main.c | |
parent | 0126b03f47db7f7842aff497cdbb0e41a0a5be0a (diff) | |
download | weechat-805717e9ec3f66c960928bca607eceb871438fae.zip |
core: add binary weechat-headless to run WeeChat without interface (closes #1120)
The optional command line option "--daemon" runs WeeChat like a daemon
(fork, new process group, file descriptors closed).
Diffstat (limited to 'src/gui/curses/headless/main.c')
-rw-r--r-- | src/gui/curses/headless/main.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/gui/curses/headless/main.c b/src/gui/curses/headless/main.c new file mode 100644 index 000000000..481177020 --- /dev/null +++ b/src/gui/curses/headless/main.c @@ -0,0 +1,125 @@ +/* + * main.c - entry point for headless mode (no GUI) + * + * Copyright (C) 2003-2018 Sébastien Helleu <flashcode@flashtux.org> + * + * This file is part of WeeChat, the extensible chat client. + * + * WeeChat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * WeeChat is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * 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 WeeChat. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdio.h> +#include <string.h> + +#include "../../../core/weechat.h" +#include "../../gui-main.h" +#include "../gui-curses.h" + + +/* + * Daemonizes the process. + */ + +void +daemonize () +{ + pid_t pid; + int fd, i; + + printf (_("Running WeeChat in background...")); + printf (" "); + + pid = fork(); + + if (pid < 0) + { + printf (_("fork error")); + printf ("\n"); + exit (EXIT_FAILURE); + } + + if (pid > 0) + { + /* parent process */ + printf (_("OK")); + printf ("\n"); + exit (EXIT_SUCCESS); + } + + /* child process */ + + /* obtain a new process group */ + setsid (); + + /* close all file descriptors */ + for (i = getdtablesize(); i >= 0; --i) + { + close (i); + } + fd = open ("/dev/null", O_RDWR); + dup (fd); + dup (fd); +} + +/* + * Entry point for WeeChat in headless mode (no GUI). + */ + +int +main (int argc, char *argv[]) +{ + int i, daemon; + + weechat_init_gettext (); + + /* + * Enable a special "headless" mode, where some things are slightly + * different, for example: + * - no read of stdin (keyboard/mouse) + * - don't catch any terminal related signal + */ + weechat_headless = 1; + + /* + * If "--daemon" is received in command line arguments, + * daemonize the process. + */ + daemon = 0; + for (i = 1; i < argc; i++) + { + if (strcmp (argv[i], "--daemon") == 0) + { + daemon = 1; + break; + } + } + if (daemon) + daemonize (); + + /* init, main loop and end */ + weechat_init (argc, argv, &gui_main_init); + gui_main_loop (); + weechat_end (&gui_main_end); + + return EXIT_SUCCESS; +} |