#include <sys/ioctl.h>
#include "systty.h"
-
-#ifdef BSD
-#ifdef BSD4_1
-#include <wait.h>
-#else /* not 4.1 */
-#include <sys/wait.h>
-#endif /* not 4.1 */
-#endif /* BSD */
+#include "syswait.h"
#ifdef BROKEN_TIOCGWINSZ
#undef TIOCGWINSZ
#else
#ifdef SIGTSTP
-#ifdef GETPGRP_NO_ARG
- EMACS_KILLPG (getpgrp (), SIGTSTP);
+ {
+#ifdef USG
+ int pgrp = getpgrp ();
#else
- EMACS_KILLPG (getpgrp (0), SIGTSTP);
+ int pgrp = getpgrp (0);
#endif
+ EMACS_KILLPG (pgrp, SIGTSTP);
+ }
#else /* No SIGTSTP */
#ifdef USG_JOBCTRL /* If you don't know what this is don't mess with it */
int lmode;
#endif
+#ifndef F_SETOWN_BUG
#ifdef F_SETOWN
int old_fcntl_owner;
#endif /* F_SETOWN */
+#endif /* F_SETOWN_BUG */
/* This may also be defined in stdio,
but if so, this does no harm,
}
#ifdef F_SETFL
+#ifndef F_SETOWN_BUG
#ifdef F_GETOWN /* F_SETFL does not imply existence of F_GETOWN */
if (interrupt_input)
{
init_sigio ();
}
#endif /* F_GETOWN */
+#endif /* F_SETOWN_BUG */
#endif /* F_SETFL */
#ifdef BSD4_1
#endif
#ifdef F_SETFL
+#ifndef F_SETOWN_BUG
#ifdef F_SETOWN /* F_SETFL does not imply existence of F_SETOWN */
if (interrupt_input)
{
fcntl (0, F_SETOWN, old_fcntl_owner);
}
#endif /* F_SETOWN */
+#endif /* F_SETOWN_BUG */
#endif /* F_SETFL */
#ifdef BSD4_1
if (interrupt_input)
#endif /* INTERRUPTIBLE_IO */
\f
+#ifndef HAVE_VFORK
+
+/*
+ * Substitute fork for vfork on USG flavors.
+ */
+
+vfork ()
+{
+ return (fork ());
+}
+
+#endif /* not HAVE_VFORK */
+\f
#ifdef USG
/*
* All of the following are for USG.
#ifndef HAVE_RENAME
rename (from, to)
- char *from;
- char *to;
+ const char *from;
+ const char *to;
{
if (access (from, 0) == 0)
{
#endif
-#ifndef HAVE_VFORK
-
-/*
- * Substitute fork for vfork on USG flavors.
- */
-
-vfork ()
-{
- return (fork ());
-}
-
-#endif /* not HAVE_VFORK */
-
#ifdef MISSING_UTIMES
/* HPUX (among others) sets HAVE_TIMEVAL but does not implement utimes. */
#include <dirent.h>
-#ifndef AIX
+#ifndef HAVE_CLOSEDIR
int
closedir (dirp)
register DIR *dirp; /* stream from opendir */
{
sys_close (dirp->dd_fd);
- /* Some systems allocate the buffer and the DIR all in one block.
- Why in the world are we freeing this ourselves anyway? */
- if (dirp->dd_buf != (char *)(dirp + 1))
- xfree ((char *) dirp->dd_buf); /* directory block defined in <dirent.h> */
+ /* Some systems (like Solaris) allocate the buffer and the DIR all
+ in one block. Why in the world are we freeing this ourselves
+ anyway? */
+#if ! (defined (sun) && defined (USG5_4))
+ xfree ((char *) dirp->dd_buf); /* directory block defined in <dirent.h> */
+#endif
xfree ((char *) dirp);
}
-#endif /* not AIX */
+#endif /* not HAVE_CLOSEDIR */
#endif /* SYSV_SYSTEM_DIR */
#ifdef NONSYSTEM_DIR_LIBRARY
#endif /* VMS */
#endif /* NONSYSTEM_DIR_LIBRARY */
+
+\f
+/* mkdir and rmdir functions, for systems which don't have them. */
+
+#ifndef HAVE_MKDIR
+/*
+ * Written by Robert Rother, Mariah Corporation, August 1985.
+ *
+ * If you want it, it's yours. All I ask in return is that if you
+ * figure out how to do this in a Bourne Shell script you send me
+ * a copy.
+ * sdcsvax!rmr or rmr@uscd
+ *
+ * Severely hacked over by John Gilmore to make a 4.2BSD compatible
+ * subroutine. 11Mar86; hoptoad!gnu
+ *
+ * Modified by rmtodd@uokmax 6-28-87 -- when making an already existing dir,
+ * subroutine didn't return EEXIST. It does now.
+ */
+
+/*
+ * Make a directory.
+ */
+int
+mkdir (dpath, dmode)
+ char *dpath;
+ int dmode;
+{
+ int cpid, status, fd;
+ struct stat statbuf;
+
+ if (stat (dpath, &statbuf) == 0)
+ {
+ errno = EEXIST; /* Stat worked, so it already exists */
+ return -1;
+ }
+
+ /* If stat fails for a reason other than non-existence, return error */
+ if (errno != ENOENT)
+ return -1;
+
+ synch_process_alive = 1;
+ switch (cpid = fork ())
+ {
+
+ case -1: /* Error in fork */
+ 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.
+ * FIXME, 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);
+ if (fd >= 0)
+ {
+ dup2 (fd, 0);
+ dup2 (fd, 1);
+ dup2 (fd, 2);
+ }
+ execl ("/bin/mkdir", "mkdir", 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)
+ {
+ errno = EIO; /* We don't know why, but */
+ return -1; /* /bin/mkdir failed */
+ }
+
+ return 0;
+}
+#endif /* not HAVE_MKDIR */
+
+#ifndef HAVE_RMDIR
+int
+rmdir (dpath)
+ char *dpath;
+{
+ int cpid, status, fd;
+ struct stat statbuf;
+
+ if (stat (dpath, &statbuf) != 0)
+ {
+ /* Stat just set errno. We don't have to */
+ return -1;
+ }
+
+ synch_process_alive = 1;
+ switch (cpid = fork ())
+ {
+
+ case -1: /* Error in fork */
+ return (-1); /* Errno is set already */
+
+ case 0: /* Child process */
+ fd = sys_open("/dev/null", 2);
+ if (fd >= 0)
+ {
+ dup2 (fd, 0);
+ 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)
+ {
+ errno = EIO; /* We don't know why, but */
+ return -1; /* /bin/rmdir failed */
+ }
+
+ return 0;
+}
+#endif /* !HAVE_RMDIR */
+
+
\f
/* Functions for VMS */
#ifdef VMS