Contents in 1999-06-04-13 of release-21-2.
[chise/xemacs-chise.git.1] / src / sysdep.c
index c2b9800..7024e35 100644 (file)
@@ -33,6 +33,7 @@ Boston, MA 02111-1307, USA.  */
 
 #ifdef WINDOWSNT
 #include <direct.h>
+#ifndef __MINGW32__
 /* <process.h> should not conflict with "process.h", as per ANSI definition.
    This is not true though with visual c though. The trick below works with
    VC4.2b and with VC5.0. It assumes that VC is installed in a kind of
@@ -42,6 +43,9 @@ Boston, MA 02111-1307, USA.  */
    which will conflict with the macro defined in lisp.h
 */
 #include <../include/process.h>
+#else
+#include <mingw32/process.h>
+#endif
 #endif /* WINDOWSNT */
 
 #include "lisp.h"
@@ -212,11 +216,9 @@ set_descriptor_non_blocking (int fd)
   }
 #endif
 
-#ifdef O_NONBLOCK /* The POSIX way */
+#ifdef F_SETFL
   fcntl (fd, F_SETFL, O_NONBLOCK);
-#elif defined (O_NDELAY)
-  fcntl (fd, F_SETFL, O_NDELAY);
-#endif /* O_NONBLOCK */
+#endif
 }
 
 #if defined (NO_SUBPROCESSES)
@@ -456,8 +458,8 @@ child_setup_tty (int out)
 
   s.main.c_lflag |= ICANON;    /* Enable erase/kill and eof processing */
   s.main.c_cc[VEOF] = 04;      /* ensure that EOF is Control-D */
-  s.main.c_cc[VERASE] = CDISABLE; /* disable erase processing */
-  s.main.c_cc[VKILL]  = CDISABLE; /* disable kill processing */
+  s.main.c_cc[VERASE] = _POSIX_VDISABLE; /* disable erase processing */
+  s.main.c_cc[VKILL]  = _POSIX_VDISABLE; /* disable kill processing */
 
 #ifdef HPUX
   s.main.c_cflag = (s.main.c_cflag & ~CBAUD) | B9600; /* baud rate sanity */
@@ -485,12 +487,12 @@ child_setup_tty (int out)
 #else /* no TIOCGPGRP or no TIOCGLTC or no TIOCGETC */
   /* TTY `special characters' work better as signals, so disable
      character forms */
-  s.main.c_cc[VQUIT] = CDISABLE;
-  s.main.c_cc[VINTR] = CDISABLE;
-  s.main.c_cc[VSUSP] = CDISABLE;
+  s.main.c_cc[VQUIT] = _POSIX_VDISABLE;
+  s.main.c_cc[VINTR] = _POSIX_VDISABLE;
+  s.main.c_cc[VSUSP] = _POSIX_VDISABLE;
   s.main.c_lflag &= ~ISIG;
 #endif /* no TIOCGPGRP or no TIOCGLTC or no TIOCGETC */
-  s.main.c_cc[VEOL] = CDISABLE;
+  s.main.c_cc[VEOL] = _POSIX_VDISABLE;
 #if defined (CBAUD)
   /* <mdiers> ### This is not portable. ###
      POSIX does not specify CBAUD, and 4.4BSD does not have it.
@@ -749,7 +751,7 @@ get_eof_char (int fd)
     else
       return (Bufbyte) t.c_cc[VEOF];
 #endif
-    return t.c_cc[VEOF] == CDISABLE ? ctrl_d : (Bufbyte) t.c_cc[VEOF];
+    return t.c_cc[VEOF] == _POSIX_VDISABLE ? ctrl_d : (Bufbyte) t.c_cc[VEOF];
   }
 #else /* ! HAVE_TERMIOS */
   /* On Berkeley descendants, the following IOCTL's retrieve the
@@ -1534,51 +1536,51 @@ tty_init_sys_modes_on_device (struct device *d)
     }
   else
     {
-      tty.main.c_cc[VINTR] = CDISABLE;
-      tty.main.c_cc[VQUIT] = CDISABLE;
+      tty.main.c_cc[VINTR] = _POSIX_VDISABLE;
+      tty.main.c_cc[VQUIT] = _POSIX_VDISABLE;
     }
   tty.main.c_cc[VMIN] = 1;     /* Input should wait for at
                                   least 1 char */
   tty.main.c_cc[VTIME] = 0;    /* no matter how long that takes.  */
 #ifdef VSWTCH
-  tty.main.c_cc[VSWTCH] = CDISABLE;    /* Turn off shell layering use
-                                          of C-z */
+  tty.main.c_cc[VSWTCH] = _POSIX_VDISABLE; /* Turn off shell layering use
+                                             of C-z */
 #endif /* VSWTCH */
   /* There was some conditionalizing here on (mips or TCATTR), but
      I think that's wrong.  There was one report of C-y (DSUSP) not being
      disabled on HP9000s700 systems, and this might fix it. */
 #ifdef VSUSP
