summaryrefslogtreecommitdiffstats
path: root/unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'unix.c')
-rw-r--r--unix.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/unix.c b/unix.c
new file mode 100644
index 0000000..4437189
--- /dev/null
+++ b/unix.c
@@ -0,0 +1,151 @@
+/* Copyright (C) 1994, 1995 Free Software Foundation, Inc.
+ *
+ * This program 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 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * As a special exception, the Free Software Foundation gives permission
+ * for additional uses of the text contained in its release of GUILE.
+ *
+ * The exception is that, if you link the GUILE library with other files
+ * to produce an executable, this does not by itself cause the
+ * resulting executable to be covered by the GNU General Public License.
+ * Your use of that executable is in no way restricted on account of
+ * linking the GUILE library code into it.
+ *
+ * This exception does not however invalidate any other reasons why
+ * the executable file might be covered by the GNU General Public License.
+ *
+ * This exception applies only to the code released by the
+ * Free Software Foundation under the name GUILE. If you copy
+ * code from other Free Software Foundation releases into a copy of
+ * GUILE, as the General Public License permits, the exception does
+ * not apply to the code that you add in this way. To avoid misleading
+ * anyone as to the status of such modified files, you must delete
+ * this exception notice from them.
+ *
+ * If you write modifications of your own for GUILE, it is your choice
+ * whether to permit this exception to apply to your modifications.
+ * If you do not wish that, delete this exception notice.
+ */
+
+/* "unix.c" functions only in Unix (unix).
+ Author: Aubrey Jaffer */
+
+#include "scm.h"
+
+#include <pwd.h>
+#include <sys/types.h>
+/* #include <sys/wait.h> */
+#include <sys/stat.h>
+
+SCM stat2scm P((struct stat *stat_temp));
+
+#ifndef STDC_HEADERS
+ void sync P((void));
+ int symlink P((const char *oldpath, const char *newpath));
+ int readlink P((const char *path, char *buf, sizet bufsiz));
+ int acct P((const char *filename));
+ int nice P((int inc));
+#endif /* STDC_HEADERS */
+
+ /* Only the superuser can successfully execute mknod and acct */
+/* int mknod P((const char *path, mode_t mode, dev_t dev));
+ should be in stat.h */
+static char s_mknod[] = "mknod";
+SCM l_mknod(path, mode, dev)
+ SCM path, mode, dev;
+{
+ int val;
+ ASSERT(NIMP(path) && STRINGP(path), path, ARG1, s_mknod);
+ ASSERT(INUMP(mode), mode, ARG2, s_mknod);
+ ASSERT(INUMP(dev), dev, ARG3, s_mknod);
+ SYSCALL(val = mknod(CHARS(path), INUM(mode), INUM(dev)););
+ return val ? BOOL_F : BOOL_T;
+}
+static char s_acct[] = "acct";
+SCM l_acct(path)
+ SCM path;
+{
+ int val;
+ if FALSEP(path) {
+ SYSCALL(val = acct(0););
+ return val ? BOOL_F : BOOL_T;
+ }
+ ASSERT(NIMP(path) && STRINGP(path), path, ARG1, s_acct);
+ SYSCALL(val = acct(CHARS(path)););
+ return val ? BOOL_F : BOOL_T;
+}
+
+static char s_nice[] = "nice";
+SCM l_nice(incr)
+ SCM incr;
+{
+ ASSERT(INUMP(incr), incr, ARG1, s_nice);
+ return nice(INUM(incr)) ? BOOL_F : BOOL_T;
+}
+
+SCM l_sync()
+{
+ sync();
+ return UNSPECIFIED;
+}
+
+static char s_symlink[] = "symlink";
+SCM l_symlink(oldpath, newpath)
+ SCM oldpath, newpath;
+{
+ int val;
+ ASSERT(NIMP(oldpath) && STRINGP(oldpath), oldpath, ARG1, s_symlink);
+ ASSERT(NIMP(newpath) && STRINGP(newpath), newpath, ARG2, s_symlink);
+ SYSCALL(val = symlink(CHARS(oldpath), CHARS(newpath)););
+ return val ? BOOL_F : BOOL_T;
+}
+static char s_readlink[] = "readlink";
+SCM l_readlink(path)
+ SCM path;
+{
+ int i;
+ char buf[1024];
+ ASSERT(NIMP(path) && STRINGP(path), path, ARG1, s_readlink);
+ SYSCALL(i = readlink(CHARS(path), buf, (sizet)sizeof(buf)););
+ if (-1==i) return BOOL_F;
+ return makfromstr(buf, (sizet)i);
+}
+static char s_lstat[] = "lstat";
+SCM l_lstat(str)
+ SCM str;
+{
+ int i;
+ struct stat stat_temp;
+ ASSERT(NIMP(str) && STRINGP(str), str, ARG1, s_lstat);
+ SYSCALL(i = lstat(CHARS(str), &stat_temp););
+ if (i) return BOOL_F;
+ return stat2scm(&stat_temp);
+}
+
+static iproc subr1s[] = {
+ {s_nice, l_nice},
+ {s_acct, l_acct},
+ {s_lstat, l_lstat},
+ {s_readlink, l_readlink},
+ {0, 0}};
+
+void init_unix()
+{
+ make_subr("sync", tc7_subr_0, l_sync);
+ init_iprocs(subr1s, tc7_subr_1);
+ make_subr(s_symlink, tc7_subr_2, l_symlink);
+ make_subr(s_mknod, tc7_subr_3, l_mknod);
+ add_feature("unix");
+}