# include <termios.h>
#endif
-#if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && !defined(__CYGWIN32__)
-static uid_t saved_euid;
-static gid_t saved_egid;
-#endif
-
-bool
-rxvt_tainted ()
-{
-#if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && !defined(__CYGWIN32__)
- return getuid () != saved_euid || getgid () != saved_egid;
-#else
- return false;
-#endif
-}
-
vector<rxvt_term *> rxvt_term::termlist;
static char curlocale[128], savelocale[128];
return true;
}
-bool
+void
rxvt_push_locale (const char *locale)
{
strcpy (savelocale, curlocale);
#ifdef HAVE_SCROLLBARS
scrollbar_ev (this, &rxvt_term::x_cb),
#endif
-#ifdef MENUBAR
- menubar_ev (this, &rxvt_term::x_cb),
-#endif
#ifdef CURSOR_BLINK
cursor_blink_ev (this, &rxvt_term::cursor_blink_cb),
#endif
if (cmd_pid)
kill (-cmd_pid, SIGHUP);
-#ifdef UTMP_SUPPORT
- privileged_utmp (RESTORE);
-#endif
-
- pty.put ();
+ delete pty; pty = 0;
}
rxvt_term::~rxvt_term ()
#ifdef USE_XIM
im_destroy ();
#endif
-#ifdef MENUBAR
- if (menubarGC) XFreeGC (disp, menubarGC);
-#endif
#ifdef XTERM_SCROLLBAR
if (xscrollbarGC) XFreeGC (disp, xscrollbarGC);
if (ShadowGC) XFreeGC (disp, ShadowGC);
if (upArrowHi) XFreePixmap (disp, upArrowHi);
if (downArrowHi) XFreePixmap (disp, downArrowHi);
#endif
-#if defined(MENUBAR) || defined(RXVT_SCROLLBAR)
+#ifdef RXVT_SCROLLBAR
if (topShadowGC) XFreeGC (disp, topShadowGC);
if (botShadowGC) XFreeGC (disp, botShadowGC);
if (scrollbarGC) XFreeGC (disp, scrollbarGC);
#endif
if (gc) XFreeGC (disp, gc);
-#if defined(MENUBAR) && (MENUBAR_MAX > 1)
- delete menuBar.drawable;
- //if (menuBar.win)
- // XDestroyWindow (disp, menuBar.win);
-#endif
delete drawable;
// destroy all windows
if (parent[0])
}
// TODO: free pixcolours, colours should become part of rxvt_display
-
delete pix_colors_focused;
#if OFF_FOCUS_FADING
delete pix_colors_unfocused;
#endif
-#if USE_XGETDEFAULT
- XrmDestroyDatabase (xrmdatabase);
-#endif
displays.put (display);
#if HAVE_SCROLLBARS
scrollbar_ev.stop (display);
#endif
-#if MENUBAR
- menubar_ev.stop (display);
-#endif
#if TRANSPARENT
rootwin_ev.stop (display);
#endif
void
rxvt_term::destroy_cb (time_watcher &w)
{
- SET_R (this);
+ make_current ();
delete this;
}
rxvt_term::init (int argc, const char *const *argv)
{
SET_R (this);
-
set_locale ("");
+ set_environ (envv); // few things in X do not call setlocale :(
if (!init_vars ())
return false;
keyboard->register_done ();
#endif
-#if MENUBAR_MAX
- menubar_read (rs[Rs_menu]);
-#endif
#ifdef HAVE_SCROLLBARS
if (OPTION (Opt_scrollBar))
scrollBar.setIdle (); /* set existence for size calculations */
|| (rs[Rs_perl_ext_2] && *rs[Rs_perl_ext_2])
|| (rs[Rs_perl_eval] && *rs[Rs_perl_eval]))
{
-#if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && !defined(__CYGWIN32__)
- // ignore some perl-related arguments if some bozo installed us set[ug]id
- if (rxvt_tainted ())
- {
- if ((rs[Rs_perl_lib] && *rs[Rs_perl_lib])
- || (rs[Rs_perl_eval] && *rs[Rs_perl_eval]))
- {
- rxvt_warn ("running with elevated privileges: ignoring perl-lib and perl-eval.\n");
- rs[Rs_perl_lib] = 0;
- rs[Rs_perl_eval] = 0;
- }
- }
-#endif
- rxvt_perl.init ();
+ rxvt_perl.init (this);
HOOK_INVOKE ((this, HOOK_INIT, DT_END));
}
#endif
+ pty = rxvt_new_ptytty ();
+
create_windows (argc, argv);
dDisp;
init_xlocale ();
- scr_reset (); /* initialize screen */
+ scr_reset (); // initialize screen
#if 0
XSynchronize (disp, True);
if (OPTION (Opt_scrollBar))
resize_scrollbar (); /* create and map scrollbar */
#endif
-#if (MENUBAR_MAX)
- if (menubar_visible ())
- XMapWindow (disp, menuBar.win);
-#endif
#ifdef TRANSPARENT
if (OPTION (Opt_transparent))
{
free (cmd_argv);
- if (pty.pty >= 0)
- pty_ev.start (pty.pty, EVENT_READ);
+ if (pty->pty >= 0)
+ pty_ev.start (pty->pty, EVENT_READ);
check_ev.start ();
}
} sig_handlers;
+char **rxvt_environ; // startup environment
+
void
rxvt_init ()
{
- /*
- * Save and then give up any super-user privileges
- * If we need privileges in any area then we must specifically request it.
- * We should only need to be root in these cases:
- * 1. write utmp entries on some systems
- * 2. chown tty on some systems
- */
- rxvt_privileges (SAVE);
- rxvt_privileges (IGNORE);
+ uid_t uid = getuid ();
+ gid_t gid = getgid ();
+
+ // before doing anything else, check for setuid/setgid operation,
+ // start the helper process and drop privileges
+ if (uid != geteuid ()
+ || gid != getegid ())
+ {
+#if PTYTTY_HELPER
+ rxvt_ptytty_server ();
+#else
+ rxvt_warn ("running setuid/setgid without pty helper compiled in, continuing unprivileged.\n");
+#endif
+
+ // drop privileges
+#if HAVE_SETRESUID
+ setresgid (gid, gid, gid);
+ setresuid (uid, uid, uid);
+#elif HAVE_SETREUID
+ setregid (gid, gid);
+ setreuid (uid, uid);
+#elif HAVE_SETUID
+ setgid (gid);
+ setuid (uid);
+#endif
+
+ if (uid != geteuid ()
+ || gid != getegid ())
+ rxvt_fatal ("unable to drop privileges, aborting.\n");
+ }
+
+ rxvt_environ = environ;
signal (SIGHUP, SIG_IGN);
signal (SIGPIPE, SIG_IGN);
// TODO: handle this with exceptions and tolerate the memory loss
XSetIOErrorHandler (rxvt_xioerror_handler);
-#ifdef USE_XGETDEFAULT
XrmInitialize ();
-#endif
}
/* ------------------------------------------------------------------------- *
return p;
}
-/* ------------------------------------------------------------------------- *
- * PRIVILEGED OPERATIONS *
- * ------------------------------------------------------------------------- */
-/* take care of suid/sgid super-user (root) privileges */
-void
-rxvt_privileges (rxvt_privaction action)
-{
-#if ! defined(__CYGWIN32__)
-# if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID)
- /* setreuid () is the poor man's setuid (), seteuid () */
-# define seteuid(a) setreuid(-1, (a))
-# define setegid(a) setregid(-1, (a))
-# define HAVE_SETEUID
-# endif
-# ifdef HAVE_SETEUID
- switch (action)
- {
- case IGNORE:
- /*
- * change effective uid/gid - not real uid/gid - so we can switch
- * back to root later, as required
- */
- seteuid (getuid ());
- setegid (getgid ());
- break;
- case SAVE:
- saved_euid = geteuid ();
- saved_egid = getegid ();
- break;
- case RESTORE:
- seteuid (saved_euid);
- setegid (saved_egid);
- break;
- }
-# else
- switch (action)
- {
- case IGNORE:
- setuid (getuid ());
- setgid (getgid ());
- /* FALLTHROUGH */
- case SAVE:
- /* FALLTHROUGH */
- case RESTORE:
- break;
- }
-# endif
-#endif
-}
-
-#ifdef UTMP_SUPPORT
-void
-rxvt_term::privileged_utmp (rxvt_privaction action)
-{
- if (OPTION (Opt_utmpInhibit)
- || !pty.name || !*pty.name)
- return;
-
- rxvt_privileges (RESTORE);
-
- if (action == SAVE)
- makeutent (pty.name, rs[Rs_display_name]);
- else
- cleanutent ();
-
- rxvt_privileges (IGNORE);
-}
-#endif
-
/*----------------------------------------------------------------------*/
/*
* window size/position calculcations for XSizeHint and other storage.
rxvt_term::window_calc (unsigned int newwidth, unsigned int newheight)
{
short recalc_x, recalc_y;
- int x, y, sb_w, mb_h, flags;
+ int x, y, sb_w, flags;
unsigned int w, h;
unsigned int max_width, max_height;
dDisp;
szHint.base_width = szHint.base_height = 2 * int_bwidth;
- sb_w = mb_h = 0;
+ sb_w = 0;
window_vt_x = window_vt_y = int_bwidth;
- if (scrollbar_visible ())
+ if (scrollBar.state)
{
sb_w = scrollbar_TotalWidth ();
szHint.base_width += sb_w;
window_vt_x += sb_w;
}
- if (menubar_visible ())
- {
- mb_h = menuBar_TotalHeight ();
- szHint.base_height += mb_h;
- window_vt_y += mb_h;
- }
-
szHint.width_inc = fwidth;
szHint.height_inc = fheight;
szHint.min_width = szHint.base_width + szHint.width_inc;
szHint.height = szHint.base_height + height;
}
- if (scrollbar_visible () && OPTION (Opt_scrollBar_right))
+ if (scrollBar.state && OPTION (Opt_scrollBar_right))
window_sb_x = szHint.width - sb_w;
if (recalc_x)
void
rxvt_term::tt_winch ()
{
- if (pty.pty < 0)
+ if (pty->pty < 0)
return;
struct winsize ws;
ws.ws_row = nrow;
ws.ws_xpixel = width;
ws.ws_ypixel = height;
- (void)ioctl (pty.pty, TIOCSWINSZ, &ws);
+ (void)ioctl (pty->pty, TIOCSWINSZ, &ws);
#if 0
// TIOCSWINSZâ is supposed to do this automatically and correctly
if (fix_screen || newwidth != old_width || newheight != old_height)
{
- if (scrollbar_visible ())
+ if (scrollBar.state)
{
XMoveResizeWindow (disp, scrollBar.win,
window_sb_x, 0,
resize_scrollbar ();
}
- if (menubar_visible ())
- XMoveResizeWindow (disp, menuBar.win,
- window_vt_x, 0,
- width, menuBar_TotalHeight ());
-
XMoveResizeWindow (disp, vt,
window_vt_x, window_vt_y,
width, height);
char **s;
XIMStyles *xim_styles;
+ set_environ (envv);
+
if (! ((p = XSetLocaleModifiers (modifiers)) && *p))
return false;
char **s;
char buf[IMBUFSIZ];
- SET_R (this);
+ make_current ();
im_destroy ();