-  tty.main.c_cc[VSUSP] = CDISABLE;/* Turn off mips handling of C-z.  */
+  tty.main.c_cc[VSUSP] = _POSIX_VDISABLE; /* Turn off mips handling of C-z. */
 #endif /* VSUSP */
 #ifdef V_DSUSP
-  tty.main.c_cc[V_DSUSP] = CDISABLE; /* Turn off mips handling of C-y.  */
+  tty.main.c_cc[V_DSUSP] = _POSIX_VDISABLE; /* Turn off mips handling of C-y. */
 #endif /* V_DSUSP */
 #ifdef VDSUSP /* Some systems have VDSUSP, some have V_DSUSP.  */
-  tty.main.c_cc[VDSUSP] = CDISABLE;
+  tty.main.c_cc[VDSUSP] = _POSIX_VDISABLE;
 #endif /* VDSUSP */
 #ifdef VLNEXT
-  tty.main.c_cc[VLNEXT] = CDISABLE;
+  tty.main.c_cc[VLNEXT] = _POSIX_VDISABLE;
 #endif /* VLNEXT */
 #ifdef VREPRINT
-  tty.main.c_cc[VREPRINT] = CDISABLE;
+  tty.main.c_cc[VREPRINT] = _POSIX_VDISABLE;
 #endif /* VREPRINT */
 #ifdef VWERASE
-  tty.main.c_cc[VWERASE] = CDISABLE;
+  tty.main.c_cc[VWERASE] = _POSIX_VDISABLE;
 #endif /* VWERASE */
 #ifdef VDISCARD
-  tty.main.c_cc[VDISCARD] = CDISABLE;
+  tty.main.c_cc[VDISCARD] = _POSIX_VDISABLE;
 #endif /* VDISCARD */
 #ifdef VSTART
-  tty.main.c_cc[VSTART] = CDISABLE;
+  tty.main.c_cc[VSTART] = _POSIX_VDISABLE;
 #endif /* VSTART */
 #ifdef VSTRT
-  tty.main.c_cc[VSTRT] = CDISABLE; /* called VSTRT on some systems */
+  tty.main.c_cc[VSTRT] = _POSIX_VDISABLE; /* called VSTRT on some systems */
 #endif /* VSTART */
 #ifdef VSTOP
-  tty.main.c_cc[VSTOP] = CDISABLE;
+  tty.main.c_cc[VSTOP] = _POSIX_VDISABLE;
 #endif /* VSTOP */
 #ifdef SET_LINE_DISCIPLINE
-  /* Need to explicitely request TERMIODISC line discipline or
+  /* Need to explicitly request TERMIODISC line discipline or
      Ultrix's termios does not work correctly.  */
   tty.main.c_line = SET_LINE_DISCIPLINE;
 #endif
@@ -1906,7 +1908,7 @@ reset_one_device (struct device *d)
   else
 #endif
   if (DEVICE_STREAM_P (d))
-    fflush (CONSOLE_STREAM_DATA (XCONSOLE (DEVICE_CONSOLE (d)))->outfd);
+    fflush (CONSOLE_STREAM_DATA (XCONSOLE (DEVICE_CONSOLE (d)))->out);
 #if defined(SIGIO) && !defined(BROKEN_SIGIO)
   if (!DEVICE_STREAM_P (d))
     {
@@ -2072,7 +2074,6 @@ hft_reset (struct console *con)
 /*                    limits of text/data segments                      */
 /************************************************************************/
 
-/* Note that VMS compiler won't accept defined (CANNOT_DUMP).  */
 #ifndef CANNOT_DUMP
 #define NEED_STARTS
 #endif
@@ -2137,7 +2138,7 @@ start_of_text (void)
  *     at least on UniPlus, is temacs will have to be made unshared so
  *     that text and data are contiguous.  Then once loadup is complete,
  *     unexec will produce a shared executable where the data can be
- *     at the normal shared text boundry and the startofdata variable
+ *     at the normal shared text boundary and the startofdata variable
  *     will be patched by unexec to the correct value.
  *
  */
@@ -2264,42 +2265,43 @@ init_system_name (void)
 #  ifndef CANNOT_DUMP
   if (initialized)
 #  endif /* not CANNOT_DUMP */
-    {
-      struct hostent *hp = NULL;
-      int count;
+    if (!strchr (hostname, '.'))
+      {
+       struct hostent *hp = NULL;
+       int count;
 #  ifdef TRY_AGAIN
-      for (count = 0; count < 10; count++)
-       {
-         h_errno = 0;
+       for (count = 0; count < 10; count++)
+         {
+           h_errno = 0;
 #  endif
-         /* Some systems can't handle SIGALARM/SIGIO in gethostbyname(). */
-         stop_interrupts ();
-         hp = gethostbyname (hostname);
-         start_interrupts ();
+           /* Some systems can't handle SIGALARM/SIGIO in gethostbyname(). */
+           stop_interrupts ();
+           hp = gethostbyname (hostname);
+           start_interrupts ();
 #  ifdef TRY_AGAIN
-         if (! (hp == 0 && h_errno == TRY_AGAIN))
-           break;
-         Fsleep_for (make_int (1));
-       }
+           if (! (hp == 0 && h_errno == TRY_AGAIN))
+             break;
+           Fsleep_for (make_int (1));
+         }
 #  endif
-      if (hp)
-       {
-         CONST char *fqdn = (CONST char *) hp->h_name;
-
-         if (!strchr (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 && !strchr (*alias, '.'))
-               alias++;
-             if (*alias)
-               fqdn = *alias;
-           }
-         hostname = (char *) alloca (strlen (fqdn) + 1);
-         strcpy (hostname, fqdn);
-       }
-    }
+       if (hp)
+         {
+           CONST char *fqdn = (CONST char *) hp->h_name;
+
+           if (!strchr (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 && !strchr (*alias, '.'))
+                 alias++;
+               if (*alias)
+                 fqdn = *alias;
+             }
+           hostname = (char *) alloca (strlen (fqdn) + 1);
+           strcpy (hostname, fqdn);
+         }
+      }
 # endif /* HAVE_SOCKETS */
   Vsystem_name = build_string (hostname);
 #endif /* HAVE_GETHOSTNAME  */
@@ -2594,7 +2596,8 @@ sys_open (CONST char *path, int oflag, ...)
   {
     int rtnval;
     while ((rtnval = open (path, oflag, mode)) == -1
-          && (errno == EINTR));
+          && (errno == EINTR))
+      DO_NOTHING;
     return rtnval;
   }
 #else
