| 
									
										
										
										
											1994-01-05 16:17:15 +00:00
										 |  |  | /***********************************************************
 | 
					
						
							| 
									
										
										
										
											1994-01-18 10:09:50 +00:00
										 |  |  | Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum, | 
					
						
							| 
									
										
										
										
											1994-01-05 16:17:15 +00:00
										 |  |  | 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"); | 
					
						
							|  |  |  | } |