(linenum→info "unix/slp.c:2238")

emacs/22.1/src/emacs.c

    1: /* Fully extensible Emacs, running on Unix, intended for GNU.
    2:    Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1998, 1999,
    3:                  2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
    4: 
    5: This file is part of GNU Emacs.
    6: 
    7: GNU Emacs is free software; you can redistribute it and/or modify
    8: it under the terms of the GNU General Public License as published by
    9: the Free Software Foundation; either version 2, or (at your option)
   10: any later version.
   11: 
   12: GNU Emacs is distributed in the hope that it will be useful,
   13: but WITHOUT ANY WARRANTY; without even the implied warranty of
   14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   15: GNU General Public License for more details.
   16: 
   17: You should have received a copy of the GNU General Public License
   18: along with GNU Emacs; see the file COPYING.  If not, write to
   19: the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   20: Boston, MA 02110-1301, USA.  */
   21: 
   22: 
   23: #include <config.h>
   24: #include <signal.h>
   25: #include <errno.h>
   26: #include <stdio.h>
   27: 
   28: #include <sys/types.h>
   29: #include <sys/file.h>
   30: 
   31: #ifdef VMS
   32: #include <ssdef.h>
   33: #endif
   34: 
   35: #ifdef HAVE_UNISTD_H
   36: #include <unistd.h>
   37: #endif
   38: 
   39: #ifdef BSD_SYSTEM
   40: #include <sys/ioctl.h>
   41: #endif
   42: 
   43: #ifdef WINDOWSNT
   44: #include <fcntl.h>
   45: #include <windows.h> /* just for w32.h */
   46: #include "w32.h"
   47: #include "w32heap.h" /* for prototype of sbrk */
   48: #endif
   49: 
   50: #include "lisp.h"
   51: #include "commands.h"
   52: #include "intervals.h"
   53: #include "buffer.h"
   54: #include "window.h"
   55: 
   56: #include "systty.h"
   57: #include "blockinput.h"
   58: #include "syssignal.h"
   59: #include "process.h"
   60: #include "termhooks.h"
   61: #include "keyboard.h"
   62: #include "keymap.h"
   63: 
   64: #ifdef HAVE_SETLOCALE
   65: #include <locale.h>
   66: #endif
   67: 
   68: #ifdef HAVE_SETRLIMIT
   69: #include <sys/time.h>
   70: #include <sys/resource.h>
   71: #endif
   72: 
   73: #ifdef HAVE_PERSONALITY_LINUX32
   74: #include <sys/personality.h>
   75: #endif
   76: 
   77: #ifndef O_RDWR
   78: #define O_RDWR 2
   79: #endif
   80: 
   81: #ifdef HAVE_SETPGID
   82: #if !defined (USG) || defined (BSD_PGRPS)
   83: #undef setpgrp
   84: #define setpgrp setpgid
   85: #endif
   86: #endif
   87: 
   88: extern void malloc_warning P_ ((char *));
   89: extern void set_time_zone_rule P_ ((char *));
   90: #ifdef HAVE_INDEX
   91: extern char *index P_ ((const char *, int));
   92: #endif
   93: 
   94: /* Make these values available in GDB, which doesn't see macros.  */
   95: 
   96: #ifdef USE_LSB_TAG
   97: int gdb_use_lsb = 1;
   98: #else
   99: int gdb_use_lsb = 0;
  100: #endif
  101: #ifdef NO_UNION_TYPE
  102: int gdb_use_union = 0;
  103: #else
  104: int gdb_use_union = 1;
  105: #endif
  106: EMACS_INT gdb_valbits = VALBITS;
  107: EMACS_INT gdb_gctypebits = GCTYPEBITS;
  108: #ifdef DATA_SEG_BITS
  109: EMACS_INT gdb_data_seg_bits = DATA_SEG_BITS;
  110: #else
  111: EMACS_INT gdb_data_seg_bits = 0;
  112: #endif
  113: EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG;
  114: EMACS_INT gdb_array_mark_flag = ARRAY_MARK_FLAG;
  115: /* GDB might say "No enum type named pvec_type" if we don't have at
  116:    least one symbol with that type, and then xbacktrace could fail.  */
  117: enum pvec_type gdb_pvec_type = PVEC_TYPE_MASK;
  118: 
  119: /* Command line args from shell, as list of strings.  */
  120: Lisp_Object Vcommand_line_args;
  121: 
  122: /* The name under which Emacs was invoked, with any leading directory
  123:    names discarded.  */
  124: Lisp_Object Vinvocation_name;
  125: 
  126: /* The directory name from which Emacs was invoked.  */
  127: Lisp_Object Vinvocation_directory;
  128: 
  129: /* The directory name in which to find subdirs such as lisp and etc.
  130:    nil means get them only from PATH_LOADSEARCH.  */
  131: Lisp_Object Vinstallation_directory;
  132: 
  133: /* Hook run by `kill-emacs' before it does really anything.  */
  134: Lisp_Object Vkill_emacs_hook;
  135: 
  136: /* An empty lisp string.  To avoid having to build any other.  */
  137: Lisp_Object empty_string;
  138: 
  139: /* Search path separator.  */
  140: Lisp_Object Vpath_separator;
  141: 
  142: /* Set nonzero after Emacs has started up the first time.
  143:   Prevents reinitialization of the Lisp world and keymaps
  144:   on subsequent starts.  */
  145: int initialized;
  146: 
  147: #ifdef DOUG_LEA_MALLOC
  148: /* Preserves a pointer to the memory allocated that copies that
  149:    static data inside glibc's malloc.  */
  150: void *malloc_state_ptr;
  151: /* From glibc, a routine that returns a copy of the malloc internal state.  */
  152: extern void *malloc_get_state ();
  153: /* From glibc, a routine that overwrites the malloc internal state.  */
  154: extern int malloc_set_state ();
  155: /* Non-zero if the MALLOC_CHECK_ enviroment variable was set while
  156:    dumping.  Used to work around a bug in glibc's malloc.  */
  157: int malloc_using_checking;
  158: #endif
  159: 
  160: /* Variable whose value is symbol giving operating system type.  */
  161: Lisp_Object Vsystem_type;
  162: 
  163: /* Variable whose value is string giving configuration built for.  */
  164: Lisp_Object Vsystem_configuration;
  165: 
  166: /* Variable whose value is string giving configuration options,
  167:    for use when reporting bugs.  */
  168: Lisp_Object Vsystem_configuration_options;
  169: 
  170: Lisp_Object Qfile_name_handler_alist;
  171: 
  172: /* Current and previous system locales for messages and time.  */
  173: Lisp_Object Vsystem_messages_locale;
  174: Lisp_Object Vprevious_system_messages_locale;
  175: Lisp_Object Vsystem_time_locale;
  176: Lisp_Object Vprevious_system_time_locale;
  177: 
  178: /* If non-zero, emacs should not attempt to use a window-specific code,
  179:    but instead should use the virtual terminal under which it was started.  */
  180: int inhibit_window_system;
  181: 
  182: /* If nonzero, set Emacs to run at this priority.  This is also used
  183:    in child_setup and sys_suspend to make sure subshells run at normal
  184:    priority; those functions have their own extern declaration.  */
  185: EMACS_INT emacs_priority;
  186: 
  187: /* If non-zero, a filter or a sentinel is running.  Tested to save the match
  188:    data on the first attempt to change it inside asynchronous code.  */
  189: int running_asynch_code;
  190: 
  191: #ifdef BSD_PGRPS
  192: /* See sysdep.c.  */
  193: extern int inherited_pgroup;
  194: #endif
  195: 
  196: #ifdef HAVE_X_WINDOWS
  197: /* If non-zero, -d was specified, meaning we're using some window system.  */
  198: int display_arg;
  199: #endif
  200: 
  201: /* An address near the bottom of the stack.
  202:    Tells GC how to save a copy of the stack.  */
  203: char *stack_bottom;
  204: 
  205: /* The address where the heap starts (from the first sbrk (0) call).  */
  206: static void *my_heap_start;
  207: 
  208: /* The gap between BSS end and heap start as far as we can tell.  */
  209: static unsigned long heap_bss_diff;
  210: 
  211: /* If the gap between BSS end and heap start is larger than this we try to
  212:    work around it, and if that fails, output a warning in dump-emacs.  */
  213: #define MAX_HEAP_BSS_DIFF (1024*1024)
  214: 
  215: 
  216: #ifdef HAVE_WINDOW_SYSTEM
  217: extern Lisp_Object Vwindow_system;
  218: #endif /* HAVE_WINDOW_SYSTEM */
  219: 
  220: extern Lisp_Object Vauto_save_list_file_name;
  221: 
  222: extern Lisp_Object Vinhibit_redisplay;
  223: 
  224: #ifdef USG_SHARED_LIBRARIES
  225: /* If nonzero, this is the place to put the end of the writable segment
  226:    at startup.  */
  227: 
  228: unsigned int bss_end = 0;
  229: #endif
  230: 
  231: /* Nonzero means running Emacs without interactive terminal.  */
  232: 
  233: int noninteractive;
  234: 
  235: /* Value of Lisp variable `noninteractive'.
  236:    Normally same as C variable `noninteractive'
  237:    but nothing terrible happens if user sets this one.  */
  238: 
  239: int noninteractive1;
  240: 
  241: /* Save argv and argc.  */
  242: char **initial_argv;
  243: int initial_argc;
  244: 
  245: static void sort_args ();
  246: void syms_of_emacs ();
  247: 
  248: /* MSVC needs each string be shorter than 2048 bytes, so the usage
  249:    strings below are split to not overflow this limit.  */
  250: #define USAGE1 "\
  251: Usage: %s [OPTION-OR-FILENAME]...\n\
  252: \n\
  253: Run Emacs, the extensible, customizable, self-documenting real-time\n\
  254: display editor.  The recommended way to start Emacs for normal editing\n\
  255: is with no options at all.\n\
  256: \n\
  257: Run M-x info RET m emacs RET m emacs invocation RET inside Emacs to\n\
  258: read the main documentation for these command-line arguments.\n\
  259: \n\
  260: Initialization options:\n\
  261: \n\
  262: --batch                     do not do interactive display; implies -q\n\
  263: --debug-init                enable Emacs Lisp debugger for init file\n\
  264: --display, -d DISPLAY       use X server DISPLAY\n\
  265: --multibyte, --no-unibyte   inhibit the effect of EMACS_UNIBYTE\n\
  266: --no-desktop                do not load a saved desktop\n\
  267: --no-init-file, -q          load neither ~/.emacs nor default.el\n\
  268: --no-shared-memory, -nl     do not use shared memory\n\
  269: --no-site-file              do not load site-start.el\n\
  270: --no-splash                 do not display a splash screen on startup\n\
  271: --no-window-system, -nw     do not communicate with X, ignoring $DISPLAY\n\
  272: --quick, -Q                 equivalent to -q --no-site-file --no-splash\n\
  273: --script FILE               run FILE as an Emacs Lisp script\n\
  274: --terminal, -t DEVICE       use DEVICE for terminal I/O\n\
  275: --unibyte, --no-multibyte   run Emacs in unibyte mode\n\
  276: --user, -u USER             load ~USER/.emacs instead of your own\n\
  277: \n%s"
  278: 
  279: #define USAGE2 "\
  280: Action options:\n\
  281: \n\
  282: FILE                    visit FILE using find-file\n\
  283: +LINE FILE              visit FILE using find-file, then go to line LINE\n\
  284: +LINE:COLUMN FILE       visit FILE using find-file, then go to line LINE,\n\
  285:                           column COLUMN\n\
  286: --directory, -L DIR     add DIR to variable load-path\n\
  287: --eval EXPR             evaluate Emacs Lisp expression EXPR\n\
  288: --execute EXPR          evaluate Emacs Lisp expression EXPR\n\
  289: --file FILE             visit FILE using find-file\n\
  290: --find-file FILE        visit FILE using find-file\n\
  291: --funcall, -f FUNC      call Emacs Lisp function FUNC with no arguments\n\
  292: --insert FILE           insert contents of FILE into current buffer\n\
  293: --kill                  exit without asking for confirmation\n\
  294: --load, -l FILE         load Emacs Lisp FILE using the load function\n\
  295: --visit FILE            visit FILE using find-file\n\
  296: \n"
  297: 
  298: #define USAGE3 "\
  299: Display options:\n\
  300: \n\
  301: --background-color, -bg COLOR   window background color\n\
  302: --basic-display, -D             disable many display features;\n\
  303:                                   used for debugging Emacs\n\
  304: --border-color, -bd COLOR       main border color\n\
  305: --border-width, -bw WIDTH       width of main border\n\
  306: --color, --color=MODE           override color mode for character terminals;\n\
  307:                                   MODE defaults to `auto', and can also\n\
  308:                                   be `never', `auto', `always',\n\
  309:                                   or a mode name like `ansi8'\n\
  310: --cursor-color, -cr COLOR       color of the Emacs cursor indicating point\n\
  311: --font, -fn FONT                default font; must be fixed-width\n\
  312: --foreground-color, -fg COLOR   window foreground color\n\
  313: --fullheight, -fh               make the first frame high as the screen\n\
  314: --fullscreen, -fs               make first frame fullscreen\n\
  315: --fullwidth, -fw                make the first frame wide as the screen\n\
  316: --geometry, -g GEOMETRY         window geometry\n\
  317: --no-bitmap-icon, -nbi          do not use picture of gnu for Emacs icon\n\
  318: --iconic                        start Emacs in iconified state\n\
  319: --internal-border, -ib WIDTH    width between text and main border\n\
  320: --line-spacing, -lsp PIXELS     additional space to put between lines\n\
  321: --mouse-color, -ms COLOR        mouse cursor color in Emacs window\n\
  322: --name NAME                     title for initial Emacs frame\n\
  323: --no-blinking-cursor, -nbc      disable blinking cursor\n\
  324: --reverse-video, -r, -rv        switch foreground and background\n\
  325: --title, -T TITLE               title for initial Emacs frame\n\
  326: --vertical-scroll-bars, -vb     enable vertical scroll bars\n\
  327: --xrm XRESOURCES                set additional X resources\n\
  328: --help                          display this help and exit\n\
  329: --version                       output version information and exit\n\
  330: \n"
  331: 
  332: #define USAGE4 "\
  333: You can generally also specify long option names with a single -; for\n\
  334: example, -batch as well as --batch.  You can use any unambiguous\n\
  335: abbreviation for a --option.\n\
  336: \n\
  337: Various environment variables and window system resources also affect\n\
  338: Emacs' operation.  See the main documentation.\n\
  339: \n\
  340: Report bugs to %s.  First, please see the Bugs\n\
  341: section of the Emacs manual or the file BUGS.\n"
  342: 
  343: ^L
  344: /* Signal code for the fatal signal that was received.  */
  345: int fatal_error_code;
  346: 
  347: /* Nonzero if handling a fatal error already.  */
  348: int fatal_error_in_progress;
  349: 
  350: /* If non-null, call this function from fatal_error_signal before
  351:    committing suicide.  */
  352: 
  353: void (*fatal_error_signal_hook) P_ ((void));
  354: 
  355: #ifdef HAVE_GTK_AND_PTHREAD
  356: /* When compiled with GTK and running under Gnome, multiple threads meay be
  357:    created.  Keep track of our main thread to make sure signals are delivered
  358:    to it (see syssignal.h).  */
  359: 
  360: pthread_t main_thread;
  361: #endif
  362: 
  363: 
  364: /* Handle bus errors, invalid instruction, etc.  */
  365: SIGTYPE
  366: fatal_error_signal (sig)
  367:      int sig;
  368: {
  369:   SIGNAL_THREAD_CHECK (sig);
  370:   fatal_error_code = sig;
  371:   signal (sig, SIG_DFL);
  372: 
  373:   TOTALLY_UNBLOCK_INPUT;
  374: 
  375:   /* If fatal error occurs in code below, avoid infinite recursion.  */
  376:   if (! fatal_error_in_progress)
  377:     {
  378:       fatal_error_in_progress = 1;
  379: 
  380:       shut_down_emacs (sig, 0, Qnil);
  381:     }
  382: 
  383: #ifdef VMS
  384:   LIB$STOP (SS$_ABORT);
  385: #else
  386:   /* Signal the same code; this time it will really be fatal.
  387:      Remember that since we're in a signal handler, the signal we're
  388:      going to send is probably blocked, so we have to unblock it if we
  389:      want to really receive it.  */
  390: #ifndef MSDOS
  391:   sigunblock (sigmask (fatal_error_code));
  392: #endif
  393: 
  394:   if (fatal_error_signal_hook)
  395:     fatal_error_signal_hook ();
  396: 
  397:   kill (getpid (), fatal_error_code);
  398: #endif /* not VMS */
  399: }
  400: 
  401: #ifdef SIGDANGER
  402: 
  403: /* Handler for SIGDANGER.  */
  404: SIGTYPE
  405: memory_warning_signal (sig)
  406:      int sig;
  407: {
  408:   signal (sig, memory_warning_signal);
  409:   SIGNAL_THREAD_CHECK (sig);
  410: 
  411:   malloc_warning ("Operating system warns that virtual memory is running low.\n");
  412: 
  413:   /* It might be unsafe to call do_auto_save now.  */
  414:   force_auto_save_soon ();
  415: }
  416: #endif
  417: 
  418: /* We define abort, rather than using it from the library,
  419:    so that GDB can return from a breakpoint here.
  420:    MSDOS has its own definition in msdos.c.  */
  421: 
  422: #if ! defined (DOS_NT) && ! defined (NO_ABORT)
  423: 
  424: #ifndef ABORT_RETURN_TYPE
  425: #define ABORT_RETURN_TYPE void
  426: #endif
  427: 
  428: ABORT_RETURN_TYPE
  429: abort ()
  430: {
  431:   kill (getpid (), SIGABRT);
  432:   /* This shouldn't be executed, but it prevents a warning.  */
  433:   exit (1);
  434: }
  435: #endif
  436: 
  437: ^L
  438: /* Code for dealing with Lisp access to the Unix command line.  */
  439: 
  440: static void
  441: init_cmdargs (argc, argv, skip_args)
  442:      int argc;
  443:      char **argv;
  444:      int skip_args;
  445: {
  446:   register int i;
  447:   Lisp_Object name, dir, tem;
  448:   int count = SPECPDL_INDEX ();
  449:   Lisp_Object raw_name;
  450: 
  451:   initial_argv = argv;
  452:   initial_argc = argc;
  453: 
  454:   raw_name = build_string (argv[0]);
  455: 
  456:   /* Add /: to the front of the name
  457:      if it would otherwise be treated as magic.  */
  458:   tem = Ffind_file_name_handler (raw_name, Qt);
  459:   if (! NILP (tem))
  460:     raw_name = concat2 (build_string ("/:"), raw_name);
  461: 
  462:   Vinvocation_name = Ffile_name_nondirectory (raw_name);
  463:   Vinvocation_directory = Ffile_name_directory (raw_name);
  464: 
  465:   /* If we got no directory in argv[0], search PATH to find where
  466:      Emacs actually came from.  */
  467:   if (NILP (Vinvocation_directory))
  468:     {
  469:       Lisp_Object found;
  470:       int yes = openp (Vexec_path, Vinvocation_name,
  471:                        Vexec_suffixes, &found, make_number (X_OK));
  472:       if (yes == 1)
  473:         {
  474:           /* Add /: to the front of the name
  475:              if it would otherwise be treated as magic.  */
  476:           tem = Ffind_file_name_handler (found, Qt);
  477:           if (! NILP (tem))
  478:             found = concat2 (build_string ("/:"), found);
  479:           Vinvocation_directory = Ffile_name_directory (found);
  480:         }
  481:     }
  482: 
  483:   if (!NILP (Vinvocation_directory)
  484:       && NILP (Ffile_name_absolute_p (Vinvocation_directory)))
  485:     /* Emacs was started with relative path, like ./emacs.
  486:        Make it absolute.  */
  487:     Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, Qnil);
  488: 
  489:   Vinstallation_directory = Qnil;
  490: 
  491:   if (!NILP (Vinvocation_directory))
  492:     {
  493:       dir = Vinvocation_directory;
  494:       name = Fexpand_file_name (Vinvocation_name, dir);
  495:       while (1)
  496:         {
  497:           Lisp_Object tem, lib_src_exists;
  498:           Lisp_Object etc_exists, info_exists;
  499: 
  500:           /* See if dir contains subdirs for use by Emacs.
  501:              Check for the ones that would exist in a build directory,
  502:              not including lisp and info.  */
  503:           tem = Fexpand_file_name (build_string ("lib-src"), dir);
  504:           lib_src_exists = Ffile_exists_p (tem);
  505: 
  506: #ifdef MSDOS
  507:           /* MSDOS installations frequently remove lib-src, but we still
  508:              must set installation-directory, or else info won't find
  509:              its files (it uses the value of installation-directory).  */
  510:           tem = Fexpand_file_name (build_string ("info"), dir);
  511:           info_exists = Ffile_exists_p (tem);
  512: #else
  513:           info_exists = Qnil;
  514: #endif
  515: 
  516:           if (!NILP (lib_src_exists) || !NILP (info_exists))
  517:             {
  518:               tem = Fexpand_file_name (build_string ("etc"), dir);
  519:               etc_exists = Ffile_exists_p (tem);
  520:               if (!NILP (etc_exists))
  521:                 {
  522:                   Vinstallation_directory
  523:                     = Ffile_name_as_directory (dir);
  524:                   break;
  525:                 }
  526:             }
  527: 
  528:           /* See if dir's parent contains those subdirs.  */
  529:           tem = Fexpand_file_name (build_string ("../lib-src"), dir);
  530:           lib_src_exists = Ffile_exists_p (tem);
  531: 
  532: 
  533: #ifdef MSDOS
  534:           /* See the MSDOS commentary above.  */
  535:           tem = Fexpand_file_name (build_string ("../info"), dir);
  536:           info_exists = Ffile_exists_p (tem);
  537: #else
  538:           info_exists = Qnil;
  539: #endif
  540: 
  541:           if (!NILP (lib_src_exists) || !NILP (info_exists))
  542:             {
  543:               tem = Fexpand_file_name (build_string ("../etc"), dir);
  544:               etc_exists = Ffile_exists_p (tem);
  545:               if (!NILP (etc_exists))
  546:                 {
  547:                   tem = Fexpand_file_name (build_string (".."), dir);
  548:                   Vinstallation_directory
  549:                     = Ffile_name_as_directory (tem);
  550:                   break;
  551:                 }
  552:             }
  553: 
  554:           /* If the Emacs executable is actually a link,
  555:              next try the dir that the link points into.  */
  556:           tem = Ffile_symlink_p (name);
  557:           if (!NILP (tem))
  558:             {
  559:               name = Fexpand_file_name (tem, dir);
  560:               dir = Ffile_name_directory (name);
  561:             }
  562:           else
  563:             break;
  564:         }
  565:     }
  566: 
  567:   Vcommand_line_args = Qnil;
  568: 
  569:   for (i = argc - 1; i >= 0; i--)
  570:     {
  571:       if (i == 0 || i > skip_args)
  572:         /* For the moment, we keep arguments as is in unibyte strings.
  573:            They are decoded in the function command-line after we know
  574:            locale-coding-system.  */
  575:         Vcommand_line_args
  576:           = Fcons (make_unibyte_string (argv[i], strlen (argv[i])),
  577:                    Vcommand_line_args);
  578:     }
  579: 
  580:   unbind_to (count, Qnil);
  581: }
  582: 
  583: DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
  584:        doc: /* Return the program name that was used to run Emacs.
  585: Any directory names are omitted.  */)
  586:      ()
  587: {
  588:   return Fcopy_sequence (Vinvocation_name);
  589: }
  590: 
  591: DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
  592:        0, 0, 0,
  593:        doc: /* Return the directory name in which the Emacs executable was located.  */)
  594:      ()
  595: {
  596:   return Fcopy_sequence (Vinvocation_directory);
  597: }
  598: 
  599: ^L
  600: #ifdef VMS
  601: #ifdef LINK_CRTL_SHARE
  602: #ifdef SHARABLE_LIB_BUG
  603: extern noshare char **environ;
  604: #endif /* SHARABLE_LIB_BUG */
  605: #endif /* LINK_CRTL_SHARE */
  606: #endif /* VMS */
  607: 
  608: #ifdef HAVE_TZSET
  609: /* A valid but unlikely value for the TZ environment value.
  610:    It is OK (though a bit slower) if the user actually chooses this value.  */
  611: static char dump_tz[] = "UtC0";
  612: #endif
  613: 
  614: #ifndef ORDINARY_LINK
  615: /* We don't include crtbegin.o and crtend.o in the link,