@@ -2779,7 +2782,8 @@ sys_fopen (CONST char *path, CONST char *type)
 #elif defined (INTERRUPTIBLE_OPEN)
   {
     FILE *rtnval;
-    while (!(rtnval = fopen (path, type)) && (errno == EINTR));
+    while (!(rtnval = fopen (path, type)) && (errno == EINTR))
+      DO_NOTHING;
     return rtnval;
   }
 #else
@@ -3682,7 +3686,7 @@ opendir (CONST char *filename)    /* name of directory */
   int fd;              /* file descriptor for read */
   struct stat sbuf;            /* result of fstat */
 
-  fd = sys_open (filename, 0);
+  fd = sys_open (filename, O_RDONLY);
   if (fd < 0)
     return 0;
 
@@ -3799,24 +3803,24 @@ mkdir (CONST char *dpath, int dmode)
     {
 
     case -1:                   /* Error in fork() */
-      return (-1);             /* Errno is set already */
+      return -1;               /* Errno is set already */
 
     case 0:                    /* Child process */
     {
       /*
-                * Cheap hack to set mode of new directory.  Since this
-                * child process is going away anyway, we zap its umask.
-                * ####, this won't suffice to set SUID, SGID, etc. on this
-                * directory.  Does anybody care?
-                */
+       * Cheap hack to set mode of new directory.  Since this
+       * child process is going away anyway, we zap its umask.
+       * ####, this won't suffice to set SUID, SGID, etc. on this
+       * directory.  Does anybody care?
+       */
       status = umask (0);      /* Get current umask */
       status = umask (status | (0777 & ~dmode));       /* Set for mkdir */
-      fd = sys_open ("/dev/null", 2);
+      fd = sys_open ("/dev/null", O_RDWR);
       if (fd >= 0)
         {
-         dup2 (fd, 0);
-         dup2 (fd, 1);
-         dup2 (fd, 2);
+         if (fd != STDIN_FILENO)  dup2 (fd, STDIN_FILENO);
+         if (fd != STDOUT_FILENO) dup2 (fd, STDOUT_FILENO);
+         if (fd != STDERR_FILENO) dup2 (fd, STDERR_FILENO);
         }
       execl ("/bin/mkdir", "mkdir", dpath, (char *) 0);
       _exit (-1);              /* Can't exec /bin/mkdir */
@@ -3857,12 +3861,12 @@ rmdir (CONST char *dpath)
       return (-1);             /* Errno is set already */
 
     case 0:                    /* Child process */
-      fd = sys_open("/dev/null", 2);
+      fd = sys_open("/dev/null", O_RDWR);
       if (fd >= 0)
         {
-         dup2 (fd, 0);
-         dup2 (fd, 1);
-         dup2 (fd, 2);
+         if (fd != STDIN_FILENO)  dup2 (fd, STDIN_FILENO);
+         if (fd != STDOUT_FILENO) dup2 (fd, STDOUT_FILENO);
+         if (fd != STDERR_FILENO) dup2 (fd, STDERR_FILENO);
         }
       execl ("/bin/rmdir", "rmdir", dpath, (char *) 0);
       _exit (-1);              /* Can't exec /bin/mkdir */
@@ -3871,7 +3875,8 @@ rmdir (CONST char *dpath)
       wait_for_termination (cpid);
     }
 
-  if (synch_process_death != 0 || synch_process_retcode != 0)
+  if (synch_process_death   != 0 ||
+      synch_process_retcode != 0)
     {
       errno = EIO;             /* We don't know why, but */
       return -1;               /* /bin/rmdir failed */