/* Interfaces to system-dependent kernel and library entries.
- Copyright (C) 1985, 1986, 1987, 1988, 1993 Free Software Foundation, Inc.
+ Copyright (C) 1985, 86, 87, 88, 93, 94 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
#endif
extern int errno;
-#ifndef VMS
-extern char *sys_errlist[];
-#endif
#ifdef VMS
#include <rms.h>
#ifdef BROKEN_TIOCGWINSZ
#undef TIOCGWINSZ
+#undef TIOCSWINSZ
#endif
#ifdef USG
#ifndef MEMORY_IN_STRING_H
#include <memory.h>
#endif
-#ifdef TIOCGWINSZ
+#if defined (TIOCGWINSZ) || defined (ISC4_0)
#ifdef NEED_SIOCTL
#include <sys/sioctl.h>
#endif
#include <sys/stream.h>
#include <sys/ptem.h>
#endif
-#endif /* TIOCGWINSZ */
+#endif /* TIOCGWINSZ or ISC4_0 */
#endif /* USG */
extern int quit_char;
#if defined (HAVE_TERMIO) || defined (HAVE_TERMIOS)
s.main.c_oflag |= OPOST; /* Enable output postprocessing */
s.main.c_oflag &= ~ONLCR; /* Disable map of NL to CR-NL on output */
+#ifdef NLDLY
s.main.c_oflag &= ~(NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
/* No output delays */
+#endif
s.main.c_lflag &= ~ECHO; /* Disable echo */
s.main.c_lflag |= ISIG; /* Enable signals */
- s.main.c_iflag &= ~IUCLC; /* Disable map of upper case to lower on
- input */
- s.main.c_oflag &= ~OLCUC; /* Disable map of lower case to upper on
- output */
+#ifdef IUCLC
+ s.main.c_iflag &= ~IUCLC; /* Disable downcasing on input. */
+#endif
+#ifdef OLCUC
+ s.main.c_oflag &= ~OLCUC; /* Disable upcasing on output. */
+#endif
s.main.c_cflag = (s.main.c_cflag & ~CSIZE) | CS8; /* Don't strip 8th bit */
#if 0
/* Said to be unnecessary: */
sys_suspend ()
{
-#ifdef MSDOS /* Demacs 1.1.2 91/10/20 Manabu Higashida */
- int st;
- char oldwd[MAXPATHLEN+1]; /* Fixed length is safe on MSDOS. */
-#endif
#ifdef VMS
/* "Foster" parentage allows emacs to return to a subprocess that attached
to the current emacs as a cheaper than starting a whole new process. This
/* On a system where suspending is not implemented,
instead fork a subshell and let it talk directly to the terminal
while we wait. */
+ sys_subshell ();
+
+#endif /* no USG_JOBCTRL */
+#endif /* no SIGTSTP */
+#endif /* not VMS */
+}
+
+/* Fork a subshell. */
+
+sys_subshell ()
+{
+#ifndef VMS
+#ifdef MSDOS /* Demacs 1.1.2 91/10/20 Manabu Higashida */
+ int st;
+ char oldwd[MAXPATHLEN+1]; /* Fixed length is safe on MSDOS. */
+#endif
int pid = fork ();
struct save_signal saved_handlers[5];
close_process_descs (); /* Close Emacs's pipes/ptys */
#endif
-#ifdef PRIO_PROCESS
+#ifdef SET_EMACS_PRIORITY
{
extern int emacs_priority;
- if (emacs_priority)
+ if (emacs_priority < 0)
nice (-emacs_priority);
}
#endif
synch_process_alive = 1;
wait_for_termination (pid);
restore_signal_handlers (saved_handlers);
-
-#endif /* no USG_JOBCTRL */
-#endif /* no SIGTSTP */
-#endif /* not VMS */
+#endif /* !VMS */
}
save_signal_handlers (saved_handlers)
#else /* not FASYNC, not STRIDE */
+#ifdef _CX_UX
+
+#include <termios.h>
+
+request_sigio ()
+{
+ int on = 1;
+ sigset_t st;
+
+ sigemptyset(&st);
+ sigaddset(&st, SIGIO);
+ ioctl (input_fd, FIOASYNC, &on);
+ interrupts_deferred = 0;
+ sigprocmask(SIG_UNBLOCK, &st, (sigset_t *)0);
+}
+
+unrequest_sigio ()
+{
+ int off = 0;
+
+ ioctl (input_fd, FIOASYNC, &off);
+ interrupts_deferred = 1;
+}
+
+#else /* ! _CX_UX */
+
request_sigio ()
{
croak ("request_sigio");
croak ("unrequest_sigio");
}
+#endif /* _CX_UX */
#endif /* STRIDE */
#endif /* FASYNC */
#endif /* F_SETFL */
\f
/* Saving and restoring the process group of Emacs's terminal. */
-#ifdef BSD
+#ifdef BSD_PGRPS
/* The process group of which Emacs was a member when it initially
started.
setpgrp (0, inherited_pgroup);
}
-#endif
+#endif /* BSD_PGRPS */
\f
/* Getting and setting emacs_tty structures. */
#endif
#endif /* not VMS */
-#ifdef BSD
+#ifdef BSD_PGRPS
if (! read_socket_hook && EQ (Vwindow_system, Qnil))
narrow_foreground_group ();
#endif
tty.main.c_lflag &= ~ECHO; /* Disable echo */
tty.main.c_lflag &= ~ICANON; /* Disable erase/kill processing */
#ifdef IEXTEN
- tty.main.c_iflag &= ~IEXTEN; /* Disable other editing characters. */
+ tty.main.c_lflag &= ~IEXTEN; /* Disable other editing characters. */
#endif
tty.main.c_lflag |= ISIG; /* Enable signals */
if (flow_control)
EMACS_GET_TTY (input_fd, &tty);
return EMACS_TTY_TABS_OK (&tty);
}
-
+\f
/* Get terminal size from system.
- Store number of lines into *heightp and width into *widthp.
- If zero or a negative number is stored, the value is not valid. */
+ Store number of lines into *HEIGHTP and width into *WIDTHP.
+ We store 0 if there's no valid information. */
get_frame_size (widthp, heightp)
int *widthp, *heightp;
#endif /* not BSD-style */
}
+/* Set the logical window size associated with descriptor FD
+ to HEIGHT and WIDTH. This is used mainly with ptys. */
+
+int
+set_window_size (fd, height, width)
+ int fd, height, width;
+{
+#ifdef TIOCSWINSZ
+
+ /* BSD-style. */
+ struct winsize size;
+ size.ws_row = height;
+ size.ws_col = width;
+
+ if (ioctl (fd, TIOCSWINSZ, &size) == -1)
+ return 0; /* error */
+ else
+ return 1;
+
+#else
+#ifdef TIOCSSIZE
+
+ /* SunOS - style. */
+ struct ttysize size;
+ size.ts_lines = height;
+ size.ts_cols = width;
+
+ if (ioctl (fd, TIOCGSIZE, &size) == -1)
+ return 0;
+ else
+ return 1;
+#else
+ return -1;
+#endif /* not SunOS-style */
+#endif /* not BSD-style */
+}
+
\f
/* Prepare the terminal for exiting Emacs; move the cursor to the
bottom of the frame, turn off interrupt-driven I/O, etc. */
}
#endif /* F_SETOWN */
#endif /* F_SETOWN_BUG */
+#ifdef O_NDELAY
+ fcntl (input_fd, F_SETFL, fcntl (input_fd, F_GETFL, 0) & ~O_NDELAY);
+#endif
#endif /* F_SETFL */
#ifdef BSD4_1
if (interrupt_input)
hft_reset ();
#endif
-#ifdef BSD
+#ifdef BSD_PGRPS
widen_foreground_group ();
#endif
}
*
*/
-#ifndef CANNOT_UNEXEC
+#if !defined (CANNOT_UNEXEC) && !defined (HAVE_TEXT_START)
char *
start_of_text ()
{
#endif /* GOULD */
#endif /* TEXT_START */
}
-#endif /* not CANNOT_UNEXEC */
+#endif /* not CANNOT_UNEXEC and not HAVE_TEXT_START */
/*
* Return the address of the start of the data segment prior to
#endif /* not CANNOT_DUMP */
\f
-/* Get_system_name returns as its value
+/* get_system_name returns as its value
a string for the Lisp function system-name to return. */
#ifdef BSD4_1
/* Can't have this within the function since `static' is #defined to
nothing for some USG systems. */
-#ifdef USG
-#ifdef HAVE_GETHOSTNAME
-static char get_system_name_name[256];
-#else /* not HAVE_GETHOSTNAME */
-static struct utsname get_system_name_name;
-#endif /* not HAVE_GETHOSTNAME */
-#endif /* USG */
+static char *get_system_name_cache;
+static int get_system_name_predump_p;
#ifndef BSD4_1
-#ifndef USG
#ifndef VMS
#ifdef HAVE_SOCKETS
#include <sys/socket.h>
#include <netdb.h>
#endif /* HAVE_SOCKETS */
#endif /* not VMS */
-#endif /* not USG */
#endif /* not BSD4_1 */
char *
get_system_name ()
{
-#ifdef USG
-#ifdef HAVE_GETHOSTNAME
- gethostname (get_system_name_name, sizeof (get_system_name_name));
- return get_system_name_name;
-#else /* not HAVE_GETHOSTNAME */
- uname (&get_system_name_name);
- return (get_system_name_name.nodename);
-#endif /* not HAVE_GETHOSTNAME */
-#else /* Not USG */
#ifdef BSD4_1
return sysname;
-#else /* not USG, not 4.1 */
- static char system_name_saved[32];
-#ifdef VMS
- char *sp;
- if ((sp = egetenv ("SYS$NODE")) == 0)
- sp = "vax-vms";
- else
+#else
+#ifndef CANNOT_DUMP
+ /* If the cached value is from before the dump, and we've dumped
+ since then, then the cached value is no good. */
+ if (get_system_name_predump_p && initialized && get_system_name_cache)
{
- char *end;
-
- if ((end = index (sp, ':')) != 0)
- *end = '\0';
+ xfree (get_system_name_cache);
+ get_system_name_cache = 0;
}
- strcpy (system_name_saved, sp);
-#else /* not VMS */
- gethostname (system_name_saved, sizeof (system_name_saved));
-#ifdef HAVE_SOCKETS
- /* Turn the hostname into the official, fully-qualified hostname.
- Don't do this if we're going to dump; this can confuse system
- libraries on some machines and make the dumped emacs core dump. */
-#ifndef CANNOT_DUMP
- if (initialized)
-#endif /* not CANNOT_DUMP */
+#endif
+ if (!get_system_name_cache)
{
- struct hostent *hp;
- hp = gethostbyname (system_name_saved);
- if (hp && strlen (hp->h_name) < sizeof(system_name_saved))
- strcpy (system_name_saved, hp->h_name);
- if (hp && !index (system_name_saved, '.'))
+ /* No cached value, so get the name from the system. */
+#ifdef VMS
+ char *sp;
+ if ((sp = egetenv ("SYS$NODE")) == 0)
+ sp = "vax-vms";
+ else
{
- /* We still don't have a fully qualified domain name.
- Try to find one in the list of alternate names */
- char **alias = hp->h_aliases;
- while (*alias && !index (*alias, '.'))
- alias++;
- if (*alias && strlen (*alias) < sizeof (system_name_saved))
- strcpy (system_name_saved, *alias);
- }
- }
-#endif /* HAVE_SOCKETS */
-#endif /* not VMS */
- return system_name_saved;
-#endif /* not USG, not 4.1 */
-#endif /* not USG */
-}
+ char *end;
-#ifdef VMS
+ if ((end = index (sp, ':')) != 0)
+ *end = '\0';
+ }
+ get_system_name_cache = (char *) xmalloc (strlen (sp) + 1);
+ strcpy (get_system_name_cache, sp);
+#else
#ifndef HAVE_GETHOSTNAME
-void gethostname(buf, len)
- char *buf;
- int len;
-{
- char *s;
- s = getenv ("SYS$NODE");
- if (s == NULL)
- buf[0] = '\0';
- else {
- strncpy (buf, s, len - 2);
- buf[len - 1] = '\0';
- } /* else */
-} /* static void gethostname */
-#endif /* ! HAVE_GETHOSTNAME */
-#endif /* VMS */
+ struct utsname uts;
+ uname (&uts);
+ get_system_name_cache = (char *) xmalloc (strlen (uts.nodename) + 1);
+ strcpy (get_system_name_cache, uts.nodename);
+#else /* HAVE_GETHOSTNAME */
+ {
+ int hostname_size = 256;
+ char *hostname = (char *) xmalloc (hostname_size);
+
+ /* Try to get the host name; if the buffer is too short, try
+ again. Apparently, the only indication gethostname gives of
+ whether the buffer was large enough is the presence or absence
+ of a '\0' in the string. Eech. */
+ for (;;)
+ {
+ gethostname (hostname, hostname_size - 1);
+ hostname[hostname_size - 1] = '\0';
+ /* Was the buffer large enough for the '\0'? */
+ if (strlen (hostname) < hostname_size - 1)
+ break;
+
+ hostname_size <<= 1;
+ hostname = (char *) xrealloc (hostname, hostname_size);
+ }
+ get_system_name_cache = hostname;
+#ifdef HAVE_SOCKETS
+ /* Turn the hostname into the official, fully-qualified hostname.
+ Don't do this if we're going to dump; this can confuse system
+ libraries on some machines and make the dumped emacs core dump. */
+#ifndef CANNOT_DUMP
+ if (initialized)
+#endif /* not CANNOT_DUMP */
+ {
+ struct hostent *hp = gethostbyname (hostname);
+ if (hp)
+ {
+ char *fqdn = hp->h_name;
+ char *p;
+
+ if (!index (fqdn, '.'))
+ {
+ /* We still don't have a fully qualified domain name.
+ Try to find one in the list of alternate names */
+ char **alias = hp->h_aliases;
+ while (*alias && !index (*alias, '.'))
+ alias++;
+ if (*alias)
+ fqdn = *alias;
+ }
+ hostname = (char *) xrealloc (hostname, strlen (fqdn) + 1);
+ strcpy (hostname, fqdn);
+#if 0
+ /* Convert the host name to lower case. */
+ /* Using ctype.h here would introduce a possible locale
+ dependence that is probably wrong for hostnames. */
+ p = hostname
+ while (*p)
+ {
+ if (*p >= 'A' && *p <= 'Z')
+ *p += 'a' - 'A';
+ p++;
+ }
+#endif
+ }
+ }
+#endif /* HAVE_SOCKETS */
+ get_system_name_cache = hostname;
+ }
+#endif /* HAVE_GETHOSTNAME */
+#endif /* VMS */
+#ifndef CANNOT_DUMP
+ get_system_name_predump_p = !initialized;
+#endif
+ }
+ return (get_system_name_cache);
+#endif /* BSD4_1 */
+}
\f
#ifndef VMS
#ifndef HAVE_SELECT
#else
sigemptyset (&new_action.sa_mask);
new_action.sa_handler = action;
+#ifdef SA_RESTART
+ /* Emacs mostly works better with restartable system services. If this
+ * flag exists, we probably want to turn it on here.
+ */
+ new_action.sa_flags = SA_RESTART;
+#else
new_action.sa_flags = 0;
+#endif
sigaction (signal_number, &new_action, &old_action);
return (old_action.sa_handler);
#endif /* DGUX */
#endif /* SHAREABLE_LIB_BUG */
#endif /* LINK_CRTL_SHARE */
#endif /* VMS */
+
+#ifndef HAVE_STRERROR
+char *
+strerror (errnum)
+ int errnum;
+{
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+
+ if (errnum >= 0 && errnum < sys_nerr)
+ return sys_errlist[errnum];
+ return (char *) "Unknown error";
+}
+
+#endif /* ! HAVE_STRERROR */
\f
#ifdef INTERRUPTIBLE_OPEN
if (errno == EINTR)
continue;
else
- return (-1);
+ return (bytes_written ? bytes_written : -1);
}
buf += rtnval;
"user defined signal 2", /* 17 SIGUSR2 */
"death of a child", /* 18 SIGCLD */
"power-fail restart", /* 19 SIGPWR */
+#ifdef sun
+ "window size change", /* 20 SIGWINCH */
+ "urgent socket condition", /* 21 SIGURG */
+ "pollable event occured", /* 22 SIGPOLL */
+ "stop (cannot be caught or ignored)", /* 23 SIGSTOP */
+ "user stop requested from tty", /* 24 SIGTSTP */
+ "stopped process has been continued", /* 25 SIGCONT */
+ "background tty read attempted", /* 26 SIGTTIN */
+ "background tty write attempted", /* 27 SIGTTOU */
+ "virtual timer expired", /* 28 SIGVTALRM */
+ "profiling timer expired", /* 29 SIGPROF */
+ "exceeded cpu limit", /* 30 SIGXCPU */
+ "exceeded file size limit", /* 31 SIGXFSZ */
+ "process's lwps are blocked", /* 32 SIGWAITING */
+ "special signal used by thread library", /* 33 SIGLWP */
+#ifdef SIGFREEZE
+ "Special Signal Used By CPR", /* 34 SIGFREEZE */
+#endif
+#ifdef SIGTHAW
+ "Special Signal Used By CPR", /* 35 SIGTHAW */
+#endif
+#endif /* sun */
#endif /* not AIX */
0
};
#ifdef F_DUPFD
fd = fcntl (oldd, F_DUPFD, newd);
if (fd != newd)
- error ("can't dup2 (%i,%i) : %s", oldd, newd, sys_errlist[errno]);
+ error ("can't dup2 (%i,%i) : %s", oldd, newd, strerror (errno));
#else
fd = dup (old);
if (fd == -1)
/*
* Make a directory.
*/
+#ifdef MKDIR_PROTOTYPE
+MKDIR_PROTOTYPE
+#else
int
mkdir (dpath, dmode)
char *dpath;
int dmode;
+#endif
{
int cpid, status, fd;
struct stat statbuf;