summaryrefslogtreecommitdiffstats
path: root/Mac/Modules/macmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Modules/macmodule.c')
-rw-r--r--Mac/Modules/macmodule.c246
1 files changed, 246 insertions, 0 deletions
diff --git a/Mac/Modules/macmodule.c b/Mac/Modules/macmodule.c
new file mode 100644
index 0000000..3d36f35
--- /dev/null
+++ b/Mac/Modules/macmodule.c
@@ -0,0 +1,246 @@
+/***********************************************************
+Copyright 1991, 1992, 1993, 1004 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/* Macintosh OS module implementation */
+
+#include "allobjects.h"
+
+#include "import.h"
+#include "modsupport.h"
+
+#include "::unixemu:dir.h"
+#include "::unixemu:stat.h"
+
+static object *MacError; /* Exception */
+
+
+static object *
+mac_chdir(self, args)
+ object *self;
+ object *args;
+{
+ char *path;
+ if (!getstrarg(args, &path))
+ return NULL;
+ if (chdir(path) != 0)
+ return err_errno(MacError);
+ INCREF(None);
+ return None;
+}
+
+
+static object *
+mac_getcwd(self, args)
+ object *self;
+ object *args;
+{
+ extern char *getwd();
+ char buf[1025];
+ if (!getnoarg(args))
+ return NULL;
+ strcpy(buf, "mac.getcwd() failed"); /* In case getwd() doesn't set a msg */
+ if (getwd(buf) == NULL) {
+ err_setstr(MacError, buf);
+ return NULL;
+ }
+ return newstringobject(buf);
+}
+
+
+static object *
+mac_listdir(self, args)
+ object *self;
+ object *args;
+{
+ object *d, *v;
+ char *name;
+ DIR *dirp;
+ struct direct *ep;
+ if (!getstrarg(args, &name))
+ return NULL;
+ if ((dirp = opendir(name)) == NULL)
+ return err_errno(MacError);
+ if ((d = newlistobject(0)) == NULL) {
+ closedir(dirp);
+ return NULL;
+ }
+ while ((ep = readdir(dirp)) != NULL) {
+ v = newstringobject(ep->d_name);
+ if (v == NULL) {
+ DECREF(d);
+ d = NULL;
+ break;
+ }
+ if (addlistitem(d, v) != 0) {
+ DECREF(v);
+ DECREF(d);
+ d = NULL;
+ break;
+ }
+ DECREF(v);
+ }
+ closedir(dirp);
+ return d;
+}
+
+
+static object *
+mac_mkdir(self, args)
+ object *self;
+ object *args;
+{
+ char *path;
+ int mode;
+ if (!getargs(args, "(si)", &path, &mode))
+ return NULL;
+ if (mkdir(path, mode) != 0)
+ return err_errno(MacError);
+ INCREF(None);
+ return None;
+}
+
+
+static object *
+mac_rename(self, args)
+ object *self;
+ object *args;
+{
+ char *src, *dst;
+ if (!getargs(args, "(ss)", &src, &dst))
+ return NULL;
+ if (rename(src, dst) != 0)
+ return err_errno(MacError);
+ INCREF(None);
+ return None;
+}
+
+
+static object *
+mac_rmdir(self, args)
+ object *self;
+ object *args;
+{
+ char *path;
+ if (!getstrarg(args, &path))
+ return NULL;
+ if (rmdir(path) != 0)
+ return err_errno(MacError);
+ INCREF(None);
+ return None;
+}
+
+
+static object *
+mac_stat(self, args)
+ object *self;
+ object *args;
+{
+ struct stat st;
+ char *path;
+ object *v;
+ if (!getstrarg(args, &path))
+ return NULL;
+ if (stat(path, &st) != 0)
+ return err_errno(MacError);
+ v = newtupleobject(11);
+ if (v == NULL)
+ return NULL;
+#define SET(i, val) settupleitem(v, i, newintobject((long)(val)))
+#define UNSET(i, val) SET(i, 0) /* For values my Mac stat doesn't support */
+ SET(0, st.st_mode);
+ UNSET(1, st.st_ino);
+ UNSET(2, st.st_dev);
+ UNSET(3, st.st_nlink);
+ UNSET(4, st.st_uid);
+ UNSET(5, st.st_gid);
+ SET(6, st.st_size);
+ UNSET(7, st.st_atime);
+ SET(8, st.st_mtime);
+ UNSET(9, st.st_ctime);
+ SET(10, st.st_rsize); /* Mac-specific: resource size */
+ /* XXX Check that unixemu:stat.c defines this! */
+#undef SET
+ if (err_occurred()) {
+ DECREF(v);
+ return NULL;
+ }
+ return v;
+}
+
+
+static object *
+mac_sync(self, args)
+ object *self;
+ object *args;
+{
+ if (!getnoarg(args))
+ return NULL;
+ sync();
+ INCREF(None);
+ return None;
+}
+
+
+static object *
+mac_unlink(self, args)
+ object *self;
+ object *args;
+{
+ char *path;
+ if (!getstrarg(args, &path))
+ return NULL;
+ if (unlink(path) != 0)
+ return err_errno(MacError);
+ INCREF(None);
+ return None;
+}
+
+
+static struct methodlist mac_methods[] = {
+ {"chdir", mac_chdir},
+ {"getcwd", mac_getcwd},
+ {"listdir", mac_listdir},
+ {"mkdir", mac_mkdir},
+ {"rename", mac_rename},
+ {"rmdir", mac_rmdir},
+ {"stat", mac_stat},
+ {"sync", mac_sync},
+ {"unlink", mac_unlink},
+ {NULL, NULL} /* Sentinel */
+};
+
+
+void
+initmac()
+{
+ object *m, *d;
+
+ m = initmodule("mac", mac_methods);
+ d = getmoduledict(m);
+
+ /* Initialize mac.error exception */
+ MacError = newstringobject("mac.error");
+ if (MacError == NULL || dictinsert(d, "error", MacError) != 0)
+ fatal("can't define mac.error");
+}