--- rxvt-unicode/src/init.C 2007/09/12 21:06:08 1.212 +++ rxvt-unicode/src/init.C 2007/12/11 11:39:06 1.225 @@ -7,6 +7,9 @@ * - original version * Copyright (c) 1994 Robert Nation * - extensive modifications + * Copyright (c) 1996 Chuck Blake + * Copyright (c) 1997 mj olesen + * Copyright (c) 1997,1998 Oezguer Kesim * Copyright (c) 1998-2001 Geoff Wing * - extensive modifications * Copyright (c) 1999 D J Hawkey Jr @@ -40,6 +43,107 @@ #include +#ifdef HAVE_XSETLOCALE +# define X_LOCALE +# include +#else +# ifdef HAVE_SETLOCALE +# include +# endif +#endif + +#ifdef HAVE_NL_LANGINFO +# include +#endif + +#ifdef DISPLAY_IS_IP +/* On Solaris link with -lsocket and -lnsl */ +#include +#include + +/* these next two are probably only on Sun (not Solaris) */ +#ifdef HAVE_SYS_SOCKIO_H +#include +#endif +#ifdef HAVE_SYS_BYTEORDER_H +#include +#endif + +#include +#include +#include +#include + +static char * +rxvt_network_display (const char *display) +{ + char buffer[1024], *rval = NULL; + struct ifconf ifc; + struct ifreq *ifr; + int i, skfd; + + if (display[0] != ':' && strncmp (display, "unix:", 5)) + return (char *) display; /* nothing to do */ + + ifc.ifc_len = sizeof (buffer); /* Get names of all ifaces */ + ifc.ifc_buf = buffer; + + if ((skfd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) + { + perror ("socket"); + return NULL; + } + + if (ioctl (skfd, SIOCGIFCONF, &ifc) < 0) + { + perror ("SIOCGIFCONF"); + close (skfd); + return NULL; + } + + for (i = 0, ifr = ifc.ifc_req; + i < (ifc.ifc_len / sizeof (struct ifreq)); + i++, ifr++) + { + struct ifreq ifr2; + + strcpy (ifr2.ifr_name, ifr->ifr_name); + + if (ioctl (skfd, SIOCGIFADDR, &ifr2) >= 0) + { + unsigned long addr; + struct sockaddr_in *p_addr; + + p_addr = (struct sockaddr_in *) &ifr2.ifr_addr; + addr = htonl ((unsigned long)p_addr->sin_addr.s_addr); + + /* + * not "0.0.0.0" or "127.0.0.1" - so format the address + */ + if (addr && addr != 0x7F000001) + { + char *colon = strchr (display, ':'); + + if (colon == NULL) + colon = ":0.0"; + + rval = rxvt_malloc (strlen (colon) + 16); + sprintf (rval, "%d.%d.%d.%d%s", + (int) ((addr >> 030) & 0xFF), + (int) ((addr >> 020) & 0xFF), + (int) ((addr >> 010) & 0xFF), + (int) (addr & 0xFF), colon); + break; + } + } + } + + close (skfd); + + return rval; +} +#endif + const char *const def_colorName[] = { COLOR_FOREGROUND, @@ -52,9 +156,9 @@ "rgb:00/00/cd", // 4: blue (Blue3) "rgb:cd/00/cd", // 5: magenta (Magenta3) "rgb:00/cd/cd", // 6: cyan (Cyan3) -# ifdef XTERM_COLORS +# ifdef XTERM_COLORS "rgb:e5/e5/e5", // 7: white (Grey90) -# else +# else "rgb:fa/eb/d7", // 7: white (AntiqueWhite) # endif /* high-intensity colors */ @@ -148,7 +252,7 @@ #ifndef NO_CURSORCOLOR COLOR_CURSOR_BACKGROUND, COLOR_CURSOR_FOREGROUND, -#endif /* ! NO_CURSORCOLOR */ +#endif /* ! NO_CURSORCOLOR */ NULL, /* Color_pointer_fg */ NULL, /* Color_pointer_bg */ NULL, /* Color_border */ @@ -157,7 +261,7 @@ NULL, /* Color_IT */ NULL, /* Color_UL */ NULL, /* Color_RV */ -#endif /* ! NO_BOLD_UNDERLINE_REVERSE */ +#endif /* ! NO_BOLD_UNDERLINE_REVERSE */ #if ENABLE_FRILLS NULL, // Color_underline #endif @@ -167,7 +271,7 @@ #ifdef KEEP_SCROLLCOLOR COLOR_SCROLLBAR, COLOR_SCROLLTROUGH, -#endif /* KEEP_SCROLLCOLOR */ +#endif /* KEEP_SCROLLCOLOR */ #if ENABLE_TRANSPARENCY NULL, #endif @@ -230,7 +334,7 @@ /* TODO: BOO HISS */ dup2 (STDERR_FILENO, STDIN_FILENO); } - else if (i > STDIN_FILENO) + else if (i != STDIN_FILENO) { dup2 (i, STDIN_FILENO); close (i); @@ -264,15 +368,10 @@ if (!strcmp (argv[r_argc], "-e")) break; - r_argv = (const char **)rxvt_malloc (sizeof (char *) * (r_argc + 1)); - - for (i = 0; i < r_argc; i++) - r_argv[i] = (const char *)argv[i]; - - r_argv[i] = NULL; - if (r_argc == argc) cmd_argv = NULL; + else if (!argv[r_argc + 1]) + rxvt_fatal ("option '-e' requires an argument, aborting.\n"); else { cmd_argv = (const char **)rxvt_malloc (sizeof (char *) * (argc - r_argc)); @@ -283,6 +382,13 @@ cmd_argv[i] = NULL; } + r_argv = (const char **)rxvt_malloc (sizeof (char *) * (r_argc + 1)); + + for (i = 0; i < r_argc; i++) + r_argv[i] = (const char *)argv[i]; + + r_argv[i] = NULL; + rs[Rs_name] = rxvt_basename (argv[0]); /* @@ -295,7 +401,10 @@ get_options (r_argc, r_argv); if (!(display = displays.get (rs[Rs_display_name]))) - rxvt_fatal ("can't open display %s, aborting.\n", rs[Rs_display_name]); + { + free (r_argv); + rxvt_fatal ("can't open display %s, aborting.\n", rs[Rs_display_name]); + } // using a local pointer decreases code size a lot xa = display->xa; @@ -431,7 +540,7 @@ #ifndef NO_CURSORCOLOR color_aliases (Color_cursor); color_aliases (Color_cursor2); -#endif /* NO_CURSORCOLOR */ +#endif /* NO_CURSORCOLOR */ color_aliases (Color_pointer_fg); color_aliases (Color_pointer_bg); color_aliases (Color_border); @@ -439,7 +548,7 @@ color_aliases (Color_BD); color_aliases (Color_UL); color_aliases (Color_RV); -#endif /* ! NO_BOLD_UNDERLINE_REVERSE */ +#endif /* ! NO_BOLD_UNDERLINE_REVERSE */ if (!rs[Rs_color + Color_border]) rs[Rs_color + Color_border] = rs[Rs_color + Color_bg]; @@ -469,7 +578,7 @@ rs[Rs_display_name] = (const char *)val; if (val == NULL) -#endif /* DISPLAY_IS_IP */ +#endif /* DISPLAY_IS_IP */ val = XDisplayString (dpy); if (rs[Rs_display_name] == NULL) @@ -519,7 +628,7 @@ unsetenv ("LINES"); unsetenv ("COLUMNS"); unsetenv ("TERMCAP"); /* terminfo should be okay */ -#endif /* HAVE_UNSETENV */ +#endif /* HAVE_UNSETENV */ } /*----------------------------------------------------------------------*/ @@ -550,7 +659,7 @@ } - this->locale = rxvt_strdup (this->locale); + this->locale = strdup (this->locale); SET_LOCALE (this->locale); mbstate.reset (); #endif @@ -640,7 +749,7 @@ #ifdef OFF_FOCUS_FADING pix_colors = pix_colors_focused; #endif - + for (i = 0; i < (depth <= 2 ? 2 : NRS_COLORS); i++) { const char *name = rs[Rs_color + i]; @@ -728,7 +837,7 @@ )) alias_color (Color_topShadow, Color_White); } -#endif /* KEEP_SCROLLCOLOR */ +#endif /* KEEP_SCROLLCOLOR */ #ifdef OFF_FOCUS_FADING for (i = 0; i < (depth <= 2 ? 2 : NRS_COLORS); i++) @@ -746,13 +855,10 @@ int i = atoi (rs[Rs_color + idx]); if (i >= 8 && i <= 15) - { /* bright colors */ - i -= 8; - rs[Rs_color + idx] = rs[Rs_color + minBrightCOLOR + i]; - return; - } - - if (i >= 0 && i <= 7) /* normal colors */ + /* bright colors */ + rs[Rs_color + idx] = rs[Rs_color + minBrightCOLOR + i - 8]; + else if (i >= 0 && i <= 7) + /* normal colors */ rs[Rs_color + idx] = rs[Rs_color + minCOLOR + i]; } } @@ -1122,7 +1228,6 @@ * Debugging */ #ifdef DEBUG_TTYMODE -#ifdef HAVE_TERMIOS_H /* c_iflag bits */ fprintf (stderr, "Input flags\n"); @@ -1195,8 +1300,7 @@ fprintf (stderr, "\n"); # undef FOO -# endif /* HAVE_TERMIOS_H */ -#endif /* DEBUG_TTYMODE */ +#endif /* DEBUG_TTYMODE */ } /*----------------------------------------------------------------------*/ @@ -1309,7 +1413,8 @@ char *login; if (option (Opt_console)) - { /* be virtual console, fail silently */ + { + /* be virtual console, fail silently */ #ifdef TIOCCONS unsigned int on = 1; @@ -1321,7 +1426,7 @@ if (fd >= 0) if (ioctl (fd, SRIOCSREDIR, NULL) < 0) close (fd); -#endif /* SRIOCSREDIR */ +#endif /* SRIOCSREDIR */ } /* reset signals and spin off the command interpreter */ @@ -1338,7 +1443,7 @@ signal (SIGTSTP, SIG_IGN); signal (SIGTTIN, SIG_IGN); signal (SIGTTOU, SIG_IGN); -#endif /* SIGTSTP */ +#endif /* SIGTSTP */ // unblock signals (signals are blocked by iom.C sigset_t ss; @@ -1346,7 +1451,7 @@ sigprocmask (SIG_SETMASK, &ss, 0); /* command interpreter path */ - if (argv != NULL) + if (argv) { # ifdef DEBUG_CMD int i; @@ -1376,7 +1481,7 @@ argv0 = login; } - execlp (shell, argv0, NULL); + execlp (shell, argv0, (char *)0); /* no error message: STDERR is closed! */ }