| /*********************************************************** |
| 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> |
| |
| #if TARGET_API_MAC_OS8 |
| /* Skip for Carbon */ |
| #include "macstat.h" |
| #endif |
| |
| #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 */ |
| #if TARGET_API_MAC_OS8 |
| #define stat macstat |
| #endif |
| #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; |
| FILE *fp; |
| if (!PyArg_ParseTuple(args, "is", &fd, &mode)) |
| return NULL; |
| Py_BEGIN_ALLOW_THREADS |
| fp = fdopen(fd, mode); |
| Py_END_ALLOW_THREADS |
| if (fp == NULL) |
| return mac_error(); |
| return PyFile_FromFile(fp, "(fdopen)", mode, fclose); |
| } |
| #endif |
| |
| #if TARGET_API_MAC_OS8 |
| static PyObject * |
| mac_getbootvol(self, args) |
| PyObject *self; |
| PyObject *args; |
| { |
| char *res; |
| if (!PyArg_ParseTuple(args, "")) |
| return NULL; |
| Py_BEGIN_ALLOW_THREADS |
| res = getbootvol(); |
| Py_END_ALLOW_THREADS |
| if (res == NULL) |
| return mac_error(); |
| return PyString_FromString(res); |
| } |
| #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; |
| |
| #ifdef TARGET_API_MAC_OS8 |
| static PyStructSequence_Field xstat_result_fields[] = { |
| COMMON_STAT_RESULT_FIELDS |
| { "st_rsize" }, |
| { "st_creator" }, |
| { "st_type "}, |
| {0} |
| }; |
| |
| static PyStructSequence_Desc xstat_result_desc = { |
| "mac.xstat_result", |
| stat_result__doc__, |
| xstat_result_fields, |
| 13 |
| }; |
| |
| static PyTypeObject XStatResultType; |
| #endif |
| |
| static PyObject * |
| _pystat_from_struct_stat(struct stat st, void* _mst) |
| { |
| PyObject *v; |
| |
| #if TARGET_API_MAC_OS8 |
| struct macstat *mst; |
| |
| if (_mst != NULL) |
| v = PyStructSequence_New(&XStatResultType); |
| else |
| #endif |
| 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 TARGET_API_MAC_OS8 |
| if (_mst != NULL) { |
| mst = (struct macstat *) _mst; |
| PyStructSequence_SET_ITEM(v, 10, |
| PyInt_FromLong((long)mst->st_rsize)); |
| PyStructSequence_SET_ITEM(v, 11, |
| PyString_FromStringAndSize(mst->st_creator, |
| 4)); |
| PyStructSequence_SET_ITEM(v, 12, |
| PyString_FromStringAndSize(mst->st_type, |
| 4)); |
| } |
| #endif |
| |
| 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 */ |
| |
| #if TARGET_API_MAC_OS8 |
| static PyObject * |
| mac_xstat(self, args) |
| PyObject *self; |
| PyObject *args; |
| { |
| struct macstat mst; |
| struct stat st; |
| char *path; |
| int res; |
| if (!PyArg_ParseTuple(args, "s", &path)) |
| return NULL; |
| /* |
| ** Convoluted: we want stat() and xstat() to agree, so we call both |
| ** stat and macstat, and use the latter only for values not provided by |
| ** the former. |
| */ |
| Py_BEGIN_ALLOW_THREADS |
| res = macstat(path, &mst); |
| Py_END_ALLOW_THREADS |
| if (res != 0) |
| return mac_error(); |
| Py_BEGIN_ALLOW_THREADS |
| res = stat(path, &st); |
| Py_END_ALLOW_THREADS |
| if (res != 0) |
| return mac_error(); |
| |
| return _pystat_from_struct_stat(st, (void*) &mst); |
| } |
| #endif |
| |
| 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 |
| #if TARGET_API_MAC_OS8 |
| {"getbootvol", mac_getbootvol, 1}, /* non-standard */ |
| #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}, |
| #if TARGET_API_MAC_OS8 |
| {"xstat", mac_xstat, 1}, |
| #endif |
| {"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); |
| |
| #if TARGET_API_MAC_OS8 |
| PyStructSequence_InitType(&XStatResultType, &xstat_result_desc); |
| PyDict_SetItemString(d, "xstat_result", (PyObject*) &XStatResultType); |
| #endif |
| } |