1 /* Interfaces to system-dependent kernel and library entries.
2 Copyright (C) 1985-1988, 1992-1995 Free Software Foundation, Inc.
3 Copyright (C) 1995 Tinker Systems.
5 This file is part of XEmacs.
7 XEmacs is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with XEmacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* Synched up with: FSF 19.30 except for some Windows-NT crap. */
24 /* Substantially cleaned up by Ben Wing, Dec. 1994 / Jan. 1995. */
26 /* In this file, open, read and write refer to the system calls,
27 not our sugared interfaces sys_open, sys_read and sys_write.
30 #define DONT_ENCAPSULATE
36 #include <mingw32/process.h>
38 /* <process.h> should not conflict with "process.h", as per ANSI definition.
39 This is not true with visual c though. The trick below works with
40 VC4.2b, 5.0 and 6.0. It assumes that VC is installed in a kind of
41 standard way, so include path ends with /include.
43 Unfortunately, this must go before lisp.h, since process.h defines abort()
44 which will conflict with the macro defined in lisp.h
46 #include <../include/process.h>
48 #endif /* WIN32_NATIVE */
52 /* ------------------------------- */
54 /* ------------------------------- */
57 #include "console-tty.h"
59 #include "syssignal.h"
63 #include "console-stream.h"
68 #include "redisplay.h"
74 #ifdef HAVE_LIBGEN_H /* Must come before sysfile.h */
81 #if defined(WIN32_NATIVE) || defined(CYGWIN)
82 #include "syssignal.h"
88 #include <sys/times.h>
92 #include <sys/utime.h>
97 /* ------------------------------- */
99 /* ------------------------------- */
102 #include <sys/utsname.h>
103 #if defined (TIOCGWINSZ) || defined (ISC4_0)
105 #include <sys/sioctl.h>
108 #include <sys/stream.h>
109 #include <sys/ptem.h>
111 #endif /* TIOCGWINSZ or ISC4_0 */
114 /* LPASS8 is new in 4.3, and makes cbreak mode provide all 8 bits. */
125 static int baud_convert[] =
130 0, 50, 75, 110, 135, 150, 200, 300, 600, 1200,
131 1800, 2400, 4800, 9600, 19200, 38400
138 static void hft_init (struct console *c);
139 static void hft_reset (struct console *c);
140 #include <sys/termio.h>
143 /* ------------------------------- */
145 /* ------------------------------- */
148 #ifndef HAVE_STRUCT_UTIMBUF
149 /* We want to use utime rather than utimes, but we couldn't find the
150 structure declaration. We'll use the traditional one. */
160 /************************************************************************/
161 /* subprocess control */
162 /************************************************************************/
168 /* Arrange for character C to be read as the next input from
171 stuff_char (struct console *con, int c)
175 assert (CONSOLE_TTY_P (con));
176 input_fd = CONSOLE_TTY_DATA (con)->infd;
177 /* Should perhaps error if in batch mode */
179 ioctl (input_fd, TIOCSTI, &c);
180 #else /* no TIOCSTI */
181 error ("Cannot stuff terminal input characters in this version of Unix.");
182 #endif /* no TIOCSTI */
187 #endif /* HAVE_TTY */
190 set_exclusive_use (int fd)
193 ioctl (fd, FIOCLEX, 0);
195 /* Ok to do nothing if this feature does not exist */
199 set_descriptor_non_blocking (int fd)
201 /* Stride people say it's a mystery why this is needed
202 as well as the O_NDELAY, but that it fails without this. */
203 /* For AIX: Apparently need this for non-blocking reads on sockets.
204 It seems that O_NONBLOCK applies only to FIFOs? From
205 lowry@watson.ibm.com (Andy Lowry). */
206 /* #### Should this be conditionalized on FIONBIO? */
207 #if defined (STRIDE) || (defined (pfa) && defined (HAVE_PTYS)) || defined (AIX)
210 ioctl (fd, FIONBIO, &one);
215 fcntl (fd, F_SETFL, O_NONBLOCK);
219 #if defined (NO_SUBPROCESSES)
223 wait_without_blocking (void)
225 wait3 (0, WNOHANG | WUNTRACED, 0);
226 synch_process_alive = 0;
230 #endif /* NO_SUBPROCESSES */
234 void wait_for_termination (HANDLE pHandle)
236 void wait_for_termination (int pid)
239 /* #### With the new improved SIGCHLD handling stuff, there is much
240 less danger of race conditions and some of the comments below
241 don't apply. This should be updated. */
243 #if defined (NO_SUBPROCESSES)
246 /* No need to be tricky like below; we can just call wait(). */
247 /* #### should figure out how to write a wait_allowing_quit().
248 Since hardly any systems don't have subprocess support,
249 however, there doesn't seem to be much point. */
253 #elif defined (HAVE_WAITPID)
254 /* Note that, whenever any subprocess terminates (asynch. or synch.),
255 the SIGCHLD handler will be called and it will call wait(). Thus
256 we cannot just call wait() ourselves, and we can't block SIGCHLD
257 and then call wait(), because then if an asynch. process dies
258 while we're waiting for our synch. process, Emacs will never
259 notice that the asynch. process died.
261 So, the general approach we take is to repeatedly block until a
262 signal arrives, and then check if our process died using kill
263 (pid, 0). (We could also check the value of `synch_process_alive',
264 since the SIGCHLD handler will reset that and we know that we're
265 only being called on synchronous processes, but this approach is
266 safer. I don't trust the proper delivery of SIGCHLD.
268 Note also that we cannot use any form of waitpid(). A loop with
269 WNOHANG will chew up CPU time; better to use sleep(). A loop
270 without WNOWAIT will screw up the SIGCHLD handler (actually this
271 is not true, if you duplicate the exit-status-reaping code; see
272 below). A loop with WNOWAIT will result in a race condition if
273 the process terminates between the process-status check and the
274 call to waitpid(). */
276 /* Formerly, immediate_quit was set around this function call, but
277 that could lead to problems if the QUIT happened when SIGCHLD was
278 blocked -- it would remain blocked. Yet another reason why
279 immediate_quit is a bad idea. In any case, there is no reason to
280 resort to this because either the SIGIO or the SIGALRM will stop
281 the block in EMACS_WAIT_FOR_SIGNAL(). */
283 /* Apparently there are bugs on some systems with the second method
284 used below (the EMACS_BLOCK_SIGNAL method), whereby zombie
285 processes get left around. It appears in those cases that the
286 SIGCHLD handler is never getting invoked. It's not clear whether
287 this is an Emacs bug or a kernel bug or both: on HPUX this
288 problem is observed only with XEmacs, but under Solaris 2.4 all
289 sorts of different programs have problems with zombies. The
290 method we use here does not require a working SIGCHLD (but will
291 not break if it is working), and should be safe. */
293 We use waitpid(), contrary to the remarks above. There is no
294 race condition, because the three situations when sigchld_handler
295 is invoked should be handled OK:
297 - handler invoked before waitpid(): In this case, subprocess
298 status will be set by sigchld_handler. waitpid() here will
299 return -1 with errno set to ECHILD, which is a valid exit
302 - handler invoked during waitpid(): as above, except that errno
303 here will be set to EINTR. This will cause waitpid() to be
304 called again, and this time it will exit with ECHILD.
306 - handler invoked after waitpid(): The following code will reap
307 the subprocess. In the handler, wait() will return -1 because
308 there is no child to reap, and the handler will exit without
309 modifying child subprocess status. */
312 /* Because the SIGCHLD handler can potentially reap the synchronous
313 subprocess, we should take care of that. */
315 /* Will stay in the do loop as long as:
317 2. Ctrl-G is not pressed */
321 ret = waitpid (pid, &status, 0);
322 /* waitpid returns 0 if the process is still alive. */
324 while (ret == 0 || (ret == -1 && errno == EINTR));
326 if (ret == pid) /* Success */
327 /* Set synch process globals. This is can also happen
328 in sigchld_handler, and that code is duplicated. */
330 synch_process_alive = 0;
331 if (WIFEXITED (status))
332 synch_process_retcode = WEXITSTATUS (status);
333 else if (WIFSIGNALED (status))
334 synch_process_death = signal_name (WTERMSIG (status));
336 /* On exiting the loop, ret will be -1, with errno set to ECHILD if
337 the child has already been reaped, e.g. in the signal handler. */
339 /* Otherwise, we've had some error condition here.
340 Per POSIX, the only other possibilities are:
341 - EFAULT (bus error accessing arg 2) or
342 - EINVAL (incorrect arguments),
343 which are both program bugs.
345 Since implementations may add their own error indicators on top,
346 we ignore it by default. */
347 #elif defined (WIN32_NATIVE)
348 int ret = 0, status = 0;
351 warn_when_safe (Qprocess, Qwarning, "Cannot wait for unknown process to terminate");
357 ret = WaitForSingleObject(pHandle, 100);
359 while (ret == WAIT_TIMEOUT);
360 if (ret == WAIT_FAILED)
362 warn_when_safe (Qprocess, Qwarning, "waiting for process failed");
364 if (ret == WAIT_ABANDONED)
366 warn_when_safe (Qprocess, Qwarning,
367 "process to wait for has been abandoned");
369 if (ret == WAIT_OBJECT_0)
371 ret = GetExitCodeProcess(pHandle, &status);
374 synch_process_alive = 0;
375 synch_process_retcode = status;
379 /* GetExitCodeProcess() didn't return a valid exit status,
380 nothing to do. APA */
381 warn_when_safe (Qprocess, Qwarning,
382 "failure to obtain process exit value");
385 if (pHandle != NULL && !CloseHandle(pHandle))
387 warn_when_safe (Qprocess, Qwarning,
388 "failure to close unknown process");
390 #elif defined (EMACS_BLOCK_SIGNAL) && !defined (BROKEN_WAIT_FOR_SIGNAL) && defined (SIGCHLD)
393 static int wait_debugging = 0; /* Set nonzero to make following
394 function work under dbx (at least for bsd). */
399 EMACS_BLOCK_SIGNAL (SIGCHLD);
400 /* Block SIGCHLD from happening during this check,
401 to avoid race conditions. */
402 if (kill (pid, 0) < 0)
404 EMACS_UNBLOCK_SIGNAL (SIGCHLD);
408 /* WARNING: Whatever this macro does *must* not allow SIGCHLD
409 to happen between the time that it's reenabled and when we
410 begin to block. Otherwise we may end up blocking for a
411 signal that has already arrived and isn't coming again.
412 Can you say "race condition"?
414 I assume that the system calls sigpause() or sigsuspend()
415 to provide this atomicness. If you're getting hangs in
416 sigpause()/sigsuspend(), then your OS doesn't implement
417 this properly (this applies under hpux9, for example).
418 Try defining BROKEN_WAIT_FOR_SIGNAL. */
419 EMACS_WAIT_FOR_SIGNAL (SIGCHLD);
421 #else /* not HAVE_WAITPID and not WIN32_NATIVE and (not EMACS_BLOCK_SIGNAL or BROKEN_WAIT_FOR_SIGNAL) */
422 /* This approach is kind of cheesy but is guaranteed(?!) to work
427 if (kill (pid, 0) < 0)
431 #endif /* OS features */
435 #if !defined (NO_SUBPROCESSES)
438 * flush any pending output
439 * (may flush input as well; it does not matter the way we use it)
443 flush_pending_output (int channel)
446 /* If we try this, we get hit with SIGTTIN, because
447 the child's tty belongs to the child's pgrp. */
448 #elif defined (TCFLSH)
449 ioctl (channel, TCFLSH, 1);
450 #elif defined (TIOCFLUSH)
452 /* 3rd arg should be ignored
453 but some 4.2 kernels actually want the address of an int
454 and nonzero means something different. */
455 ioctl (channel, TIOCFLUSH, &zero);
460 /* Set up the terminal at the other end of a pseudo-terminal that
461 we will be controlling an inferior through.
462 It should not echo or do line-editing, since that is done
463 in Emacs. No padding needed for insertion into an Emacs buffer. */
466 child_setup_tty (int out)
469 emacs_get_tty (out, &s);
471 #if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
472 assert (isatty(out));
473 s.main.c_oflag |= OPOST; /* Enable output postprocessing */
474 s.main.c_oflag &= ~ONLCR; /* Disable map of NL to CR-NL on output */
476 s.main.c_oflag &= ~(NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
477 /* No output delays */
479 s.main.c_lflag &= ~ECHO; /* Disable echo */
480 s.main.c_lflag |= ISIG; /* Enable signals */
482 s.main.c_iflag &= ~IUCLC; /* Disable downcasing on input. */
485 s.main.c_oflag &= ~OLCUC; /* Disable upcasing on output. */
487 s.main.c_oflag &= ~TAB3; /* Disable tab expansion */
488 #if defined (CSIZE) && defined (CS8)
489 s.main.c_cflag = (s.main.c_cflag & ~CSIZE) | CS8; /* Don't strip 8th bit */
492 s.main.c_iflag &= ~ISTRIP; /* Don't strip 8th bit on input */
495 /* Unnecessary as long as ICANON is set */
496 s.main.c_cc[VMIN] = 1; /* minimum number of characters to accept */
497 s.main.c_cc[VTIME] = 0; /* wait forever for at least 1 character */
500 s.main.c_lflag |= ICANON; /* Enable erase/kill and eof processing */
501 s.main.c_cc[VEOF] = 04; /* ensure that EOF is Control-D */
502 s.main.c_cc[VERASE] = _POSIX_VDISABLE; /* disable erase processing */
503 s.main.c_cc[VKILL] = _POSIX_VDISABLE; /* disable kill processing */
506 s.main.c_cflag = (s.main.c_cflag & ~CBAUD) | B9600; /* baud rate sanity */
511 /* AIX enhanced edit loses NULs, so disable it. */
513 s.main.c_iflag &= ~ASCEDIT;
514 #endif /* IBMR2AIX */
515 /* Also, PTY overloads NUL and BREAK.
516 don't ignore break, but don't signal either, so it looks like NUL.
517 This really serves a purpose only if running in an XTERM window
518 or via TELNET or the like, but does no harm elsewhere. */
519 s.main.c_iflag &= ~IGNBRK;
520 s.main.c_iflag &= ~BRKINT;
522 #ifdef SIGNALS_VIA_CHARACTERS
523 /* TTY `special characters' are used in process_send_signal
524 so set them here to something useful. */
525 s.main.c_cc[VQUIT] = '\\'&037; /* Control-\ */
526 s.main.c_cc[VINTR] = 'C' &037; /* Control-C */
527 s.main.c_cc[VSUSP] = 'Z' &037; /* Control-Z */
528 #else /* no TIOCGPGRP or no TIOCGLTC or no TIOCGETC */
529 /* TTY `special characters' work better as signals, so disable
531 s.main.c_cc[VQUIT] = _POSIX_VDISABLE;
532 s.main.c_cc[VINTR] = _POSIX_VDISABLE;
533 s.main.c_cc[VSUSP] = _POSIX_VDISABLE;
534 s.main.c_lflag &= ~ISIG;
535 #endif /* no TIOCGPGRP or no TIOCGLTC or no TIOCGETC */
536 s.main.c_cc[VEOL] = _POSIX_VDISABLE;
538 /* <mdiers> #### This is not portable. ###
539 POSIX does not specify CBAUD, and 4.4BSD does not have it.
540 Instead, POSIX suggests to use cfset{i,o}speed().
541 [cf. D. Lewine, POSIX Programmer's Guide, Chapter 8: Terminal
542 I/O, O'Reilly 1991] */
543 s.main.c_cflag = (s.main.c_cflag & ~CBAUD) | B9600; /* baud rate sanity */
545 /* <mdiers> What to do upon failure? Just ignoring rc is probably
546 not acceptable, is it? */
547 if (cfsetispeed (&s.main, B9600) == -1) /* ignore */;
548 if (cfsetospeed (&s.main, B9600) == -1) /* ignore */;
549 #endif /* defined (CBAUD) */
551 #else /* not HAVE_TERMIO */
553 s.main.sg_flags &= ~(ECHO | CRMOD | ANYP | ALLDELAY | RAW | LCASE
555 s.main.sg_flags |= LPASS8;
556 s.main.sg_erase = 0377;
557 s.main.sg_kill = 0377;
558 s.lmode = LLITOUT | s.lmode; /* Don't strip 8th bit */
560 #endif /* not HAVE_TERMIO */
561 emacs_set_tty (out, &s, 0);
566 ioctl (out, FIOASYNC, &zero);
570 #endif /* WIN32_NATIVE */
572 #endif /* not NO_SUBPROCESSES */
575 #if !defined (SIGTSTP) && !defined (USG_JOBCTRL)
577 #if defined(__STDC__) || defined(_MSC_VER)
578 #define SIG_PARAM_TYPE int
580 #define SIG_PARAM_TYPE
583 /* Record a signal code and the handler for it. */
587 SIGTYPE (*handler) (SIG_PARAM_TYPE);
591 save_signal_handlers (struct save_signal *saved_handlers)
593 while (saved_handlers->code)
595 saved_handlers->handler
596 = (SIGTYPE (*) (SIG_PARAM_TYPE)) signal (saved_handlers->code, SIG_IGN);
602 restore_signal_handlers (struct save_signal *saved_handlers)
604 while (saved_handlers->code)
606 signal (saved_handlers->code, saved_handlers->handler);
616 return abs (getpid ());
619 #endif /* WIN32_NATIVE */
621 /* Fork a subshell. */
628 struct save_signal saved_handlers[5];
630 unsigned char *str = 0;
634 saved_handlers[0].code = SIGINT;
635 saved_handlers[1].code = SIGQUIT;
636 saved_handlers[2].code = SIGTERM;
638 saved_handlers[3].code = SIGIO;
639 saved_handlers[4].code = 0;
641 saved_handlers[3].code = 0;
644 /* Mentioning current_buffer->buffer would mean including buffer.h,
645 which somehow wedges the hp compiler. So instead... */
647 if (NILP (Fboundp (Qdefault_directory)))
649 dir = Fsymbol_value (Qdefault_directory);
654 dir = Funhandled_file_name_directory (dir);
655 dir = expand_and_dir_to_file (dir, Qnil);
657 str = (unsigned char *) alloca (XSTRING_LENGTH (dir) + 2);
658 len = XSTRING_LENGTH (dir);
659 memcpy (str, XSTRING_DATA (dir), len);
660 if (!IS_ANY_SEP (str[len - 1]))
661 str[len++] = DIRECTORY_SEP;
669 error ("Can't spawn subshell");
671 #endif /* not WIN32_NATIVE */
676 sh = (char *) egetenv ("SHELL");
680 /* Use our buffer's default directory for the subshell. */
686 /* Waits for process completion */
687 if (_spawnlp (_P_WAIT, sh, sh, NULL) != 0)
688 error ("Can't spawn subshell");
690 return; /* we're done, no need to wait for termination */
695 #if !defined (NO_SUBPROCESSES)
696 close_process_descs (); /* Close Emacs's pipes/ptys */
699 #ifdef SET_EMACS_PRIORITY
700 if (emacs_priority != 0)
701 nice (-emacs_priority); /* Give the new shell the default priority */
705 write (1, "Can't execute subshell", 22);
709 save_signal_handlers (saved_handlers);
710 synch_process_alive = 1;
711 wait_for_termination (pid);
712 restore_signal_handlers (saved_handlers);
714 #endif /* not WIN32_NATIVE */
718 #endif /* !defined (SIGTSTP) && !defined (USG_JOBCTRL) */
722 /* Suspend the Emacs process; give terminal to its superior. */
726 #if defined (SIGTSTP)
728 int pgrp = EMACS_GET_PROCESS_GROUP ();
729 EMACS_KILLPG (pgrp, SIGTSTP);
732 #elif defined (USG_JOBCTRL)
733 /* If you don't know what this is don't mess with it */
734 ptrace (0, 0, 0, 0); /* set for ptrace - caught by csh */
735 kill (getpid (), SIGQUIT);
737 #else /* No SIGTSTP or USG_JOBCTRL */
739 /* On a system where suspending is not implemented,
740 instead fork a subshell and let it talk directly to the terminal
747 /* Suspend a process if possible; give terminal to its superior. */
749 sys_suspend_process (int process)
751 /* I don't doubt that it is possible to suspend processes on
752 * VMS machines or thost that use USG_JOBCTRL,
753 * but I don't know how to do it, so...
755 #if defined (SIGTSTP)
756 kill(process, SIGTSTP);
761 /* Given FD, obtain pty buffer size. When no luck, a good guess is made,
762 so that the function works even when fd is not a pty. */
765 get_pty_max_bytes (int fd)
767 /* DEC OSF 4.0 fpathconf returns 255, but xemacs hangs on long shell
768 input lines if we return 253. 252 is OK!. So let's leave a bit
769 of slack for the newline that xemacs will insert, and for those
770 inevitable vendor off-by-one-or-two-or-three bugs. */
771 #define MAX_CANON_SLACK 10
772 #define SAFE_MAX_CANON (127 - MAX_CANON_SLACK)
773 #if defined (HAVE_FPATHCONF) && defined (_PC_MAX_CANON)
775 int max_canon = fpathconf (fd, _PC_MAX_CANON);
777 /* HP-UX 10.20 fpathconf returns 768, but this results in
778 truncated input lines, while 255 works. */
779 if (max_canon > 255) max_canon = 255;
781 return (max_canon < 0 ? SAFE_MAX_CANON :
782 max_canon > SAFE_MAX_CANON ? max_canon - MAX_CANON_SLACK :
785 #elif defined (_POSIX_MAX_CANON)
786 return (_POSIX_MAX_CANON > SAFE_MAX_CANON ?
787 _POSIX_MAX_CANON - MAX_CANON_SLACK :
790 return SAFE_MAX_CANON;
794 /* Figure out the eof character for the FD. */
797 get_eof_char (int fd)
799 const Bufbyte ctrl_d = (Bufbyte) '\004';
808 /* What is the following line designed to do??? -mrb */
809 if (strlen ((const char *) t.c_cc) < (unsigned int) (VEOF + 1))
812 return (Bufbyte) t.c_cc[VEOF];
814 return t.c_cc[VEOF] == _POSIX_VDISABLE ? ctrl_d : (Bufbyte) t.c_cc[VEOF];
816 #else /* ! HAVE_TERMIOS */
817 /* On Berkeley descendants, the following IOCTL's retrieve the
818 current control characters. */
819 #if defined (TIOCGETC)
822 ioctl (fd, TIOCGETC, &c);
823 return (Bufbyte) c.t_eofc;
825 #else /* ! defined (TIOCGLTC) && defined (TIOCGETC) */
826 /* On SYSV descendants, the TCGETA ioctl retrieves the current control
831 ioctl (fd, TCGETA, &t);
832 if (strlen ((const char *) t.c_cc) < (unsigned int) (VINTR + 1))
835 return (Bufbyte) t.c_cc[VINTR];
837 #else /* ! defined (TCGETA) */
838 /* Rather than complain, we'll just guess ^D, which is what
839 * earlier emacsen always used. */
841 #endif /* ! defined (TCGETA) */
842 #endif /* ! defined (TIOCGETC) */
843 #endif /* ! defined (HAVE_TERMIOS) */
846 /* Set the logical window size associated with descriptor FD
847 to HEIGHT and WIDTH. This is used mainly with ptys. */
850 set_window_size (int fd, int height, int width)
856 size.ws_row = height;
859 if (ioctl (fd, TIOCSWINSZ, &size) == -1)
860 return 0; /* error */
864 #elif defined (TIOCSSIZE)
868 size.ts_lines = height;
869 size.ts_cols = width;
871 if (ioctl (fd, TIOCGSIZE, &size) == -1)
882 /* Set up the proper status flags for use of a pty. */
887 /* I'm told that TIOCREMOTE does not mean control chars
888 "can't be sent" but rather that they don't have
889 input-editing or signaling effects.
890 That should be good, because we have other ways
891 to do those things in Emacs.
892 However, telnet mode seems not to work on 4.2.
893 So TIOCREMOTE is turned off now. */
895 /* Under hp-ux, if TIOCREMOTE is turned on, some calls
896 will hang. In particular, the "timeout" feature (which
897 causes a read to return if there is no data available)
898 does this. Also it is known that telnet mode will hang
899 in such a way that Emacs must be stopped (perhaps this
900 is the same problem).
902 If TIOCREMOTE is turned off, then there is a bug in
903 hp-ux which sometimes loses data. Apparently the
904 code which blocks the master process when the internal
905 buffer fills up does not work. Other than this,
906 though, everything else seems to work fine.
908 Since the latter lossage is more benign, we may as well
909 lose that way. -- cph */
910 #if defined (FIONBIO) && defined (SYSV_PTYS)
913 ioctl (fd, FIONBIO, &on);
917 /* On AIX, the parent gets SIGHUP when a pty attached child dies. So, we */
918 /* ignore SIGHUP once we've started a child on a pty. Note that this may */
919 /* cause EMACS not to die when it should, i.e., when its own controlling */
920 /* tty goes away. I've complained to the AIX developers, and they may */
921 /* change this behavior, but I'm not going to hold my breath. */
922 signal (SIGHUP, SIG_IGN);
925 /* In some systems (Linux through 2.0.0, at least), packet mode doesn't
926 get cleared when a pty is closed, so we need to clear it here.
927 Linux pre2.0.13 contained an attempted fix for this (from Ted Ts'o,
928 tytso@mit.edu), but apparently it messed up rlogind and telnetd, so he
929 removed the fix in pre2.0.14. - dkindred@cs.cmu.edu
933 ioctl (fd, TIOCPKT, (char *)&off);
937 #endif /* HAVE_PTYS */
940 /************************************************************************/
942 /************************************************************************/
944 /* ------------------------------------------------------ */
946 /* ------------------------------------------------------ */
948 /* It really makes more sense for the baud-rate to be console-specific
949 and not device-specific, but it's (at least potentially) used for output
953 init_baud_rate (struct device *d)
955 struct console *con = XCONSOLE (DEVICE_CONSOLE (d));
956 if (DEVICE_WIN_P (d) || DEVICE_STREAM_P (d))
958 DEVICE_BAUD_RATE (d) = 38400;
963 assert (DEVICE_TTY_P (d));
965 int input_fd = CONSOLE_TTY_DATA (con)->infd;
966 #if defined (WIN32_NATIVE)
967 DEVICE_TTY_DATA (d)->ospeed = 15;
968 #elif defined (HAVE_TERMIOS)
972 tcgetattr (input_fd, &sg);
973 DEVICE_TTY_DATA (d)->ospeed = cfgetospeed (&sg);
974 # if defined (USE_GETOBAUD) && defined (getobaud)
975 /* m88k-motorola-sysv3 needs this (ghazi@noc.rutgers.edu) 9/1/94. */
976 if (DEVICE_TTY_DATA (d)->ospeed == 0)
977 DEVICE_TTY_DATA (d)->ospeed = getobaud (sg.c_cflag);
979 #elif defined (HAVE_TERMIO)
984 tcgetattr (input_fd, &sg);
986 ioctl (input_fd, TCGETA, &sg);
988 DEVICE_TTY_DATA (d)->ospeed = sg.c_cflag & CBAUD;
989 #else /* neither TERMIOS nor TERMIO */
992 sg.sg_ospeed = B9600;
993 if (ioctl (input_fd, TIOCGETP, &sg) < 0)
995 DEVICE_TTY_DATA (d)->ospeed = sg.sg_ospeed;
999 DEVICE_BAUD_RATE (d) =
1000 (DEVICE_TTY_DATA (d)->ospeed < countof (baud_convert)
1001 ? baud_convert[DEVICE_TTY_DATA (d)->ospeed]
1004 if (DEVICE_BAUD_RATE (d) == 0)
1005 DEVICE_BAUD_RATE (d) = 1200;
1006 #endif /* HAVE_TTY */
1010 /* ------------------------------------------------------ */
1012 /* ------------------------------------------------------ */
1014 #if defined(SIGIO) && !defined(BROKEN_SIGIO)
1017 init_sigio_on_device (struct device *d)
1019 int filedesc = DEVICE_INFD (d);
1021 #if defined (FIOSSAIOOWN)
1023 int owner = getpid ();
1025 if (DEVICE_TTY_P (d))
1027 ioctl_status = ioctl (filedesc, FIOGSAIOOWN,
1028 &DEVICE_OLD_FCNTL_OWNER (d));
1029 ioctl_status = ioctl (filedesc, FIOSSAIOOWN, &owner);
1031 #ifdef HAVE_WINDOW_SYSTEM
1032 else if (!DEVICE_STREAM_P (d))
1034 ioctl_status = ioctl (filedesc, SIOCGPGRP,
1035 &DEVICE_OLD_FCNTL_OWNER (d));
1036 ioctl_status = ioctl (filedesc, SIOCSPGRP, &owner);
1040 #elif defined (F_SETOWN) && !defined (F_SETOWN_BUG)
1041 DEVICE_OLD_FCNTL_OWNER (d) = fcntl (filedesc, F_GETOWN, 0);
1042 # ifdef F_SETOWN_SOCK_NEG
1043 /* stdin is a socket here */
1044 fcntl (filedesc, F_SETOWN, -getpid ());
1046 fcntl (filedesc, F_SETOWN, getpid ());
1052 reset_sigio_on_device (struct device *d)
1054 int filedesc = DEVICE_INFD (d);
1056 #if defined (FIOSSAIOOWN)
1059 if (DEVICE_TTY_P (d))
1061 ioctl_status = ioctl (filedesc, FIOSSAIOOWN,
1062 &DEVICE_OLD_FCNTL_OWNER (d));
1064 #ifdef HAVE_WINDOW_SYSTEM
1065 else if (!DEVICE_STREAM_P (d))
1067 ioctl_status = ioctl (filedesc, SIOCSPGRP,
1068 &DEVICE_OLD_FCNTL_OWNER (d));
1072 #elif defined (F_SETOWN) && !defined (F_SETOWN_BUG)
1073 fcntl (filedesc, F_SETOWN, DEVICE_OLD_FCNTL_OWNER (d));
1078 request_sigio_on_device (struct device *d)
1080 int filedesc = DEVICE_INFD (d);
1082 #if defined (I_SETSIG) && !defined(HPUX10) && !defined(LINUX)
1085 ioctl (filedesc, I_GETSIG, &events);
1086 ioctl (filedesc, I_SETSIG, events | S_INPUT);
1088 #elif defined (FASYNC)
1089 fcntl (filedesc, F_SETFL, fcntl (filedesc, F_GETFL, 0) | FASYNC);
1090 #elif defined (FIOSSAIOSTAT)
1092 /* DG: Changed for HP-UX. HP-UX uses different IOCTLs for
1093 sockets and other devices for some bizarre reason. We guess
1094 that an X device is a socket, and tty devices aren't. We then
1095 use the following crud to do the appropriate thing. */
1097 int ioctl_status; /* ####DG: check if IOCTL succeeds here. */
1099 if (DEVICE_TTY_P (d))
1101 ioctl_status = ioctl (filedesc, FIOSSAIOSTAT, &on);
1103 #ifdef HAVE_WINDOW_SYSTEM
1104 else if (!DEVICE_STREAM_P (d))
1106 ioctl_status = ioctl (filedesc, FIOASYNC, &on);
1110 #elif defined (FIOASYNC)
1113 ioctl (filedesc, FIOASYNC, &on);
1117 #if defined (_CX_UX) /* #### Is this crap necessary? */
1118 EMACS_UNBLOCK_SIGNAL (SIGIO);
1123 unrequest_sigio_on_device (struct device *d)
1125 int filedesc = DEVICE_INFD (d);
1127 #if defined (I_SETSIG) && !defined(HPUX10)
1130 ioctl (filedesc, I_GETSIG, &events);
1131 ioctl (filedesc, I_SETSIG, events & ~S_INPUT);
1133 #elif defined (FASYNC)
1134 fcntl (filedesc, F_SETFL, fcntl (filedesc, F_GETFL, 0) & ~FASYNC);
1135 #elif defined (FIOSSAIOSTAT)
1137 /* DG: Changed for HP-UX. HP-UX uses different IOCTLs for
1138 sockets and other devices for some bizarre reason. We guess
1139 that an X device is a socket, and tty devices aren't. We then
1140 use the following crud to do the appropriate thing. */
1145 /* See comment for request_sigio_on_device */
1147 if (DEVICE_TTY_P (d))
1149 ioctl_status = ioctl (filedesc, FIOSSAIOSTAT, &off);
1153 ioctl_status = ioctl (filedesc, FIOASYNC, &off);
1156 #elif defined (FIOASYNC)
1159 ioctl (filedesc, FIOASYNC, &off);
1165 request_sigio (void)
1167 Lisp_Object devcons, concons;
1169 DEVICE_LOOP_NO_BREAK (devcons, concons)
1173 d = XDEVICE (XCAR (devcons));
1175 if (!DEVICE_STREAM_P (d))
1176 request_sigio_on_device (d);
1181 unrequest_sigio (void)
1183 Lisp_Object devcons, concons;
1185 DEVICE_LOOP_NO_BREAK (devcons, concons)
1189 d = XDEVICE (XCAR (devcons));
1191 if (!DEVICE_STREAM_P (d))
1192 unrequest_sigio_on_device (d);
1198 /* ------------------------------------------------------ */
1199 /* Changing Emacs's process group */
1200 /* ------------------------------------------------------ */
1202 /* Saving and restoring the process group of Emacs's terminal. */
1204 /* On some systems, apparently (?!) Emacs must be in its own process
1205 group in order to receive SIGIO correctly. On other systems
1206 (e.g. Solaris), it's not required and doing it makes things
1207 get fucked up. So, we only do it when
1208 SIGIO_REQUIRES_SEPARATE_PROCESS_GROUP is defined. Basically,
1209 this is only required for BSD 4.2 systems. (Actually, I bet
1210 we don't have to do this at all -- those systems also
1211 required interrupt input, which we don't support.)
1213 If Emacs was in its own process group (i.e. inherited_pgroup ==
1214 getpid ()), then we know we're running under a shell with job
1215 control (Emacs would never be run as part of a pipeline).
1218 If Emacs was not in its own process group, then we know we're
1219 running under a shell (or a caller) that doesn't know how to
1220 separate itself from Emacs (like sh). Emacs must be in its own
1221 process group in order to receive SIGIO correctly. In this
1222 situation, we put ourselves in our own pgroup, forcibly set the
1223 tty's pgroup to our pgroup, and make sure to restore and reinstate
1224 the tty's pgroup just like any other terminal setting. If
1225 inherited_group was not the tty's pgroup, then we'll get a
1226 SIGTTmumble when we try to change the tty's pgroup, and a CONT if
1227 it goes foreground in the future, which is what should happen. */
1229 #ifdef SIGIO_REQUIRES_SEPARATE_PROCESS_GROUP
1231 static pid_t inherited_pgroup;
1232 static pid_t inherited_tty_pgroup;
1237 munge_tty_process_group (void)
1239 #ifdef SIGIO_REQUIRES_SEPARATE_PROCESS_GROUP
1243 /* Only do this munging if we have a device on the controlling
1244 terminal. See the large comment below. */
1246 if (CONSOLEP (Vcontrolling_terminal) &&
1247 CONSOLE_LIVE_P (XCONSOLE (Vcontrolling_terminal)))
1249 int fd = open ("/dev/tty", O_RDWR, 0);
1250 pid_t me = getpid ();
1251 EMACS_BLOCK_SIGNAL (SIGTTOU);
1252 EMACS_SET_TTY_PROCESS_GROUP (fd, &me);
1253 EMACS_UNBLOCK_SIGNAL (SIGTTOU);
1259 /* Split off the foreground process group to Emacs alone.
1260 When we are in the foreground, but not started in our own process
1261 group, redirect the TTY to point to our own process group. We need
1262 to be in our own process group to receive SIGIO properly. */
1264 munge_process_groups (void)
1266 #ifdef SIGIO_REQUIRES_SEPARATE_PROCESS_GROUP
1270 EMACS_SEPARATE_PROCESS_GROUP ();
1272 munge_tty_process_group ();
1277 unmunge_tty_process_group (void)
1279 #ifdef SIGIO_REQUIRES_SEPARATE_PROCESS_GROUP
1281 int fd = open ("/dev/tty", O_RDWR, 0);
1282 EMACS_BLOCK_SIGNAL (SIGTTOU);
1283 EMACS_SET_TTY_PROCESS_GROUP (fd, &inherited_tty_pgroup);
1284 EMACS_UNBLOCK_SIGNAL (SIGTTOU);
1290 /* Set the tty to our original foreground group.
1291 Also restore the original process group (put us back into sh's
1292 process group), so that ^Z will suspend both us and sh. */
1294 unmunge_process_groups (void)
1296 #ifdef SIGIO_REQUIRES_SEPARATE_PROCESS_GROUP
1300 unmunge_tty_process_group ();
1302 EMACS_SET_PROCESS_GROUP (inherited_pgroup);
1306 /* According to some old wisdom, we need to be in a separate process
1307 group for SIGIO to work correctly (at least on some systems ...).
1308 So go ahead and put ourselves into our own process group. This
1309 will fail if we're already in our own process group, but who cares.
1310 Also record whether we were in our own process group. (In general,
1311 we will already be in our own process group if we were started from
1312 a job-control shell like csh, but not if we were started from sh).
1314 If we succeeded in changing our process group, then we will no
1315 longer be in the foreground process group of our controlling
1316 terminal. Therefore, if we have a console open onto this terminal,
1317 we have to change the controlling terminal's foreground process
1318 group (otherwise we will get stopped with a SIGTTIN signal when
1319 attempting to read from the terminal). It's important,
1320 however, that we do this *only* when we have a console open onto
1321 the terminal. It's a decidedly bad idea to do so otherwise,
1322 especially if XEmacs was started from the background. */
1325 init_process_group (void)
1327 #ifdef SIGIO_REQUIRES_SEPARATE_PROCESS_GROUP
1328 if (! noninteractive)
1330 int fd = open ("/dev/tty", O_RDWR, 0);
1331 inherited_pgroup = EMACS_GET_PROCESS_GROUP ();
1332 EMACS_GET_TTY_PROCESS_GROUP (fd, &inherited_tty_pgroup);
1334 EMACS_SEPARATE_PROCESS_GROUP ();
1340 disconnect_controlling_terminal (void)
1343 /* Controlling terminals are attached to a session.
1344 Create a new session for us; it will have no controlling
1345 terminal. This also, of course, puts us in our own
1349 /* Put us in our own process group. */
1350 EMACS_SEPARATE_PROCESS_GROUP ();
1351 # if defined (TIOCNOTTY)
1352 /* This is the older way of disconnecting the controlling
1353 terminal, on 4.3 BSD. We must open /dev/tty; using
1354 filedesc 0 is not sufficient because it could be
1355 something else (e.g. our stdin was redirected to
1359 int j = open ("/dev/tty", O_RDWR, 0);
1360 ioctl (j, TIOCNOTTY, 0);
1363 # endif /* TIOCNOTTY */
1365 On systems without TIOCNOTTY and without
1366 setsid(), we don't need to do anything more to
1367 disconnect our controlling terminal. Here is
1368 what the man page for termio(7) from a SYSV 3.2
1371 "The first terminal file opened by the process group leader
1372 of a terminal file not already associated with a process
1373 group becomes the control terminal for that process group.
1374 The control terminal plays a special role in handling quit
1375 and interrupt signals, as discussed below. The control
1376 terminal is inherited by a child process during a fork(2).
1377 A process can break this association by changing its process
1378 group using setpgrp(2)."
1381 # endif /* not HAVE_SETSID */
1385 /* ------------------------------------------------------ */
1386 /* Getting and setting emacs_tty structures */
1387 /* ------------------------------------------------------ */
1389 /* It's wrong to encase these into #ifdef HAVE_TTY because we need
1390 them for child TTY processes. */
1391 /* However, this does break NT support while we don't do child TTY processes */
1392 #ifndef WIN32_NATIVE
1394 /* Set *TC to the parameters associated with the terminal FD.
1395 Return zero if all's well, or -1 if we ran into an error we
1396 couldn't deal with. */
1398 emacs_get_tty (int fd, struct emacs_tty *settings)
1400 /* Retrieve the primary parameters - baud rate, character size, etcetera. */
1402 /* We have those nifty POSIX tcmumbleattr functions. */
1403 if (tcgetattr (fd, &settings->main) < 0)
1406 #elif defined HAVE_TERMIO
1407 /* The SYSV-style interface? */
1408 if (ioctl (fd, TCGETA, &settings->main) < 0)
1411 #elif !defined (WIN32_NATIVE)
1412 /* I give up - I hope you have the BSD ioctls. */
1413 if (ioctl (fd, TIOCGETP, &settings->main) < 0)
1415 #endif /* HAVE_TCATTR */
1417 /* Suivant - Do we have to get struct ltchars data? */
1419 if (ioctl (fd, TIOCGLTC, &settings->ltchars) < 0)
1423 /* How about a struct tchars and a wordful of lmode bits? */
1425 if (ioctl (fd, TIOCGETC, &settings->tchars) < 0
1426 || ioctl (fd, TIOCLGET, &settings->lmode) < 0)
1430 /* We have survived the tempest. */
1434 /* Set the parameters of the tty on FD according to the contents of
1435 *SETTINGS. If FLUSHP is non-zero, we discard input.
1436 Return 0 if all went well, and -1 if anything failed.
1437 #### All current callers use FLUSHP == 0. */
1440 emacs_set_tty (int fd, struct emacs_tty *settings, int flushp)
1442 /* Set the primary parameters - baud rate, character size, etcetera. */
1445 /* We have those nifty POSIX tcmumbleattr functions.
1446 William J. Smith <wjs@wiis.wang.com> writes:
1447 "POSIX 1003.1 defines tcsetattr() to return success if it was
1448 able to perform any of the requested actions, even if some
1449 of the requested actions could not be performed.
1450 We must read settings back to ensure tty setup properly.
1451 AIX requires this to keep tty from hanging occasionally." */
1452 /* This makes sure that we don't loop indefinitely in here. */
1453 for (i = 0 ; i < 10 ; i++)
1454 if (tcsetattr (fd, flushp ? TCSAFLUSH : TCSADRAIN, &settings->main) < 0)
1465 /* Get the current settings, and see if they're what we asked for. */
1466 tcgetattr (fd, &new);
1467 /* We cannot use memcmp on the whole structure here because under
1468 * aix386 the termios structure has some reserved field that may
1471 if ( new.c_iflag == settings->main.c_iflag
1472 && new.c_oflag == settings->main.c_oflag
1473 && new.c_cflag == settings->main.c_cflag
1474 && new.c_lflag == settings->main.c_lflag
1475 && memcmp(new.c_cc, settings->main.c_cc, NCCS) == 0)
1480 #elif defined HAVE_TERMIO
1481 /* The SYSV-style interface? */
1482 if (ioctl (fd, flushp ? TCSETAF : TCSETAW, &settings->main) < 0)
1485 #elif !defined (WIN32_NATIVE)
1486 /* I give up - I hope you have the BSD ioctls. */
1487 if (ioctl (fd, (flushp) ? TIOCSETP : TIOCSETN, &settings->main) < 0)
1489 #endif /* HAVE_TCATTR */
1491 /* Suivant - Do we have to get struct ltchars data? */
1493 if (ioctl (fd, TIOCSLTC, &settings->ltchars) < 0)
1497 /* How about a struct tchars and a wordful of lmode bits? */
1499 if (ioctl (fd, TIOCSETC, &settings->tchars) < 0
1500 || ioctl (fd, TIOCLSET, &settings->lmode) < 0)
1504 /* We have survived the tempest. */
1508 #endif /* WIN32_NATIVE */
1510 /* ------------------------------------------------------ */
1511 /* Initializing a device */
1512 /* ------------------------------------------------------ */
1516 /* This may also be defined in stdio,
1517 but if so, this does no harm,
1518 and using the same name avoids wasting the other one's space. */
1520 #if ((defined(USG) || defined(DGUX)) && !defined(__STDC__))
1521 char _sobuf[BUFSIZ+8];
1522 #elif (defined(USG) && !defined(LINUX) && !defined(_SCO_DS)) || defined(IRIX5)
1523 extern unsigned char _sobuf[BUFSIZ+8];
1525 char _sobuf[BUFSIZ];
1528 #if defined (TIOCGLTC) && defined (HAVE_LTCHARS) /* HAVE_LTCHARS */
1529 static struct ltchars new_ltchars = {-1,-1,-1,-1,-1,-1};
1531 #ifdef TIOCGETC /* HAVE_TCHARS */
1533 static struct tchars new_tchars = {-1,-1,-1,-1,-1,-1};
1538 tty_init_sys_modes_on_device (struct device *d)
1540 struct emacs_tty tty;
1541 int input_fd, output_fd;
1542 struct console *con = XCONSOLE (DEVICE_CONSOLE (d));
1544 input_fd = CONSOLE_TTY_DATA (con)->infd;
1545 output_fd = CONSOLE_TTY_DATA (con)->outfd;
1547 emacs_get_tty (input_fd, &CONSOLE_TTY_DATA (con)->old_tty);
1548 tty = CONSOLE_TTY_DATA (con)->old_tty;
1550 con->tty_erase_char = Qnil;
1552 #if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
1553 /* after all those years... */
1554 con->tty_erase_char = make_char (tty.main.c_cc[VERASE]);
1556 /* This allows meta to be sent on 8th bit. */
1557 tty.main.c_iflag &= ~INPCK; /* don't check input for parity */
1559 tty.main.c_iflag |= (IGNBRK); /* Ignore break condition */
1560 tty.main.c_iflag &= ~ICRNL; /* Disable map of CR to NL on input */
1562 tty.main.c_iflag &= ~ISTRIP; /* don't strip 8th bit on input */
1564 tty.main.c_lflag &= ~ECHO; /* Disable echo */
1565 tty.main.c_lflag &= ~ICANON; /* Disable erase/kill processing */
1567 tty.main.c_lflag &= ~IEXTEN; /* Disable other editing characters. */
1569 tty.main.c_lflag |= ISIG; /* Enable signals */
1570 if (TTY_FLAGS (con).flow_control)
1572 tty.main.c_iflag |= IXON; /* Enable start/stop output control */
1574 tty.main.c_iflag &= ~IXANY;
1578 tty.main.c_iflag &= ~IXON; /* Disable start/stop output control */
1579 tty.main.c_oflag &= ~ONLCR; /* Disable map of NL to CR-NL
1581 tty.main.c_oflag &= ~TAB3; /* Disable tab expansion */
1583 if (TTY_FLAGS (con).meta_key)
1585 tty.main.c_cflag |= CS8; /* allow 8th bit on input */
1586 tty.main.c_cflag &= ~PARENB;/* Don't check parity */
1589 if (CONSOLE_TTY_DATA (con)->controlling_terminal)
1591 tty.main.c_cc[VINTR] =
1592 CONSOLE_QUIT_CHAR (con); /* C-g (usually) gives SIGINT */
1593 /* Set up C-g for both SIGQUIT and SIGINT.
1594 We don't know which we will get, but we handle both alike
1595 so which one it really gives us does not matter. */
1596 tty.main.c_cc[VQUIT] = CONSOLE_QUIT_CHAR (con);
1600 tty.main.c_cc[VINTR] = _POSIX_VDISABLE;
1601 tty.main.c_cc[VQUIT] = _POSIX_VDISABLE;
1603 tty.main.c_cc[VMIN] = 1; /* Input should wait for at
1605 tty.main.c_cc[VTIME] = 0; /* no matter how long that takes. */
1607 tty.main.c_cc[VSWTCH] = _POSIX_VDISABLE; /* Turn off shell layering use
1610 /* There was some conditionalizing here on (mips or TCATTR), but
1611 I think that's wrong. There was one report of C-y (DSUSP) not being
1612 disabled on HP9000s700 systems, and this might fix it. */
1614 tty.main.c_cc[VSUSP] = _POSIX_VDISABLE; /* Turn off mips handling of C-z. */
1617 tty.main.c_cc[V_DSUSP] = _POSIX_VDISABLE; /* Turn off mips handling of C-y. */
1618 #endif /* V_DSUSP */
1619 #ifdef VDSUSP /* Some systems have VDSUSP, some have V_DSUSP. */
1620 tty.main.c_cc[VDSUSP] = _POSIX_VDISABLE;
1623 tty.main.c_cc[VLNEXT] = _POSIX_VDISABLE;
1626 tty.main.c_cc[VREPRINT] = _POSIX_VDISABLE;
1627 #endif /* VREPRINT */
1629 tty.main.c_cc[VWERASE] = _POSIX_VDISABLE;
1630 #endif /* VWERASE */
1632 tty.main.c_cc[VDISCARD] = _POSIX_VDISABLE;
1633 #endif /* VDISCARD */
1635 tty.main.c_cc[VSTART] = _POSIX_VDISABLE;
1638 tty.main.c_cc[VSTRT] = _POSIX_VDISABLE; /* called VSTRT on some systems */
1641 tty.main.c_cc[VSTOP] = _POSIX_VDISABLE;
1643 #ifdef SET_LINE_DISCIPLINE
1644 /* Need to explicitly request TERMIODISC line discipline or
1645 Ultrix's termios does not work correctly. */
1646 tty.main.c_line = SET_LINE_DISCIPLINE;
1651 /* AIX enhanced edit loses NULs, so disable it. */
1652 tty.main.c_line = 0;
1653 tty.main.c_iflag &= ~ASCEDIT;
1655 tty.main.c_cc[VSTRT] = 255;
1656 tty.main.c_cc[VSTOP] = 255;
1657 tty.main.c_cc[VSUSP] = 255;
1658 tty.main.c_cc[VDSUSP] = 255;
1659 #endif /* IBMR2AIX */
1660 /* Also, PTY overloads NUL and BREAK.
1661 don't ignore break, but don't signal either, so it looks like NUL.
1662 This really serves a purpose only if running in an XTERM window
1663 or via TELNET or the like, but does no harm elsewhere. */
1664 tty.main.c_iflag &= ~IGNBRK;
1665 tty.main.c_iflag &= ~BRKINT;
1667 #else /* if not HAVE_TERMIO */
1668 #if !defined (WIN32_NATIVE)
1669 con->tty_erase_char = make_char (tty.main.sg_erase);
1670 tty.main.sg_flags &= ~(ECHO | CRMOD | XTABS);
1671 if (TTY_FLAGS (con).meta_key)
1672 tty.main.sg_flags |= ANYP;
1673 /* #### should we be using RAW mode here? */
1674 tty.main.sg_flags |= /* interrupt_input ? RAW : */ CBREAK;
1675 #endif /* not WIN32_NATIVE */
1676 #endif /* not HAVE_TERMIO */
1678 /* If going to use CBREAK mode, we must request C-g to interrupt
1679 and turn off start and stop chars, etc. If not going to use
1680 CBREAK mode, do this anyway so as to turn off local flow
1681 control for user coming over network on 4.2; in this case,
1682 only t_stopc and t_startc really matter. */
1685 /* Note: if not using CBREAK mode, it makes no difference how we
1687 tty.tchars = new_tchars;
1688 tty.tchars.t_intrc = CONSOLE_QUIT_CHAR (con);
1689 if (TTY_FLAGS (con).flow_control)
1691 tty.tchars.t_startc = '\021';
1692 tty.tchars.t_stopc = '\023';
1695 tty.lmode = LDECCTQ | LLITOUT | LPASS8 | LNOFLSH |
1696 CONSOLE_TTY_DATA (con)->old_tty.lmode;
1698 #if defined (ultrix) || defined (__bsdi__)
1699 /* Under Ultrix 4.2a, leaving this out doesn't seem to hurt
1700 anything, and leaving it in breaks the meta key. Go figure. */
1701 /* Turning off ONLCR is enough under BSD/386. Leave the general
1702 output post-processing flag alone since for some reason it
1703 doesn't get reset after XEmacs goes away. */
1704 tty.lmode &= ~LLITOUT;
1707 #endif /* HAVE_TCHARS */
1708 #endif /* not HAVE_TERMIO */
1711 tty.ltchars = new_ltchars;
1712 #endif /* HAVE_LTCHARS */
1714 emacs_set_tty (input_fd, &tty, 0);
1716 /* This code added to insure that, if flow-control is not to be used,
1717 we have an unlocked terminal at the start. */
1720 if (!TTY_FLAGS (con).flow_control) ioctl (input_fd, TCXONC, 1);
1723 if (!TTY_FLAGS (con).flow_control) ioctl (input_fd, TIOCSTART, 0);
1726 #if defined (HAVE_TERMIOS) || defined (HPUX9)
1728 if (!TTY_FLAGS (con).flow_control) tcflow (input_fd, TCOON);
1735 /* IBM's HFT device usually thinks a ^J should be LF/CR.
1736 We need it to be only LF. This is the way that is
1740 if (ioctl (output_fd, HFTGETID, &tty) != -1)
1741 write (output_fd, "\033[20l", 5);
1746 #if 0 /* We do our own buffering with lstreams. */
1748 /* This symbol is defined on recent USG systems.
1749 Someone says without this call USG won't really buffer the file
1750 even with a call to setbuf. */
1751 setvbuf (CONSOLE_TTY_DATA (con)->outfd, (char *) _sobuf, _IOFBF, sizeof _sobuf);
1753 setbuf (CONSOLE_TTY_DATA (con)->outfd, (char *) _sobuf);
1756 set_tty_modes (con);
1759 #endif /* HAVE_TTY */
1762 init_one_device (struct device *d)
1765 if (DEVICE_TTY_P (d))
1766 tty_init_sys_modes_on_device (d);
1768 #if defined(SIGIO) && !defined(BROKEN_SIGIO)
1769 if (!DEVICE_STREAM_P (d))
1771 init_sigio_on_device (d);
1772 request_sigio_on_device (d);
1778 init_one_console (struct console *con)
1780 Lisp_Object devcons;
1782 CONSOLE_DEVICE_LOOP (devcons, con)
1784 struct device *d = XDEVICE (XCAR (devcons));
1786 init_one_device (d);
1791 reinit_initial_console (void)
1793 munge_process_groups ();
1794 if (CONSOLEP (Vcontrolling_terminal) &&
1795 CONSOLE_LIVE_P (XCONSOLE (Vcontrolling_terminal)))
1796 init_one_console (XCONSOLE (Vcontrolling_terminal));
1800 /* ------------------------------------------------------ */
1801 /* Other TTY functions */
1802 /* ------------------------------------------------------ */
1806 #if 0 /* not currently used */
1808 /* Return nonzero if safe to use tabs in output.
1809 At the time this is called, init_sys_modes has not been done yet. */
1812 tabs_safe_p (struct device *d)
1815 if (DEVICE_TTY_P (d))
1817 struct emacs_tty tty;
1819 emacs_get_tty (DEVICE_INFD (d), &tty);
1820 return EMACS_TTY_TABS_OK (&tty);
1828 /* Get terminal size from system.
1829 Store number of lines into *heightp and width into *widthp.
1830 If zero or a negative number is stored, the value is not valid. */
1833 get_tty_device_size (struct device *d, int *widthp, int *heightp)
1835 int input_fd = DEVICE_INFD (d);
1837 assert (DEVICE_TTY_P (d));
1842 struct winsize size;
1844 if (ioctl (input_fd, TIOCGWINSZ, &size) == -1)
1845 *widthp = *heightp = 0;
1848 *widthp = size.ws_col;
1849 *heightp = size.ws_row;
1852 #elif defined TIOCGSIZE
1854 /* SunOS - style. */
1855 struct ttysize size;
1857 if (ioctl (input_fd, TIOCGSIZE, &size) == -1)
1858 *widthp = *heightp = 0;
1861 *widthp = size.ts_cols;
1862 *heightp = size.ts_lines;
1865 #else /* system doesn't know size */
1870 #endif /* not !TIOCGWINSZ */
1873 #endif /* HAVE_TTY */
1876 /* ------------------------------------------------------ */
1877 /* Is device 8 bit ? */
1878 /* ------------------------------------------------------ */
1883 eight_bit_tty (struct device *d)
1889 assert (DEVICE_TTY_P (d));
1890 input_fd = DEVICE_INFD (d);
1892 emacs_get_tty (input_fd, &s);
1894 #if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
1895 eight_bit = (s.main.c_cflag & CSIZE) == CS8;
1897 eight_bit = 0; /* I don't know how to do it */
1902 #endif /* HAVE_TTY */
1905 /* ------------------------------------------------------ */
1906 /* Resetting a device */
1907 /* ------------------------------------------------------ */
1911 /* Prepare the terminal for exiting Emacs; move the cursor to the
1912 bottom of the frame, turn off interrupt-driven I/O, etc. */
1914 tty_reset_sys_modes_on_device (struct device *d)
1916 int input_fd, output_fd;
1917 struct console *con = XCONSOLE (DEVICE_CONSOLE (d));
1919 input_fd = CONSOLE_TTY_DATA (con)->infd;
1920 output_fd = CONSOLE_TTY_DATA (con)->outfd;
1922 #if defined (IBMR2AIX) && defined (AIXHFT)
1924 /* HFT consoles normally use ^J as a LF/CR. We forced it to
1925 do the LF only. Now, we need to reset it. */
1928 if (ioctl (output_fd, HFTGETID, &tty) != -1)
1929 write (output_fd, "\033[20h", 5);
1933 tty_redisplay_shutdown (con);
1934 /* reset_tty_modes() flushes the connection at its end. */
1935 reset_tty_modes (con);
1938 /* Avoid possible loss of output when changing terminal modes. */
1942 while (emacs_set_tty (input_fd, &CONSOLE_TTY_DATA (con)->old_tty, 0)
1943 < 0 && errno == EINTR)
1946 #ifdef SET_LINE_DISCIPLINE
1947 /* Ultrix's termios *ignores* any line discipline except TERMIODISC.
1948 A different old line discipline is therefore not restored, yet.
1949 Restore the old line discipline by hand. */
1950 ioctl (input_fd, TIOCSETD, &old_tty.main.c_line);
1959 #endif /* HAVE_TTY */
1962 reset_one_device (struct device *d)
1965 if (DEVICE_TTY_P (d))
1966 tty_reset_sys_modes_on_device (d);
1969 if (DEVICE_STREAM_P (d))
1970 fflush (CONSOLE_STREAM_DATA (XCONSOLE (DEVICE_CONSOLE (d)))->out);
1971 #if defined(SIGIO) && !defined(BROKEN_SIGIO)
1972 if (!DEVICE_STREAM_P (d))
1974 unrequest_sigio_on_device (d);
1975 reset_sigio_on_device (d);
1981 reset_one_console (struct console *con)
1983 /* Note: this can be called during GC. */
1984 Lisp_Object devcons;
1986 CONSOLE_DEVICE_LOOP (devcons, con)
1988 struct device *d = XDEVICE (XCAR (devcons));
1990 reset_one_device (d);
1995 reset_all_consoles (void)
1997 /* Note: this can be called during GC. */
1998 Lisp_Object concons;
2000 CONSOLE_LOOP (concons)
2002 struct console *con = XCONSOLE (XCAR (concons));
2004 reset_one_console (con);
2007 unmunge_process_groups ();
2011 reset_initial_console (void)
2013 if (CONSOLEP (Vcontrolling_terminal) &&
2014 CONSOLE_LIVE_P (XCONSOLE (Vcontrolling_terminal)))
2015 reset_one_console (XCONSOLE (Vcontrolling_terminal));
2016 unmunge_process_groups ();
2020 /* ------------------------------------------------------ */
2021 /* extra TTY stuff under AIX */
2022 /* ------------------------------------------------------ */
2026 /* Called from init_sys_modes. */
2028 hft_init (struct console *con)
2033 assert (CONSOLE_TTY_P (con));
2034 input_fd = CONSOLE_TTY_DATA (con)->infd;
2036 /* If we're not on an HFT we shouldn't do any of this. We determine
2037 if we are on an HFT by trying to get an HFT error code. If this
2038 call fails, we're not on an HFT. */
2040 if (ioctl (input_fd, HFQERROR, &junk) < 0)
2042 #else /* not IBMR2AIX */
2043 if (ioctl (input_fd, HFQEIO, 0) < 0)
2045 #endif /* not IBMR2AIX */
2047 /* On AIX the default hft keyboard mapping uses backspace rather than delete
2048 as the rubout key's ASCII code. Here this is changed. The bug is that
2049 there's no way to determine the old mapping, so in reset_one_console
2050 we need to assume that the normal map had been present. Of course, this
2051 code also doesn't help if on a terminal emulator which doesn't understand
2055 struct hfkeymap keymap;
2057 buf.hf_bufp = (char *)&keymap;
2058 buf.hf_buflen = sizeof (keymap);
2059 keymap.hf_nkeys = 2;
2060 keymap.hfkey[0].hf_kpos = 15;
2061 keymap.hfkey[0].hf_kstate = HFMAPCHAR | HFSHFNONE;
2063 keymap.hfkey[0].hf_keyidh = '<';
2064 #else /* not IBMR2AIX */
2065 keymap.hfkey[0].hf_page = '<';
2066 #endif /* not IBMR2AIX */
2067 keymap.hfkey[0].hf_char = 127;
2068 keymap.hfkey[1].hf_kpos = 15;
2069 keymap.hfkey[1].hf_kstate = HFMAPCHAR | HFSHFSHFT;
2071 keymap.hfkey[1].hf_keyidh = '<';
2072 #else /* not IBMR2AIX */
2073 keymap.hfkey[1].hf_page = '<';
2074 #endif /* not IBMR2AIX */
2075 keymap.hfkey[1].hf_char = 127;
2076 hftctl (input_fd, HFSKBD, &buf);
2078 /* #### Should probably set a console TTY flag here. */
2080 /* The HFT system on AIX doesn't optimize for scrolling, so it's really ugly
2082 line_ins_del_ok = char_ins_del_ok = 0;
2086 /* Reset the rubout key to backspace. */
2089 hft_reset (struct console *con)
2092 struct hfkeymap keymap;
2096 assert (CONSOLE_TTY_P (con));
2097 input_fd = CONSOLE_TTY_DATA (con)->infd;
2100 if (ioctl (input_fd, HFQERROR, &junk) < 0)
2102 #else /* not IBMR2AIX */
2103 if (ioctl (input_fd, HFQEIO, 0) < 0)
2105 #endif /* not IBMR2AIX */
2107 buf.hf_bufp = (char *)&keymap;
2108 buf.hf_buflen = sizeof (keymap);
2109 keymap.hf_nkeys = 2;
2110 keymap.hfkey[0].hf_kpos = 15;
2111 keymap.hfkey[0].hf_kstate = HFMAPCHAR | HFSHFNONE;
2113 keymap.hfkey[0].hf_keyidh = '<';
2114 #else /* not IBMR2AIX */
2115 keymap.hfkey[0].hf_page = '<';
2116 #endif /* not IBMR2AIX */
2117 keymap.hfkey[0].hf_char = 8;
2118 keymap.hfkey[1].hf_kpos = 15;
2119 keymap.hfkey[1].hf_kstate = HFMAPCHAR | HFSHFSHFT;
2121 keymap.hfkey[1].hf_keyidh = '<';
2122 #else /* not IBMR2AIX */
2123 keymap.hfkey[1].hf_page = '<';
2124 #endif /* not IBMR2AIX */
2125 keymap.hfkey[1].hf_char = 8;
2126 hftctl (input_fd, HFSKBD, &buf);
2132 /************************************************************************/
2133 /* limits of text/data segments */
2134 /************************************************************************/
2136 #if !defined(CANNOT_DUMP) && !defined(PDUMP)
2140 #ifndef SYSTEM_MALLOC
2147 /* Some systems that cannot dump also cannot implement these. */
2150 * Return the address of the start of the text segment prior to
2151 * doing an unexec. After unexec the return value is undefined.
2152 * See crt0.c for further explanation and _start.
2156 #if !defined(HAVE_TEXT_START) && !defined(PDUMP)
2158 EXTERN_C int _start (void);
2161 start_of_text (void)
2164 return (char *) TEXT_START;
2166 return (char *) _start;
2167 #endif /* TEXT_START */
2169 #endif /* !defined(HAVE_TEXT_START) && !defined(PDUMP) */
2172 * Return the address of the start of the data segment prior to
2173 * doing an unexec. After unexec the return value is undefined.
2174 * See ecrt0.c for further information and definition of data_start.
2176 * Apparently, on BSD systems this is etext at startup. On
2177 * USG systems (swapping) this is highly mmu dependent and
2178 * is also dependent on whether or not the program is running
2179 * with shared text. Generally there is a (possibly large)
2180 * gap between end of text and start of data with shared text.
2182 * On Uniplus+ systems with shared text, data starts at a
2183 * fixed address. Each port (from a given oem) is generally
2184 * different, and the specific value of the start of data can
2185 * be obtained via the UniPlus+ specific "uvar" system call,
2186 * however the method outlined in crt0.c seems to be more portable.
2188 * Probably what will have to happen when a USG unexec is available,
2189 * at least on UniPlus, is temacs will have to be made unshared so
2190 * that text and data are contiguous. Then once loadup is complete,
2191 * unexec will produce a shared executable where the data can be
2192 * at the normal shared text boundary and the startofdata variable
2193 * will be patched by unexec to the correct value.
2197 #if defined(ORDINARY_LINK) && !defined(MINGW)
2198 extern char **environ;
2202 start_of_data (void)
2205 return ((char *) DATA_START);
2207 #if defined (ORDINARY_LINK) || defined(PDUMP)
2209 * This is a hack. Since we're not linking crt0.c or pre_crt0.c,
2210 * data_start isn't defined. We take the address of environ, which
2211 * is known to live at or near the start of the system crt0.c, and
2212 * we don't sweat the handful of bytes that might lose.
2214 #if defined (HEAP_IN_DATA) && !defined(PDUMP)
2215 extern char* static_heap_base;
2217 return static_heap_base;
2219 return((char *) &environ);
2221 extern int data_start;
2222 return ((char *) &data_start);
2223 #endif /* ORDINARY_LINK */
2224 #endif /* DATA_START */
2226 #endif /* NEED_STARTS (not CANNOT_DUMP or not SYSTEM_MALLOC) */
2228 #if !defined(CANNOT_DUMP) && !defined(PDUMP)
2229 /* Some systems that cannot dump also cannot implement these. */
2232 * Return the address of the end of the text segment prior to
2233 * doing an unexec. After unexec the return value is undefined.
2240 return ((char *) TEXT_END);
2243 return ((char *) &etext);
2248 * Return the address of the end of the data segment prior to
2249 * doing an unexec. After unexec the return value is undefined.
2256 return ((char *) DATA_END);
2259 return ((char *) &edata);
2263 #endif /* !defined(CANNOT_DUMP) && !defined(PDUMP) */
2266 /************************************************************************/
2267 /* get the system name */
2268 /************************************************************************/
2270 /* init_system_name sets up the string for the Lisp function
2271 system-name to return. */
2273 extern Lisp_Object Vsystem_name;
2276 init_system_name (void)
2278 #if defined (WIN32_NATIVE)
2279 char hostname [MAX_COMPUTERNAME_LENGTH + 1];
2280 size_t size = sizeof (hostname);
2281 GetComputerName (hostname, &size);
2282 Vsystem_name = build_string (hostname);
2283 #elif !defined (HAVE_GETHOSTNAME)
2286 Vsystem_name = build_string (uts.nodename);
2287 #else /* HAVE_GETHOSTNAME */
2288 unsigned int hostname_size = 256;
2289 char *hostname = (char *) alloca (hostname_size);
2291 /* Try to get the host name; if the buffer is too short, try
2292 again. Apparently, the only indication gethostname gives of
2293 whether the buffer was large enough is the presence or absence
2294 of a '\0' in the string. Eech. */
2297 gethostname (hostname, hostname_size - 1);
2298 hostname[hostname_size - 1] = '\0';
2300 /* Was the buffer large enough for the '\0'? */
2301 if (strlen (hostname) < (size_t) (hostname_size - 1))
2304 hostname_size <<= 1;
2305 hostname = (char *) alloca (hostname_size);
2307 # if defined( HAVE_SOCKETS) && !defined(BROKEN_CYGWIN)
2308 /* Turn the hostname into the official, fully-qualified hostname.
2309 Don't do this if we're going to dump; this can confuse system
2310 libraries on some machines and make the dumped emacs core dump. */
2311 # ifndef CANNOT_DUMP
2313 # endif /* not CANNOT_DUMP */
2314 if (!strchr (hostname, '.'))
2316 # if !(defined(HAVE_GETADDRINFO) && defined(HAVE_GETNAMEINFO))
2317 struct hostent *hp = NULL;
2320 for (count = 0; count < 10; count++)
2324 /* Some systems can't handle SIGALARM/SIGIO in gethostbyname(). */
2326 hp = gethostbyname (hostname);
2327 start_interrupts ();
2329 if (! (hp == 0 && h_errno == TRY_AGAIN))
2331 Fsleep_for (make_int (1));
2336 const char *fqdn = (const char *) hp->h_name;
2338 if (!strchr (fqdn, '.'))
2340 /* We still don't have a fully qualified domain name.
2341 Try to find one in the list of alternate names */
2342 char **alias = hp->h_aliases;
2343 while (*alias && !strchr (*alias, '.'))
2348 hostname = (char *) alloca (strlen (fqdn) + 1);
2349 strcpy (hostname, fqdn);
2351 # else /* !(HAVE_GETADDRINFO && HAVE_GETNAMEINFO) */
2352 struct addrinfo hints, *res;
2355 hints.ai_flags = AI_CANONNAME;
2356 hints.ai_family = AF_UNSPEC;
2357 hints.ai_socktype = SOCK_STREAM;
2358 hints.ai_protocol = 0;
2359 if (!getaddrinfo (hostname, NULL, &hints, &res))
2361 hostname = (char *) alloca (strlen (res->ai_canonname) + 1);
2362 strcpy (hostname, res->ai_canonname);
2366 # endif /* !(HAVE_GETADDRINFO && HAVE_GETNAMEINFO) */
2368 # endif /* HAVE_SOCKETS */
2369 Vsystem_name = build_string (hostname);
2370 #endif /* HAVE_GETHOSTNAME */
2375 for (i = 0, p = XSTRING_DATA (Vsystem_name);
2376 i < XSTRING_LENGTH (Vsystem_name);
2379 if (*p == ' ' || *p == '\t')
2386 /************************************************************************/
2387 /* Emulation of select() */
2388 /************************************************************************/
2392 ERROR: XEmacs requires a working select().
2394 #endif /* not HAVE_SELECT */
2397 /************************************************************************/
2398 /* Emulation of signal stuff */
2399 /************************************************************************/
2401 /* BSD 4.1 crap deleted. 4.2 was released in 1983, for God's sake! I
2402 can't imagine that anyone is actually running that OS any more.
2403 You can't use X under it (I think) because there's no select().
2404 Anyway, the signal stuff has all been changed. If someone wants to
2405 get this stuff working again, look in the FSF Emacs sources. */
2407 /* POSIX signals support - DJB */
2409 #ifdef HAVE_SIGPROCMASK
2411 /* #### Is there any reason this is static global rather than local? */
2412 static struct sigaction new_action, old_action;
2415 sys_do_signal (int signal_number, signal_handler_t action)
2419 /* XEmacs works better if system calls are *not* restarted.
2420 This allows C-g to interrupt reads and writes, on most systems.
2422 #### Another possibility is to just longjmp() out of the signal
2423 handler. According to W.R. Stevens, this should be OK on all
2424 systems. However, I don't want to deal with the potential
2425 evil ramifications of this at this point. */
2428 /* This gets us restartable system calls for efficiency.
2429 The "else" code will work as well. */
2430 return (berk_signal (signal_number, action));
2432 sigemptyset (&new_action.sa_mask);
2433 new_action.sa_handler = action;
2434 #if defined (SA_RESTART)
2435 /* Emacs mostly works better with restartable system services. If this
2436 * flag exists, we probably want to turn it on here.
2438 new_action.sa_flags = SA_RESTART;
2440 new_action.sa_flags = 0;
2442 sigaction (signal_number, &new_action, &old_action);
2443 return (old_action.sa_handler);
2448 sigemptyset (&new_action.sa_mask);
2449 new_action.sa_handler = action;
2450 #if defined (SA_INTERRUPT) /* don't restart system calls, under SunOS */
2451 new_action.sa_flags = SA_INTERRUPT;
2453 new_action.sa_flags = 0;
2455 sigaction (signal_number, &new_action, &old_action);
2456 return (signal_handler_t) (old_action.sa_handler);
2461 #elif defined (HAVE_SIGBLOCK)
2463 /* We use sigvec() rather than signal() if we have it, because
2464 it lets us specify interruptible system calls. */
2466 sys_do_signal (int signal_number, signal_handler_t action)
2468 struct sigvec vec, ovec;
2470 vec.sv_handler = action;
2472 #ifdef SV_INTERRUPT /* don't restart system calls */
2473 vec.sv_flags = SV_INTERRUPT;
2478 sigvec (signal_number, &vec, &ovec);
2480 return (ovec.sv_handler);
2483 #endif /* HAVE_SIGBLOCK (HAVE_SIGPROCMASK) */
2486 /************************************************************************/
2487 /* Emulation of strerror() and errno support */
2488 /************************************************************************/
2490 #ifndef HAVE_STRERROR
2492 #if !defined(NeXT) && !defined(__alpha) && !defined(MACH) && !defined(LINUX) && !defined(IRIX) && !defined(__NetBSD__)
2493 /* Linux added here by Raymond L. Toy <toy@alydar.crd.ge.com> for XEmacs. */
2494 /* Irix added here by gparker@sni-usa.com for XEmacs. */
2495 /* NetBSD added here by James R Grinter <jrg@doc.ic.ac.uk> for XEmacs */
2496 extern const char *sys_errlist[];
2497 extern int sys_nerr;
2501 extern char *sys_errlist[];
2502 extern int sys_nerr;
2507 strerror (int errnum)
2509 if (errnum >= 0 && errnum < sys_nerr)
2510 return sys_errlist[errnum];
2511 return ((const char *) GETTEXT ("Unknown error"));
2514 #endif /* ! HAVE_STRERROR */
2519 unsigned long oscode; /* Win32 error */
2520 int errnocode; /* unix errno */
2523 static struct errentry errtable[] = {
2524 { ERROR_INVALID_FUNCTION, EINVAL }, /* 1 */
2525 { ERROR_FILE_NOT_FOUND, ENOENT }, /* 2 */
2526 { ERROR_PATH_NOT_FOUND, ENOENT }, /* 3 */
2527 { ERROR_TOO_MANY_OPEN_FILES, EMFILE }, /* 4 */
2528 { ERROR_ACCESS_DENIED, EACCES }, /* 5 */
2529 { ERROR_INVALID_HANDLE, EBADF }, /* 6 */
2530 { ERROR_ARENA_TRASHED, ENOMEM }, /* 7 */
2531 { ERROR_NOT_ENOUGH_MEMORY, ENOMEM }, /* 8 */
2532 { ERROR_INVALID_BLOCK, ENOMEM }, /* 9 */
2533 { ERROR_BAD_ENVIRONMENT, E2BIG }, /* 10 */
2534 { ERROR_BAD_FORMAT, ENOEXEC }, /* 11 */
2535 { ERROR_INVALID_ACCESS, EINVAL }, /* 12 */
2536 { ERROR_INVALID_DATA, EINVAL }, /* 13 */
2537 { ERROR_INVALID_DRIVE, ENOENT }, /* 15 */
2538 { ERROR_CURRENT_DIRECTORY, EACCES }, /* 16 */
2539 { ERROR_NOT_SAME_DEVICE, EXDEV }, /* 17 */
2540 { ERROR_NO_MORE_FILES, ENOENT }, /* 18 */
2541 { ERROR_LOCK_VIOLATION, EACCES }, /* 33 */
2542 { ERROR_BAD_NETPATH, ENOENT }, /* 53 */
2543 { ERROR_NETWORK_ACCESS_DENIED, EACCES }, /* 65 */
2544 { ERROR_BAD_NET_NAME, ENOENT }, /* 67 */
2545 { ERROR_FILE_EXISTS, EEXIST }, /* 80 */
2546 { ERROR_CANNOT_MAKE, EACCES }, /* 82 */
2547 { ERROR_FAIL_I24, EACCES }, /* 83 */
2548 { ERROR_INVALID_PARAMETER, EINVAL }, /* 87 */
2549 { ERROR_NO_PROC_SLOTS, EAGAIN }, /* 89 */
2550 { ERROR_DRIVE_LOCKED, EACCES }, /* 108 */
2551 { ERROR_BROKEN_PIPE, EPIPE }, /* 109 */
2552 { ERROR_DISK_FULL, ENOSPC }, /* 112 */
2553 { ERROR_INVALID_TARGET_HANDLE, EBADF }, /* 114 */
2554 { ERROR_INVALID_HANDLE, EINVAL }, /* 124 */
2555 { ERROR_WAIT_NO_CHILDREN, ECHILD }, /* 128 */
2556 { ERROR_CHILD_NOT_COMPLETE, ECHILD }, /* 129 */
2557 { ERROR_DIRECT_ACCESS_HANDLE, EBADF }, /* 130 */
2558 { ERROR_NEGATIVE_SEEK, EINVAL }, /* 131 */
2559 { ERROR_SEEK_ON_DEVICE, EACCES }, /* 132 */
2560 { ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, /* 145 */
2561 { ERROR_NOT_LOCKED, EACCES }, /* 158 */
2562 { ERROR_BAD_PATHNAME, ENOENT }, /* 161 */
2563 { ERROR_MAX_THRDS_REACHED, EAGAIN }, /* 164 */
2564 { ERROR_LOCK_FAILED, EACCES }, /* 167 */
2565 { ERROR_ALREADY_EXISTS, EEXIST }, /* 183 */
2566 { ERROR_FILENAME_EXCED_RANGE, ENOENT }, /* 206 */
2567 { ERROR_NESTING_NOT_ALLOWED, EAGAIN }, /* 215 */
2568 { ERROR_NOT_ENOUGH_QUOTA, ENOMEM } /* 1816 */
2571 /* The following two constants must be the minimum and maximum
2572 values in the (contiguous) range of Exec Failure errors. */
2573 #define MIN_EXEC_ERROR ERROR_INVALID_STARTING_CODESEG
2574 #define MAX_EXEC_ERROR ERROR_INFLOOP_IN_RELOC_CHAIN
2576 /* These are the low and high value in the range of errors that are
2577 access violations */
2578 #define MIN_EACCES_RANGE ERROR_WRITE_PROTECT
2579 #define MAX_EACCES_RANGE ERROR_SHARING_BUFFER_EXCEEDED
2582 mswindows_set_errno (unsigned long win32_error)
2586 /* check the table for the OS error code */
2587 for (i = 0; i < countof (errtable); ++i)
2589 if (win32_error == errtable[i].oscode)
2591 errno = errtable[i].errnocode;
2596 /* The error code wasn't in the table. We check for a range of
2597 * EACCES errors or exec failure errors (ENOEXEC). Otherwise EINVAL is
2599 if (win32_error >= MIN_EACCES_RANGE && win32_error <= MAX_EACCES_RANGE)
2601 else if (win32_error >= MIN_EXEC_ERROR && win32_error <= MAX_EXEC_ERROR)
2608 mswindows_set_last_errno (void)
2610 mswindows_set_errno (GetLastError ());
2613 #endif /* WIN32_NATIVE */
2616 /************************************************************************/
2617 /* Encapsulations of system calls */
2618 /************************************************************************/
2620 #define PATHNAME_CONVERT_OUT(path) \
2621 TO_EXTERNAL_FORMAT (C_STRING, (path), C_STRING_ALLOCA, (path), Qfile_name);
2623 /***************** low-level calls ****************/
2626 * On USG systems the system calls are INTERRUPTIBLE by signals
2627 * that the user program has elected to catch. Thus the system call
2628 * must be retried in these cases. To handle this without massive
2629 * changes in the source code, we remap the standard system call names
2630 * to names for our own functions in sysdep.c that do the system call
2631 * with retries. Actually, for portability reasons, it is good
2632 * programming practice, as this example shows, to limit all actual
2633 * system calls to a single occurrence in the source. Sure, this
2634 * adds an extra level of function call overhead but it is almost
2635 * always negligible. Fred Fish, Unisoft Systems Inc.
2638 /* Ben sez: read Dick Gabriel's essay about the Worse Is Better
2639 approach to programming and its connection to the silly
2640 interruptible-system-call business. To find it, look on
2641 Jamie's home page (http://www.jwz.org/worse-is-better.html). */
2643 #ifdef ENCAPSULATE_OPEN
2645 sys_open (const char *path, int oflag, ...)
2650 va_start (ap, oflag);
2651 mode = va_arg (ap, int);
2654 PATHNAME_CONVERT_OUT (path);
2657 /* Make all handles non-inheritable */
2658 oflag |= _O_NOINHERIT;
2661 #ifdef INTERRUPTIBLE_OPEN
2664 while ((rtnval = open (path, oflag, mode)) == -1
2665 && (errno == EINTR))
2670 return open (path, oflag, mode);
2673 #endif /* ENCAPSULATE_OPEN */
2675 /* Like sys_open, only when open() is interrupted by EINTR, check for
2676 QUIT. This allows the callers of this function to be interrupted
2677 with C-g when, say, reading from named pipes. However, this should
2678 be used with caution, as it can GC.
2680 This function will not function as expected on systems where open()
2681 is not interrupted by C-g. However, the worst that can happen is
2682 the fallback to simple open(). */
2684 interruptible_open (const char *path, int oflag, int mode)
2686 /* This function can GC */
2687 size_t len = strlen (path);
2688 char *nonreloc = (char *) alloca (len + 1);
2690 /* Must copy PATH, because it might be the data of a Lisp_String,
2691 which could be relocated by GC when checking for QUIT. */
2692 memcpy (nonreloc, path, len + 1);
2694 PATHNAME_CONVERT_OUT (nonreloc);
2697 /* Make all handles non-inheritable */
2698 oflag |= _O_NOINHERIT;
2703 int rtnval = open (nonreloc, oflag, mode);
2704 if (!(rtnval == -1 && errno == EINTR))
2706 /* open() was interrupted. Was QUIT responsible? */
2711 #ifdef ENCAPSULATE_CLOSE
2713 sys_close (int filedes)
2715 #ifdef INTERRUPTIBLE_CLOSE
2717 REGISTER int rtnval;
2719 while ((rtnval = close (filedes)) == -1
2720 && (errno == EINTR))
2723 /* If close is interrupted SunOS 4.1 may or may not have closed the
2724 file descriptor. If it did the second close will fail with
2725 errno = EBADF. That means we have succeeded. */
2726 if (rtnval == -1 && did_retry && errno == EBADF)
2731 return close (filedes);
2734 #endif /* ENCAPSULATE_CLOSE */
2737 sys_read_1 (int fildes, void *buf, size_t nbyte, int allow_quit)
2741 /* No harm in looping regardless of the INTERRUPTIBLE_IO setting. */
2742 while ((rtnval = read (fildes, buf, nbyte)) == -1
2743 && (errno == EINTR))
2751 #ifdef ENCAPSULATE_READ
2753 sys_read (int fildes, void *buf, size_t nbyte)
2755 return sys_read_1 (fildes, buf, nbyte, 0);
2757 #endif /* ENCAPSULATE_READ */
2760 sys_write_1 (int fildes, const void *buf, size_t nbyte, int allow_quit)
2762 ssize_t bytes_written = 0;
2763 const char *b = (const char *) buf;
2765 /* No harm in looping regardless of the INTERRUPTIBLE_IO setting. */
2768 ssize_t rtnval = write (fildes, b, nbyte);
2778 return bytes_written ? bytes_written : -1;
2782 bytes_written += rtnval;
2784 return bytes_written;
2787 #ifdef ENCAPSULATE_WRITE
2789 sys_write (int fildes, const void *buf, size_t nbyte)
2791 return sys_write_1 (fildes, buf, nbyte, 0);
2793 #endif /* ENCAPSULATE_WRITE */
2796 /**************** stdio calls ****************/
2798 /* There is at least some evidence that the stdio calls are interruptible
2799 just like the normal system calls, at least on some systems. In any
2800 case, it doesn't hurt to encapsulate them. */
2802 /* #### Should also encapsulate fflush().
2803 #### Should conceivably encapsulate getchar() etc. What a pain! */
2805 #ifdef ENCAPSULATE_FOPEN
2807 sys_fopen (const char *path, const char *type)
2809 PATHNAME_CONVERT_OUT (path);
2810 #if defined (WIN32_NATIVE)
2814 const char * type_save = type;
2816 /* Force all file handles to be non-inheritable. This is necessary to
2817 ensure child processes don't unwittingly inherit handles that might
2818 prevent future file access. */
2822 else if (type[0] == 'w' || type[0] == 'a')
2823 oflag = O_WRONLY | O_CREAT | O_TRUNC;
2827 /* Only do simplistic option parsing. */
2831 oflag &= ~(O_RDONLY | O_WRONLY);
2834 else if (type[0] == 'b')
2839 else if (type[0] == 't')
2846 fd = open (path, oflag | _O_NOINHERIT, 0644);
2850 return _fdopen (fd, type_save);
2852 #elif defined (INTERRUPTIBLE_OPEN)
2855 while (!(rtnval = fopen (path, type)) && (errno == EINTR))
2860 return fopen (path, type);
2863 #endif /* ENCAPSULATE_FOPEN */
2866 #ifdef ENCAPSULATE_FCLOSE
2868 sys_fclose (FILE *stream)
2870 #ifdef INTERRUPTIBLE_CLOSE
2873 while ((rtnval = fclose (stream)) == EOF
2874 && (errno == EINTR))
2878 return fclose (stream);
2881 #endif /* ENCAPSULATE_FCLOSE */
2884 #ifdef ENCAPSULATE_FREAD
2886 sys_fread (void *ptr, size_t size, size_t nitem, FILE *stream)
2888 #ifdef INTERRUPTIBLE_IO
2890 size_t items_read = 0;
2891 char *b = (char *) ptr;
2895 rtnval = fread (b, size, nitem, stream);
2898 if (ferror (stream) && errno == EINTR)
2905 items_read += rtnval;
2907 return (items_read);
2909 return fread (ptr, size, nitem, stream);
2912 #endif /* ENCAPSULATE_FREAD */
2915 #ifdef ENCAPSULATE_FWRITE
2917 sys_fwrite (const void *ptr, size_t size, size_t nitem, FILE *stream)
2919 #ifdef INTERRUPTIBLE_IO
2921 size_t items_written = 0;
2922 const char *b = (const char *) ptr;
2926 rtnval = fwrite (b, size, nitem, stream);
2929 if (ferror (stream) && errno == EINTR)
2932 return items_written;
2936 items_written += rtnval;
2938 return (items_written);
2940 return fwrite (ptr, size, nitem, stream);
2943 #endif /* ENCAPSULATE_FWRITE */
2946 /********************* directory calls *******************/
2948 #ifdef ENCAPSULATE_CHDIR
2950 sys_chdir (const char *path)
2952 PATHNAME_CONVERT_OUT (path);
2953 return chdir (path);
2955 #endif /* ENCAPSULATE_CHDIR */
2958 #ifdef ENCAPSULATE_MKDIR
2960 sys_mkdir (const char *path, mode_t mode)
2962 PATHNAME_CONVERT_OUT (path);
2964 return mkdir (path);
2966 return mkdir (path, mode);
2969 #endif /* ENCAPSULATE_MKDIR */
2972 #ifdef ENCAPSULATE_OPENDIR
2974 sys_opendir (const char *filename)
2977 PATHNAME_CONVERT_OUT (filename);
2979 while (!(rtnval = opendir (filename))
2980 && (errno == EINTR))
2984 #endif /* ENCAPSULATE_OPENDIR */
2987 #ifdef ENCAPSULATE_READDIR
2989 sys_readdir (DIR *dirp)
2993 /* Apparently setting errno is necessary on some systems?
2994 Maybe readdir() doesn't always set errno ?! */
2995 while (!(errno = 0, rtnval = readdir (dirp))
2996 && (errno == EINTR))
3001 if (rtnval == NULL) /* End of directory */
3004 Extcount external_len;
3005 int ascii_filename_p = 1;
3006 const Extbyte * const external_name = (const Extbyte *) rtnval->d_name;
3008 /* Optimize for the common all-ASCII case, computing len en passant */
3009 for (external_len = 0; external_name[external_len] ; external_len++)
3011 if (!BYTE_ASCII_P (external_name[external_len]))
3012 ascii_filename_p = 0;
3014 if (ascii_filename_p)
3017 { /* Non-ASCII filename */
3018 static Bufbyte_dynarr *internal_DIRENTRY;
3019 const Bufbyte *internal_name;
3020 Bytecount internal_len;
3021 if (!internal_DIRENTRY)
3022 internal_DIRENTRY = Dynarr_new (Bufbyte);
3024 Dynarr_reset (internal_DIRENTRY);
3026 Dynarr_add_many (internal_DIRENTRY, (Bufbyte *) rtnval,
3027 offsetof (DIRENTRY, d_name));
3029 TO_INTERNAL_FORMAT (DATA, (external_name, external_len),
3030 ALLOCA, (internal_name, internal_len),
3033 Dynarr_add_many (internal_DIRENTRY, internal_name, internal_len);
3034 Dynarr_add (internal_DIRENTRY, '\0'); /* NUL-terminate */
3035 return (DIRENTRY *) Dynarr_atp (internal_DIRENTRY, 0);
3040 #endif /* ENCAPSULATE_READDIR */
3043 #ifdef ENCAPSULATE_CLOSEDIR
3045 sys_closedir (DIR *dirp)
3049 while ((rtnval = closedir (dirp)) == -1
3050 && (errno == EINTR))
3054 #endif /* ENCAPSULATE_CLOSEDIR */
3057 #ifdef ENCAPSULATE_RMDIR
3059 sys_rmdir (const char *path)
3061 PATHNAME_CONVERT_OUT (path);
3062 return rmdir (path);
3064 #endif /* ENCAPSULATE_RMDIR */
3067 /***************** file-information calls ******************/
3069 #ifdef ENCAPSULATE_ACCESS
3071 sys_access (const char *path, int mode)
3073 PATHNAME_CONVERT_OUT (path);
3074 return access (path, mode);
3076 #endif /* ENCAPSULATE_ACCESS */
3080 #ifdef ENCAPSULATE_EACCESS
3082 sys_eaccess (const char *path, int mode)
3084 PATHNAME_CONVERT_OUT (path);
3085 return eaccess (path, mode);
3087 #endif /* ENCAPSULATE_EACCESS */
3088 #endif /* HAVE_EACCESS */
3091 #ifdef ENCAPSULATE_LSTAT
3093 sys_lstat (const char *path, struct stat *buf)
3095 PATHNAME_CONVERT_OUT (path);
3096 return lstat (path, buf);
3098 #endif /* ENCAPSULATE_LSTAT */
3101 #ifdef ENCAPSULATE_READLINK
3103 sys_readlink (const char *path, char *buf, size_t bufsiz)
3105 PATHNAME_CONVERT_OUT (path);
3106 /* #### currently we don't do conversions on the incoming data */
3107 return readlink (path, buf, bufsiz);
3109 #endif /* ENCAPSULATE_READLINK */
3111 #ifdef ENCAPSULATE_FSTAT
3113 sys_fstat (int fd, struct stat *buf)
3116 return mswindows_fstat (fd, buf);
3118 return fstat (fd, buf);
3121 #endif /* ENCAPSULATE_FSTAT */
3124 xemacs_stat (const char *path, struct stat *buf)
3126 PATHNAME_CONVERT_OUT (path);
3128 return mswindows_stat (path, buf);
3130 return stat (path, buf);
3134 /****************** file-manipulation calls *****************/
3136 #ifdef ENCAPSULATE_CHMOD
3138 sys_chmod (const char *path, mode_t mode)
3140 PATHNAME_CONVERT_OUT (path);
3141 return chmod (path, mode);
3143 #endif /* ENCAPSULATE_CHMOD */
3146 #ifdef ENCAPSULATE_CREAT
3148 sys_creat (const char *path, mode_t mode)
3150 PATHNAME_CONVERT_OUT (path);
3151 return creat (path, mode);
3153 #endif /* ENCAPSULATE_CREAT */
3156 #ifdef ENCAPSULATE_LINK
3158 sys_link (const char *existing, const char *new)
3160 PATHNAME_CONVERT_OUT (existing);
3161 PATHNAME_CONVERT_OUT (new);
3162 return link (existing, new);
3164 #endif /* ENCAPSULATE_LINK */
3167 #ifdef ENCAPSULATE_RENAME
3169 sys_rename (const char *old, const char *new)
3171 PATHNAME_CONVERT_OUT (old);
3172 PATHNAME_CONVERT_OUT (new);
3174 /* Windows rename fails if NEW exists */
3175 if (rename (old, new) == 0)
3177 if (errno != EEXIST)
3180 #endif /* WIN32_NATIVE */
3181 return rename (old, new);
3183 #endif /* ENCAPSULATE_RENAME */
3186 #ifdef ENCAPSULATE_SYMLINK
3188 sys_symlink (const char *name1, const char *name2)
3190 PATHNAME_CONVERT_OUT (name1);
3191 PATHNAME_CONVERT_OUT (name2);
3192 return symlink (name1, name2);
3194 #endif /* ENCAPSULATE_SYMLINK */
3197 #ifdef ENCAPSULATE_UNLINK
3199 sys_unlink (const char *path)
3201 PATHNAME_CONVERT_OUT (path);
3202 return unlink (path);
3204 #endif /* ENCAPSULATE_UNLINK */
3207 #ifdef ENCAPSULATE_EXECVP
3209 sys_execvp (const char *path, char * const * argv)
3214 PATHNAME_CONVERT_OUT (path);
3215 for (argc = 0; argv[argc]; argc++)
3217 new_argv = alloca_array (char *, argc + 1);
3218 for (i = 0; i < argc; i++)
3220 new_argv[i] = argv[i];
3221 PATHNAME_CONVERT_OUT (new_argv[i]);
3223 new_argv[argc] = NULL;
3224 return execvp (path, new_argv);
3226 #endif /* ENCAPSULATE_EXECVP */
3229 /************************************************************************/
3230 /* Emulations of missing system calls */
3231 /************************************************************************/
3233 /***** (these are primarily required for USG, it seems) *****/
3237 getcwd (char *pathname, size_t size)
3239 return getwd (pathname);
3241 #endif /* emulate getcwd */
3246 * Warning, this function may not duplicate BSD 4.2 action properly
3247 * under error conditions.
3252 getwd (char *pathname)
3254 char *npath, *spath;
3255 #if !__STDC__ && !defined(STDC_HEADERS)
3256 extern char *getcwd ();
3259 spath = npath = getcwd ((char *) 0, MAXPATHLEN);
3262 /* On Altos 3068, getcwd can return @hostname/dir, so discard
3263 up to first slash. Should be harmless on other systems. */
3264 while (*npath && *npath != '/')
3266 strcpy (pathname, npath);
3267 xfree (spath); /* getcwd uses malloc */
3270 #endif /* HAVE_GETWD */
3271 #endif /* 0 - mrb */
3274 * Emulate rename using unlink/link. Note that this is
3275 * only partially correct. Also, doesn't enforce restriction
3276 * that files be of same type (regular->regular, dir->dir, etc).
3281 rename (const char *from, const char *to)
3283 if (access (from, 0) == 0)
3286 if (link (from, to) == 0)
3287 if (unlink (from) == 0)
3292 #endif /* HAVE_RENAME */
3297 /* HPUX curses library references perror, but as far as we know
3298 it won't be called. Anyway this definition will do for now. */
3304 #endif /* not HAVE_PERROR */
3310 * Emulate BSD dup2. First close newd if it already exists.
3311 * Then, attempt to dup oldd. If not successful, call dup2 recursively
3312 * until we are, then close the unsuccessful ones.
3316 dup2 (int oldd, int newd)
3323 fd = fcntl (oldd, F_DUPFD, newd);
3325 error ("can't dup2 (%i,%i) : %s", oldd, newd, strerror (errno));
3332 ret = dup2 (old, new);
3335 #endif /* F_DUPFD */
3338 #endif /* not HAVE_DUP2 */
3341 * Gettimeofday. Simulate as much as possible. Only accurate
3342 * to nearest second. Emacs doesn't use tzp so ignore it for now.
3345 #if !defined (HAVE_GETTIMEOFDAY)
3348 gettimeofday (struct timeval *tp, struct timezone *tzp)
3350 extern long time ();
3352 tp->tv_sec = time ((long *)0);
3355 tzp->tz_minuteswest = -1;
3359 #endif /* !HAVE_GETTIMEOFDAY */
3361 /* No need to encapsulate utime and utimes explicitly because all
3362 access to those functions goes through the following. */
3365 set_file_times (char *filename, EMACS_TIME atime, EMACS_TIME mtime)
3368 struct timeval tv[2];
3371 return utimes (filename, tv);
3372 #else /* not HAVE_UTIMES */
3374 utb.actime = EMACS_SECS (atime);
3375 utb.modtime = EMACS_SECS (mtime);
3376 return utime (filename, &utb);
3377 #endif /* not HAVE_UTIMES */
3382 static long ticks_per_second;
3383 static long orig_user_ticks, orig_system_ticks;
3384 EMACS_TIME orig_real_time;
3386 static int process_times_available;
3388 /* Return the relative user and system tick count. We try to
3389 maintain calculations in terms of integers as long as possible
3390 for increased accuracy. */
3393 get_process_times_1 (long *user_ticks, long *system_ticks)
3395 #if defined (_SC_CLK_TCK) || defined (CLK_TCK) && !defined(WIN32_NATIVE)
3396 /* We have the POSIX times() function available. */
3399 *user_ticks = (long) tttt.tms_utime;
3400 *system_ticks = (long) tttt.tms_stime;
3402 #elif defined (CLOCKS_PER_SEC)
3403 *user_ticks = (long) clock ();
3412 init_process_times_very_early (void)
3414 #if defined (_SC_CLK_TCK)
3415 ticks_per_second = sysconf (_SC_CLK_TCK);
3416 #elif defined (CLK_TCK)
3417 ticks_per_second = CLK_TCK;
3418 #elif defined (CLOCKS_PER_SEC)
3419 ticks_per_second = CLOCKS_PER_SEC;
3422 process_times_available = get_process_times_1 (&orig_user_ticks,
3423 &orig_system_ticks);
3424 EMACS_GET_TIME (orig_real_time);
3427 /* Return the user and system times used up by this process so far. */
3429 get_process_times (double *user_time, double *system_time, double *real_time)
3431 EMACS_TIME curr_real_time;
3432 EMACS_TIME elapsed_time;
3433 long curr_user_ticks, curr_system_ticks;
3435 EMACS_GET_TIME (curr_real_time);
3436 EMACS_SUB_TIME (elapsed_time, curr_real_time, orig_real_time);
3437 *real_time = (EMACS_SECS (elapsed_time)
3438 + ((double) EMACS_USECS (elapsed_time)) / 1000000);
3439 if (get_process_times_1 (&curr_user_ticks, &curr_system_ticks))
3441 *user_time = (((double) (curr_user_ticks - orig_user_ticks))
3442 / ticks_per_second);
3443 *system_time = (((double) (curr_system_ticks - orig_system_ticks))
3444 / ticks_per_second);
3449 *user_time = *real_time;
3460 /* Figure out how many bits the system's random number generator uses.
3461 `random' and `lrand48' are assumed to return 31 usable bits.
3462 BSD `rand' returns a 31 bit value but the low order bits are unusable;
3463 so we'll shift it and treat it like the 15-bit USG `rand'. */
3467 # define RAND_BITS 31
3468 # else /* !HAVE_RANDOM */
3469 # ifdef HAVE_LRAND48
3470 # define RAND_BITS 31
3471 # define random lrand48
3472 # else /* !HAVE_LRAND48 */
3473 # define RAND_BITS 15
3474 # if RAND_MAX == 32767
3475 # define random rand
3476 # else /* RAND_MAX != 32767 */
3477 # if RAND_MAX == 2147483647
3478 # define random() (rand () >> 16)
3479 # else /* RAND_MAX != 2147483647 */
3481 # define random rand
3483 # define random() (rand () >> 16)
3485 # endif /* RAND_MAX != 2147483647 */
3486 # endif /* RAND_MAX != 32767 */
3487 # endif /* !HAVE_LRAND48 */
3488 # endif /* !HAVE_RANDOM */
3489 #endif /* !RAND_BITS */
3491 void seed_random (long arg);
3493 seed_random (long arg)
3496 srandom ((unsigned int)arg);
3498 # ifdef HAVE_LRAND48
3501 srand ((unsigned int)arg);
3507 * Build a full Emacs-sized word out of whatever we've got.
3508 * This suffices even for a 64-bit architecture with a 15-bit rand.
3510 long get_random (void);
3514 long val = random ();
3515 #if VALBITS > RAND_BITS
3516 val = (val << RAND_BITS) ^ random ();
3517 #if VALBITS > 2*RAND_BITS
3518 val = (val << RAND_BITS) ^ random ();
3519 #if VALBITS > 3*RAND_BITS
3520 val = (val << RAND_BITS) ^ random ();
3521 #if VALBITS > 4*RAND_BITS
3522 val = (val << RAND_BITS) ^ random ();
3523 #endif /* need at least 5 */
3524 #endif /* need at least 4 */
3525 #endif /* need at least 3 */
3526 #endif /* need at least 2 */
3527 return val & ((1L << VALBITS) - 1);
3531 /************************************************************************/
3532 /* Strings corresponding to defined signals */
3533 /************************************************************************/
3535 #if !defined (SYS_SIGLIST_DECLARED) && !defined (HAVE_SYS_SIGLIST)
3537 #if defined(WIN32_NATIVE) || defined(CYGWIN)
3538 const char *sys_siglist[] =
3544 "illegal instruction",
3548 "floating point exception",
3551 "segmentation violation",
3552 "bad argument to system call",
3553 "write on a pipe with no one to read it",
3555 "software termination signal from kill",
3557 "sendable stop signal not from tty",
3558 "stop signal from tty",
3559 "continue a stopped process",
3560 "child status has changed",
3561 "background read attempted from control tty",
3562 "background write attempted from control tty",
3563 "input record available at control tty",
3564 "exceeded CPU time limit",
3565 "exceeded file size limit"
3571 const char *sys_siglist[NSIG + 1] =
3573 /* AIX has changed the signals a bit */
3574 DEFER_GETTEXT ("bogus signal"), /* 0 */
3575 DEFER_GETTEXT ("hangup"), /* 1 SIGHUP */
3576 DEFER_GETTEXT ("interrupt"), /* 2 SIGINT */
3577 DEFER_GETTEXT ("quit"), /* 3 SIGQUIT */
3578 DEFER_GETTEXT ("illegal instruction"), /* 4 SIGILL */
3579 DEFER_GETTEXT ("trace trap"), /* 5 SIGTRAP */
3580 DEFER_GETTEXT ("IOT instruction"), /* 6 SIGIOT */
3581 DEFER_GETTEXT ("crash likely"), /* 7 SIGDANGER */
3582 DEFER_GETTEXT ("floating point exception"), /* 8 SIGFPE */
3583 DEFER_GETTEXT ("kill"), /* 9 SIGKILL */
3584 DEFER_GETTEXT ("bus error"), /* 10 SIGBUS */
3585 DEFER_GETTEXT ("segmentation violation"), /* 11 SIGSEGV */
3586 DEFER_GETTEXT ("bad argument to system call"), /* 12 SIGSYS */
3587 DEFER_GETTEXT ("write on a pipe with no one to read it"), /* 13 SIGPIPE */
3588 DEFER_GETTEXT ("alarm clock"), /* 14 SIGALRM */
3589 DEFER_GETTEXT ("software termination signum"), /* 15 SIGTERM */
3590 DEFER_GETTEXT ("user defined signal 1"), /* 16 SIGUSR1 */
3591 DEFER_GETTEXT ("user defined signal 2"), /* 17 SIGUSR2 */
3592 DEFER_GETTEXT ("death of a child"), /* 18 SIGCLD */
3593 DEFER_GETTEXT ("power-fail restart"), /* 19 SIGPWR */
3594 DEFER_GETTEXT ("bogus signal"), /* 20 */
3595 DEFER_GETTEXT ("bogus signal"), /* 21 */
3596 DEFER_GETTEXT ("bogus signal"), /* 22 */
3597 DEFER_GETTEXT ("bogus signal"), /* 23 */
3598 DEFER_GETTEXT ("bogus signal"), /* 24 */
3599 DEFER_GETTEXT ("LAN I/O interrupt"), /* 25 SIGAIO */
3600 DEFER_GETTEXT ("PTY I/O interrupt"), /* 26 SIGPTY */
3601 DEFER_GETTEXT ("I/O intervention required"), /* 27 SIGIOINT */
3603 DEFER_GETTEXT ("HFT grant"), /* 28 SIGGRANT */
3604 DEFER_GETTEXT ("HFT retract"), /* 29 SIGRETRACT */
3605 DEFER_GETTEXT ("HFT sound done"), /* 30 SIGSOUND */
3606 DEFER_GETTEXT ("HFT input ready"), /* 31 SIGMSG */
3610 #else /* USG, not AIX */
3611 const char *sys_siglist[NSIG + 1] =
3613 DEFER_GETTEXT ("bogus signal"), /* 0 */
3614 DEFER_GETTEXT ("hangup"), /* 1 SIGHUP */
3615 DEFER_GETTEXT ("interrupt"), /* 2 SIGINT */
3616 DEFER_GETTEXT ("quit"), /* 3 SIGQUIT */
3617 DEFER_GETTEXT ("illegal instruction"), /* 4 SIGILL */
3618 DEFER_GETTEXT ("trace trap"), /* 5 SIGTRAP */
3619 DEFER_GETTEXT ("IOT instruction"), /* 6 SIGIOT */
3620 DEFER_GETTEXT ("EMT instruction"), /* 7 SIGEMT */
3621 DEFER_GETTEXT ("floating point exception"), /* 8 SIGFPE */
3622 DEFER_GETTEXT ("kill"), /* 9 SIGKILL */
3623 DEFER_GETTEXT ("bus error"), /* 10 SIGBUS */
3624 DEFER_GETTEXT ("segmentation violation"), /* 11 SIGSEGV */
3625 DEFER_GETTEXT ("bad argument to system call"), /* 12 SIGSYS */
3626 DEFER_GETTEXT ("write on a pipe with no one to read it"), /* 13 SIGPIPE */
3627 DEFER_GETTEXT ("alarm clock"), /* 14 SIGALRM */
3628 DEFER_GETTEXT ("software termination signum"), /* 15 SIGTERM */
3629 DEFER_GETTEXT ("user defined signal 1"), /* 16 SIGUSR1 */
3630 DEFER_GETTEXT ("user defined signal 2"), /* 17 SIGUSR2 */
3631 DEFER_GETTEXT ("death of a child"), /* 18 SIGCLD */
3632 DEFER_GETTEXT ("power-fail restart"), /* 19 SIGPWR */
3634 DEFER_GETTEXT ("window size changed"), /* 20 SIGWINCH */
3635 DEFER_GETTEXT ("urgent socket condition"), /* 21 SIGURG */
3636 DEFER_GETTEXT ("pollable event occurred"), /* 22 SIGPOLL */
3637 DEFER_GETTEXT ("stop (cannot be caught or ignored)"), /* 23 SIGSTOP */
3638 DEFER_GETTEXT ("user stop requested from tty"), /* 24 SIGTSTP */
3639 DEFER_GETTEXT ("stopped process has been continued"), /* 25 SIGCONT */
3640 DEFER_GETTEXT ("background tty read attempted"), /* 26 SIGTTIN */
3641 DEFER_GETTEXT ("background tty write attempted"), /* 27 SIGTTOU */
3642 DEFER_GETTEXT ("virtual timer expired"), /* 28 SIGVTALRM */
3643 DEFER_GETTEXT ("profiling timer expired"), /* 29 SIGPROF */
3644 DEFER_GETTEXT ("exceeded cpu limit"), /* 30 SIGXCPU */
3645 DEFER_GETTEXT ("exceeded file size limit"), /* 31 SIGXFSZ */
3646 DEFER_GETTEXT ("process's lwps are blocked"), /* 32 SIGWAITING */
3647 DEFER_GETTEXT ("special signal used by thread library"), /* 33 SIGLWP */
3649 DEFER_GETTEXT ("special signal used by CPR"), /* 34 SIGFREEZE */
3652 DEFER_GETTEXT ("special signal used by CPR"), /* 35 SIGTHAW */
3657 #endif /* not AIX */
3660 const char *sys_siglist[NSIG + 1] =
3662 DEFER_GETTEXT ("null signal"), /* 0 SIGNULL */
3663 DEFER_GETTEXT ("hangup"), /* 1 SIGHUP */
3664 DEFER_GETTEXT ("interrupt"), /* 2 SIGINT */
3665 DEFER_GETTEXT ("quit"), /* 3 SIGQUIT */
3666 DEFER_GETTEXT ("illegal instruction"), /* 4 SIGILL */
3667 DEFER_GETTEXT ("trace trap"), /* 5 SIGTRAP */
3668 DEFER_GETTEXT ("abort termination"), /* 6 SIGABRT */
3669 DEFER_GETTEXT ("SIGEMT"), /* 7 SIGEMT */
3670 DEFER_GETTEXT ("floating point exception"), /* 8 SIGFPE */
3671 DEFER_GETTEXT ("kill"), /* 9 SIGKILL */
3672 DEFER_GETTEXT ("bus error"), /* 10 SIGBUS */
3673 DEFER_GETTEXT ("segmentation violation"), /* 11 SIGSEGV */
3674 DEFER_GETTEXT ("bad argument to system call"), /* 12 SIGSYS */
3675 DEFER_GETTEXT ("write on a pipe with no reader"), /* 13 SIGPIPE */
3676 DEFER_GETTEXT ("alarm clock"), /* 14 SIGALRM */
3677 DEFER_GETTEXT ("software termination signal"), /* 15 SIGTERM */
3678 DEFER_GETTEXT ("user defined signal 1"), /* 16 SIGUSR1 */
3679 DEFER_GETTEXT ("user defined signal 2"), /* 17 SIGUSR2 */
3680 DEFER_GETTEXT ("child stopped or terminated"), /* 18 SIGCLD */
3681 DEFER_GETTEXT ("power-fail restart"), /* 19 SIGPWR */
3682 DEFER_GETTEXT ("window size changed"), /* 20 SIGWINCH */
3683 DEFER_GETTEXT ("undefined"), /* 21 */
3684 DEFER_GETTEXT ("pollable event occurred"), /* 22 SIGPOLL */
3685 DEFER_GETTEXT ("sendable stop signal not from tty"), /* 23 SIGSTOP */
3686 DEFER_GETTEXT ("stop signal from tty"), /* 24 SIGSTP */
3687 DEFER_GETTEXT ("continue a stopped process"), /* 25 SIGCONT */
3688 DEFER_GETTEXT ("attempted background tty read"), /* 26 SIGTTIN */
3689 DEFER_GETTEXT ("attempted background tty write"), /* 27 SIGTTOU */
3690 DEFER_GETTEXT ("undefined"), /* 28 */
3691 DEFER_GETTEXT ("undefined"), /* 29 */
3692 DEFER_GETTEXT ("undefined"), /* 30 */
3693 DEFER_GETTEXT ("undefined"), /* 31 */
3694 DEFER_GETTEXT ("undefined"), /* 32 */
3695 DEFER_GETTEXT ("socket (TCP/IP) urgent data arrival"), /* 33 SIGURG */
3696 DEFER_GETTEXT ("I/O is possible"), /* 34 SIGIO */
3697 DEFER_GETTEXT ("exceeded cpu time limit"), /* 35 SIGXCPU */
3698 DEFER_GETTEXT ("exceeded file size limit"), /* 36 SIGXFSZ */
3699 DEFER_GETTEXT ("virtual time alarm"), /* 37 SIGVTALRM */
3700 DEFER_GETTEXT ("profiling time alarm"), /* 38 SIGPROF */
3701 DEFER_GETTEXT ("undefined"), /* 39 */
3702 DEFER_GETTEXT ("file record locks revoked"), /* 40 SIGLOST */
3703 DEFER_GETTEXT ("undefined"), /* 41 */
3704 DEFER_GETTEXT ("undefined"), /* 42 */
3705 DEFER_GETTEXT ("undefined"), /* 43 */
3706 DEFER_GETTEXT ("undefined"), /* 44 */
3707 DEFER_GETTEXT ("undefined"), /* 45 */
3708 DEFER_GETTEXT ("undefined"), /* 46 */
3709 DEFER_GETTEXT ("undefined"), /* 47 */
3710 DEFER_GETTEXT ("undefined"), /* 48 */
3711 DEFER_GETTEXT ("undefined"), /* 49 */
3712 DEFER_GETTEXT ("undefined"), /* 50 */
3713 DEFER_GETTEXT ("undefined"), /* 51 */
3714 DEFER_GETTEXT ("undefined"), /* 52 */
3715 DEFER_GETTEXT ("undefined"), /* 53 */
3716 DEFER_GETTEXT ("undefined"), /* 54 */
3717 DEFER_GETTEXT ("undefined"), /* 55 */
3718 DEFER_GETTEXT ("undefined"), /* 56 */
3719 DEFER_GETTEXT ("undefined"), /* 57 */
3720 DEFER_GETTEXT ("undefined"), /* 58 */
3721 DEFER_GETTEXT ("undefined"), /* 59 */
3722 DEFER_GETTEXT ("undefined"), /* 60 */
3723 DEFER_GETTEXT ("undefined"), /* 61 */
3724 DEFER_GETTEXT ("undefined"), /* 62 */
3725 DEFER_GETTEXT ("undefined"), /* 63 */
3726 DEFER_GETTEXT ("notification message in mess. queue"), /* 64 SIGDGNOTIFY */
3731 #endif /* ! SYS_SIGLIST_DECLARED && ! HAVE_SYS_SIGLIST */
3734 /************************************************************************/
3735 /* Directory routines for systems that don't have them */
3736 /************************************************************************/
3738 #ifdef SYSV_SYSTEM_DIR
3742 #if defined(BROKEN_CLOSEDIR) || !defined(HAVE_CLOSEDIR)
3744 closedir (DIR *dirp) /* stream from opendir */
3748 rtnval = sys_close (dirp->dd_fd);
3750 /* Some systems (like Solaris) allocate the buffer and the DIR all
3751 in one block. Why in the world are we freeing this ourselves
3753 #if ! (defined (sun) && defined (USG5_4))
3754 xfree ((char *) dirp->dd_buf); /* directory block defined in <dirent.h> */
3756 xfree ((char *) dirp);
3759 #endif /* BROKEN_CLOSEDIR or not HAVE_CLOSEDIR */
3760 #endif /* SYSV_SYSTEM_DIR */
3762 #ifdef NONSYSTEM_DIR_LIBRARY
3765 opendir (const char *filename) /* name of directory */
3767 DIR *dirp; /* -> malloc'ed storage */
3768 int fd; /* file descriptor for read */
3769 struct stat sbuf; /* result of fstat */
3771 fd = sys_open (filename, O_RDONLY);
3775 if (fstat (fd, &sbuf) < 0
3776 || (sbuf.st_mode & S_IFMT) != S_IFDIR
3777 || (dirp = (DIR *) malloc (sizeof (DIR))) == 0)
3780 return 0; /* bad luck today */
3784 dirp->dd_loc = dirp->dd_size = 0; /* refill needed */
3790 closedir (DIR *dirp) /* stream from opendir */
3792 sys_close (dirp->dd_fd);
3800 ino_t od_ino; /* inode */
3801 char od_name[DIRSIZ]; /* filename */
3804 static struct direct dir_static; /* simulated directory contents */
3808 readdir (DIR *dirp) /* stream from opendir */
3810 struct olddir *dp; /* -> directory data */
3814 if (dirp->dd_loc >= dirp->dd_size)
3815 dirp->dd_loc = dirp->dd_size = 0;
3817 if (dirp->dd_size == 0 /* refill buffer */
3818 && (dirp->dd_size = sys_read (dirp->dd_fd, dirp->dd_buf, DIRBLKSIZ)) <= 0)
3821 dp = (struct olddir *) &dirp->dd_buf[dirp->dd_loc];
3822 dirp->dd_loc += sizeof (struct olddir);
3824 if (dp->od_ino != 0) /* not deleted entry */
3826 dir_static.d_ino = dp->od_ino;
3827 strncpy (dir_static.d_name, dp->od_name, DIRSIZ);
3828 dir_static.d_name[DIRSIZ] = '\0';
3829 dir_static.d_namlen = strlen (dir_static.d_name);
3830 dir_static.d_reclen = sizeof (struct direct)
3832 + dir_static.d_namlen - dir_static.d_namlen % 4;
3833 return &dir_static; /* -> simulated structure */
3839 #endif /* NONSYSTEM_DIR_LIBRARY */
3842 /* mkdir and rmdir functions, for systems which don't have them. */
3846 * Written by Robert Rother, Mariah Corporation, August 1985.
3848 * If you want it, it's yours. All I ask in return is that if you
3849 * figure out how to do this in a Bourne Shell script you send me
3851 * sdcsvax!rmr or rmr@uscd
3853 * Severely hacked over by John Gilmore to make a 4.2BSD compatible
3854 * subroutine. 11Mar86; hoptoad!gnu
3856 * Modified by rmtodd@uokmax 6-28-87 -- when making an already existing dir,
3857 * subroutine didn't return EEXIST. It does now.
3863 #ifdef MKDIR_PROTOTYPE
3867 mkdir (const char *dpath, int dmode)
3870 int cpid, status, fd;
3871 struct stat statbuf;
3873 if (stat (dpath, &statbuf) == 0) /* we do want stat() here */
3875 errno = EEXIST; /* Stat worked, so it already exists */
3879 /* If stat fails for a reason other than non-existence, return error */
3880 if (errno != ENOENT)
3883 synch_process_alive = 1;
3884 switch (cpid = fork ())
3887 case -1: /* Error in fork() */
3888 return -1; /* Errno is set already */
3890 case 0: /* Child process */
3893 * Cheap hack to set mode of new directory. Since this
3894 * child process is going away anyway, we zap its umask.
3895 * ####, this won't suffice to set SUID, SGID, etc. on this
3896 * directory. Does anybody care?
3898 status = umask (0); /* Get current umask */
3899 status = umask (status | (0777 & ~dmode)); /* Set for mkdir */
3900 fd = sys_open ("/dev/null", O_RDWR);
3903 if (fd != STDIN_FILENO) dup2 (fd, STDIN_FILENO);
3904 if (fd != STDOUT_FILENO) dup2 (fd, STDOUT_FILENO);
3905 if (fd != STDERR_FILENO) dup2 (fd, STDERR_FILENO);
3907 execl ("/bin/mkdir", "mkdir", dpath, (char *) 0);
3908 _exit (-1); /* Can't exec /bin/mkdir */
3911 default: /* Parent process */
3912 wait_for_termination (cpid);
3915 if (synch_process_death != 0 || synch_process_retcode != 0)
3917 errno = EIO; /* We don't know why, but */
3918 return -1; /* /bin/mkdir failed */
3923 #endif /* not HAVE_MKDIR */
3927 rmdir (const char *dpath)
3929 int cpid, status, fd;
3930 struct stat statbuf;
3932 if (stat (dpath, &statbuf) != 0) /* we do want stat() here */
3934 /* Stat just set errno. We don't have to */
3938 synch_process_alive = 1;
3939 switch (cpid = fork ())
3942 case -1: /* Error in fork() */
3943 return (-1); /* Errno is set already */
3945 case 0: /* Child process */
3946 fd = sys_open("/dev/null", O_RDWR);
3949 if (fd != STDIN_FILENO) dup2 (fd, STDIN_FILENO);
3950 if (fd != STDOUT_FILENO) dup2 (fd, STDOUT_FILENO);
3951 if (fd != STDERR_FILENO) dup2 (fd, STDERR_FILENO);
3953 execl ("/bin/rmdir", "rmdir", dpath, (char *) 0);
3954 _exit (-1); /* Can't exec /bin/mkdir */
3956 default: /* Parent process */
3957 wait_for_termination (cpid);
3960 if (synch_process_death != 0 ||
3961 synch_process_retcode != 0)
3963 errno = EIO; /* We don't know why, but */
3964 return -1; /* /bin/rmdir failed */
3969 #endif /* !HAVE_RMDIR */
3972 /************************************************************************/
3973 /* Misc. SunOS crap */
3974 /************************************************************************/
3978 /* These are included on Sunos 4.1 when we do not use shared libraries.
3979 X11 libraries may refer to these functions but (we hope) do not
3980 actually call them. */
4000 #endif /* USE_DL_STUBS */