--- rxvt-unicode/src/rxvtd.C 2007/12/13 18:24:36 1.42 +++ rxvt-unicode/src/rxvtd.C 2011/12/17 23:17:33 1.58 @@ -3,7 +3,7 @@ *----------------------------------------------------------------------* * * All portions of code are copyright by their respective author/s. - * Copyright (c) 2003-2006 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 @@ -33,6 +33,14 @@ #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" @@ -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); @@ -174,24 +182,12 @@ break; else if (!strcmp (tok, "ENV") && recv (tok)) envv->push_back (strdup (tok)); - else if (!strcmp (tok, "CWD") && recv (tok)) - { - if (chdir (tok)) - { - delete envv; - delete argv; - return err ("unable to change to working directory to '%s', aborting: %s.\n", - (char *)tok, strerror (errno)); - } - } else if (!strcmp (tok, "ARG") && recv (tok)) argv->push_back (strdup (tok)); else return err ("protocol error: unexpected NEW token.\n"); } - envv->push_back (0); - { rxvt_term *term = new rxvt_term; @@ -211,7 +207,7 @@ term->log_hook = 0; - chdir ("/"); + chdir ("/"); // init might change to different working directory if (!success) term->destroy (); @@ -226,12 +222,15 @@ 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_MLOCK + static char opt_lock; +#endif for (int i = 1; i < argc; i++) { @@ -241,6 +240,10 @@ 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 else { rxvt_log ("%s: unknown option '%s', aborting.\n", argv [0], argv [i]); @@ -248,14 +251,18 @@ } } - chdir ("/"); + rxvt_init (); + // optionally open display and never release it. if (opt_opendisplay) - displays.get (getenv ("DISPLAY")); // open display and never release it + if (const char *dpy = getenv ("DISPLAY")) + displays.get (dpy ? dpy : ":0"); // move string logic into rxvt_display maybe? char *sockname = rxvt_connection::unix_sockname (); unix_listener l (sockname); + chdir ("/"); + if (!opt_quiet) { printf ("rxvt-unicode daemon listening on %s.\n", sockname); @@ -264,10 +271,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"); @@ -276,10 +294,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; }