/* 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,
#include <sys/stat.h>
#include <errno.h>
-extern int errno;
-#ifndef VMS
-extern char *sys_errlist[];
+#ifdef MSDOS /* Demacs 1.1.2 91/10/20 Manabu Higashida, MW Aug 1993 */
+#include <dos.h>
+#include "dosfns.h"
+#include "msdos.h"
+#include <sys/param.h>
#endif
+extern int errno;
+
#ifdef VMS
#include <rms.h>
#include <ttdef.h>
#undef FASYNC
#endif
+#ifndef MSDOS
#include <sys/ioctl.h>
+#endif
#include "systty.h"
#include "syswait.h"
ioctl (input_fd, TIOCFLUSH, &zero);
}
#else /* not Apollo */
+#ifdef MSDOS /* Demacs 1.1.1 91/10/16 HIRANO Satoshi */
+ while (dos_keyread () != -1)
+ ;
+#else /* not MSDOS */
EMACS_GET_TTY (input_fd, &buf);
EMACS_SET_TTY (input_fd, &buf, 0);
+#endif /* not MSDOS */
#endif /* not Apollo */
#endif /* not VMS */
}
ospeed = 0;
else
{
+#ifdef MSDOS
+ ospeed = 15;
+#else
#ifdef VMS
struct sensemode sg;
#endif /* not HAVE_TERMIO */
#endif /* not HAVE_TERMIOS */
#endif /* not VMS */
+#endif /* not MSDOS */
}
baud_rate = (ospeed < sizeof baud_convert / sizeof baud_convert[0]
child_setup_tty (out)
int out;
{
+#ifndef MSDOS
struct emacs_tty s;
EMACS_GET_TTY (out, &s);
ioctl (out, FIOASYNC, &zero);
}
#endif /* RTU */
+#endif /* not MSDOS */
}
#endif /* not VMS */
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
}
return -1;
#else
-#ifdef SIGTSTP
+#if defined(SIGTSTP) && !defined(MSDOS)
{
int pgrp = EMACS_GETPGRP (0);
{
char *sh;
+#ifdef MSDOS /* MW, Aug 1993 */
+ getwd (oldwd);
+#endif
sh = (char *) egetenv ("SHELL");
if (sh == 0)
sh = "sh";
+
/* Use our buffer's default directory for the subshell. */
{
Lisp_Object dir;
which somehow wedges the hp compiler. So instead... */
dir = intern ("default-directory");
- /* Can't use NULL */
+ /* Can't use NILP */
if (XFASTINT (Fboundp (dir)) == XFASTINT (Qnil))
goto xyzzy;
dir = Fsymbol_value (dir);
}
#endif
+#ifdef MSDOS /* Demacs 1.1.2 91/10/20 Manabu Higashida */
+ st = system (sh);
+ chdir (oldwd);
+ if (st)
+ report_file_error ("Can't execute subshell", Fcons (build_string (sh), Qnil));
+#else /* not MSDOS */
execlp (sh, sh, 0);
write (1, "Can't execute subshell", 22);
_exit (1);
+#endif /* not MSDOS */
}
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 */
return -1;
#else
+#ifndef MSDOS
/* I give up - I hope you have the BSD ioctls. */
if (ioctl (fd, TIOCGETP, &settings->main) < 0)
return -1;
-
+#endif /* not MSDOS */
#endif
#endif
#endif
return -1;
#else
+#ifndef MSDOS
/* I give up - I hope you have the BSD ioctls. */
if (ioctl (fd, (waitp) ? TIOCSETP : TIOCSETN, &settings->main) < 0)
return -1;
+#endif /* not MSDOS */
#endif
#endif
tty.main.tt_char &= ~TT$M_TTSYNC;
tty.main.tt2_char |= TT2$M_PASTHRU | TT2$M_XON;
#else /* not VMS (BSD, that is) */
+#ifndef MSDOS
tty.main.sg_flags &= ~(ECHO | CRMOD | XTABS);
if (meta_key)
tty.main.sg_flags |= ANYP;
tty.main.sg_flags |= interrupt_input ? RAW : CBREAK;
+#endif
#endif /* not VMS (BSD, that is) */
#endif /* not HAVE_TERMIO */
#ifdef HAVE_LTCHARS
tty.ltchars = new_ltchars;
#endif /* HAVE_LTCHARS */
+#ifdef MSDOS /* Demacs 1.1.2 91/10/20 Manabu Higashida, MW Aug 1993 */
+ internal_terminal_init ();
+ dos_ttraw ();
+#endif
EMACS_SET_TTY (input_fd, &tty, 0);
*widthp = tty.scr_wid;
*heightp = tty.scr_len;
+#else
+#ifdef MSDOS
+ *widthp = ScreenCols ();
+ *heightp = ScreenRows ();
#else /* system doesn't know size */
-
*widthp = 0;
*heightp = 0;
+#endif
#endif /* not VMS */
#endif /* not SunOS-style */
while (EMACS_SET_TTY (input_fd, &old_tty, 0) < 0 && errno == EINTR)
;
+#ifdef MSDOS /* Demacs 1.1.2 91/10/20 Manabu Higashida */
+ dos_ttcooked ();
+#endif
+
#ifdef AIX
hft_reset ();
#endif
#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
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;
+ 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);
+ }
+ }
+#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
#ifdef FIONREAD
status = ioctl (fd, FIONREAD, &avail);
#else /* no FIONREAD */
+#ifdef MSDOS
+ abort (); /* I don't think we need it. */
+#else /* not MSDOS */
/* Hoping it will return -1 if nothing available
or 0 if all 0 chars requested are read. */
if (proc_buffered_char[fd] >= 0)
if (avail > 0)
proc_buffered_char[fd] = buf;
}
+#endif /* not MSDOS */
#endif /* no FIONREAD */
}
if (status >= 0 && avail > 0)
while (select_alarmed == 0 && *local_timeout != 0
&& process_tick == update_tick)
{
+#ifdef MSDOS
+ sleep_or_kbd_hit (SELECT_PAUSE, (orfds & 1) != 0);
+ select_alarm ();
+#else /* not MSDOS */
/* If we are interested in terminal input,
wait by reading the terminal.
That makes instant wakeup for terminal input at least. */
}
else
pause ();
+#endif /* not MSDOS */
}
(*local_timeout) -= SELECT_PAUSE;
/* Reset the old alarm if there was one */
#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
"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 */
+ "Special Signal Used By CPR", /* 34 SIGFREEZE */
+ "Special Signal Used By CPR", /* 35 SIGTHAW */
+#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;
dup2 (fd, 1);
dup2 (fd, 2);
}
- execl ("/bin/rmdir", "rmdir", dpath, (char *) 0);
- _exit (-1); /* Can't exec /bin/mkdir */
-
- default: /* Parent process */
wait_for_termination (cpid);
+ if (synch_process_death != 0 || synch_process_retcode != 0)
+ return -1; /* /bin/rmdir failed */
+ default: /* Parent process */
+ while (cpid != wait (&status)); /* Wait for kid to finish */
}
- if (synch_process_death != 0 || synch_process_retcode != 0)
+ if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0)
{
errno = EIO; /* We don't know why, but */
- return -1; /* /bin/rmdir failed */
+ return -1; /* /bin/mkdir failed */
}
return 0;