1 /* Interfaces to system-dependent kernel and library entries.
2 Copyright (C) 1985, 1986, 1987, 1988, 1993, 1994, 1995, 1999, 2000, 2001,
3 2002, 2003, 2004, 2005, 2006, 2007, 2008
4 Free Software Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
32 /* Including stdlib.h isn't necessarily enough to get srandom
33 declared, e.g. without __USE_XOPEN_EXTENDED with glibc 2. */
35 #if 0 /* Don't prototype srandom; it takes an unsigned argument on
36 some systems, and an unsigned long on others, like FreeBSD
38 extern void srandom
P_ ((unsigned int));
42 /* The w32 build defines select stuff in w32.h, which is included by
43 sys/select.h (included below). */
45 #include "sysselect.h"
48 #include "blockinput.h"
52 #define write sys_write
57 #endif /* not WINDOWSNT */
59 /* Does anyone other than VMS need this? */
61 #define sys_fwrite fwrite
66 #include <sys/types.h>
71 #if !defined (USG) || defined (BSD_PGRPS)
73 #define setpgrp setpgid
77 /* Get SI_SRPC_DOMAIN, if it is available. */
78 #ifdef HAVE_SYS_SYSTEMINFO_H
79 #include <sys/systeminfo.h>
82 #ifdef MSDOS /* Demacs 1.1.2 91/10/20 Manabu Higashida, MW Aug 1993 */
86 #include <sys/param.h>
90 extern unsigned start
__asm__ ("start");
112 #include <sys/file.h>
120 #define MAXIOSIZE (32 * PAGESIZE) /* Don't I/O more than 32 blocks at a time */
124 #include <sys/file.h>
132 #include <sys/ioctl.h>
138 #ifdef BROKEN_TIOCGWINSZ
144 #include <sys/utsname.h>
146 #if defined (TIOCGWINSZ)
148 #include <sys/sioctl.h>
151 #include <sys/stream.h>
152 #include <sys/ptem.h>
154 #endif /* TIOCGWINSZ */
157 extern int quit_char
;
159 #include "keyboard.h"
162 #include "termhooks.h"
163 #include "termchar.h"
164 #include "termopts.h"
165 #include "dispextern.h"
167 #include "cm.h" /* for reset_sys_modes */
169 /* For serial_configure and serial_open. */
170 extern Lisp_Object QCport
, QCspeed
, QCprocess
;
171 extern Lisp_Object QCbytesize
, QCstopbits
, QCparity
, Qodd
, Qeven
;
172 extern Lisp_Object QCflowcontrol
, Qhw
, Qsw
, QCsummary
;
176 /* In process.h which conflicts with the local copy. */
178 int _cdecl
_spawnlp (int, const char *, const char *, ...);
179 int _cdecl
_getpid (void);
180 extern char *getwd (char *);
183 #ifdef NONSYSTEM_DIR_LIBRARY
185 #endif /* NONSYSTEM_DIR_LIBRARY */
187 #include "syssignal.h"
194 #ifndef HAVE_STRUCT_UTIMBUF
195 /* We want to use utime rather than utimes, but we couldn't find the
196 structure declaration. We'll use the traditional one. */
204 /* LPASS8 is new in 4.3, and makes cbreak mode provide all 8 bits. */
209 static int baud_convert
[] =
214 0, 50, 75, 110, 135, 150, 200, 300, 600, 1200,
215 1800, 2400, 4800, 9600, 19200, 38400
222 #if defined (HAVE_LIBNCURSES) && ! defined (NCURSES_OSPEED_T)
224 #if defined (HAVE_TERMIOS_H) && defined (GNU_LINUX)
232 void croak
P_ ((char *)) NO_RETURN
;
234 /* Temporary used by `sigblock' when defined in terms of signprocmask. */
236 SIGMASKTYPE sigprocmask_set
;
239 #if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
241 /* Return the current working directory. Returns NULL on errors.
242 Any other returned value must be freed with free. This is used
243 only when get_current_dir_name is not defined on the system. */
245 get_current_dir_name ()
249 struct stat dotstat
, pwdstat
;
250 /* If PWD is accurate, use it instead of calling getwd. PWD is
251 sometimes a nicer name, and using it may avoid a fatal error if a
252 parent directory is searchable but not readable. */
253 if ((pwd
= getenv ("PWD")) != 0
254 && (IS_DIRECTORY_SEP (*pwd
) || (*pwd
&& IS_DEVICE_SEP (pwd
[1])))
255 && stat (pwd
, &pwdstat
) == 0
256 && stat (".", &dotstat
) == 0
257 && dotstat
.st_ino
== pwdstat
.st_ino
258 && dotstat
.st_dev
== pwdstat
.st_dev
260 && strlen (pwd
) < MAXPATHLEN
264 buf
= (char *) malloc (strlen (pwd
) + 1);
272 size_t buf_size
= 1024;
273 buf
= (char *) malloc (buf_size
);
278 if (getcwd (buf
, buf_size
) == buf
)
282 int tmp_errno
= errno
;
288 buf
= (char *) realloc (buf
, buf_size
);
296 /* We need MAXPATHLEN here. */
297 buf
= (char *) malloc (MAXPATHLEN
+ 1);
300 if (getwd (buf
) == NULL
)
302 int tmp_errno
= errno
;
314 /* Discard pending input on all input descriptors. */
320 struct emacs_tty buf
;
327 SYS$
QIOW (0, fileno (CURTTY()->input
), IO$_READVBLK
|IO$M_PURGE
, input_iosb
, 0, 0,
328 &buf
.main
, 0, 0, terminator_mask
, 0, 0);
331 #ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
332 while (dos_keyread () != -1)
334 #else /* not MSDOS */
336 struct tty_display_info
*tty
;
337 for (tty
= tty_list
; tty
; tty
= tty
->next
)
339 if (tty
->input
) /* Is the device suspended? */
341 EMACS_GET_TTY (fileno (tty
->input
), &buf
);
342 EMACS_SET_TTY (fileno (tty
->input
), &buf
, 0);
346 #endif /* not MSDOS */
348 #endif /* not WINDOWSNT */
354 /* Arrange for character C to be read as the next input from
356 XXX What if we have multiple ttys?
362 if (! FRAME_TERMCAP_P (SELECTED_FRAME ()))
365 /* Should perhaps error if in batch mode */
367 ioctl (fileno (CURTTY()->input
), TIOCSTI
, &c
);
368 #else /* no TIOCSTI */
369 error ("Cannot stuff terminal input characters in this version of Unix");
370 #endif /* no TIOCSTI */
376 init_baud_rate (int fd
)
384 #else /* not DOS_NT */
388 SYS$
QIOW (0, fd
, IO$_SENSEMODE
, &sg
, 0, 0,
389 &sg
.class, 12, 0, 0, 0, 0 );
390 emacs_ospeed
= sg
.xmit_baud
;
397 emacs_ospeed
= cfgetospeed (&sg
);
398 #else /* neither VMS nor TERMIOS */
406 ioctl (fd
, TCGETA
, &sg
);
408 emacs_ospeed
= sg
.c_cflag
& CBAUD
;
409 #else /* neither VMS nor TERMIOS nor TERMIO */
412 sg
.sg_ospeed
= B9600
;
413 if (ioctl (fd
, TIOCGETP
, &sg
) < 0)
415 emacs_ospeed
= sg
.sg_ospeed
;
416 #endif /* not HAVE_TERMIO */
417 #endif /* not HAVE_TERMIOS */
419 #endif /* not DOS_NT */
422 baud_rate
= (emacs_ospeed
< sizeof baud_convert
/ sizeof baud_convert
[0]
423 ? baud_convert
[emacs_ospeed
] : 9600);
431 set_exclusive_use (fd
)
435 ioctl (fd
, FIOCLEX
, 0);
437 /* Ok to do nothing if this feature does not exist */
442 wait_without_blocking ()
445 wait3 (0, WNOHANG
| WUNTRACED
, 0);
447 croak ("wait_without_blocking");
449 synch_process_alive
= 0;
452 #endif /* not subprocesses */
454 int wait_debugging
; /* Set nonzero to make following function work under dbx
455 (at least for bsd). */
458 wait_for_termination_signal ()
461 /* Wait for subprocess with process id `pid' to terminate and
462 make sure it will get eliminated (not remain forever as a zombie) */
465 wait_for_termination (pid
)
474 status
= SYS$
FORCEX (&pid
, 0, 0);
477 #if defined (BSD_SYSTEM) || defined (HPUX)
478 /* Note that kill returns -1 even if the process is just a zombie now.
479 But inevitably a SIGCHLD interrupt should be generated
480 and child_sig will do wait3 and make the process go away. */
481 /* There is some indication that there is a bug involved with
482 termination of subprocesses, perhaps involving a kernel bug too,
483 but no idea what it is. Just as a hunch we signal SIGCHLD to see
484 if that causes the problem to go away or get worse. */
485 sigsetmask (sigmask (SIGCHLD
));
486 if (0 > kill (pid
, 0))
488 sigsetmask (SIGEMPTYMASK
);
489 kill (getpid (), SIGCHLD
);
495 sigpause (SIGEMPTYMASK
);
496 #else /* not BSD_SYSTEM, and not HPUX version >= 6 */
497 #ifdef POSIX_SIGNALS /* would this work for GNU/Linux as well? */
498 sigblock (sigmask (SIGCHLD
));
500 if (kill (pid
, 0) == -1 && errno
== ESRCH
)
502 sigunblock (sigmask (SIGCHLD
));
506 sigsuspend (&empty_mask
);
507 #else /* not POSIX_SIGNALS */
508 #ifdef HAVE_SYSV_SIGPAUSE
510 if (0 > kill (pid
, 0))
516 #else /* not HAVE_SYSV_SIGPAUSE */
520 #else /* not WINDOWSNT */
521 if (0 > kill (pid
, 0))
523 /* Using sleep instead of pause avoids timing error.
524 If the inferior dies just before the sleep,
525 we lose just one second. */
527 #endif /* not WINDOWSNT */
528 #endif /* not HAVE_SYSV_SIGPAUSE */
529 #endif /* not POSIX_SIGNALS */
530 #endif /* not BSD_SYSTEM, and not HPUX version >= 6 */
532 #else /* not subprocesses */
535 #else /* not __DJGPP__ > 1 */
536 if (kill (pid
, 0) < 0)
539 #endif /* not __DJGPP__ > 1*/
540 #endif /* not subprocesses */
547 * flush any pending output
548 * (may flush input as well; it does not matter the way we use it)
552 flush_pending_output (channel
)
556 /* If we try this, we get hit with SIGTTIN, because
557 the child's tty belongs to the child's pgrp. */
560 ioctl (channel
, TCFLSH
, 1);
564 /* 3rd arg should be ignored
565 but some 4.2 kernels actually want the address of an int
566 and nonzero means something different. */
567 ioctl (channel
, TIOCFLUSH
, &zero
);
574 /* Set up the terminal at the other end of a pseudo-terminal that
575 we will be controlling an inferior through.
576 It should not echo or do line-editing, since that is done
577 in Emacs. No padding needed for insertion into an Emacs buffer. */
580 child_setup_tty (out
)
586 EMACS_GET_TTY (out
, &s
);
588 #if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
589 s
.main
.c_oflag
|= OPOST
; /* Enable output postprocessing */
590 s
.main
.c_oflag
&= ~ONLCR
; /* Disable map of NL to CR-NL on output */
592 /* http://lists.gnu.org/archive/html/emacs-devel/2008-05/msg00406.html
593 Some versions of GNU Hurd do not have FFDLY? */
595 s
.main
.c_oflag
&= ~(NLDLY
|CRDLY
|TABDLY
|BSDLY
|VTDLY
|FFDLY
);
596 /* No output delays */
598 s
.main
.c_oflag
&= ~(NLDLY
|CRDLY
|TABDLY
|BSDLY
|VTDLY
);
599 /* No output delays */
602 s
.main
.c_lflag
&= ~ECHO
; /* Disable echo */
603 s
.main
.c_lflag
|= ISIG
; /* Enable signals */
604 #if 0 /* This causes bugs in (for instance) telnet to certain sites. */
605 s
.main
.c_iflag
&= ~ICRNL
; /* Disable map of CR to NL on input */
606 #ifdef INLCR /* Just being cautious, since I can't check how
607 widespread INLCR is--rms. */
608 s
.main
.c_iflag
&= ~INLCR
; /* Disable map of NL to CR on input */
612 s
.main
.c_iflag
&= ~IUCLC
; /* Disable downcasing on input. */
615 s
.main
.c_iflag
&= ~ISTRIP
; /* don't strip 8th bit on input */
618 s
.main
.c_oflag
&= ~OLCUC
; /* Disable upcasing on output. */
620 s
.main
.c_oflag
&= ~TAB3
; /* Disable tab expansion */
621 s
.main
.c_cflag
= (s
.main
.c_cflag
& ~CSIZE
) | CS8
; /* Don't strip 8th bit */
623 /* Said to be unnecessary: */
624 s
.main
.c_cc
[VMIN
] = 1; /* minimum number of characters to accept */
625 s
.main
.c_cc
[VTIME
] = 0; /* wait forever for at least 1 character */
628 s
.main
.c_lflag
|= ICANON
; /* Enable erase/kill and eof processing */
629 s
.main
.c_cc
[VEOF
] = 04; /* insure that EOF is Control-D */
630 s
.main
.c_cc
[VERASE
] = CDISABLE
; /* disable erase processing */
631 s
.main
.c_cc
[VKILL
] = CDISABLE
; /* disable kill processing */
634 s
.main
.c_cflag
= (s
.main
.c_cflag
& ~CBAUD
) | B9600
; /* baud rate sanity */
637 #ifdef SIGNALS_VIA_CHARACTERS
638 /* the QUIT and INTR character are used in process_send_signal
639 so set them here to something useful. */
640 if (s
.main
.c_cc
[VQUIT
] == CDISABLE
)
641 s
.main
.c_cc
[VQUIT
] = '\\'&037; /* Control-\ */
642 if (s
.main
.c_cc
[VINTR
] == CDISABLE
)
643 s
.main
.c_cc
[VINTR
] = 'C'&037; /* Control-C */
644 #endif /* not SIGNALS_VIA_CHARACTERS */
647 /* AIX enhanced edit loses NULs, so disable it */
650 s
.main
.c_iflag
&= ~ASCEDIT
;
652 /* Also, PTY overloads NUL and BREAK.
653 don't ignore break, but don't signal either, so it looks like NUL. */
654 s
.main
.c_iflag
&= ~IGNBRK
;
655 s
.main
.c_iflag
&= ~BRKINT
;
656 /* rms: Formerly it set s.main.c_cc[VINTR] to 0377 here
657 unconditionally. Then a SIGNALS_VIA_CHARACTERS conditional
658 would force it to 0377. That looks like duplicated code. */
659 #ifndef SIGNALS_VIA_CHARACTERS
660 /* QUIT and INTR work better as signals, so disable character forms */
661 s
.main
.c_cc
[VQUIT
] = CDISABLE
;
662 s
.main
.c_cc
[VINTR
] = CDISABLE
;
663 s
.main
.c_lflag
&= ~ISIG
;
664 #endif /* no TIOCGPGRP or no TIOCGLTC or no TIOCGETC */
665 s
.main
.c_cc
[VEOL
] = CDISABLE
;
666 s
.main
.c_cflag
= (s
.main
.c_cflag
& ~CBAUD
) | B9600
; /* baud rate sanity */
669 #else /* not HAVE_TERMIO */
671 s
.main
.sg_flags
&= ~(ECHO
| CRMOD
| ANYP
| ALLDELAY
| RAW
| LCASE
673 s
.main
.sg_flags
|= LPASS8
;
674 s
.main
.sg_erase
= 0377;
675 s
.main
.sg_kill
= 0377;
676 s
.lmode
= LLITOUT
| s
.lmode
; /* Don't strip 8th bit */
678 #endif /* not HAVE_TERMIO */
680 EMACS_SET_TTY (out
, &s
, 0);
682 #endif /* not DOS_NT */
686 #endif /* subprocesses */
688 /* Record a signal code and the handler for it. */
692 SIGTYPE (*handler
) P_ ((int));
695 static void save_signal_handlers
P_ ((struct save_signal
*));
696 static void restore_signal_handlers
P_ ((struct save_signal
*));
698 /* Suspend the Emacs process; give terminal to its superior. */
704 /* "Foster" parentage allows emacs to return to a subprocess that attached
705 to the current emacs as a cheaper than starting a whole new process. This
706 is set up by KEPTEDITOR.COM. */
707 unsigned long parent_id
, foster_parent_id
;
710 fpid_string
= getenv ("EMACS_PARENT_PID");
711 if (fpid_string
!= NULL
)
713 sscanf (fpid_string
, "%x", &foster_parent_id
);
714 if (foster_parent_id
!= 0)
715 parent_id
= foster_parent_id
;
717 parent_id
= getppid ();
720 parent_id
= getppid ();
722 xfree (fpid_string
); /* On VMS, this was malloc'd */
724 if (parent_id
&& parent_id
!= 0xffffffff)
726 SIGTYPE (*oldsig
)() = (int) signal (SIGINT
, SIG_IGN
);
727 int status
= LIB$
ATTACH (&parent_id
) & 1;
728 signal (SIGINT
, oldsig
);
737 d_prompt
.l
= sizeof ("Emacs: "); /* Our special prompt */
738 d_prompt
.a
= "Emacs: "; /* Just a reminder */
739 LIB$
SPAWN (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &d_prompt
, 0);
744 #if defined (SIGTSTP) && !defined (MSDOS)
747 int pgrp
= EMACS_GETPGRP (0);
748 EMACS_KILLPG (pgrp
, SIGTSTP
);
751 #else /* No SIGTSTP */
752 #ifdef USG_JOBCTRL /* If you don't know what this is don't mess with it */
753 ptrace (0, 0, 0, 0); /* set for ptrace - caught by csh */
754 kill (getpid (), SIGQUIT
);
756 #else /* No SIGTSTP or USG_JOBCTRL */
758 /* On a system where suspending is not implemented,
759 instead fork a subshell and let it talk directly to the terminal
763 #endif /* no USG_JOBCTRL */
764 #endif /* no SIGTSTP */
768 /* Fork a subshell. */
774 #ifdef DOS_NT /* Demacs 1.1.2 91/10/20 Manabu Higashida */
776 char oldwd
[MAXPATHLEN
+1]; /* Fixed length is safe on MSDOS. */
779 struct save_signal saved_handlers
[5];
781 unsigned char *str
= 0;
784 saved_handlers
[0].code
= SIGINT
;
785 saved_handlers
[1].code
= SIGQUIT
;
786 saved_handlers
[2].code
= SIGTERM
;
788 saved_handlers
[3].code
= SIGIO
;
789 saved_handlers
[4].code
= 0;
791 saved_handlers
[3].code
= 0;
794 /* Mentioning current_buffer->buffer would mean including buffer.h,
795 which somehow wedges the hp compiler. So instead... */
797 dir
= intern ("default-directory");
798 if (NILP (Fboundp (dir
)))
800 dir
= Fsymbol_value (dir
);
804 dir
= expand_and_dir_to_file (Funhandled_file_name_directory (dir
), Qnil
);
805 str
= (unsigned char *) alloca (SCHARS (dir
) + 2);
807 bcopy (SDATA (dir
), str
, len
);
808 if (str
[len
- 1] != '/') str
[len
++] = '/';
815 save_signal_handlers (saved_handlers
);
816 synch_process_alive
= 1;
817 #endif /* __DJGPP__ > 1 */
821 error ("Can't spawn subshell");
828 #ifdef DOS_NT /* MW, Aug 1993 */
831 sh
= (char *) egetenv ("SUSPEND"); /* KFS, 1994-12-14 */
834 sh
= (char *) egetenv ("SHELL");
838 /* Use our buffer's default directory for the subshell. */
840 chdir ((char *) str
);
843 close_process_descs (); /* Close Emacs's pipes/ptys */
846 #ifdef SET_EMACS_PRIORITY
848 extern EMACS_INT emacs_priority
;
850 if (emacs_priority
< 0)
851 nice (-emacs_priority
);
855 #ifdef MSDOS /* Demacs 1.1.2 91/10/20 Manabu Higashida */
857 char *epwd
= getenv ("PWD");
858 char old_pwd
[MAXPATHLEN
+1+4];
860 /* If PWD is set, pass it with corrected value. */
863 strcpy (old_pwd
, epwd
);
864 if (str
[len
- 1] == '/')
866 setenv ("PWD", str
, 1);
871 putenv (old_pwd
); /* restore previous value */
873 #if 0 /* This is also reported if last command executed in subshell failed, KFS */
875 report_file_error ("Can't execute subshell", Fcons (build_string (sh
), Qnil
));
877 #else /* not MSDOS */
879 /* Waits for process completion */
880 pid
= _spawnlp (_P_WAIT
, sh
, sh
, NULL
);
883 write (1, "Can't execute subshell", 22);
884 #else /* not WINDOWSNT */
885 execlp (sh
, sh
, (char *) 0);
886 write (1, "Can't execute subshell", 22);
888 #endif /* not WINDOWSNT */
889 #endif /* not MSDOS */
892 /* Do this now if we did not do it before. */
893 #if !defined (MSDOS) || __DJGPP__ == 1
894 save_signal_handlers (saved_handlers
);
895 synch_process_alive
= 1;
899 wait_for_termination (pid
);
901 restore_signal_handlers (saved_handlers
);
902 synch_process_alive
= 0;
907 save_signal_handlers (saved_handlers
)
908 struct save_signal
*saved_handlers
;
910 while (saved_handlers
->code
)
912 saved_handlers
->handler
913 = (SIGTYPE (*) P_ ((int))) signal (saved_handlers
->code
, SIG_IGN
);
919 restore_signal_handlers (saved_handlers
)
920 struct save_signal
*saved_handlers
;
922 while (saved_handlers
->code
)
924 signal (saved_handlers
->code
, saved_handlers
->handler
);
930 /* If SIGIO is broken, don't do anything. */
947 unrequest_sigio (void)
954 int old_fcntl_flags
[MAXDESC
];
961 old_fcntl_flags
[fd
] = fcntl (fd
, F_GETFL
, 0) & ~FASYNC
;
962 fcntl (fd
, F_SETFL
, old_fcntl_flags
[fd
] | FASYNC
);
964 interrupts_deferred
= 0;
972 fcntl (fd
, F_SETFL
, old_fcntl_flags
[fd
]);
976 #ifdef FASYNC /* F_SETFL does not imply existence of FASYNC */
977 /* XXX Uhm, FASYNC is not used anymore here. */
978 /* XXX Yeah, but you need it for SIGIO, don't you? */
987 sigunblock (sigmask (SIGWINCH
));
989 sigunblock (sigmask (SIGIO
));
991 interrupts_deferred
= 0;
995 unrequest_sigio (void)
1000 #if 0 /* XXX What's wrong with blocking SIGIO under X? */
1006 sigblock (sigmask (SIGWINCH
));
1008 sigblock (sigmask (SIGIO
));
1009 interrupts_deferred
= 1;
1012 #else /* no FASYNC */
1018 if (noninteractive
|| read_socket_hook
)
1021 croak ("request_sigio");
1027 if (noninteractive
|| read_socket_hook
)
1030 croak ("unrequest_sigio");
1035 #endif /* F_SETFL */
1038 /* Saving and restoring the process group of Emacs's terminal. */
1042 /* The process group of which Emacs was a member when it initially
1045 If Emacs was in its own process group (i.e. inherited_pgroup ==
1046 getpid ()), then we know we're running under a shell with job
1047 control (Emacs would never be run as part of a pipeline).
1050 If Emacs was not in its own process group, then we know we're
1051 running under a shell (or a caller) that doesn't know how to
1052 separate itself from Emacs (like sh). Emacs must be in its own
1053 process group in order to receive SIGIO correctly. In this
1054 situation, we put ourselves in our own pgroup, forcibly set the
1055 tty's pgroup to our pgroup, and make sure to restore and reinstate
1056 the tty's pgroup just like any other terminal setting. If
1057 inherited_group was not the tty's pgroup, then we'll get a
1058 SIGTTmumble when we try to change the tty's pgroup, and a CONT if
1059 it goes foreground in the future, which is what should happen.
1061 This variable is initialized in emacs.c. */
1062 int inherited_pgroup
;
1064 /* Split off the foreground process group to Emacs alone. When we are
1065 in the foreground, but not started in our own process group,
1066 redirect the tty device handle FD to point to our own process
1067 group. We need to be in our own process group to receive SIGIO
1070 narrow_foreground_group (int fd
)
1074 setpgrp (0, inherited_pgroup
);
1076 /* XXX inherited_pgroup should not be zero here, but GTK seems to
1078 if (! inherited_pgroup
)
1079 abort (); /* Should not happen. */
1081 if (inherited_pgroup
!= me
)
1082 EMACS_SET_TTY_PGRP (fd
, &me
); /* XXX This only works on the controlling tty. */
1086 /* Set the tty to our original foreground group. */
1088 widen_foreground_group (int fd
)
1090 if (inherited_pgroup
!= getpid ())
1091 EMACS_SET_TTY_PGRP (fd
, &inherited_pgroup
);
1092 setpgrp (0, inherited_pgroup
);
1095 #endif /* BSD_PGRPS */
1097 /* Getting and setting emacs_tty structures. */
1099 /* Set *TC to the parameters associated with the terminal FD.
1100 Return zero if all's well, or -1 if we ran into an error we
1101 couldn't deal with. */
1103 emacs_get_tty (fd
, settings
)
1105 struct emacs_tty
*settings
;
1107 /* Retrieve the primary parameters - baud rate, character size, etcetera. */
1109 /* We have those nifty POSIX tcmumbleattr functions. */
1110 bzero (&settings
->main
, sizeof (settings
->main
));
1111 if (tcgetattr (fd
, &settings
->main
) < 0)
1116 /* The SYSV-style interface? */
1117 if (ioctl (fd
, TCGETA
, &settings
->main
) < 0)
1122 /* Vehemently Monstrous System? :-) */
1123 if (! (SYS$
QIOW (0, fd
, IO$_SENSEMODE
, settings
, 0, 0,
1124 &settings
->main
.class, 12, 0, 0, 0, 0)
1130 /* I give up - I hope you have the BSD ioctls. */
1131 if (ioctl (fd
, TIOCGETP
, &settings
->main
) < 0)
1133 #endif /* not DOS_NT */
1138 /* Suivant - Do we have to get struct ltchars data? */
1140 if (ioctl (fd
, TIOCGLTC
, &settings
->ltchars
) < 0)
1144 /* How about a struct tchars and a wordful of lmode bits? */
1146 if (ioctl (fd
, TIOCGETC
, &settings
->tchars
) < 0
1147 || ioctl (fd
, TIOCLGET
, &settings
->lmode
) < 0)
1151 /* We have survived the tempest. */
1156 /* Set the parameters of the tty on FD according to the contents of
1157 *SETTINGS. If FLUSHP is non-zero, we discard input.
1158 Return 0 if all went well, and -1 if anything failed. */
1161 emacs_set_tty (fd
, settings
, flushp
)
1163 struct emacs_tty
*settings
;
1166 /* Set the primary parameters - baud rate, character size, etcetera. */
1169 /* We have those nifty POSIX tcmumbleattr functions.
1170 William J. Smith <wjs@wiis.wang.com> writes:
1171 "POSIX 1003.1 defines tcsetattr to return success if it was
1172 able to perform any of the requested actions, even if some
1173 of the requested actions could not be performed.
1174 We must read settings back to ensure tty setup properly.
1175 AIX requires this to keep tty from hanging occasionally." */
1176 /* This make sure that we don't loop indefinitely in here. */
1177 for (i
= 0 ; i
< 10 ; i
++)
1178 if (tcsetattr (fd
, flushp
? TCSAFLUSH
: TCSADRAIN
, &settings
->main
) < 0)
1189 bzero (&new, sizeof (new));
1190 /* Get the current settings, and see if they're what we asked for. */
1191 tcgetattr (fd
, &new);
1192 /* We cannot use memcmp on the whole structure here because under
1193 * aix386 the termios structure has some reserved field that may
1196 if ( new.c_iflag
== settings
->main
.c_iflag
1197 && new.c_oflag
== settings
->main
.c_oflag
1198 && new.c_cflag
== settings
->main
.c_cflag
1199 && new.c_lflag
== settings
->main
.c_lflag
1200 && memcmp (new.c_cc
, settings
->main
.c_cc
, NCCS
) == 0)
1208 /* The SYSV-style interface? */
1209 if (ioctl (fd
, flushp
? TCSETAF
: TCSETAW
, &settings
->main
) < 0)
1214 /* Vehemently Monstrous System? :-) */
1215 if (! (SYS$
QIOW (0, fd
, IO$_SETMODE
, &input_iosb
, 0, 0,
1216 &settings
->main
.class, 12, 0, 0, 0, 0)
1222 /* I give up - I hope you have the BSD ioctls. */
1223 if (ioctl (fd
, (flushp
) ? TIOCSETP
: TIOCSETN
, &settings
->main
) < 0)
1225 #endif /* not DOS_NT */
1231 /* Suivant - Do we have to get struct ltchars data? */
1233 if (ioctl (fd
, TIOCSLTC
, &settings
->ltchars
) < 0)
1237 /* How about a struct tchars and a wordful of lmode bits? */
1239 if (ioctl (fd
, TIOCSETC
, &settings
->tchars
) < 0
1240 || ioctl (fd
, TIOCLSET
, &settings
->lmode
) < 0)
1244 /* We have survived the tempest. */
1251 int old_fcntl_owner
[MAXDESC
];
1252 #endif /* F_SETOWN */
1254 /* This may also be defined in stdio,
1255 but if so, this does no harm,
1256 and using the same name avoids wasting the other one's space. */
1258 #if defined (USG) || defined (DGUX)
1259 unsigned char _sobuf
[BUFSIZ
+8];
1261 char _sobuf
[BUFSIZ
];
1265 static struct ltchars new_ltchars
= {-1,-1,-1,-1,-1,-1};
1268 static struct tchars new_tchars
= {-1,-1,-1,-1,-1,-1};
1271 /* Initialize the terminal mode on all tty devices that are currently
1275 init_all_sys_modes (void)
1277 struct tty_display_info
*tty
;
1278 for (tty
= tty_list
; tty
; tty
= tty
->next
)
1279 init_sys_modes (tty
);
1282 /* Initialize the terminal mode on the given tty device. */
1285 init_sys_modes (tty_out
)
1286 struct tty_display_info
*tty_out
;
1288 struct emacs_tty tty
;
1292 static int oob_chars
[2] = {0, 1 << 7}; /* catch C-g's */
1293 extern int (*interrupt_signal
) ();
1297 Vtty_erase_char
= Qnil
;
1302 if (!tty_out
->output
)
1303 return; /* The tty is suspended. */
1307 input_ef
= get_kbd_event_flag ();
1308 /* LIB$GET_EF (&input_ef); */
1309 SYS$
CLREF (input_ef
);
1310 waiting_for_ast
= 0;
1312 timer_ef
= get_timer_event_flag ();
1313 /* LIB$GET_EF (&timer_ef); */
1314 SYS$
CLREF (timer_ef
);
1318 LIB$
GET_EF (&process_ef
);
1319 SYS$
CLREF (process_ef
);
1321 if (input_ef
/ 32 != process_ef
/ 32)
1322 croak ("Input and process event flags in different clusters.");
1324 if (input_ef
/ 32 != timer_ef
/ 32)
1325 croak ("Input and timer event flags in different clusters.");
1327 input_eflist
= ((unsigned) 1 << (input_ef
% 32)) |
1328 ((unsigned) 1 << (process_ef
% 32));
1330 timer_eflist
= ((unsigned) 1 << (input_ef
% 32)) |
1331 ((unsigned) 1 << (timer_ef
% 32));
1333 sys_access_reinit ();
1339 /* read_socket_hook is not global anymore. I think doing this
1340 unconditionally will not cause any problems. */
1341 if (! read_socket_hook
&& EQ (Vinitial_window_system
, Qnil
))
1343 narrow_foreground_group (fileno (tty_out
->input
));
1346 if (! tty_out
->old_tty
)
1347 tty_out
->old_tty
= (struct emacs_tty
*) xmalloc (sizeof (struct emacs_tty
));
1349 EMACS_GET_TTY (fileno (tty_out
->input
), tty_out
->old_tty
);
1351 tty
= *tty_out
->old_tty
;
1353 #if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
1354 XSETINT (Vtty_erase_char
, tty
.main
.c_cc
[VERASE
]);
1356 tty
.main
.c_iflag
|= (IGNBRK
); /* Ignore break condition */
1357 tty
.main
.c_iflag
&= ~ICRNL
; /* Disable map of CR to NL on input */
1358 #ifdef INLCR /* I'm just being cautious,
1359 since I can't check how widespread INLCR is--rms. */
1360 tty
.main
.c_iflag
&= ~INLCR
; /* Disable map of NL to CR on input */
1363 tty
.main
.c_iflag
&= ~ISTRIP
; /* don't strip 8th bit on input */
1365 tty
.main
.c_lflag
&= ~ECHO
; /* Disable echo */
1366 tty
.main
.c_lflag
&= ~ICANON
; /* Disable erase/kill processing */
1368 tty
.main
.c_lflag
&= ~IEXTEN
; /* Disable other editing characters. */
1370 tty
.main
.c_lflag
|= ISIG
; /* Enable signals */
1371 if (tty_out
->flow_control
)
1373 tty
.main
.c_iflag
|= IXON
; /* Enable start/stop output control */
1375 tty
.main
.c_iflag
&= ~IXANY
;
1379 tty
.main
.c_iflag
&= ~IXON
; /* Disable start/stop output control */
1380 tty
.main
.c_oflag
&= ~ONLCR
; /* Disable map of NL to CR-NL
1382 tty
.main
.c_oflag
&= ~TAB3
; /* Disable tab expansion */
1384 if (tty_out
->meta_key
)
1386 tty
.main
.c_cflag
|= CS8
; /* allow 8th bit on input */
1387 tty
.main
.c_cflag
&= ~PARENB
;/* Don't check parity */
1390 if (tty_out
->input
== stdin
)
1392 tty
.main
.c_cc
[VINTR
] = quit_char
; /* C-g (usually) gives SIGINT */
1393 /* Set up C-g for both SIGQUIT and SIGINT.
1394 We don't know which we will get, but we handle both alike
1395 so which one it really gives us does not matter. */
1396 tty
.main
.c_cc
[VQUIT
] = quit_char
;
1400 /* We normally don't get interrupt or quit signals from tty
1401 devices other than our controlling terminal; therefore,
1402 we must handle C-g as normal input. Unfortunately, this
1403 means that the interrupt and quit feature must be
1404 disabled on secondary ttys, or we would not even see the
1407 Note that even though emacsclient could have special code
1408 to pass SIGINT to Emacs, we should _not_ enable
1409 interrupt/quit keys for emacsclient frames. This means
1410 that we can't break out of loops in C code from a
1411 secondary tty frame, but we can always decide what
1412 display the C-g came from, which is more important from a
1413 usability point of view. (Consider the case when two
1414 people work together using the same Emacs instance.) */
1415 tty
.main
.c_cc
[VINTR
] = CDISABLE
;
1416 tty
.main
.c_cc
[VQUIT
] = CDISABLE
;
1418 tty
.main
.c_cc
[VMIN
] = 1; /* Input should wait for at least 1 char */
1419 tty
.main
.c_cc
[VTIME
] = 0; /* no matter how long that takes. */
1421 tty
.main
.c_cc
[VSWTCH
] = CDISABLE
; /* Turn off shell layering use
1425 #if defined (mips) || defined (HAVE_TCATTR)
1427 tty
.main
.c_cc
[VSUSP
] = CDISABLE
; /* Turn off mips handling of C-z. */
1430 tty
.main
.c_cc
[V_DSUSP
] = CDISABLE
; /* Turn off mips handling of C-y. */
1431 #endif /* V_DSUSP */
1432 #ifdef VDSUSP /* Some systems have VDSUSP, some have V_DSUSP. */
1433 tty
.main
.c_cc
[VDSUSP
] = CDISABLE
;
1436 tty
.main
.c_cc
[VLNEXT
] = CDISABLE
;
1439 tty
.main
.c_cc
[VREPRINT
] = CDISABLE
;
1440 #endif /* VREPRINT */
1442 tty
.main
.c_cc
[VWERASE
] = CDISABLE
;
1443 #endif /* VWERASE */
1445 tty
.main
.c_cc
[VDISCARD
] = CDISABLE
;
1446 #endif /* VDISCARD */
1448 if (tty_out
->flow_control
)
1451 tty
.main
.c_cc
[VSTART
] = '\021';
1454 tty
.main
.c_cc
[VSTOP
] = '\023';
1460 tty
.main
.c_cc
[VSTART
] = CDISABLE
;
1463 tty
.main
.c_cc
[VSTOP
] = CDISABLE
;
1466 #endif /* mips or HAVE_TCATTR */
1470 /* AIX enhanced edit loses NULs, so disable it. */
1471 tty
.main
.c_line
= 0;
1472 tty
.main
.c_iflag
&= ~ASCEDIT
;
1474 tty
.main
.c_cc
[VSTRT
] = CDISABLE
;
1475 tty
.main
.c_cc
[VSTOP
] = CDISABLE
;
1476 tty
.main
.c_cc
[VSUSP
] = CDISABLE
;
1477 tty
.main
.c_cc
[VDSUSP
] = CDISABLE
;
1478 #endif /* IBMR2AIX */
1479 if (tty_out
->flow_control
)
1482 tty
.main
.c_cc
[VSTART
] = '\021';
1485 tty
.main
.c_cc
[VSTOP
] = '\023';
1488 /* Also, PTY overloads NUL and BREAK.
1489 don't ignore break, but don't signal either, so it looks like NUL.
1490 This really serves a purpose only if running in an XTERM window
1491 or via TELNET or the like, but does no harm elsewhere. */
1492 tty
.main
.c_iflag
&= ~IGNBRK
;
1493 tty
.main
.c_iflag
&= ~BRKINT
;
1495 #else /* if not HAVE_TERMIO */
1497 tty
.main
.tt_char
|= TT$M_NOECHO
;
1499 tty
.main
.tt_char
|= TT$M_EIGHTBIT
;
1500 if (tty_out
->flow_control
)
1501 tty
.main
.tt_char
|= TT$M_TTSYNC
;
1503 tty
.main
.tt_char
&= ~TT$M_TTSYNC
;
1504 tty
.main
.tt2_char
|= TT2$M_PASTHRU
| TT2$M_XON
;
1505 #else /* not VMS (BSD, that is) */
1507 XSETINT (Vtty_erase_char
, tty
.main
.sg_erase
);
1508 tty
.main
.sg_flags
&= ~(ECHO
| CRMOD
| XTABS
);
1510 tty
.main
.sg_flags
|= ANYP
;
1511 tty
.main
.sg_flags
|= interrupt_input
? RAW
: CBREAK
;
1512 #endif /* not DOS_NT */
1513 #endif /* not VMS (BSD, that is) */
1514 #endif /* not HAVE_TERMIO */
1516 /* If going to use CBREAK mode, we must request C-g to interrupt
1517 and turn off start and stop chars, etc. If not going to use
1518 CBREAK mode, do this anyway so as to turn off local flow
1519 control for user coming over network on 4.2; in this case,
1520 only t_stopc and t_startc really matter. */
1523 /* Note: if not using CBREAK mode, it makes no difference how we
1525 tty
.tchars
= new_tchars
;
1526 tty
.tchars
.t_intrc
= quit_char
;
1527 if (tty_out
->flow_control
)
1529 tty
.tchars
.t_startc
= '\021';
1530 tty
.tchars
.t_stopc
= '\023';
1533 tty
.lmode
= LDECCTQ
| LLITOUT
| LPASS8
| LNOFLSH
| tty_out
->old_tty
.lmode
;
1535 #endif /* HAVE_TCHARS */
1536 #endif /* not HAVE_TERMIO */
1539 tty
.ltchars
= new_ltchars
;
1540 #endif /* HAVE_LTCHARS */
1541 #ifdef MSDOS /* Demacs 1.1.2 91/10/20 Manabu Higashida, MW Aug 1993 */
1542 if (!tty_out
->term_initted
)
1543 internal_terminal_init ();
1547 EMACS_SET_TTY (fileno (tty_out
->input
), &tty
, 0);
1549 /* This code added to insure that, if flow-control is not to be used,
1550 we have an unlocked terminal at the start. */
1553 if (!tty_out
->flow_control
) ioctl (fileno (tty_out
->input
), TCXONC
, 1);
1556 if (!tty_out
->flow_control
) ioctl (fileno (tty_out
->input
), TIOCSTART
, 0);
1559 #if defined (HAVE_TERMIOS) || defined (HPUX)
1561 if (!tty_out
->flow_control
) tcflow (fileno (tty_out
->input
), TCOON
);
1566 /* Appears to do nothing when in PASTHRU mode.
1567 SYS$QIOW (0, fileno (tty_out->input), IO$_SETMODE|IO$M_OUTBAND, 0, 0, 0,
1568 interrupt_signal, oob_chars, 0, 0, 0, 0);
1570 queue_kbd_input (0);
1574 #ifdef F_GETOWN /* F_SETFL does not imply existence of F_GETOWN */
1575 if (interrupt_input
)
1577 old_fcntl_owner
[fileno (tty_out
->input
)] =
1578 fcntl (fileno (tty_out
->input
), F_GETOWN
, 0);
1579 fcntl (fileno (tty_out
->input
), F_SETOWN
, getpid ());
1580 init_sigio (fileno (tty_out
->input
));
1582 if (gpm_tty
== tty_out
)
1584 /* Arrange for mouse events to give us SIGIO signals. */
1585 fcntl (gpm_fd
, F_SETOWN
, getpid ());
1586 fcntl (gpm_fd
, F_SETFL
, fcntl (gpm_fd
, F_GETFL
, 0) | O_NONBLOCK
);
1587 init_sigio (gpm_fd
);
1589 #endif /* HAVE_GPM */
1591 #endif /* F_GETOWN */
1592 #endif /* F_SETFL */
1594 #ifdef VMS /* VMS sometimes has this symbol but lacks setvbuf. */
1598 /* This symbol is defined on recent USG systems.
1599 Someone says without this call USG won't really buffer the file
1600 even with a call to setbuf. */
1601 setvbuf (tty_out
->output
, (char *) _sobuf
, _IOFBF
, sizeof _sobuf
);
1603 setbuf (tty_out
->output
, (char *) _sobuf
);
1606 if (tty_out
->terminal
->set_terminal_modes_hook
)
1607 tty_out
->terminal
->set_terminal_modes_hook (tty_out
->terminal
);
1609 if (!tty_out
->term_initted
)
1611 Lisp_Object tail
, frame
;
1612 FOR_EACH_FRAME (tail
, frame
)
1614 /* XXX This needs to be revised. */
1615 if (FRAME_TERMCAP_P (XFRAME (frame
))
1616 && FRAME_TTY (XFRAME (frame
)) == tty_out
)
1617 init_frame_faces (XFRAME (frame
));
1621 if (tty_out
->term_initted
&& no_redraw_on_reenter
)
1623 /* XXX This seems wrong on multi-tty. */
1624 if (display_completed
)
1625 direct_output_forward_char (0);
1629 Lisp_Object tail
, frame
;
1631 FOR_EACH_FRAME (tail
, frame
)
1633 if (FRAME_TERMCAP_P (XFRAME (frame
))
1634 && FRAME_TTY (XFRAME (frame
)) == tty_out
)
1635 FRAME_GARBAGED_P (XFRAME (frame
)) = 1;
1639 tty_out
->term_initted
= 1;
1642 /* Return nonzero if safe to use tabs in output.
1643 At the time this is called, init_sys_modes has not been done yet. */
1646 tabs_safe_p (int fd
)
1648 struct emacs_tty etty
;
1650 EMACS_GET_TTY (fd
, &etty
);
1651 return EMACS_TTY_TABS_OK (&etty
);
1654 /* Get terminal size from system.
1655 Store number of lines into *HEIGHTP and width into *WIDTHP.
1656 We store 0 if there's no valid information. */
1659 get_tty_size (int fd
, int *widthp
, int *heightp
)
1665 struct winsize size
;
1667 if (ioctl (fd
, TIOCGWINSZ
, &size
) == -1)
1668 *widthp
= *heightp
= 0;
1671 *widthp
= size
.ws_col
;
1672 *heightp
= size
.ws_row
;
1678 /* SunOS - style. */
1679 struct ttysize size
;
1681 if (ioctl (fd
, TIOCGSIZE
, &size
) == -1)
1682 *widthp
= *heightp
= 0;
1685 *widthp
= size
.ts_cols
;
1686 *heightp
= size
.ts_lines
;
1692 /* Use a fresh channel since the current one may have stale info
1693 (for example, from prior to a suspend); and to avoid a dependency
1694 in the init sequence. */
1696 struct sensemode tty
;
1698 SYS$
ASSIGN (&input_dsc
, &chan
, 0, 0);
1699 SYS$
QIOW (0, chan
, IO$_SENSEMODE
, &tty
, 0, 0,
1700 &tty
.class, 12, 0, 0, 0, 0);
1702 *widthp
= tty
.scr_wid
;
1703 *heightp
= tty
.scr_len
;
1707 *widthp
= ScreenCols ();
1708 *heightp
= ScreenRows ();
1709 #else /* system doesn't know size */
1713 #endif /* not VMS */
1714 #endif /* not SunOS-style */
1715 #endif /* not BSD-style */
1718 /* Set the logical window size associated with descriptor FD
1719 to HEIGHT and WIDTH. This is used mainly with ptys. */
1722 set_window_size (fd
, height
, width
)
1723 int fd
, height
, width
;
1728 struct winsize size
;
1729 size
.ws_row
= height
;
1730 size
.ws_col
= width
;
1732 if (ioctl (fd
, TIOCSWINSZ
, &size
) == -1)
1733 return 0; /* error */
1740 /* SunOS - style. */
1741 struct ttysize size
;
1742 size
.ts_lines
= height
;
1743 size
.ts_cols
= width
;
1745 if (ioctl (fd
, TIOCGSIZE
, &size
) == -1)
1751 #endif /* not SunOS-style */
1752 #endif /* not BSD-style */
1757 /* Prepare all terminal devices for exiting Emacs. */
1760 reset_all_sys_modes (void)
1762 struct tty_display_info
*tty
;
1763 for (tty
= tty_list
; tty
; tty
= tty
->next
)
1764 reset_sys_modes (tty
);
1767 /* Prepare the terminal for closing it; move the cursor to the
1768 bottom of the frame, turn off interrupt-driven I/O, etc. */
1771 reset_sys_modes (tty_out
)
1772 struct tty_display_info
*tty_out
;
1779 if (!tty_out
->term_initted
)
1782 if (!tty_out
->output
)
1783 return; /* The tty is suspended. */
1785 /* Go to and clear the last line of the terminal. */
1787 cmgoto (tty_out
, FrameRows (tty_out
) - 1, 0);
1789 /* Code adapted from tty_clear_end_of_line. */
1790 if (tty_out
->TS_clr_line
)
1792 emacs_tputs (tty_out
, tty_out
->TS_clr_line
, 1, cmputc
);
1795 { /* have to do it the hard way */
1797 tty_turn_off_insert (tty_out
);
1799 for (i
= curX (tty_out
); i
< FrameCols (tty_out
) - 1; i
++)
1801 fputc (' ', tty_out
->output
);
1805 cmgoto (tty_out
, FrameRows (tty_out
) - 1, 0);
1806 fflush (tty_out
->output
);
1808 if (tty_out
->terminal
->reset_terminal_modes_hook
)
1809 tty_out
->terminal
->reset_terminal_modes_hook (tty_out
->terminal
);
1812 /* Avoid possible loss of output when changing terminal modes. */
1813 fsync (fileno (tty_out
->output
));
1817 #ifdef F_SETOWN /* F_SETFL does not imply existence of F_SETOWN */
1818 if (interrupt_input
)
1820 reset_sigio (fileno (tty_out
->input
));
1821 fcntl (fileno (tty_out
->input
), F_SETOWN
,
1822 old_fcntl_owner
[fileno (tty_out
->input
)]);
1824 #endif /* F_SETOWN */
1826 fcntl (fileno (tty_out
->input
), F_SETFL
,
1827 fcntl (fileno (tty_out
->input
), F_GETFL
, 0) & ~O_NDELAY
);
1829 #endif /* F_SETFL */
1831 if (tty_out
->old_tty
)
1832 while (EMACS_SET_TTY (fileno (tty_out
->input
),
1833 tty_out
->old_tty
, 0) < 0 && errno
== EINTR
)
1836 #ifdef MSDOS /* Demacs 1.1.2 91/10/20 Manabu Higashida */
1841 widen_foreground_group (fileno (tty_out
->input
));
1847 /* Set up the proper status flags for use of a pty. */
1853 /* I'm told that TOICREMOTE does not mean control chars
1854 "can't be sent" but rather that they don't have
1855 input-editing or signaling effects.
1856 That should be good, because we have other ways
1857 to do those things in Emacs.
1858 However, telnet mode seems not to work on 4.2.
1859 So TIOCREMOTE is turned off now. */
1861 /* Under hp-ux, if TIOCREMOTE is turned on, some calls
1862 will hang. In particular, the "timeout" feature (which
1863 causes a read to return if there is no data available)
1864 does this. Also it is known that telnet mode will hang
1865 in such a way that Emacs must be stopped (perhaps this
1866 is the same problem).
1868 If TIOCREMOTE is turned off, then there is a bug in
1869 hp-ux which sometimes loses data. Apparently the
1870 code which blocks the master process when the internal
1871 buffer fills up does not work. Other than this,
1872 though, everything else seems to work fine.
1874 Since the latter lossage is more benign, we may as well
1875 lose that way. -- cph */
1877 #if defined(SYSV_PTYS) || defined(UNIX98_PTYS)
1880 ioctl (fd
, FIONBIO
, &on
);
1885 #endif /* HAVE_PTYS */
1889 /* Assigning an input channel is done at the start of Emacs execution.
1890 This is called each time Emacs is resumed, also, but does nothing
1891 because input_chain is no longer zero. */
1898 if (fileno (CURTTY ()->input
)) == 0)
1900 status
= SYS$
ASSIGN (&input_dsc
, &fileno (CURTTY ()->input
)), 0, 0);
1906 /* Deassigning the input channel is done before exiting. */
1911 return SYS$
DASSGN (fileno (CURTTY ()->input
)));
1916 /* Request reading one character into the keyboard buffer.
1917 This is done as soon as the buffer becomes empty. */
1923 extern kbd_input_ast ();
1925 waiting_for_ast
= 0;
1927 status
= SYS$
QIO (0, fileno (CURTTY()->input
), IO$_READVBLK
,
1928 &input_iosb
, kbd_input_ast
, 1,
1929 &input_buffer
, 1, 0, terminator_mask
, 0, 0);
1934 /* Ast routine that is called when keyboard input comes in
1935 in accord with the SYS$QIO above. */
1940 register int c
= -1;
1941 int old_errno
= errno
;
1942 extern EMACS_TIME
*input_available_clear_time
;
1944 if (waiting_for_ast
)
1945 SYS$
SETEF (input_ef
);
1946 waiting_for_ast
= 0;
1949 if (input_count
== 25)
1951 printf ("Ast # %d,", input_count
);
1952 printf (" iosb = %x, %x, %x, %x",
1953 input_iosb
.offset
, input_iosb
.status
, input_iosb
.termlen
,
1956 if (input_iosb
.offset
)
1960 printf (", char = 0%o", c
);
1972 struct input_event e
;
1975 e
.kind
= ASCII_KEYSTROKE_EVENT
;
1976 XSETINT (e
.code
, c
);
1977 e
.frame_or_window
= selected_frame
;
1978 kbd_buffer_store_event (&e
);
1980 if (input_available_clear_time
)
1981 EMACS_SET_SECS_USECS (*input_available_clear_time
, 0, 0);
1985 /* Wait until there is something in kbd_buffer. */
1988 wait_for_kbd_input ()
1990 extern int have_process_input
, process_exited
;
1992 /* If already something, avoid doing system calls. */
1993 if (detect_input_pending ())
1997 /* Clear a flag, and tell ast routine above to set it. */
1998 SYS$
CLREF (input_ef
);
1999 waiting_for_ast
= 1;
2000 /* Check for timing error: ast happened while we were doing that. */
2001 if (!detect_input_pending ())
2003 /* No timing error: wait for flag to be set. */
2004 set_waiting_for_input (0);
2005 SYS$
WFLOR (input_ef
, input_eflist
);
2006 clear_waiting_for_input ();
2007 if (!detect_input_pending ())
2008 /* Check for subprocess input availability */
2010 int dsp
= have_process_input
|| process_exited
;
2012 SYS$
CLREF (process_ef
);
2013 if (have_process_input
)
2014 process_command_input ();
2019 update_mode_lines
++;
2020 prepare_menu_bars ();
2021 redisplay_preserve_echo_area (18);
2025 waiting_for_ast
= 0;
2028 /* Get rid of any pending QIO, when we are about to suspend
2029 or when we want to throw away pending input.
2030 We wait for a positive sign that the AST routine has run
2031 and therefore there is no I/O request queued when we return.
2032 SYS$SETAST is used to avoid a timing error. */
2038 printf ("At end_kbd_input.\n");
2042 if (LIB$
AST_IN_PROG ()) /* Don't wait if suspending from kbd_buffer_store_event! */
2044 SYS$
CANCEL (fileno (CURTTY()->input
));
2049 /* Clear a flag, and tell ast routine above to set it. */
2050 SYS$
CLREF (input_ef
);
2051 waiting_for_ast
= 1;
2053 SYS$
CANCEL (fileno (CURTTY()->input
));
2055 SYS$
WAITFR (input_ef
);
2056 waiting_for_ast
= 0;
2059 /* Wait for either input available or time interval expiry. */
2062 input_wait_timeout (timeval
)
2063 int timeval
; /* Time to wait, in seconds */
2066 static int zero
= 0;
2067 static int large
= -10000000;
2069 LIB$
EMUL (&timeval
, &large
, &zero
, time
); /* Convert to VMS format */
2071 /* If already something, avoid doing system calls. */
2072 if (detect_input_pending ())
2076 /* Clear a flag, and tell ast routine above to set it. */
2077 SYS$
CLREF (input_ef
);
2078 waiting_for_ast
= 1;
2079 /* Check for timing error: ast happened while we were doing that. */
2080 if (!detect_input_pending ())
2082 /* No timing error: wait for flag to be set. */
2084 if (SYS$
SETIMR (timer_ef
, time
, 0, 1) & 1) /* Set timer */
2085 SYS$
WFLOR (timer_ef
, timer_eflist
); /* Wait for timer expiry or input */
2087 waiting_for_ast
= 0;
2090 /* The standard `sleep' routine works some other way
2091 and it stops working if you have ever quit out of it.
2092 This one continues to work. */
2098 static int zero
= 0;
2099 static int large
= -10000000;
2101 LIB$
EMUL (&timeval
, &large
, &zero
, time
); /* Convert to VMS format */
2104 if (SYS$
SETIMR (timer_ef
, time
, 0, 1) & 1) /* Set timer */
2105 SYS$
WAITFR (timer_ef
); /* Wait for timer expiry only */
2126 croak ("request sigio");
2134 croak ("unrequest sigio");
2139 /* Note that VMS compiler won't accept defined (CANNOT_DUMP). */
2144 #ifndef SYSTEM_MALLOC
2151 /* Some systems that cannot dump also cannot implement these. */
2154 * Return the address of the start of the text segment prior to
2155 * doing an unexec. After unexec the return value is undefined.
2156 * See crt0.c for further explanation and _start.
2160 #if !(defined (__NetBSD__) && defined (__ELF__))
2161 #ifndef HAVE_TEXT_START
2166 return ((char *) TEXT_START
);
2168 extern int _start ();
2169 return ((char *) _start
);
2170 #endif /* TEXT_START */
2172 #endif /* not HAVE_TEXT_START */
2176 * Return the address of the start of the data segment prior to
2177 * doing an unexec. After unexec the return value is undefined.
2178 * See crt0.c for further information and definition of data_start.
2180 * Apparently, on BSD systems this is etext at startup. On
2181 * USG systems (swapping) this is highly mmu dependent and
2182 * is also dependent on whether or not the program is running
2183 * with shared text. Generally there is a (possibly large)
2184 * gap between end of text and start of data with shared text.
2186 * On Uniplus+ systems with shared text, data starts at a
2187 * fixed address. Each port (from a given oem) is generally
2188 * different, and the specific value of the start of data can
2189 * be obtained via the UniPlus+ specific "uvar" system call,
2190 * however the method outlined in crt0.c seems to be more portable.
2192 * Probably what will have to happen when a USG unexec is available,
2193 * at least on UniPlus, is temacs will have to be made unshared so
2194 * that text and data are contiguous. Then once loadup is complete,
2195 * unexec will produce a shared executable where the data can be
2196 * at the normal shared text boundary and the startofdata variable
2197 * will be patched by unexec to the correct value.
2201 #ifndef start_of_data
2206 return ((char *) DATA_START
);
2208 #ifdef ORDINARY_LINK
2210 * This is a hack. Since we're not linking crt0.c or pre_crt0.c,
2211 * data_start isn't defined. We take the address of environ, which
2212 * is known to live at or near the start of the system crt0.c, and
2213 * we don't sweat the handful of bytes that might lose.
2215 extern char **environ
;
2217 return ((char *) &environ
);
2219 extern int data_start
;
2220 return ((char *) &data_start
);
2221 #endif /* ORDINARY_LINK */
2222 #endif /* DATA_START */
2224 #endif /* start_of_data */
2225 #endif /* NEED_STARTS (not CANNOT_DUMP or not SYSTEM_MALLOC) */
2227 /* init_system_name sets up the string for the Lisp function
2228 system-name to return. */
2230 extern Lisp_Object Vsystem_name
;
2234 #include <sys/socket.h>
2236 #endif /* HAVE_SOCKETS */
2237 #endif /* not VMS */
2240 #ifndef HAVE_H_ERRNO
2243 #endif /* TRY_AGAIN */
2250 if ((sp
= egetenv ("SYS$NODE")) == 0)
2251 Vsystem_name
= build_string ("vax-vms");
2252 else if ((end
= index (sp
, ':')) == 0)
2253 Vsystem_name
= build_string (sp
);
2255 Vsystem_name
= make_string (sp
, end
- sp
);
2257 #ifndef HAVE_GETHOSTNAME
2260 Vsystem_name
= build_string (uts
.nodename
);
2261 #else /* HAVE_GETHOSTNAME */
2262 unsigned int hostname_size
= 256;
2263 char *hostname
= (char *) alloca (hostname_size
);
2265 /* Try to get the host name; if the buffer is too short, try
2266 again. Apparently, the only indication gethostname gives of
2267 whether the buffer was large enough is the presence or absence
2268 of a '\0' in the string. Eech. */
2271 gethostname (hostname
, hostname_size
- 1);
2272 hostname
[hostname_size
- 1] = '\0';
2274 /* Was the buffer large enough for the '\0'? */
2275 if (strlen (hostname
) < hostname_size
- 1)
2278 hostname_size
<<= 1;
2279 hostname
= (char *) alloca (hostname_size
);
2282 /* Turn the hostname into the official, fully-qualified hostname.
2283 Don't do this if we're going to dump; this can confuse system
2284 libraries on some machines and make the dumped emacs core dump. */
2287 #endif /* not CANNOT_DUMP */
2288 if (! index (hostname
, '.'))
2291 #ifdef HAVE_GETADDRINFO
2292 struct addrinfo
*res
;
2293 struct addrinfo hints
;
2296 memset (&hints
, 0, sizeof(hints
));
2297 hints
.ai_socktype
= SOCK_STREAM
;
2298 hints
.ai_flags
= AI_CANONNAME
;
2300 for (count
= 0;; count
++)
2302 if ((ret
= getaddrinfo (hostname
, NULL
, &hints
, &res
)) == 0
2303 || ret
!= EAI_AGAIN
)
2308 Fsleep_for (make_number (1), Qnil
);
2313 struct addrinfo
*it
= res
;
2316 char *fqdn
= it
->ai_canonname
;
2317 if (fqdn
&& index (fqdn
, '.')
2318 && strcmp (fqdn
, "localhost.localdomain") != 0)
2324 hostname
= alloca (strlen (it
->ai_canonname
) + 1);
2325 strcpy (hostname
, it
->ai_canonname
);
2329 #else /* !HAVE_GETADDRINFO */
2331 for (count
= 0;; count
++)
2337 hp
= gethostbyname (hostname
);
2339 if (! (hp
== 0 && h_errno
== TRY_AGAIN
))
2346 Fsleep_for (make_number (1), Qnil
);
2351 char *fqdn
= (char *) hp
->h_name
;
2356 if (!index (fqdn
, '.'))
2358 /* We still don't have a fully qualified domain name.
2359 Try to find one in the list of alternate names */
2360 char **alias
= hp
->h_aliases
;
2362 && (!index (*alias
, '.')
2363 || !strcmp (*alias
, "localhost.localdomain")))
2370 /* Convert the host name to lower case. */
2371 /* Using ctype.h here would introduce a possible locale
2372 dependence that is probably wrong for hostnames. */
2376 if (*p
>= 'A' && *p
<= 'Z')
2382 #endif /* !HAVE_GETADDRINFO */
2384 #endif /* HAVE_SOCKETS */
2385 /* We used to try using getdomainname here,
2386 but NIIBE Yutaka <gniibe@etl.go.jp> says that
2387 getdomainname gets the NIS/YP domain which often is not the same
2388 as in Internet domain name. */
2389 #if 0 /* Turned off because sysinfo is not really likely to return the
2390 correct Internet domain. */
2391 #if (HAVE_SYSINFO && defined (SI_SRPC_DOMAIN))
2392 if (! index (hostname
, '.'))
2394 /* The hostname is not fully qualified. Append the domain name. */
2396 int hostlen
= strlen (hostname
);
2397 int domain_size
= 256;
2401 char *domain
= (char *) alloca (domain_size
+ 1);
2402 char *fqdn
= (char *) alloca (hostlen
+ 1 + domain_size
+ 1);
2403 int sys_domain_size
= sysinfo (SI_SRPC_DOMAIN
, domain
, domain_size
);
2404 if (sys_domain_size
<= 0)
2406 if (domain_size
< sys_domain_size
)
2408 domain_size
= sys_domain_size
;
2411 strcpy (fqdn
, hostname
);
2412 if (domain
[0] == '.')
2413 strcpy (fqdn
+ hostlen
, domain
);
2414 else if (domain
[0] != 0)
2416 fqdn
[hostlen
] = '.';
2417 strcpy (fqdn
+ hostlen
+ 1, domain
);
2423 #endif /* HAVE_SYSINFO && defined (SI_SRPC_DOMAIN) */
2425 Vsystem_name
= build_string (hostname
);
2426 #endif /* HAVE_GETHOSTNAME */
2430 for (p
= SDATA (Vsystem_name
); *p
; p
++)
2431 if (*p
== ' ' || *p
== '\t')
2438 #if !defined (HAVE_SELECT)
2440 #include "sysselect.h"
2443 #if defined (HAVE_X_WINDOWS) && !defined (HAVE_SELECT)
2444 /* Cause explanatory error message at compile time,
2445 since the select emulation is not good enough for X. */
2446 int *x
= &x_windows_lose_if_no_select_system_call
;
2449 /* Emulate as much as select as is possible under 4.1 and needed by Gnu Emacs
2450 * Only checks read descriptors.
2452 /* How long to wait between checking fds in select */
2453 #define SELECT_PAUSE 1
2456 /* For longjmp'ing back to read_input_waiting. */
2458 jmp_buf read_alarm_throw
;
2460 /* Nonzero if the alarm signal should throw back to read_input_waiting.
2461 The read_socket_hook function sets this to 1 while it is waiting. */
2463 int read_alarm_should_throw
;
2469 signal (SIGALRM
, SIG_IGN
);
2470 SIGNAL_THREAD_CHECK (SIGALRM
);
2471 if (read_alarm_should_throw
)
2472 longjmp (read_alarm_throw
, 1);
2476 /* Only rfds are checked. */
2478 sys_select (nfds
, rfds
, wfds
, efds
, timeout
)
2480 SELECT_TYPE
*rfds
, *wfds
, *efds
;
2481 EMACS_TIME
*timeout
;
2483 /* XXX This needs to be updated for multi-tty support. Is there
2484 anybody who needs to emulate select these days? */
2489 extern int proc_buffered_char
[];
2490 #ifndef subprocesses
2491 int process_tick
= 0, update_tick
= 0;
2493 extern int process_tick
, update_tick
;
2497 #if defined (HAVE_SELECT) && defined (HAVE_X_WINDOWS)
2498 /* If we're using X, then the native select will work; we only need the
2499 emulation for non-X usage. */
2500 if (!NILP (Vinitial_window_system
))
2501 return select (nfds
, rfds
, wfds
, efds
, timeout
);
2503 timeoutval
= timeout
? EMACS_SECS (*timeout
) : 100000;
2504 local_timeout
= &timeoutval
;
2516 /* If we are looking only for the terminal, with no timeout,
2517 just read it and wait -- that's more efficient. */
2518 if (*local_timeout
== 100000 && process_tick
== update_tick
2519 && FD_ISSET (0, &orfds
))
2522 for (fd
= 1; fd
< nfds
; ++fd
)
2523 if (FD_ISSET (fd
, &orfds
))
2525 if (! detect_input_pending ())
2526 read_input_waiting ();
2532 /* Once a second, till the timer expires, check all the flagged read
2533 * descriptors to see if any input is available. If there is some then
2534 * set the corresponding bit in the return copy of rfds.
2538 register int to_check
, fd
;
2542 for (to_check
= nfds
, fd
= 0; --to_check
>= 0; fd
++)
2544 if (FD_ISSET (fd
, &orfds
))
2546 int avail
= 0, status
= 0;
2549 avail
= detect_input_pending (); /* Special keyboard handler */
2553 status
= ioctl (fd
, FIONREAD
, &avail
);
2554 #else /* no FIONREAD */
2555 /* Hoping it will return -1 if nothing available
2556 or 0 if all 0 chars requested are read. */
2557 if (proc_buffered_char
[fd
] >= 0)
2561 avail
= read (fd
, &buf
, 1);
2563 proc_buffered_char
[fd
] = buf
;
2565 #endif /* no FIONREAD */
2567 if (status
>= 0 && avail
> 0)
2575 if (*local_timeout
== 0 || ravail
!= 0 || process_tick
!= update_tick
)
2578 turn_on_atimers (0);
2579 signal (SIGALRM
, select_alarm
);
2581 alarm (SELECT_PAUSE
);
2583 /* Wait for a SIGALRM (or maybe a SIGTINT) */
2584 while (select_alarmed
== 0 && *local_timeout
!= 0
2585 && process_tick
== update_tick
)
2587 /* If we are interested in terminal input,
2588 wait by reading the terminal.
2589 That makes instant wakeup for terminal input at least. */
2590 if (FD_ISSET (0, &orfds
))
2592 read_input_waiting ();
2593 if (detect_input_pending ())
2599 (*local_timeout
) -= SELECT_PAUSE
;
2601 /* Reset the old alarm if there was one. */
2602 turn_on_atimers (1);
2604 if (*local_timeout
== 0) /* Stop on timer being cleared */
2609 #endif /* not WINDOWSNT */
2611 /* Read keyboard input into the standard buffer,
2612 waiting for at least one character. */
2615 read_input_waiting ()
2617 /* XXX This needs to be updated for multi-tty support. Is there
2618 anybody who needs to emulate select these days? */
2620 extern int quit_char
;
2622 if (read_socket_hook
)
2624 struct input_event hold_quit
;
2626 EVENT_INIT (hold_quit
);
2627 hold_quit
.kind
= NO_EVENT
;
2629 read_alarm_should_throw
= 0;
2630 if (! setjmp (read_alarm_throw
))
2631 nread
= (*read_socket_hook
) (0, 1, &hold_quit
);
2635 if (hold_quit
.kind
!= NO_EVENT
)
2636 kbd_buffer_store_event (&hold_quit
);
2640 struct input_event e
;
2642 nread
= read (fileno (stdin
), buf
, 1);
2645 /* Scan the chars for C-g and store them in kbd_buffer. */
2646 e
.kind
= ASCII_KEYSTROKE_EVENT
;
2647 e
.frame_or_window
= selected_frame
;
2649 for (i
= 0; i
< nread
; i
++)
2651 /* Convert chars > 0177 to meta events if desired.
2652 We do this under the same conditions that read_avail_input does. */
2653 if (read_socket_hook
== 0)
2655 /* If the user says she has a meta key, then believe her. */
2656 if (meta_key
== 1 && (buf
[i
] & 0x80))
2657 e
.modifiers
= meta_modifier
;
2662 XSETINT (e
.code
, buf
[i
]);
2663 kbd_buffer_store_event (&e
);
2664 /* Don't look at input that follows a C-g too closely.
2665 This reduces lossage due to autorepeat on C-g. */
2666 if (buf
[i
] == quit_char
)
2672 #if !defined (HAVE_SELECT)
2673 #define select sys_select
2676 #endif /* not HAVE_SELECT */
2677 #endif /* not VMS */
2678 #endif /* not MSDOS */
2680 /* POSIX signals support - DJB */
2681 /* Anyone with POSIX signals should have ANSI C declarations */
2683 #ifdef POSIX_SIGNALS
2685 sigset_t empty_mask
, full_mask
;
2688 sys_signal (int signal_number
, signal_handler_t action
)
2690 struct sigaction new_action
, old_action
;
2691 sigemptyset (&new_action
.sa_mask
);
2692 new_action
.sa_handler
= action
;
2693 #if defined (SA_RESTART) && ! defined (BROKEN_SA_RESTART) && !defined(SYNC_INPUT)
2694 /* Emacs mostly works better with restartable system services. If this
2695 flag exists, we probably want to turn it on here.
2696 However, on some systems this resets the timeout of `select'
2697 which means that `select' never finishes if it keeps getting signals.
2698 BROKEN_SA_RESTART is defined on those systems. */
2699 /* It's not clear why the comment above says "mostly works better". --Stef
2700 When SYNC_INPUT is set, we don't want SA_RESTART because we need to poll
2701 for pending input so we need long-running syscalls to be interrupted
2702 after a signal that sets the interrupt_input_pending flag. */
2703 new_action
.sa_flags
= SA_RESTART
;
2705 new_action
.sa_flags
= 0;
2707 sigaction (signal_number
, &new_action
, &old_action
);
2708 return (old_action
.sa_handler
);
2712 /* If we're compiling with GCC, we don't need this function, since it
2713 can be written as a macro. */
2715 sys_sigmask (int sig
)
2718 sigemptyset (&mask
);
2719 sigaddset (&mask
, sig
);
2724 /* I'd like to have these guys return pointers to the mask storage in here,
2725 but there'd be trouble if the code was saving multiple masks. I'll be
2726 safe and pass the structure. It normally won't be more than 2 bytes
2730 sys_sigblock (sigset_t new_mask
)
2733 sigprocmask (SIG_BLOCK
, &new_mask
, &old_mask
);
2738 sys_sigunblock (sigset_t new_mask
)
2741 sigprocmask (SIG_UNBLOCK
, &new_mask
, &old_mask
);
2746 sys_sigsetmask (sigset_t new_mask
)
2749 sigprocmask (SIG_SETMASK
, &new_mask
, &old_mask
);
2753 #endif /* POSIX_SIGNALS */
2755 #if !defined HAVE_STRSIGNAL && !HAVE_DECL_SYS_SIGLIST
2756 static char *my_sys_siglist
[NSIG
];
2760 # define sys_siglist my_sys_siglist
2766 #ifdef POSIX_SIGNALS
2767 sigemptyset (&empty_mask
);
2768 sigfillset (&full_mask
);
2771 #if !defined HAVE_STRSIGNAL && !HAVE_DECL_SYS_SIGLIST
2775 sys_siglist
[SIGABRT
] = "Aborted";
2778 sys_siglist
[SIGAIO
] = "LAN I/O interrupt";
2781 sys_siglist
[SIGALRM
] = "Alarm clock";
2784 sys_siglist
[SIGBUS
] = "Bus error";
2787 sys_siglist
[SIGCLD
] = "Child status changed";
2790 sys_siglist
[SIGCHLD
] = "Child status changed";
2793 sys_siglist
[SIGCONT
] = "Continued";
2796 sys_siglist
[SIGDANGER
] = "Swap space dangerously low";
2799 sys_siglist
[SIGDGNOTIFY
] = "Notification message in queue";
2802 sys_siglist
[SIGEMT
] = "Emulation trap";
2805 sys_siglist
[SIGFPE
] = "Arithmetic exception";
2808 sys_siglist
[SIGFREEZE
] = "SIGFREEZE";
2811 sys_siglist
[SIGGRANT
] = "Monitor mode granted";
2814 sys_siglist
[SIGHUP
] = "Hangup";
2817 sys_siglist
[SIGILL
] = "Illegal instruction";
2820 sys_siglist
[SIGINT
] = "Interrupt";
2823 sys_siglist
[SIGIO
] = "I/O possible";
2826 sys_siglist
[SIGIOINT
] = "I/O intervention required";
2829 sys_siglist
[SIGIOT
] = "IOT trap";
2832 sys_siglist
[SIGKILL
] = "Killed";
2835 sys_siglist
[SIGLOST
] = "Resource lost";
2838 sys_siglist
[SIGLWP
] = "SIGLWP";
2841 sys_siglist
[SIGMSG
] = "Monitor mode data available";
2844 sys_siglist
[SIGWIND
] = "SIGPHONE";
2847 sys_siglist
[SIGPIPE
] = "Broken pipe";
2850 sys_siglist
[SIGPOLL
] = "Pollable event occurred";
2853 sys_siglist
[SIGPROF
] = "Profiling timer expired";
2856 sys_siglist
[SIGPTY
] = "PTY I/O interrupt";
2859 sys_siglist
[SIGPWR
] = "Power-fail restart";
2862 sys_siglist
[SIGQUIT
] = "Quit";
2865 sys_siglist
[SIGRETRACT
] = "Need to relinguish monitor mode";
2868 sys_siglist
[SIGSAK
] = "Secure attention";
2871 sys_siglist
[SIGSEGV
] = "Segmentation violation";
2874 sys_siglist
[SIGSOUND
] = "Sound completed";
2877 sys_siglist
[SIGSTOP
] = "Stopped (signal)";
2880 sys_siglist
[SIGSTP
] = "Stopped (user)";
2883 sys_siglist
[SIGSYS
] = "Bad argument to system call";
2886 sys_siglist
[SIGTERM
] = "Terminated";
2889 sys_siglist
[SIGTHAW
] = "SIGTHAW";
2892 sys_siglist
[SIGTRAP
] = "Trace/breakpoint trap";
2895 sys_siglist
[SIGTSTP
] = "Stopped (user)";
2898 sys_siglist
[SIGTTIN
] = "Stopped (tty input)";
2901 sys_siglist
[SIGTTOU
] = "Stopped (tty output)";
2904 sys_siglist
[SIGURG
] = "Urgent I/O condition";
2907 sys_siglist
[SIGUSR1
] = "User defined signal 1";
2910 sys_siglist
[SIGUSR2
] = "User defined signal 2";
2913 sys_siglist
[SIGVTALRM
] = "Virtual timer expired";
2916 sys_siglist
[SIGWAITING
] = "Process's LWPs are blocked";
2919 sys_siglist
[SIGWINCH
] = "Window size changed";
2922 sys_siglist
[SIGWIND
] = "SIGWIND";
2925 sys_siglist
[SIGXCPU
] = "CPU time limit exceeded";
2928 sys_siglist
[SIGXFSZ
] = "File size limit exceeded";
2931 #endif /* !defined HAVE_STRSIGNAL && !defined HAVE_DECL_SYS_SIGLIST */
2940 /* Figure out how many bits the system's random number generator uses.
2941 `random' and `lrand48' are assumed to return 31 usable bits.
2942 BSD `rand' returns a 31 bit value but the low order bits are unusable;
2943 so we'll shift it and treat it like the 15-bit USG `rand'. */
2947 # define RAND_BITS 31
2948 # else /* !HAVE_RANDOM */
2949 # ifdef HAVE_LRAND48
2950 # define RAND_BITS 31
2951 # define random lrand48
2952 # else /* !HAVE_LRAND48 */
2953 # define RAND_BITS 15
2954 # if RAND_MAX == 32767
2955 # define random rand
2956 # else /* RAND_MAX != 32767 */
2957 # if RAND_MAX == 2147483647
2958 # define random() (rand () >> 16)
2959 # else /* RAND_MAX != 2147483647 */
2961 # define random rand
2963 # define random() (rand () >> 16)
2965 # endif /* RAND_MAX != 2147483647 */
2966 # endif /* RAND_MAX != 32767 */
2967 # endif /* !HAVE_LRAND48 */
2968 # endif /* !HAVE_RANDOM */
2969 #endif /* !RAND_BITS */
2976 srandom ((unsigned int)arg
);
2978 # ifdef HAVE_LRAND48
2981 srand ((unsigned int)arg
);
2987 * Build a full Emacs-sized word out of whatever we've got.
2988 * This suffices even for a 64-bit architecture with a 15-bit rand.
2993 long val
= random ();
2994 #if VALBITS > RAND_BITS
2995 val
= (val
<< RAND_BITS
) ^ random ();
2996 #if VALBITS > 2*RAND_BITS
2997 val
= (val
<< RAND_BITS
) ^ random ();
2998 #if VALBITS > 3*RAND_BITS
2999 val
= (val
<< RAND_BITS
) ^ random ();
3000 #if VALBITS > 4*RAND_BITS
3001 val
= (val
<< RAND_BITS
) ^ random ();
3002 #endif /* need at least 5 */
3003 #endif /* need at least 4 */
3004 #endif /* need at least 3 */
3005 #endif /* need at least 2 */
3006 return val
& ((1L << VALBITS
) - 1);
3012 /* If any place else asks for the TERM variable,
3013 allow it to be overridden with the EMACS_TERM variable
3014 before attempting to translate the logical name TERM. As a last
3015 resort, ask for VAX C's special idea of the TERM variable. */
3022 static char buf
[256];
3023 static struct dsc$descriptor_s equiv
3024 = {sizeof (buf
), DSC$K_DTYPE_T
, DSC$K_CLASS_S
, buf
};
3025 static struct dsc$descriptor_s d_name
3026 = {0, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, 0};
3029 if (!strcmp (name
, "TERM"))
3031 val
= (char *) getenv ("EMACS_TERM");
3036 d_name
.dsc$w_length
= strlen (name
);
3037 d_name
.dsc$a_pointer
= name
;
3038 if (LIB$
SYS_TRNLOG (&d_name
, &eqlen
, &equiv
) == 1)
3040 char *str
= (char *) xmalloc (eqlen
+ 1);
3041 bcopy (buf
, str
, eqlen
);
3043 /* This is a storage leak, but a pain to fix. With luck,
3044 no one will ever notice. */
3047 return (char *) getenv (name
);
3052 /* Since VMS doesn't believe in core dumps, the only way to debug this beast is
3053 to force a call on the debugger from within the image. */
3057 reset_all_sys_modes ();
3058 LIB$
SIGNAL (SS$_DEBUG
);
3064 #ifdef LINK_CRTL_SHARE
3065 #ifdef SHARABLE_LIB_BUG
3066 /* Variables declared noshare and initialized in sharable libraries
3067 cannot be shared. The VMS linker incorrectly forces you to use a private
3068 version which is uninitialized... If not for this "feature", we
3069 could use the C library definition of sys_nerr and sys_errlist. */
3071 char *sys_errlist
[] =
3075 "no such file or directory",
3077 "interrupted system call",
3079 "no such device or address",
3080 "argument list too long",
3081 "exec format error",
3084 "no more processes",
3085 "not enough memory",
3086 "permission denied",
3088 "block device required",
3089 "mount devices busy",
3091 "cross-device link",
3096 "file table overflow",
3097 "too many open files",
3101 "no space left on device",
3103 "read-only file system",
3109 "vax/vms specific error code nontranslatable error"
3111 #endif /* SHARABLE_LIB_BUG */
3112 #endif /* LINK_CRTL_SHARE */
3115 #ifndef HAVE_STRERROR
3121 extern char *sys_errlist
[];
3122 extern int sys_nerr
;
3124 if (errnum
>= 0 && errnum
< sys_nerr
)
3125 return sys_errlist
[errnum
];
3126 return (char *) "Unknown error";
3128 #endif /* not WINDOWSNT */
3129 #endif /* ! HAVE_STRERROR */
3132 emacs_open (path
, oflag
, mode
)
3136 register int rtnval
;
3138 while ((rtnval
= open (path
, oflag
, mode
)) == -1
3139 && (errno
== EINTR
))
3149 register int rtnval
;
3151 #if defined (MAC_OSX) && defined (HAVE_CARBON)
3153 extern int mac_try_close_socket
P_ ((int));
3155 if (mac_try_close_socket (fd
))
3160 while ((rtnval
= close (fd
)) == -1
3161 && (errno
== EINTR
))
3164 /* If close is interrupted SunOS 4.1 may or may not have closed the
3165 file descriptor. If it did the second close will fail with
3166 errno = EBADF. That means we have succeeded. */
3167 if (rtnval
== -1 && did_retry
&& errno
== EBADF
)
3174 emacs_read (fildes
, buf
, nbyte
)
3179 register int rtnval
;
3181 while ((rtnval
= read (fildes
, buf
, nbyte
)) == -1
3182 && (errno
== EINTR
))
3188 emacs_write (fildes
, buf
, nbyte
)
3193 register int rtnval
, bytes_written
;
3199 rtnval
= write (fildes
, buf
, nbyte
);
3206 /* I originally used `QUIT' but that might causes files to
3207 be truncated if you hit C-g in the middle of it. --Stef */
3208 if (interrupt_input_pending
)
3209 handle_async_input ();
3210 if (pending_atimers
)
3211 do_pending_atimers ();
3216 return (bytes_written
? bytes_written
: -1);
3221 bytes_written
+= rtnval
;
3223 return (bytes_written
);
3228 * All of the following are for USG.
3230 * On USG systems the system calls are INTERRUPTIBLE by signals
3231 * that the user program has elected to catch. Thus the system call
3232 * must be retried in these cases. To handle this without massive
3233 * changes in the source code, we remap the standard system call names
3234 * to names for our own functions in sysdep.c that do the system call
3235 * with retries. Actually, for portability reasons, it is good
3236 * programming practice, as this example shows, to limit all actual
3237 * system calls to a single occurrence in the source. Sure, this
3238 * adds an extra level of function call overhead but it is almost
3239 * always negligible. Fred Fish, Unisoft Systems Inc.
3243 * Warning, this function may not duplicate 4.2 action properly
3244 * under error conditions.
3248 /* In 4.1, param.h fails to define this. */
3249 #define MAXPATHLEN 1024
3258 char *npath
, *spath
;
3259 extern char *getcwd ();
3261 BLOCK_INPUT
; /* getcwd uses malloc */
3262 spath
= npath
= getcwd ((char *) 0, MAXPATHLEN
);
3268 /* On Altos 3068, getcwd can return @hostname/dir, so discard
3269 up to first slash. Should be harmless on other systems. */
3270 while (*npath
&& *npath
!= '/')
3272 strcpy (pathname
, npath
);
3273 free (spath
); /* getcwd uses malloc */
3278 #endif /* HAVE_GETWD */
3281 * Emulate rename using unlink/link. Note that this is
3282 * only partially correct. Also, doesn't enforce restriction
3283 * that files be of same type (regular->regular, dir->dir, etc).
3292 if (access (from
, 0) == 0)
3295 if (link (from
, to
) == 0)
3296 if (unlink (from
) == 0)
3308 /* HPUX curses library references perror, but as far as we know
3309 it won't be called. Anyway this definition will do for now. */
3315 #endif /* not HAVE_PERROR */
3321 * Emulate BSD dup2. First close newd if it already exists.
3322 * Then, attempt to dup oldd. If not successful, call dup2 recursively
3323 * until we are, then close the unsuccessful ones.
3330 register int fd
, ret
;
3335 return fcntl (oldd
, F_DUPFD
, newd
);
3342 ret
= dup2 (old
,new);
3348 #endif /* not HAVE_DUP2 */
3351 * Gettimeofday. Simulate as much as possible. Only accurate
3352 * to nearest second. Emacs doesn't use tzp so ignore it for now.
3353 * Only needed when subprocesses are defined.
3358 #ifndef HAVE_GETTIMEOFDAY
3363 gettimeofday (tp
, tzp
)
3365 struct timezone
*tzp
;
3367 extern long time ();
3369 tp
->tv_sec
= time ((long *)0);
3372 tzp
->tz_minuteswest
= -1;
3379 #endif /* subprocess && !HAVE_GETTIMEOFDAY && HAVE_TIMEVAL && !VMS */
3382 * This function will go away as soon as all the stubs fixed. (fnf)
3389 printf ("%s not yet implemented\r\n", badfunc
);
3390 reset_all_sys_modes ();
3396 /* Directory routines for systems that don't have them. */
3398 #ifdef SYSV_SYSTEM_DIR
3402 #if defined (BROKEN_CLOSEDIR) || !defined (HAVE_CLOSEDIR)
3406 register DIR *dirp
; /* stream from opendir */
3410 rtnval
= emacs_close (dirp
->dd_fd
);
3412 /* Some systems (like Solaris) allocate the buffer and the DIR all
3413 in one block. Why in the world are we freeing this ourselves
3415 #if ! (defined (sun) && defined (USG5_4))
3416 xfree ((char *) dirp
->dd_buf
); /* directory block defined in <dirent.h> */
3418 xfree ((char *) dirp
);
3422 #endif /* BROKEN_CLOSEDIR or not HAVE_CLOSEDIR */
3423 #endif /* SYSV_SYSTEM_DIR */
3425 #ifdef NONSYSTEM_DIR_LIBRARY
3429 char *filename
; /* name of directory */
3431 register DIR *dirp
; /* -> malloc'ed storage */
3432 register int fd
; /* file descriptor for read */
3433 struct stat sbuf
; /* result of fstat */
3435 fd
= emacs_open (filename
, O_RDONLY
, 0);
3440 if (fstat (fd
, &sbuf
) < 0
3441 || (sbuf
.st_mode
& S_IFMT
) != S_IFDIR
3442 || (dirp
= (DIR *) xmalloc (sizeof (DIR))) == 0)
3446 return 0; /* bad luck today */
3451 dirp
->dd_loc
= dirp
->dd_size
= 0; /* refill needed */
3458 register DIR *dirp
; /* stream from opendir */
3460 emacs_close (dirp
->dd_fd
);
3461 xfree ((char *) dirp
);
3469 ino_t od_ino
; /* inode */
3470 char od_name
[DIRSIZ
]; /* filename */
3472 #endif /* not VMS */
3474 struct direct dir_static
; /* simulated directory contents */
3479 register DIR *dirp
; /* stream from opendir */
3482 register struct olddir
*dp
; /* -> directory data */
3484 register struct dir$_name
*dp
; /* -> directory data */
3485 register struct dir$_version
*dv
; /* -> version data */
3490 if (dirp
->dd_loc
>= dirp
->dd_size
)
3491 dirp
->dd_loc
= dirp
->dd_size
= 0;
3493 if (dirp
->dd_size
== 0 /* refill buffer */
3494 && (dirp
->dd_size
= emacs_read (dirp
->dd_fd
, dirp
->dd_buf
, DIRBLKSIZ
)) <= 0)
3498 dp
= (struct olddir
*) &dirp
->dd_buf
[dirp
->dd_loc
];
3499 dirp
->dd_loc
+= sizeof (struct olddir
);
3501 if (dp
->od_ino
!= 0) /* not deleted entry */
3503 dir_static
.d_ino
= dp
->od_ino
;
3504 strncpy (dir_static
.d_name
, dp
->od_name
, DIRSIZ
);
3505 dir_static
.d_name
[DIRSIZ
] = '\0';
3506 dir_static
.d_namlen
= strlen (dir_static
.d_name
);
3507 dir_static
.d_reclen
= sizeof (struct direct
)
3509 + dir_static
.d_namlen
- dir_static
.d_namlen
% 4;
3510 return &dir_static
; /* -> simulated structure */
3513 dp
= (struct dir$_name
*) dirp
->dd_buf
;
3514 if (dirp
->dd_loc
== 0)
3515 dirp
->dd_loc
= (dp
->dir$b_namecount
&1) ? dp
->dir$b_namecount
+ 1
3516 : dp
->dir$b_namecount
;
3517 dv
= (struct dir$_version
*)&dp
->dir$t_name
[dirp
->dd_loc
];
3518 dir_static
.d_ino
= dv
->dir$w_fid_num
;
3519 dir_static
.d_namlen
= dp
->dir$b_namecount
;
3520 dir_static
.d_reclen
= sizeof (struct direct
)
3522 + dir_static
.d_namlen
- dir_static
.d_namlen
% 4;
3523 strncpy (dir_static
.d_name
, dp
->dir$t_name
, dp
->dir$b_namecount
);
3524 dir_static
.d_name
[dir_static
.d_namlen
] = '\0';
3525 dirp
->dd_loc
= dirp
->dd_size
; /* only one record at a time */
3532 /* readdirver is just like readdir except it returns all versions of a file
3533 as separate entries. */
3538 register DIR *dirp
; /* stream from opendir */
3540 register struct dir$_name
*dp
; /* -> directory data */
3541 register struct dir$_version
*dv
; /* -> version data */
3543 if (dirp
->dd_loc
>= dirp
->dd_size
- sizeof (struct dir$_name
))
3544 dirp
->dd_loc
= dirp
->dd_size
= 0;
3546 if (dirp
->dd_size
== 0 /* refill buffer */
3547 && (dirp
->dd_size
= sys_read (dirp
->dd_fd
, dirp
->dd_buf
, DIRBLKSIZ
)) <= 0)
3550 dp
= (struct dir$_name
*) dirp
->dd_buf
;
3551 if (dirp
->dd_loc
== 0)
3552 dirp
->dd_loc
= (dp
->dir$b_namecount
& 1) ? dp
->dir$b_namecount
+ 1
3553 : dp
->dir$b_namecount
;
3554 dv
= (struct dir$_version
*) &dp
->dir$t_name
[dirp
->dd_loc
];
3555 strncpy (dir_static
.d_name
, dp
->dir$t_name
, dp
->dir$b_namecount
);
3556 sprintf (&dir_static
.d_name
[dp
->dir$b_namecount
], ";%d", dv
->dir$w_version
);
3557 dir_static
.d_namlen
= strlen (dir_static
.d_name
);
3558 dir_static
.d_ino
= dv
->dir$w_fid_num
;
3559 dir_static
.d_reclen
= sizeof (struct direct
) - MAXNAMLEN
+ 3
3560 + dir_static
.d_namlen
- dir_static
.d_namlen
% 4;
3561 dirp
->dd_loc
= ((char *) (++dv
) - dp
->dir$t_name
);
3567 #endif /* NONSYSTEM_DIR_LIBRARY */
3571 set_file_times (filename
, atime
, mtime
)
3572 const char *filename
;
3573 EMACS_TIME atime
, mtime
;
3576 struct timeval tv
[2];
3579 return utimes (filename
, tv
);
3580 #else /* not HAVE_UTIMES */
3582 utb
.actime
= EMACS_SECS (atime
);
3583 utb
.modtime
= EMACS_SECS (mtime
);
3584 return utime (filename
, &utb
);
3585 #endif /* not HAVE_UTIMES */
3588 /* mkdir and rmdir functions, for systems which don't have them. */
3592 * Written by Robert Rother, Mariah Corporation, August 1985.
3594 * If you want it, it's yours. All I ask in return is that if you
3595 * figure out how to do this in a Bourne Shell script you send me
3597 * sdcsvax!rmr or rmr@uscd
3599 * Severely hacked over by John Gilmore to make a 4.2BSD compatible
3600 * subroutine. 11Mar86; hoptoad!gnu
3602 * Modified by rmtodd@uokmax 6-28-87 -- when making an already existing dir,
3603 * subroutine didn't return EEXIST. It does now.
3609 #ifdef MKDIR_PROTOTYPE
3613 mkdir (dpath
, dmode
)
3618 int cpid
, status
, fd
;
3619 struct stat statbuf
;
3621 if (stat (dpath
, &statbuf
) == 0)
3623 errno
= EEXIST
; /* Stat worked, so it already exists */
3627 /* If stat fails for a reason other than non-existence, return error */
3628 if (errno
!= ENOENT
)
3631 synch_process_alive
= 1;
3632 switch (cpid
= fork ())
3635 case -1: /* Error in fork */
3636 return (-1); /* Errno is set already */
3638 case 0: /* Child process */
3640 * Cheap hack to set mode of new directory. Since this
3641 * child process is going away anyway, we zap its umask.
3642 * FIXME, this won't suffice to set SUID, SGID, etc. on this
3643 * directory. Does anybody care?
3645 status
= umask (0); /* Get current umask */
3646 status
= umask (status
| (0777 & ~dmode
)); /* Set for mkdir */
3647 fd
= emacs_open ("/dev/null", O_RDWR
, 0);
3654 execl ("/bin/mkdir", "mkdir", dpath
, (char *) 0);
3655 _exit (-1); /* Can't exec /bin/mkdir */
3657 default: /* Parent process */
3658 wait_for_termination (cpid
);
3661 if (synch_process_death
!= 0 || synch_process_retcode
!= 0
3662 || synch_process_termsig
!= 0)
3664 errno
= EIO
; /* We don't know why, but */
3665 return -1; /* /bin/mkdir failed */
3670 #endif /* not HAVE_MKDIR */
3677 int cpid
, status
, fd
;
3678 struct stat statbuf
;
3680 if (stat (dpath
, &statbuf
) != 0)
3682 /* Stat just set errno. We don't have to */
3686 synch_process_alive
= 1;
3687 switch (cpid
= fork ())
3690 case -1: /* Error in fork */
3691 return (-1); /* Errno is set already */
3693 case 0: /* Child process */
3694 fd
= emacs_open ("/dev/null", O_RDWR
, 0);
3701 execl ("/bin/rmdir", "rmdir", dpath
, (char *) 0);
3702 _exit (-1); /* Can't exec /bin/rmdir */
3704 default: /* Parent process */
3705 wait_for_termination (cpid
);
3708 if (synch_process_death
!= 0 || synch_process_retcode
!= 0
3709 || synch_process_termsig
!= 0)
3711 errno
= EIO
; /* We don't know why, but */
3712 return -1; /* /bin/rmdir failed */
3717 #endif /* !HAVE_RMDIR */
3721 /* Functions for VMS */
3727 /* Return as a string the VMS error string pertaining to STATUS.
3728 Reuses the same static buffer each time it is called. */
3732 int status
; /* VMS status code */
3736 static char buf
[257];
3738 bufadr
[0] = sizeof buf
- 1;
3739 bufadr
[1] = (int) buf
;
3740 if (! (SYS$
GETMSG (status
, &len
, bufadr
, 0x1, 0) & 1))
3741 return "untranslatable VMS error status";
3749 /* The following is necessary because 'access' emulation by VMS C (2.0) does
3750 * not work correctly. (It also doesn't work well in version 2.3.)
3755 #define DESCRIPTOR(name,string) struct dsc$descriptor_s name = \
3756 { strlen (string), DSC$K_DTYPE_T, DSC$K_CLASS_S, string }
3760 unsigned short s_buflen
;
3761 unsigned short s_code
;
3763 unsigned short *s_retlenadr
;
3767 #define buflen s.s_buflen
3768 #define code s.s_code
3769 #define bufadr s.s_bufadr
3770 #define retlenadr s.s_retlenadr
3772 #define R_OK 4 /* test for read permission */
3773 #define W_OK 2 /* test for write permission */
3774 #define X_OK 1 /* test for execute (search) permission */
3775 #define F_OK 0 /* test for presence of file */
3778 sys_access (path
, mode
)
3782 static char *user
= NULL
;
3785 /* translate possible directory spec into .DIR file name, so brain-dead
3786 * access can treat the directory like a file. */
3787 if (directory_file_name (path
, dir_fn
))
3791 return access (path
, mode
);
3792 if (user
== NULL
&& (user
= (char *) getenv ("USER")) == NULL
)
3798 unsigned short int dummy
;
3800 static int constant
= ACL$C_FILE
;
3801 DESCRIPTOR (path_desc
, path
);
3802 DESCRIPTOR (user_desc
, user
);
3806 if ((mode
& X_OK
) && ((stat
= access (path
, mode
)) < 0 || mode
== X_OK
))
3809 acces
|= CHP$M_READ
;
3811 acces
|= CHP$M_WRITE
;
3812 itemlst
[0].buflen
= sizeof (int);
3813 itemlst
[0].code
= CHP$_FLAGS
;
3814 itemlst
[0].bufadr
= (char *) &flags
;
3815 itemlst
[0].retlenadr
= &dummy
;
3816 itemlst
[1].buflen
= sizeof (int);
3817 itemlst
[1].code
= CHP$_ACCESS
;
3818 itemlst
[1].bufadr
= (char *) &acces
;
3819 itemlst
[1].retlenadr
= &dummy
;
3820 itemlst
[2].end
= CHP$_END
;
3821 stat
= SYS$
CHECK_ACCESS (&constant
, &path_desc
, &user_desc
, itemlst
);
3822 return stat
== SS$_NORMAL
? 0 : -1;
3826 #else /* not VMS4_4 */
3829 #define ACE$M_WRITE 2
3830 #define ACE$C_KEYID 1
3832 static unsigned short memid
, grpid
;
3833 static unsigned int uic
;
3835 /* Called from init_sys_modes, so it happens not very often
3836 but at least each time Emacs is loaded. */
3838 sys_access_reinit ()
3844 sys_access (filename
, type
)
3850 int status
, size
, i
, typecode
, acl_controlled
;
3851 unsigned int *aclptr
, *aclend
, aclbuf
[60];
3852 union prvdef prvmask
;
3854 /* Get UIC and GRP values for protection checking. */
3857 status
= LIB$
GETJPI (&JPI$_UIC
, 0, 0, &uic
, 0, 0);
3860 memid
= uic
& 0xFFFF;
3864 if (type
!= 2) /* not checking write access */
3865 return access (filename
, type
);
3867 /* Check write protection. */
3869 #define CHECKPRIV(bit) (prvmask.bit)
3870 #define WRITABLE(field) (! ((xab.xab$w_pro >> field) & XAB$M_NOWRITE))
3872 /* Find privilege bits */
3873 status
= SYS$
SETPRV (0, 0, 0, prvmask
);
3875 error ("Unable to find privileges: %s", vmserrstr (status
));
3876 if (CHECKPRIV (PRV$V_BYPASS
))
3877 return 0; /* BYPASS enabled */
3879 fab
.fab$b_fac
= FAB$M_GET
;
3880 fab
.fab$l_fna
= filename
;
3881 fab
.fab$b_fns
= strlen (filename
);
3882 fab
.fab$l_xab
= &xab
;
3883 xab
= cc$rms_xabpro
;
3884 xab
.xab$l_aclbuf
= aclbuf
;
3885 xab
.xab$w_aclsiz
= sizeof (aclbuf
);
3886 status
= SYS$
OPEN (&fab
, 0, 0);
3889 SYS$
CLOSE (&fab
, 0, 0);
3890 /* Check system access */
3891 if (CHECKPRIV (PRV$V_SYSPRV
) && WRITABLE (XAB$V_SYS
))
3893 /* Check ACL entries, if any */
3895 if (xab
.xab$w_acllen
> 0)
3898 aclend
= &aclbuf
[xab
.xab$w_acllen
/ 4];
3899 while (*aclptr
&& aclptr
< aclend
)
3901 size
= (*aclptr
& 0xff) / 4;
3902 typecode
= (*aclptr
>> 8) & 0xff;
3903 if (typecode
== ACE$C_KEYID
)
3904 for (i
= size
- 1; i
> 1; i
--)
3905 if (aclptr
[i
] == uic
)
3908 if (aclptr
[1] & ACE$M_WRITE
)
3909 return 0; /* Write access through ACL */
3911 aclptr
= &aclptr
[size
];
3913 if (acl_controlled
) /* ACL specified, prohibits write access */
3916 /* No ACL entries specified, check normal protection */
3917 if (WRITABLE (XAB$V_WLD
)) /* World writable */
3919 if (WRITABLE (XAB$V_GRP
) &&
3920 (unsigned short) (xab
.xab$l_uic
>> 16) == grpid
)
3921 return 0; /* Group writable */
3922 if (WRITABLE (XAB$V_OWN
) &&
3923 (xab
.xab$l_uic
& 0xFFFF) == memid
)
3924 return 0; /* Owner writable */
3926 return -1; /* Not writable */
3928 #endif /* not VMS4_4 */
3931 static char vtbuf
[NAM$C_MAXRSS
+1];
3933 /* translate a vms file spec to a unix path */
3935 sys_translate_vms (vfile
)
3946 /* leading device or logical name is a root directory */
3947 if (p
= strchr (vfile
, ':'))
3956 if (*p
== '[' || *p
== '<')
3958 while (*++vfile
!= *p
+ 2)
3962 if (vfile
[-1] == *p
)
3985 static char utbuf
[NAM$C_MAXRSS
+1];
3987 /* translate a unix path to a VMS file spec */
3989 sys_translate_unix (ufile
)
4012 if (index (&ufile
[1], '/'))
4019 if (index (&ufile
[1], '/'))
4026 if (strncmp (ufile
, "./", 2) == 0)
4033 ufile
++; /* skip the dot */
4034 if (index (&ufile
[1], '/'))
4039 else if (strncmp (ufile
, "../", 3) == 0)
4047 ufile
+= 2; /* skip the dots */
4048 if (index (&ufile
[1], '/'))
4073 extern char *getcwd ();
4075 #define MAXPATHLEN 1024
4077 ptr
= xmalloc (MAXPATHLEN
);
4078 val
= getcwd (ptr
, MAXPATHLEN
);
4084 strcpy (pathname
, ptr
);
4093 long item_code
= JPI$_OWNER
;
4094 unsigned long parent_id
;
4097 if (((status
= LIB$
GETJPI (&item_code
, 0, 0, &parent_id
)) & 1) == 0)
4100 vaxc$errno
= status
;
4110 return (getgid () << 16) | getuid ();
4115 sys_read (fildes
, buf
, nbyte
)
4120 return read (fildes
, buf
, (nbyte
< MAXIOSIZE
? nbyte
: MAXIOSIZE
));
4125 sys_write (fildes
, buf
, nbyte
)
4130 register int nwrote
, rtnval
= 0;
4132 while (nbyte
> MAXIOSIZE
&& (nwrote
= write (fildes
, buf
, MAXIOSIZE
)) > 0) {
4138 return rtnval
? rtnval
: -1;
4139 if ((nwrote
= write (fildes
, buf
, nbyte
)) < 0)
4140 return rtnval
? rtnval
: -1;
4141 return (rtnval
+ nwrote
);
4146 * VAX/VMS VAX C RTL really loses. It insists that records
4147 * end with a newline (carriage return) character, and if they
4148 * don't it adds one (nice of it isn't it!)
4150 * Thus we do this stupidity below.
4155 sys_write (fildes
, buf
, nbytes
)
4158 unsigned int nbytes
;
4165 fstat (fildes
, &st
);
4171 /* Handle fixed-length files with carriage control. */
4172 if (st
.st_fab_rfm
== FAB$C_FIX
4173 && ((st
.st_fab_rat
& (FAB$M_FTN
| FAB$M_CR
)) != 0))
4175 len
= st
.st_fab_mrs
;
4176 retval
= write (fildes
, p
, min (len
, nbytes
));
4179 retval
++; /* This skips the implied carriage control */
4183 e
= p
+ min (MAXIOSIZE
, nbytes
) - 1;
4184 while (*e
!= '\n' && e
> p
) e
--;
4185 if (p
== e
) /* Ok.. so here we add a newline... sigh. */
4186 e
= p
+ min (MAXIOSIZE
, nbytes
) - 1;
4188 retval
= write (fildes
, p
, len
);
4199 /* Create file NEW copying its attributes from file OLD. If
4200 OLD is 0 or does not exist, create based on the value of
4203 /* Protection value the file should ultimately have.
4204 Set by create_copy_attrs, and use by rename_sansversions. */
4205 static unsigned short int fab_final_pro
;
4208 creat_copy_attrs (old
, new)
4211 struct FAB fab
= cc$rms_fab
;
4212 struct XABPRO xabpro
;
4213 char aclbuf
[256]; /* Choice of size is arbitrary. See below. */
4214 extern int vms_stmlf_recfm
;
4218 fab
.fab$b_fac
= FAB$M_GET
;
4219 fab
.fab$l_fna
= old
;
4220 fab
.fab$b_fns
= strlen (old
);
4221 fab
.fab$l_xab
= (char *) &xabpro
;
4222 xabpro
= cc$rms_xabpro
;
4223 xabpro
.xab$l_aclbuf
= aclbuf
;
4224 xabpro
.xab$w_aclsiz
= sizeof aclbuf
;
4225 /* Call $OPEN to fill in the fab & xabpro fields. */
4226 if (SYS$
OPEN (&fab
, 0, 0) & 1)
4228 SYS$
CLOSE (&fab
, 0, 0);
4229 fab
.fab$l_alq
= 0; /* zero the allocation quantity */
4230 if (xabpro
.xab$w_acllen
> 0)
4232 if (xabpro
.xab$w_acllen
> sizeof aclbuf
)
4233 /* If the acl buffer was too short, redo open with longer one.
4234 Wouldn't need to do this if there were some system imposed
4235 limit on the size of an ACL, but I can't find any such. */
4237 xabpro
.xab$l_aclbuf
= (char *) alloca (xabpro
.xab$w_acllen
);
4238 xabpro
.xab$w_aclsiz
= xabpro
.xab$w_acllen
;
4239 if (SYS$
OPEN (&fab
, 0, 0) & 1)
4240 SYS$
CLOSE (&fab
, 0, 0);
4246 xabpro
.xab$l_aclbuf
= 0;
4251 fab
.fab$l_fna
= new;
4252 fab
.fab$b_fns
= strlen (new);
4256 fab
.fab$b_rfm
= vms_stmlf_recfm
? FAB$C_STMLF
: FAB$C_VAR
;
4257 fab
.fab$b_rat
= FAB$M_CR
;
4260 /* Set the file protections such that we will be able to manipulate
4261 this file. Once we are done writing and renaming it, we will set
4262 the protections back. */
4264 fab_final_pro
= xabpro
.xab$w_pro
;
4266 SYS$
SETDFPROT (0, &fab_final_pro
);
4267 xabpro
.xab$w_pro
&= 0xff0f; /* set O:rewd for now. This is set back later. */
4269 /* Create the new file with either default attrs or attrs copied
4271 if (!(SYS$
CREATE (&fab
, 0, 0) & 1))
4273 SYS$
CLOSE (&fab
, 0, 0);
4274 /* As this is a "replacement" for creat, return a file descriptor
4275 opened for writing. */
4276 return open (new, O_WRONLY
);
4281 #include <varargs.h>
4284 #define va_count(X) ((X) = *(((int *) &(va_alist)) - 1))
4289 sys_creat (va_alist
)
4292 va_list list_incrementer
;
4295 int rfd
; /* related file descriptor */
4296 int fd
; /* Our new file descriptor */
4303 extern int vms_stmlf_recfm
;
4306 va_start (list_incrementer
);
4307 name
= va_arg (list_incrementer
, char *);
4308 mode
= va_arg (list_incrementer
, int);
4310 rfd
= va_arg (list_incrementer
, int);
4311 va_end (list_incrementer
);
4314 /* Use information from the related file descriptor to set record
4315 format of the newly created file. */
4316 fstat (rfd
, &st_buf
);
4317 switch (st_buf
.st_fab_rfm
)
4320 strcpy (rfm
, "rfm = fix");
4321 sprintf (mrs
, "mrs = %d", st_buf
.st_fab_mrs
);
4322 strcpy (rat
, "rat = ");
4323 if (st_buf
.st_fab_rat
& FAB$M_CR
)
4325 else if (st_buf
.st_fab_rat
& FAB$M_FTN
)
4326 strcat (rat
, "ftn");
4327 else if (st_buf
.st_fab_rat
& FAB$M_PRN
)
4328 strcat (rat
, "prn");
4329 if (st_buf
.st_fab_rat
& FAB$M_BLK
)
4330 if (st_buf
.st_fab_rat
& (FAB$M_CR
|FAB$M_FTN
|FAB$M_PRN
))
4331 strcat (rat
, ", blk");
4333 strcat (rat
, "blk");
4334 return creat (name
, 0, rfm
, rat
, mrs
);
4337 strcpy (rfm
, "rfm = vfc");
4338 sprintf (fsz
, "fsz = %d", st_buf
.st_fab_fsz
);
4339 strcpy (rat
, "rat = ");
4340 if (st_buf
.st_fab_rat
& FAB$M_CR
)
4342 else if (st_buf
.st_fab_rat
& FAB$M_FTN
)
4343 strcat (rat
, "ftn");
4344 else if (st_buf
.st_fab_rat
& FAB$M_PRN
)
4345 strcat (rat
, "prn");
4346 if (st_buf
.st_fab_rat
& FAB$M_BLK
)
4347 if (st_buf
.st_fab_rat
& (FAB$M_CR
|FAB$M_FTN
|FAB$M_PRN
))
4348 strcat (rat
, ", blk");
4350 strcat (rat
, "blk");
4351 return creat (name
, 0, rfm
, rat
, fsz
);
4354 strcpy (rfm
, "rfm = stm");
4358 strcpy (rfm
, "rfm = stmcr");
4362 strcpy (rfm
, "rfm = stmlf");
4366 strcpy (rfm
, "rfm = udf");
4370 strcpy (rfm
, "rfm = var");
4373 strcpy (rat
, "rat = ");
4374 if (st_buf
.st_fab_rat
& FAB$M_CR
)
4376 else if (st_buf
.st_fab_rat
& FAB$M_FTN
)
4377 strcat (rat
, "ftn");
4378 else if (st_buf
.st_fab_rat
& FAB$M_PRN
)
4379 strcat (rat
, "prn");
4380 if (st_buf
.st_fab_rat
& FAB$M_BLK
)
4381 if (st_buf
.st_fab_rat
& (FAB$M_CR
|FAB$M_FTN
|FAB$M_PRN
))
4382 strcat (rat
, ", blk");
4384 strcat (rat
, "blk");
4388 strcpy (rfm
, vms_stmlf_recfm
? "rfm = stmlf" : "rfm=var");
4389 strcpy (rat
, "rat=cr");
4391 /* Until the VAX C RTL fixes the many bugs with modes, always use
4392 mode 0 to get the user's default protection. */
4393 fd
= creat (name
, 0, rfm
, rat
);
4394 if (fd
< 0 && errno
== EEXIST
)
4396 if (unlink (name
) < 0)
4397 report_file_error ("delete", build_string (name
));
4398 fd
= creat (name
, 0, rfm
, rat
);
4404 /* fwrite to stdout is S L O W. Speed it up by using fputc...*/
4406 sys_fwrite (ptr
, size
, num
, fp
)
4407 register char * ptr
;
4410 register int tot
= num
* size
;
4418 * The VMS C library routine creat actually creates a new version of an
4419 * existing file rather than truncating the old version. There are times
4420 * when this is not the desired behavior, for instance, when writing an
4421 * auto save file (you only want one version), or when you don't have
4422 * write permission in the directory containing the file (but the file
4423 * itself is writable). Hence this routine, which is equivalent to
4424 * "close (creat (fn, 0));" on Unix if fn already exists.
4430 struct FAB xfab
= cc$rms_fab
;
4431 struct RAB xrab
= cc$rms_rab
;
4434 xfab
.fab$l_fop
= FAB$M_TEF
; /* free allocated but unused blocks on close */
4435 xfab
.fab$b_fac
= FAB$M_TRN
| FAB$M_GET
; /* allow truncate and get access */
4436 xfab
.fab$b_shr
= FAB$M_NIL
; /* allow no sharing - file must be locked */
4437 xfab
.fab$l_fna
= fn
;
4438 xfab
.fab$b_fns
= strlen (fn
);
4439 xfab
.fab$l_dna
= ";0"; /* default to latest version of the file */
4441 xrab
.rab$l_fab
= &xfab
;
4443 /* This gibberish opens the file, positions to the first record, and
4444 deletes all records from there until the end of file. */
4445 if ((SYS$
OPEN (&xfab
) & 01) == 01)
4447 if ((SYS$
CONNECT (&xrab
) & 01) == 01 &&
4448 (SYS$
FIND (&xrab
) & 01) == 01 &&
4449 (SYS$
TRUNCATE (&xrab
) & 01) == 01)
4460 /* Define this symbol to actually read SYSUAF.DAT. This requires either
4461 SYSPRV or a readable SYSUAF.DAT. */
4467 * Routine to read the VMS User Authorization File and return
4468 * a specific user's record.
4471 static struct UAF retuaf
;
4474 get_uaf_name (uname
)
4481 uaf_fab
= cc$rms_fab
;
4482 uaf_rab
= cc$rms_rab
;
4483 /* initialize fab fields */
4484 uaf_fab
.fab$l_fna
= "SYS$SYSTEM:SYSUAF.DAT";
4485 uaf_fab
.fab$b_fns
= 21;
4486 uaf_fab
.fab$b_fac
= FAB$M_GET
;
4487 uaf_fab
.fab$b_org
= FAB$C_IDX
;
4488 uaf_fab
.fab$b_shr
= FAB$M_GET
|FAB$M_PUT
|FAB$M_UPD
|FAB$M_DEL
;
4489 /* initialize rab fields */
4490 uaf_rab
.rab$l_fab
= &uaf_fab
;
4491 /* open the User Authorization File */
4492 status
= SYS$
OPEN (&uaf_fab
);
4496 vaxc$errno
= status
;
4499 status
= SYS$
CONNECT (&uaf_rab
);
4503 vaxc$errno
= status
;
4506 /* read the requested record - index is in uname */
4507 uaf_rab
.rab$l_kbf
= uname
;
4508 uaf_rab
.rab$b_ksz
= strlen (uname
);
4509 uaf_rab
.rab$b_rac
= RAB$C_KEY
;
4510 uaf_rab
.rab$l_ubf
= (char *)&retuaf
;
4511 uaf_rab
.rab$w_usz
= sizeof retuaf
;
4512 status
= SYS$
GET (&uaf_rab
);
4516 vaxc$errno
= status
;
4519 /* close the User Authorization File */
4520 status
= SYS$
DISCONNECT (&uaf_rab
);
4524 vaxc$errno
= status
;
4527 status
= SYS$
CLOSE (&uaf_fab
);
4531 vaxc$errno
= status
;
4545 uaf_fab
= cc$rms_fab
;
4546 uaf_rab
= cc$rms_rab
;
4547 /* initialize fab fields */
4548 uaf_fab
.fab$l_fna
= "SYS$SYSTEM:SYSUAF.DAT";
4549 uaf_fab
.fab$b_fns
= 21;
4550 uaf_fab
.fab$b_fac
= FAB$M_GET
;
4551 uaf_fab
.fab$b_org
= FAB$C_IDX
;
4552 uaf_fab
.fab$b_shr
= FAB$M_GET
|FAB$M_PUT
|FAB$M_UPD
|FAB$M_DEL
;
4553 /* initialize rab fields */
4554 uaf_rab
.rab$l_fab
= &uaf_fab
;
4555 /* open the User Authorization File */
4556 status
= SYS$
OPEN (&uaf_fab
);
4560 vaxc$errno
= status
;
4563 status
= SYS$
CONNECT (&uaf_rab
);
4567 vaxc$errno
= status
;
4570 /* read the requested record - index is in uic */
4571 uaf_rab
.rab$b_krf
= 1; /* 1st alternate key */
4572 uaf_rab
.rab$l_kbf
= (char *) &uic
;
4573 uaf_rab
.rab$b_ksz
= sizeof uic
;
4574 uaf_rab
.rab$b_rac
= RAB$C_KEY
;
4575 uaf_rab
.rab$l_ubf
= (char *)&retuaf
;
4576 uaf_rab
.rab$w_usz
= sizeof retuaf
;
4577 status
= SYS$
GET (&uaf_rab
);
4581 vaxc$errno
= status
;
4584 /* close the User Authorization File */
4585 status
= SYS$
DISCONNECT (&uaf_rab
);
4589 vaxc$errno
= status
;
4592 status
= SYS$
CLOSE (&uaf_fab
);
4596 vaxc$errno
= status
;
4602 static struct passwd retpw
;
4610 /* copy these out first because if the username is 32 chars, the next
4611 section will overwrite the first byte of the UIC */
4612 retpw
.pw_uid
= up
->uaf$w_mem
;
4613 retpw
.pw_gid
= up
->uaf$w_grp
;
4615 /* I suppose this is not the best style, to possibly overwrite one
4616 byte beyond the end of the field, but what the heck... */
4617 ptr
= &up
->uaf$t_username
[UAF$S_USERNAME
];
4618 while (ptr
[-1] == ' ')
4621 strcpy (retpw
.pw_name
, up
->uaf$t_username
);
4623 /* the rest of these are counted ascii strings */
4624 strncpy (retpw
.pw_gecos
, &up
->uaf$t_owner
[1], up
->uaf$t_owner
[0]);
4625 retpw
.pw_gecos
[up
->uaf$t_owner
[0]] = '\0';
4626 strncpy (retpw
.pw_dir
, &up
->uaf$t_defdev
[1], up
->uaf$t_defdev
[0]);
4627 retpw
.pw_dir
[up
->uaf$t_defdev
[0]] = '\0';
4628 strncat (retpw
.pw_dir
, &up
->uaf$t_defdir
[1], up
->uaf$t_defdir
[0]);
4629 retpw
.pw_dir
[up
->uaf$t_defdev
[0] + up
->uaf$t_defdir
[0]] = '\0';
4630 strncpy (retpw
.pw_shell
, &up
->uaf$t_defcli
[1], up
->uaf$t_defcli
[0]);
4631 retpw
.pw_shell
[up
->uaf$t_defcli
[0]] = '\0';
4635 #else /* not READ_SYSUAF */
4636 static struct passwd retpw
;
4637 #endif /* not READ_SYSUAF */
4648 unsigned char * full
;
4649 #endif /* READ_SYSUAF */
4654 if ('a' <= *ptr
&& *ptr
<= 'z')
4659 if (!(up
= get_uaf_name (name
)))
4661 return cnv_uaf_pw (up
);
4663 if (strcmp (name
, getenv ("USER")) == 0)
4665 retpw
.pw_uid
= getuid ();
4666 retpw
.pw_gid
= getgid ();
4667 strcpy (retpw
.pw_name
, name
);
4668 if (full
= egetenv ("FULLNAME"))
4669 strcpy (retpw
.pw_gecos
, full
);
4671 *retpw
.pw_gecos
= '\0';
4672 strcpy (retpw
.pw_dir
, egetenv ("HOME"));
4673 *retpw
.pw_shell
= '\0';
4678 #endif /* not READ_SYSUAF */
4688 if (!(up
= get_uaf_uic (uid
)))
4690 return cnv_uaf_pw (up
);
4692 if (uid
== sys_getuid ())
4693 return getpwnam (egetenv ("USER"));
4696 #endif /* not READ_SYSUAF */
4699 /* return total address space available to the current process. This is
4700 the sum of the current p0 size, p1 size and free page table entries
4706 unsigned long free_pages
;
4707 unsigned long frep0va
;
4708 unsigned long frep1va
;
4711 item_code
= JPI$_FREPTECNT
;
4712 if (((status
= LIB$
GETJPI (&item_code
, 0, 0, &free_pages
)) & 1) == 0)
4715 vaxc$errno
= status
;
4720 item_code
= JPI$_FREP0VA
;
4721 if (((status
= LIB$
GETJPI (&item_code
, 0, 0, &frep0va
)) & 1) == 0)
4724 vaxc$errno
= status
;
4727 item_code
= JPI$_FREP1VA
;
4728 if (((status
= LIB$
GETJPI (&item_code
, 0, 0, &frep1va
)) & 1) == 0)
4731 vaxc$errno
= status
;
4735 return free_pages
+ frep0va
+ (0x7fffffff - frep1va
);
4739 define_logical_name (varname
, string
)
4743 struct dsc$descriptor_s strdsc
=
4744 {strlen (string
), DSC$K_DTYPE_T
, DSC$K_CLASS_S
, string
};
4745 struct dsc$descriptor_s envdsc
=
4746 {strlen (varname
), DSC$K_DTYPE_T
, DSC$K_CLASS_S
, varname
};
4747 struct dsc$descriptor_s lnmdsc
=
4748 {7, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, "LNM$JOB"};
4750 return LIB$
SET_LOGICAL (&envdsc
, &strdsc
, &lnmdsc
, 0, 0);
4754 delete_logical_name (varname
)
4757 struct dsc$descriptor_s envdsc
=
4758 {strlen (varname
), DSC$K_DTYPE_T
, DSC$K_CLASS_S
, varname
};
4759 struct dsc$descriptor_s lnmdsc
=
4760 {7, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, "LNM$JOB"};
4762 return LIB$
DELETE_LOGICAL (&envdsc
, &lnmdsc
);
4780 error ("execvp system call not implemented");
4789 struct FAB from_fab
= cc$rms_fab
, to_fab
= cc$rms_fab
;
4790 struct NAM from_nam
= cc$rms_nam
, to_nam
= cc$rms_nam
;
4791 char from_esn
[NAM$C_MAXRSS
];
4792 char to_esn
[NAM$C_MAXRSS
];
4794 from_fab
.fab$l_fna
= from
;
4795 from_fab
.fab$b_fns
= strlen (from
);
4796 from_fab
.fab$l_nam
= &from_nam
;
4797 from_fab
.fab$l_fop
= FAB$M_NAM
;
4799 from_nam
.nam$l_esa
= from_esn
;
4800 from_nam
.nam$b_ess
= sizeof from_esn
;
4802 to_fab
.fab$l_fna
= to
;
4803 to_fab
.fab$b_fns
= strlen (to
);
4804 to_fab
.fab$l_nam
= &to_nam
;
4805 to_fab
.fab$l_fop
= FAB$M_NAM
;
4807 to_nam
.nam$l_esa
= to_esn
;
4808 to_nam
.nam$b_ess
= sizeof to_esn
;
4810 status
= SYS$
RENAME (&from_fab
, 0, 0, &to_fab
);
4816 if (status
== RMS$_DEV
)
4820 vaxc$errno
= status
;
4825 /* This function renames a file like `rename', but it strips
4826 the version number from the "to" filename, such that the "to" file is
4827 will always be a new version. It also sets the file protection once it is
4828 finished. The protection that we will use is stored in fab_final_pro,
4829 and was set when we did a creat_copy_attrs to create the file that we
4832 We could use the chmod function, but Eunichs uses 3 bits per user category
4833 to describe the protection, and VMS uses 4 (write and delete are separate
4834 bits). To maintain portability, the VMS implementation of `chmod' wires
4835 the W and D bits together. */
4838 static struct fibdef fib
; /* We need this initialized to zero */
4839 char vms_file_written
[NAM$C_MAXRSS
];
4842 rename_sans_version (from
,to
)
4849 struct FAB to_fab
= cc$rms_fab
;
4850 struct NAM to_nam
= cc$rms_nam
;
4851 struct dsc$descriptor fib_d
={sizeof (fib
),0,0,(char*) &fib
};
4852 struct dsc$descriptor fib_attr
[2]
4853 = {{sizeof (fab_final_pro
),ATR$C_FPRO
,0,(char*) &fab_final_pro
},{0,0,0,0}};
4854 char to_esn
[NAM$C_MAXRSS
];
4856 $
DESCRIPTOR (disk
,to_esn
);
4858 to_fab
.fab$l_fna
= to
;
4859 to_fab
.fab$b_fns
= strlen (to
);
4860 to_fab
.fab$l_nam
= &to_nam
;
4861 to_fab
.fab$l_fop
= FAB$M_NAM
;
4863 to_nam
.nam$l_esa
= to_esn
;
4864 to_nam
.nam$b_ess
= sizeof to_esn
;
4866 status
= SYS$
PARSE (&to_fab
, 0, 0); /* figure out the full file name */
4868 if (to_nam
.nam$l_fnb
&& NAM$M_EXP_VER
)
4869 *(to_nam
.nam$l_ver
) = '\0';
4871 stat
= rename (from
, to_esn
);
4875 strcpy (vms_file_written
, to_esn
);
4877 to_fab
.fab$l_fna
= vms_file_written
; /* this points to the versionless name */
4878 to_fab
.fab$b_fns
= strlen (vms_file_written
);
4880 /* Now set the file protection to the correct value */
4881 SYS$
OPEN (&to_fab
, 0, 0); /* This fills in the nam$w_fid fields */
4883 /* Copy these fields into the fib */
4884 fib
.fib$r_fid_overlay
.fib$w_fid
[0] = to_nam
.nam$w_fid
[0];
4885 fib
.fib$r_fid_overlay
.fib$w_fid
[1] = to_nam
.nam$w_fid
[1];
4886 fib
.fib$r_fid_overlay
.fib$w_fid
[2] = to_nam
.nam$w_fid
[2];
4888 SYS$
CLOSE (&to_fab
, 0, 0);
4890 stat
= SYS$
ASSIGN (&disk
, &chan
, 0, 0); /* open a channel to the disk */
4893 stat
= SYS$
QIOW (0, chan
, IO$_MODIFY
, iosb
, 0, 0, &fib_d
,
4894 0, 0, 0, &fib_attr
, 0);
4897 stat
= SYS$
DASSGN (chan
);
4900 strcpy (vms_file_written
, to_esn
); /* We will write this to the terminal*/
4911 unsigned short fid
[3];
4912 char esa
[NAM$C_MAXRSS
];
4915 fab
.fab$l_fop
= FAB$M_OFP
;
4916 fab
.fab$l_fna
= file
;
4917 fab
.fab$b_fns
= strlen (file
);
4918 fab
.fab$l_nam
= &nam
;
4921 nam
.nam$l_esa
= esa
;
4922 nam
.nam$b_ess
= NAM$C_MAXRSS
;
4924 status
= SYS$
PARSE (&fab
);
4925 if ((status
& 1) == 0)
4928 vaxc$errno
= status
;
4931 status
= SYS$
SEARCH (&fab
);
4932 if ((status
& 1) == 0)
4935 vaxc$errno
= status
;
4939 fid
[0] = nam
.nam$w_fid
[0];
4940 fid
[1] = nam
.nam$w_fid
[1];
4941 fid
[2] = nam
.nam$w_fid
[2];
4943 fab
.fab$l_fna
= new;
4944 fab
.fab$b_fns
= strlen (new);
4946 status
= SYS$
PARSE (&fab
);
4947 if ((status
& 1) == 0)
4950 vaxc$errno
= status
;
4954 nam
.nam$w_fid
[0] = fid
[0];
4955 nam
.nam$w_fid
[1] = fid
[1];
4956 nam
.nam$w_fid
[2] = fid
[2];
4958 nam
.nam$l_esa
= nam
.nam$l_name
;
4959 nam
.nam$b_esl
= nam
.nam$b_name
+ nam
.nam$b_type
+ nam
.nam$b_ver
;
4961 status
= SYS$
ENTER (&fab
);
4962 if ((status
& 1) == 0)
4965 vaxc$errno
= status
;
4976 printf ("%s not yet implemented\r\n", badfunc
);
4977 reset_all_sys_modes ();
4984 /* Arrange to return a range centered on zero. */
4985 return rand () - (1 << 30);
5002 register int length
;
5006 long max_str
= 65535;
5008 while (length
> max_str
) {
5009 (void) LIB$
MOVC5 (&zero
, &zero
, &zero
, &max_str
, b
);
5014 (void) LIB$
MOVC5 (&zero
, &zero
, &zero
, &max_str
, b
);
5016 while (length
-- > 0)
5018 #endif /* not VMS */
5021 #endif /* no bzero */
5022 #endif /* BSTRING */
5024 #if (!defined (BSTRING) && !defined (bcopy)) || defined (NEED_BCOPY)
5027 /* Saying `void' requires a declaration, above, where bcopy is used
5028 and that declaration causes pain for systems where bcopy is a macro. */
5029 bcopy (b1
, b2
, length
)
5032 register int length
;
5035 long max_str
= 65535;
5037 while (length
> max_str
) {
5038 (void) LIB$
MOVC3 (&max_str
, b1
, b2
);
5044 (void) LIB$
MOVC3 (&length
, b1
, b2
);
5046 while (length
-- > 0)
5048 #endif /* not VMS */
5050 #endif /* (!defined (BSTRING) && !defined (bcopy)) || defined (NEED_BCOPY) */
5055 bcmp (b1
, b2
, length
) /* This could be a macro! */
5058 register int length
;
5061 struct dsc$descriptor_s src1
= {length
, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, b1
};
5062 struct dsc$descriptor_s src2
= {length
, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, b2
};
5064 return STR$
COMPARE (&src1
, &src2
);
5066 while (length
-- > 0)
5071 #endif /* not VMS */
5073 #endif /* no bcmp */
5074 #endif /* not BSTRING */
5076 #ifndef HAVE_STRSIGNAL
5083 if (0 <= code
&& code
< NSIG
)
5086 signame
= sys_errlist
[code
];
5088 /* Cast to suppress warning if the table has const char *. */
5089 signame
= (char *) sys_siglist
[code
];
5095 #endif /* HAVE_STRSIGNAL */
5098 /* For make-serial-process */
5099 int serial_open (char *port
)
5103 fd
= emacs_open ((char*) port
,
5116 error ("Could not open %s: %s",
5117 port
, emacs_strerror (errno
));
5120 ioctl (fd
, TIOCEXCL
, (char *) 0);
5125 #endif /* TERMIOS */
5129 #if !defined (HAVE_CFMAKERAW)
5130 /* Workaround for targets which are missing cfmakeraw. */
5131 /* Pasted from man page. */
5132 static void cfmakeraw (struct termios
*termios_p
)
5134 termios_p
->c_iflag
&= ~(IGNBRK
|BRKINT
|PARMRK
|ISTRIP
|INLCR
|IGNCR
|ICRNL
|IXON
);
5135 termios_p
->c_oflag
&= ~OPOST
;
5136 termios_p
->c_lflag
&= ~(ECHO
|ECHONL
|ICANON
|ISIG
|IEXTEN
);
5137 termios_p
->c_cflag
&= ~(CSIZE
|PARENB
);
5138 termios_p
->c_cflag
|= CS8
;
5140 #endif /* !defined (HAVE_CFMAKERAW */
5142 #if !defined (HAVE_CFSETSPEED)
5143 /* Workaround for targets which are missing cfsetspeed. */
5144 static int cfsetspeed (struct termios
*termios_p
, speed_t vitesse
)
5146 return (cfsetispeed (termios_p
, vitesse
)
5147 + cfsetospeed (termios_p
, vitesse
));
5151 /* For serial-process-configure */
5153 serial_configure (struct Lisp_Process
*p
,
5154 Lisp_Object contact
)
5156 Lisp_Object childp2
= Qnil
;
5157 Lisp_Object tem
= Qnil
;
5158 struct termios attr
;
5160 char summary
[4] = "???"; /* This usually becomes "8N1". */
5162 childp2
= Fcopy_sequence (p
->childp
);
5164 /* Read port attributes and prepare default configuration. */
5165 err
= tcgetattr (p
->outfd
, &attr
);
5167 error ("tcgetattr() failed: %s", emacs_strerror (errno
));
5169 #if defined (CLOCAL)
5170 attr
.c_cflag
|= CLOCAL
;
5173 attr
.c_cflag
| CREAD
;
5176 /* Configure speed. */
5177 if (!NILP (Fplist_member (contact
, QCspeed
)))
5178 tem
= Fplist_get (contact
, QCspeed
);
5180 tem
= Fplist_get (p
->childp
, QCspeed
);
5182 err
= cfsetspeed (&attr
, XINT (tem
));
5184 error ("cfsetspeed(%d) failed: %s", XINT (tem
), emacs_strerror (errno
));
5185 childp2
= Fplist_put (childp2
, QCspeed
, tem
);
5187 /* Configure bytesize. */
5188 if (!NILP (Fplist_member (contact
, QCbytesize
)))
5189 tem
= Fplist_get (contact
, QCbytesize
);
5191 tem
= Fplist_get (p
->childp
, QCbytesize
);
5193 tem
= make_number (8);
5195 if (XINT (tem
) != 7 && XINT (tem
) != 8)
5196 error (":bytesize must be nil (8), 7, or 8");
5197 summary
[0] = XINT(tem
) + '0';
5198 #if defined (CSIZE) && defined (CS7) && defined (CS8)
5199 attr
.c_cflag
&= ~CSIZE
;
5200 attr
.c_cflag
|= ((XINT (tem
) == 7) ? CS7
: CS8
);
5202 /* Don't error on bytesize 8, which should be set by cfmakeraw. */
5203 if (XINT (tem
) != 8)
5204 error ("Bytesize cannot be changed");
5206 childp2
= Fplist_put (childp2
, QCbytesize
, tem
);
5208 /* Configure parity. */
5209 if (!NILP (Fplist_member (contact
, QCparity
)))
5210 tem
= Fplist_get (contact
, QCparity
);
5212 tem
= Fplist_get (p
->childp
, QCparity
);
5213 if (!NILP (tem
) && !EQ (tem
, Qeven
) && !EQ (tem
, Qodd
))
5214 error (":parity must be nil (no parity), `even', or `odd'");
5215 #if defined (PARENB) && defined (PARODD) && defined (IGNPAR) && defined (INPCK)
5216 attr
.c_cflag
&= ~(PARENB
| PARODD
);
5217 attr
.c_iflag
&= ~(IGNPAR
| INPCK
);
5222 else if (EQ (tem
, Qeven
))
5225 attr
.c_cflag
|= PARENB
;
5226 attr
.c_iflag
|= (IGNPAR
| INPCK
);
5228 else if (EQ (tem
, Qodd
))
5231 attr
.c_cflag
|= (PARENB
| PARODD
);
5232 attr
.c_iflag
|= (IGNPAR
| INPCK
);
5235 /* Don't error on no parity, which should be set by cfmakeraw. */
5237 error ("Parity cannot be configured");
5239 childp2
= Fplist_put (childp2
, QCparity
, tem
);
5241 /* Configure stopbits. */
5242 if (!NILP (Fplist_member (contact
, QCstopbits
)))
5243 tem
= Fplist_get (contact
, QCstopbits
);
5245 tem
= Fplist_get (p
->childp
, QCstopbits
);
5247 tem
= make_number (1);
5249 if (XINT (tem
) != 1 && XINT (tem
) != 2)
5250 error (":stopbits must be nil (1 stopbit), 1, or 2");
5251 summary
[2] = XINT (tem
) + '0';
5252 #if defined (CSTOPB)
5253 attr
.c_cflag
&= ~CSTOPB
;
5254 if (XINT (tem
) == 2)
5255 attr
.c_cflag
|= CSTOPB
;
5257 /* Don't error on 1 stopbit, which should be set by cfmakeraw. */
5258 if (XINT (tem
) != 1)
5259 error ("Stopbits cannot be configured");
5261 childp2
= Fplist_put (childp2
, QCstopbits
, tem
);
5263 /* Configure flowcontrol. */
5264 if (!NILP (Fplist_member (contact
, QCflowcontrol
)))
5265 tem
= Fplist_get (contact
, QCflowcontrol
);
5267 tem
= Fplist_get (p
->childp
, QCflowcontrol
);
5268 if (!NILP (tem
) && !EQ (tem
, Qhw
) && !EQ (tem
, Qsw
))
5269 error (":flowcontrol must be nil (no flowcontrol), `hw', or `sw'");
5270 #if defined (CRTSCTS)
5271 attr
.c_cflag
&= ~CRTSCTS
;
5273 #if defined (CNEW_RTSCTS)
5274 attr
.c_cflag
&= ~CNEW_RTSCTS
;
5276 #if defined (IXON) && defined (IXOFF)
5277 attr
.c_iflag
&= ~(IXON
| IXOFF
);
5281 /* Already configured. */
5283 else if (EQ (tem
, Qhw
))
5285 #if defined (CRTSCTS)
5286 attr
.c_cflag
|= CRTSCTS
;
5287 #elif defined (CNEW_RTSCTS)
5288 attr
.c_cflag
|= CNEW_RTSCTS
;
5290 error ("Hardware flowcontrol (RTS/CTS) not supported");
5293 else if (EQ (tem
, Qsw
))
5295 #if defined (IXON) && defined (IXOFF)
5296 attr
.c_iflag
|= (IXON
| IXOFF
);
5298 error ("Software flowcontrol (XON/XOFF) not supported");
5301 childp2
= Fplist_put (childp2
, QCflowcontrol
, tem
);
5303 /* Activate configuration. */
5304 err
= tcsetattr (p
->outfd
, TCSANOW
, &attr
);
5306 error ("tcsetattr() failed: %s", emacs_strerror (errno
));
5308 childp2
= Fplist_put (childp2
, QCsummary
, build_string (summary
));
5309 p
->childp
= childp2
;
5312 #endif /* TERMIOS */
5314 /* arch-tag: edb43589-4e09-4544-b325-978b5b121dcf
5315 (do not change this comment) */