mirror of
				https://github.com/python/cpython.git
				synced 2025-10-26 11:14:33 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			769 lines
		
	
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			769 lines
		
	
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***********************************************************
 | |
| 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 "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
 | |
| 
 | |
| #ifdef USE_GUSI1
 | |
| #include <GUSI.h>
 | |
| #endif /* USE_GUSI1 */
 | |
| #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
 | |
| #define sync bad_sync
 | |
| #include <unistd.h>
 | |
| #include <fcntl.h>
 | |
| #undef sync
 | |
| int sync(void);
 | |
| #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);
 | |
| 
 | |
| 
 | |
| static PyObject *MacError; /* Exception mac.error */
 | |
| 
 | |
| /* Set a MAC-specific error from errno, and return NULL */
 | |
| 
 | |
| static PyObject * 
 | |
| mac_error() 
 | |
| {
 | |
| 	return PyErr_SetFromErrno(MacError);
 | |
| }
 | |
| 
 | |
| /* 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;
 | |
| {
 | |
| #ifdef USE_GUSI1
 | |
| 	PyObject *rv;
 | |
| 	
 | |
| 	/* Change MacOS's idea of wd too */
 | |
| 	rv = mac_1str(args, chdir);
 | |
| 	PyMac_FixGUSIcd();
 | |
| 	return rv;
 | |
| #else
 | |
| 	return mac_1str(args, chdir);
 | |
| #endif
 | |
| 
 | |
| }
 | |
| 
 | |
| 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
 | |
| #ifndef USE_GUSI1
 | |
| 	/* GUSI gives surious errors here? */
 | |
| 	if (res < 0)
 | |
| 		return mac_error();
 | |
| #endif
 | |
| 	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) {
 | |
| 		PyErr_SetString(MacError, path);
 | |
| 		return NULL;
 | |
| 	}
 | |
| 	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
 | |
| #ifdef USE_GUSI1
 | |
| 	res = mkdir(path);
 | |
| #else
 | |
| 	res = mkdir(path, mode);
 | |
| #endif
 | |
| 	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 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 Py_BuildValue("(lllllllddd)",
 | |
| 		    (long)st.st_mode,
 | |
| 		    (long)st.st_ino,
 | |
| 		    (long)st.st_dev,
 | |
| 		    (long)st.st_nlink,
 | |
| 		    (long)st.st_uid,
 | |
| 		    (long)st.st_gid,
 | |
| 		    (long)st.st_size,
 | |
| 		    (double)st.st_atime,
 | |
| 		    (double)st.st_mtime,
 | |
| 		    (double)st.st_ctime);
 | |
| }
 | |
| 
 | |
| #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 Py_BuildValue("(lllllllddd)",
 | |
| 		    (long)st.st_mode,
 | |
| 		    (long)st.st_ino,
 | |
| 		    (long)st.st_dev,
 | |
| 		    (long)st.st_nlink,
 | |
| 		    (long)st.st_uid,
 | |
| 		    (long)st.st_gid,
 | |
| 		    (long)st.st_size,
 | |
| 		    (double)st.st_atime,
 | |
| 		    (double)st.st_mtime,
 | |
| 		    (double)st.st_ctime);
 | |
| }
 | |
| #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 Py_BuildValue("(llllllldddls#s#)",
 | |
| 		    (long)st.st_mode,
 | |
| 		    (long)st.st_ino,
 | |
| 		    (long)st.st_dev,
 | |
| 		    (long)st.st_nlink,
 | |
| 		    (long)st.st_uid,
 | |
| 		    (long)st.st_gid,
 | |
| 		    (long)st.st_size,
 | |
| 		    (double)st.st_atime,
 | |
| 		    (double)st.st_mtime,
 | |
| 		    (double)st.st_ctime,
 | |
| 		    (long)mst.st_rsize,
 | |
| 		    mst.st_creator, 4,
 | |
| 		    mst.st_type, 4);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| static PyObject *
 | |
| mac_sync(self, args)
 | |
| 	PyObject *self;
 | |
| 	PyObject *args;
 | |
| {
 | |
| 	int res;
 | |
| 	if (!PyArg_ParseTuple(args, ""))
 | |
| 		return NULL;
 | |
| 	Py_BEGIN_ALLOW_THREADS
 | |
| 	res = sync();
 | |
| 	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 */
 | |
| 	MacError = PyErr_NewException("mac.error", NULL, NULL);
 | |
| 	PyDict_SetItemString(d, "error", MacError);
 | |
| }
 | 
