diff options
Diffstat (limited to 'Mac/Modules/macmodule.c')
-rw-r--r-- | Mac/Modules/macmodule.c | 727 |
1 files changed, 0 insertions, 727 deletions
diff --git a/Mac/Modules/macmodule.c b/Mac/Modules/macmodule.c deleted file mode 100644 index fb62286..0000000 --- a/Mac/Modules/macmodule.c +++ /dev/null @@ -1,727 +0,0 @@ -/*********************************************************** -Copyright 1991-1997 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. - -******************************************************************/ - -/* Mac module implementation */ - -#include "Python.h" -#include "structseq.h" -#include "ceval.h" - -#include <stdio.h> -#include <string.h> -#include <errno.h> - -#ifdef USE_GUSI -/* Remove defines from macstat.h */ -#undef S_IFMT -#undef S_IFDIR -#undef S_IFREG -#undef S_IREAD -#undef S_IWRITE -#undef S_IEXEC - -#include <sys/types.h> -#include <sys/stat.h> -#else /* USE_GUSI */ -#endif /* USE_GUSI */ - -#ifdef USE_GUSI2 -#include <unistd.h> -#include <fcntl.h> -#else -#define mode_t int -#include <fcntl.h> -#ifdef _POSIX -#include <unistd.h> -#include <stat.h> -#endif -#endif - -/* Optional routines, for some compiler/runtime combinations */ -#if defined(USE_GUSI) || !defined(__MWERKS__) -#define WEHAVE_FDOPEN -#endif -#if defined(MPW) || defined(USE_GUSI) -#define WEHAVE_DUP -#endif -#if defined(USE_GUSI) -#define WEHAVE_FSTAT -#endif - -#include "macdefs.h" -#ifdef USE_GUSI -#include <dirent.h> -#else -#include "dirent.h" -#endif - -#ifndef MAXPATHLEN -#define MAXPATHLEN 1024 -#endif - -/* Prototypes for Unix simulation on Mac */ - -#ifndef USE_GUSI - -int chdir(const char *path); -int mkdir(const char *path, int mode); -DIR * opendir(char *); -void closedir(DIR *); -struct dirent * readdir(DIR *); -int rmdir(const char *path); -int sync(void); - -int unlink(const char *); - -#endif /* USE_GUSI */ - -char *getwd(char *); -char *getbootvol(void); - - -/* Set a MAC-specific error from errno, and return NULL */ - -static PyObject * -mac_error() -{ - return PyErr_SetFromErrno(PyExc_OSError); -} - -/* MAC generic methods */ - -static PyObject * -mac_1str(args, func) - PyObject *args; - int (*func)(const char *); -{ - char *path1; - int res; - if (!PyArg_ParseTuple(args, "s", &path1)) - return NULL; - Py_BEGIN_ALLOW_THREADS - res = (*func)(path1); - Py_END_ALLOW_THREADS - if (res < 0) - return mac_error(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -mac_2str(args, func) - PyObject *args; - int (*func)(const char *, const char *); -{ - char *path1, *path2; - int res; - if (!PyArg_ParseTuple(args, "ss", &path1, &path2)) - return NULL; - Py_BEGIN_ALLOW_THREADS - res = (*func)(path1, path2); - Py_END_ALLOW_THREADS - if (res < 0) - return mac_error(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -mac_strint(args, func) - PyObject *args; - int (*func)(const char *, int); -{ - char *path; - int i; - int res; - if (!PyArg_ParseTuple(args, "si", &path, &i)) - return NULL; - Py_BEGIN_ALLOW_THREADS - res = (*func)(path, i); - Py_END_ALLOW_THREADS - if (res < 0) - return mac_error(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -mac_chdir(self, args) - PyObject *self; - PyObject *args; -{ - return mac_1str(args, chdir); -} - -static PyObject * -mac_close(self, args) - PyObject *self; - PyObject *args; -{ - int fd, res; - if (!PyArg_ParseTuple(args, "i", &fd)) - return NULL; - Py_BEGIN_ALLOW_THREADS - res = close(fd); - Py_END_ALLOW_THREADS - if (res < 0) - return mac_error(); - Py_INCREF(Py_None); - return Py_None; -} - -#ifdef WEHAVE_DUP - -static PyObject * -mac_dup(self, args) - PyObject *self; - PyObject *args; -{ - int fd; - if (!PyArg_ParseTuple(args, "i", &fd)) - return NULL; - Py_BEGIN_ALLOW_THREADS - fd = dup(fd); - Py_END_ALLOW_THREADS - if (fd < 0) - return mac_error(); - return PyInt_FromLong((long)fd); -} - -#endif - -#ifdef WEHAVE_FDOPEN -static PyObject * -mac_fdopen(self, args) - PyObject *self; - PyObject *args; -{ - extern int fclose(FILE *); - int fd; - char *mode = "r"; - int bufsize = -1; - FILE *fp; - PyObject *f; - if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize)) - return NULL; - Py_BEGIN_ALLOW_THREADS - fp = fdopen(fd, mode); - Py_END_ALLOW_THREADS - if (fp == NULL) - return mac_error(); - f = PyFile_FromFile(fp, "<fdopen>", mode, fclose); - if (f != NULL) - PyFile_SetBufSize(f, bufsize); - return f; -} -#endif - -static PyObject * -mac_getcwd(self, args) - PyObject *self; - PyObject *args; -{ - char path[MAXPATHLEN]; - char *res; - if (!PyArg_ParseTuple(args, "")) - return NULL; - Py_BEGIN_ALLOW_THREADS -#ifdef USE_GUSI - res = getcwd(path, sizeof path); -#else - res = getwd(path); -#endif - Py_END_ALLOW_THREADS - if (res == NULL) { - return mac_error(); - } - return PyString_FromString(res); -} - -static PyObject * -mac_listdir(self, args) - PyObject *self; - PyObject *args; -{ - char *name; - PyObject *d, *v; - DIR *dirp; - struct dirent *ep; - if (!PyArg_ParseTuple(args, "s", &name)) - return NULL; -#ifdef USE_GUSI - /* Work around a bug in GUSI: if you opendir() a file it will - ** actually opendir() the parent directory. - */ - { - struct stat stb; - int res; - - res = stat(name, &stb); - if ( res < 0 ) - return mac_error(); - if (!S_ISDIR(stb.st_mode) ) { - errno = ENOTDIR; - return mac_error(); - } - } -#endif - - Py_BEGIN_ALLOW_THREADS - if ((dirp = opendir(name)) == NULL) { - Py_BLOCK_THREADS - return mac_error(); - } - if ((d = PyList_New(0)) == NULL) { - closedir(dirp); - Py_BLOCK_THREADS - return NULL; - } - while ((ep = readdir(dirp)) != NULL) { - v = PyString_FromString(ep->d_name); - if (v == NULL) { - Py_DECREF(d); - d = NULL; - break; - } - if (PyList_Append(d, v) != 0) { - Py_DECREF(v); - Py_DECREF(d); - d = NULL; - break; - } - Py_DECREF(v); - } - closedir(dirp); - Py_END_ALLOW_THREADS - - return d; -} - -static PyObject * -mac_lseek(self, args) - PyObject *self; - PyObject *args; -{ - int fd; - int where; - int how; - long res; - if (!PyArg_ParseTuple(args, "iii", &fd, &where, &how)) - return NULL; - Py_BEGIN_ALLOW_THREADS - res = lseek(fd, (long)where, how); - Py_END_ALLOW_THREADS - if (res < 0) - return mac_error(); - return PyInt_FromLong(res); -} - -static PyObject * -mac_mkdir(self, args) - PyObject *self; - PyObject *args; -{ - int res; - char *path; - int mode = 0777; /* Unused */ - if (!PyArg_ParseTuple(args, "s|i", &path, &mode)) - return NULL; - Py_BEGIN_ALLOW_THREADS - res = mkdir(path, mode); - Py_END_ALLOW_THREADS - if (res < 0) - return mac_error(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -mac_open(self, args) - PyObject *self; - PyObject *args; -{ - char *path; - int mode; - int perm; /* Accepted but ignored */ - int fd; - if (!PyArg_ParseTuple(args, "si|i", &path, &mode, &perm)) - return NULL; - Py_BEGIN_ALLOW_THREADS - fd = open(path, mode); - Py_END_ALLOW_THREADS - if (fd < 0) - return mac_error(); - return PyInt_FromLong((long)fd); -} - -static PyObject * -mac_read(self, args) - PyObject *self; - PyObject *args; -{ - int fd, size; - PyObject *buffer; - if (!PyArg_ParseTuple(args, "ii", &fd, &size)) - return NULL; - buffer = PyString_FromStringAndSize((char *)NULL, size); - if (buffer == NULL) - return NULL; - Py_BEGIN_ALLOW_THREADS - size = read(fd, PyString_AsString(buffer), size); - Py_END_ALLOW_THREADS - if (size < 0) { - Py_DECREF(buffer); - return mac_error(); - } - _PyString_Resize(&buffer, size); - return buffer; -} - -static PyObject * -mac_rename(self, args) - PyObject *self; - PyObject *args; -{ - return mac_2str(args, rename); -} - -static PyObject * -mac_rmdir(self, args) - PyObject *self; - PyObject *args; -{ - return mac_1str(args, rmdir); -} - -static char stat_result__doc__[] = -"stat_result: Result from stat or lstat.\n\n\ -This object may be accessed either as a tuple of\n\ - (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\ -or via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n\ -\n\ -See os.stat for more information.\n"; - -#define COMMON_STAT_RESULT_FIELDS \ - { "st_mode", "protection bits" }, \ - { "st_ino", "inode" }, \ - { "st_dev", "device" }, \ - { "st_nlink", "number of hard links" }, \ - { "st_uid", "user ID of owner" }, \ - { "st_gid", "group ID of owner" }, \ - { "st_size", "total size, in bytes" }, \ - { "st_atime", "time of last access" }, \ - { "st_mtime", "time of last modification" }, \ - { "st_ctime", "time of last change" }, - - - -static PyStructSequence_Field stat_result_fields[] = { - COMMON_STAT_RESULT_FIELDS - {0} -}; - -static PyStructSequence_Desc stat_result_desc = { - "mac.stat_result", - stat_result__doc__, - stat_result_fields, - 10 -}; - -static PyTypeObject StatResultType; - -static PyObject * -_pystat_from_struct_stat(struct stat st, void* _mst) -{ - PyObject *v; - - v = PyStructSequence_New(&StatResultType); - PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long)st.st_mode)); - PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long)st.st_ino)); - PyStructSequence_SET_ITEM(v, 2, PyInt_FromLong((long)st.st_dev)); - PyStructSequence_SET_ITEM(v, 3, PyInt_FromLong((long)st.st_nlink)); - PyStructSequence_SET_ITEM(v, 4, PyInt_FromLong((long)st.st_uid)); - PyStructSequence_SET_ITEM(v, 5, PyInt_FromLong((long)st.st_gid)); - PyStructSequence_SET_ITEM(v, 6, PyInt_FromLong((long)st.st_size)); - PyStructSequence_SET_ITEM(v, 7, - PyFloat_FromDouble((double)st.st_atime)); - PyStructSequence_SET_ITEM(v, 8, - PyFloat_FromDouble((double)st.st_mtime)); - PyStructSequence_SET_ITEM(v, 9, - PyFloat_FromDouble((double)st.st_ctime)); - if (PyErr_Occurred()) { - Py_DECREF(v); - return NULL; - } - - return v; -} - - -static PyObject * -mac_stat(self, args) - PyObject *self; - PyObject *args; -{ - struct stat st; - char *path; - int res; - if (!PyArg_ParseTuple(args, "s", &path)) - return NULL; - Py_BEGIN_ALLOW_THREADS - res = stat(path, &st); - Py_END_ALLOW_THREADS - if (res != 0) - return mac_error(); - - return _pystat_from_struct_stat(st, NULL); -} - -#ifdef WEHAVE_FSTAT -static PyObject * -mac_fstat(self, args) - PyObject *self; - PyObject *args; -{ - struct stat st; - long fd; - int res; - if (!PyArg_ParseTuple(args, "l", &fd)) - return NULL; - Py_BEGIN_ALLOW_THREADS - res = fstat((int)fd, &st); - Py_END_ALLOW_THREADS - if (res != 0) - return mac_error(); - - return _pystat_from_struct_stat(st, NULL); -} -#endif /* WEHAVE_FSTAT */ - -static PyObject * -mac_sync(self, args) - PyObject *self; - PyObject *args; -{ - int res; - if (!PyArg_ParseTuple(args, "")) - return NULL; - Py_BEGIN_ALLOW_THREADS -#ifdef USE_GUSI2 - sync(); - res = 0; -#else - res = sync(); -#endif - Py_END_ALLOW_THREADS - if (res != 0) - return mac_error(); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -mac_unlink(self, args) - PyObject *self; - PyObject *args; -{ - return mac_1str(args, (int (*)(const char *))unlink); -} - -static PyObject * -mac_write(self, args) - PyObject *self; - PyObject *args; -{ - int fd, size; - char *buffer; - if (!PyArg_ParseTuple(args, "is#", &fd, &buffer, &size)) - return NULL; - Py_BEGIN_ALLOW_THREADS - size = write(fd, buffer, size); - Py_END_ALLOW_THREADS - if (size < 0) - return mac_error(); - return PyInt_FromLong((long)size); -} - -#ifdef USE_MALLOC_DEBUG -void *mstats(char *); - -static PyObject * -mac_mstats(self, args) - PyObject*self; - PyObject *args; -{ - mstats("python"); - Py_INCREF(Py_None); - return Py_None; -} -#endif /* USE_MALLOC_DEBUG */ - -static struct PyMethodDef mac_methods[] = { - {"chdir", mac_chdir, 1}, - {"close", mac_close, 1}, -#ifdef WEHAVE_DUP - {"dup", mac_dup, 1}, -#endif -#ifdef WEHAVE_FDOPEN - {"fdopen", mac_fdopen, 1}, -#endif -#ifdef WEHAVE_FSTAT - {"fstat", mac_fstat, 1}, -#endif - {"getcwd", mac_getcwd, 1}, - {"listdir", mac_listdir, 1}, - {"lseek", mac_lseek, 1}, - {"mkdir", mac_mkdir, 1}, - {"open", mac_open, 1}, - {"read", mac_read, 1}, - {"rename", mac_rename, 1}, - {"rmdir", mac_rmdir, 1}, - {"stat", mac_stat, 1}, - {"sync", mac_sync, 1}, - {"remove", mac_unlink, 1}, - {"unlink", mac_unlink, 1}, - {"write", mac_write, 1}, -#ifdef USE_MALLOC_DEBUG - {"mstats", mac_mstats, 1}, -#endif - - {NULL, NULL} /* Sentinel */ -}; - -static int -ins(PyObject *d, char *symbol, long value) -{ - PyObject* v = PyInt_FromLong(value); - if (!v || PyDict_SetItemString(d, symbol, v) < 0) - return -1; /* triggers fatal error */ - - Py_DECREF(v); - return 0; -} - -static int -all_ins(PyObject *d) -{ -#ifdef F_OK - if (ins(d, "F_OK", (long)F_OK)) return -1; -#endif -#ifdef R_OK - if (ins(d, "R_OK", (long)R_OK)) return -1; -#endif -#ifdef W_OK - if (ins(d, "W_OK", (long)W_OK)) return -1; -#endif -#ifdef X_OK - if (ins(d, "X_OK", (long)X_OK)) return -1; -#endif -#ifdef NGROUPS_MAX - if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1; -#endif -#ifdef TMP_MAX - if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1; -#endif -#ifdef WNOHANG - if (ins(d, "WNOHANG", (long)WNOHANG)) return -1; -#endif -#ifdef O_RDONLY - if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1; -#endif -#ifdef O_WRONLY - if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1; -#endif -#ifdef O_RDWR - if (ins(d, "O_RDWR", (long)O_RDWR)) return -1; -#endif -#ifdef O_NDELAY - if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1; -#endif -#ifdef O_NONBLOCK - if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1; -#endif -#ifdef O_APPEND - if (ins(d, "O_APPEND", (long)O_APPEND)) return -1; -#endif -#ifdef O_DSYNC - if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1; -#endif -#ifdef O_RSYNC - if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1; -#endif -#ifdef O_SYNC - if (ins(d, "O_SYNC", (long)O_SYNC)) return -1; -#endif -#ifdef O_NOCTTY - if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1; -#endif -#ifdef O_CREAT - if (ins(d, "O_CREAT", (long)O_CREAT)) return -1; -#endif -#ifdef O_EXCL - if (ins(d, "O_EXCL", (long)O_EXCL)) return -1; -#endif -#ifdef O_TRUNC - if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1; -#endif -#ifdef O_BINARY - if (ins(d, "O_BINARY", (long)O_BINARY)) return -1; -#endif -#ifdef O_TEXT - if (ins(d, "O_TEXT", (long)O_TEXT)) return -1; -#endif - -#ifdef HAVE_SPAWNV - if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1; - if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1; - if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1; - if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1; - if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1; -#endif - -#if defined(PYOS_OS2) - if (insertvalues(d)) return -1; -#endif - return 0; -} - - -void -initmac() -{ - PyObject *m, *d; - - m = Py_InitModule("mac", mac_methods); - d = PyModule_GetDict(m); - - if (all_ins(d)) - return; - - /* Initialize mac.error exception */ - PyDict_SetItemString(d, "error", PyExc_OSError); - - PyStructSequence_InitType(&StatResultType, &stat_result_desc); - PyDict_SetItemString(d, "stat_result", (PyObject*) &StatResultType); - -} |