--- rxvt-unicode/src/rxvtd.C 2008/06/15 13:54:15 1.46 +++ rxvt-unicode/src/rxvtd.C 2014/05/22 18:54:33 1.61 @@ -3,11 +3,11 @@ *----------------------------------------------------------------------* * * All portions of code are copyright by their respective author/s. - * Copyright (c) 2003-2007 Marc Lehmann + * Copyright (c) 2003-2007 Marc Lehmann * * This program 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 2 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -21,10 +21,10 @@ *----------------------------------------------------------------------*/ #include "../config.h" -#include -#include -#include -#include +#include +#include +#include +#include #include #include @@ -33,7 +33,15 @@ #include #include -#include +#if defined(ENABLE_FRILLS) && defined(_POSIX_MEMLOCK) && _POSIX_MEMLOCK > 0 +# define ENABLE_MLOCK 1 +#endif + +#if ENABLE_MLOCK +# include +#endif + +#include #include "rxvt.h" #include "rxvtdaemon.h" @@ -94,7 +102,7 @@ sa.sun_family = AF_UNIX; strcpy (sa.sun_path, sockname); - unlink (rxvt_connection::unix_sockname ()); + unlink (sockname); mode_t omask = umask (0077); @@ -180,8 +188,6 @@ return err ("protocol error: unexpected NEW token.\n"); } - envv->push_back (0); - { rxvt_term *term = new rxvt_term; @@ -216,12 +222,18 @@ return err (); } -int opt_fork, opt_opendisplay, opt_quiet; - int -main (int argc, const char *const *argv) +main (int argc, char *argv[]) { - rxvt_init (); + ptytty::init (); + + static char opt_fork, opt_opendisplay, opt_quiet; +#if ENABLE_PERL + static char *opt_eval; +#endif +#if ENABLE_MLOCK + static char opt_lock; +#endif for (int i = 1; i < argc; i++) { @@ -231,6 +243,14 @@ opt_opendisplay = 1; else if (!strcmp (argv [i], "-q") || !strcmp (argv [i], "--quiet")) opt_quiet = 1; +#if ENABLE_MLOCK + else if (!strcmp (argv [i], "-m") || !strcmp (argv [i], "--mlock")) + opt_lock = 1; +#endif +#if ENABLE_PERL + else if (!strcmp (argv [i], "-e") || !strcmp (argv [i], "--eval")) + opt_eval = argv [++i]; +#endif else { rxvt_log ("%s: unknown option '%s', aborting.\n", argv [0], argv [i]); @@ -238,6 +258,16 @@ } } + rxvt_init (); + +#if ENABLE_PERL + if (opt_eval) + { + rxvt_perl.init (); + rxvt_perl.eval (opt_eval); + } +#endif + // optionally open display and never release it. if (opt_opendisplay) if (const char *dpy = getenv ("DISPLAY")) @@ -256,10 +286,21 @@ free (sockname); + pid_t pid = 0; if (opt_fork) { - pid_t pid = fork (); + pid = fork (); + } +#if ENABLE_MLOCK + // Optionally perform an mlockall so this process does not get swapped out. + if (opt_lock && !pid) + if (mlockall (MCL_CURRENT | MCL_FUTURE) < 0) + perror ("unable to lock into ram"); +#endif + + if (opt_fork) + { if (pid < 0) { rxvt_log ("unable to fork daemon, aborting.\n"); @@ -268,10 +309,10 @@ else if (pid > 0) _exit (EXIT_SUCCESS); - ev_default_fork (); + ev_loop_fork (EV_DEFAULT_UC); } - ev_loop (0); + ev_run (); return EXIT_SUCCESS; }