Commit 9b731a20 authored by Guido van Rossum's avatar Guido van Rossum

As extended by Richard M Walker for MPW

parent 2e9a73db
...@@ -22,67 +22,233 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ...@@ -22,67 +22,233 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
******************************************************************/ ******************************************************************/
/* Macintosh OS module implementation */ /* Mac module implementation */
/* Richard J. Walker April 7, 1994 Island Graphics Corp. */
/* Thanks to Guido's unix emulation routines */
#include "allobjects.h" #include "allobjects.h"
#include "import.h"
#include "modsupport.h" #include "modsupport.h"
#include "ceval.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include "macdefs.h"
#include "dir.h"
#include "stat.h"
#ifndef MAXPATHLEN
#define MAXPATHLEN 1024
#endif
/* Prototypes for Unix simulation on Mac */
int access PROTO((char *path, int mode));
int chdir PROTO((char *path));
char *getbootvol PROTO((void));
char *getwd PROTO((char *));
int mkdir PROTO((char *path, int mode));
DIR * opendir PROTO((char *));
void closedir PROTO((DIR *));
struct direct * readdir PROTO((DIR *));
int rmdir PROTO((char *path));
int stat PROTO((char *path, struct stat *buf));
int sync PROTO((void));
#include "::unixemu:dir.h"
#include "::unixemu:stat.h"
static object *MacError; /* Exception */ static object *MacError; /* Exception mac.error */
/* Set a MAC-specific error from errno, and return NULL */
static object *
mac_error()
{
return err_errno(MacError);
}
/* MAC generic methods */
static object *
mac_1str(args, func)
object *args;
int (*func) FPROTO((const char *));
{
char *path1;
int res;
if (!getargs(args, "s", &path1))
return NULL;
BGN_SAVE
res = (*func)(path1);
END_SAVE
if (res < 0)
return mac_error();
INCREF(None);
return None;
}
static object *
mac_2str(args, func)
object *args;
int (*func) FPROTO((const char *, const char *));
{
char *path1, *path2;
int res;
if (!getargs(args, "(ss)", &path1, &path2))
return NULL;
BGN_SAVE
res = (*func)(path1, path2);
END_SAVE
if (res < 0)
return mac_error();
INCREF(None);
return None;
}
static object *
mac_strint(args, func)
object *args;
int (*func) FPROTO((const char *, int));
{
char *path;
int i;
int res;
if (!getargs(args, "(si)", &path, &i))
return NULL;
BGN_SAVE
res = (*func)(path, i);
END_SAVE
if (res < 0)
return mac_error();
INCREF(None);
return None;
}
static object *
mac_access(self, args)
object *self;
object *args;
{
return mac_strint(args, access);
}
static object * static object *
mac_chdir(self, args) mac_chdir(self, args)
object *self; object *self;
object *args; object *args;
{ {
char *path; return mac_1str(args, chdir);
if (!getstrarg(args, &path)) }
static object *
mac_close(self, args)
object *self;
object *args;
{
int fd, res;
if (!getargs(args, "i", &fd))
return NULL; return NULL;
if (chdir(path) != 0) BGN_SAVE
return err_errno(MacError); res = close(fd);
END_SAVE
if (res < 0)
return mac_error();
INCREF(None); INCREF(None);
return None; return None;
} }
static object *
mac_dup(self, args)
object *self;
object *args;
{
int fd;
if (!getargs(args, "i", &fd))
return NULL;
BGN_SAVE
fd = dup(fd);
END_SAVE
if (fd < 0)
return mac_error();
return newintobject((long)fd);
}
static object *
mac_fdopen(self, args)
object *self;
object *args;
{
extern int fclose PROTO((FILE *));
int fd;
char *mode;
FILE *fp;
if (!getargs(args, "(is)", &fd, &mode))
return NULL;
BGN_SAVE
fp = fdopen(fd, mode);
END_SAVE
if (fp == NULL)
return mac_error();
return newopenfileobject(fp, "(fdopen)", mode, fclose);
}
static object *
mac_getbootvol(self, args)
object *self;
object *args;
{
char *res;
if (!getnoarg(args))
return NULL;
BGN_SAVE
res = getbootvol();
END_SAVE
if (res == NULL)
return mac_error();
return newstringobject(res);
}
static object * static object *
mac_getcwd(self, args) mac_getcwd(self, args)
object *self; object *self;
object *args; object *args;
{ {
extern char *getwd(); char path[MAXPATHLEN];
char buf[1025]; char *res;
if (!getnoarg(args)) if (!getnoarg(args))
return NULL; return NULL;
strcpy(buf, "mac.getcwd() failed"); /* In case getwd() doesn't set a msg */ BGN_SAVE
if (getwd(buf) == NULL) { res = getwd(path);
err_setstr(MacError, buf); END_SAVE
if (res == NULL) {
err_setstr(MacError, path);
return NULL; return NULL;
} }
return newstringobject(buf); return newstringobject(res);
} }
static object * static object *
mac_listdir(self, args) mac_listdir(self, args)
object *self; object *self;
object *args; object *args;
{ {
object *d, *v;
char *name; char *name;
object *d, *v;
DIR *dirp; DIR *dirp;
struct direct *ep; struct direct *ep;
if (!getstrarg(args, &name)) if (!getargs(args, "s", &name))
return NULL; return NULL;
if ((dirp = opendir(name)) == NULL) BGN_SAVE
return err_errno(MacError); if ((dirp = opendir(name)) == NULL) {
RET_SAVE
return mac_error();
}
if ((d = newlistobject(0)) == NULL) { if ((d = newlistobject(0)) == NULL) {
closedir(dirp); closedir(dirp);
RET_SAVE
return NULL; return NULL;
} }
while ((ep = readdir(dirp)) != NULL) { while ((ep = readdir(dirp)) != NULL) {
...@@ -101,56 +267,95 @@ mac_listdir(self, args) ...@@ -101,56 +267,95 @@ mac_listdir(self, args)
DECREF(v); DECREF(v);
} }
closedir(dirp); closedir(dirp);
END_SAVE
return d; return d;
} }
static object *
mac_lseek(self, args)
object *self;
object *args;
{
int fd;
int where;
int how;
long res;
if (!getargs(args, "(iii)", &fd, &where, &how))
return NULL;
BGN_SAVE
res = lseek(fd, (long)where, how);
END_SAVE
if (res < 0)
return mac_error();
return newintobject(res);
}
static object * static object *
mac_mkdir(self, args) mac_mkdir(self, args)
object *self; object *self;
object *args; object *args;
{
return mac_strint(args, mkdir);
}
static object *
mac_open(self, args)
object *self;
object *args;
{ {
char *path; char *path;
int mode; int mode;
int fd;
if (!getargs(args, "(si)", &path, &mode)) if (!getargs(args, "(si)", &path, &mode))
return NULL; return NULL;
if (mkdir(path, mode) != 0) BGN_SAVE
return err_errno(MacError); fd = open(path, mode);
INCREF(None); END_SAVE
return None; if (fd < 0)
return mac_error();
return newintobject((long)fd);
} }
static object * static object *
mac_rename(self, args) mac_read(self, args)
object *self; object *self;
object *args; object *args;
{ {
char *src, *dst; int fd, size;
if (!getargs(args, "(ss)", &src, &dst)) object *buffer;
if (!getargs(args, "(ii)", &fd, &size))
return NULL; return NULL;
if (rename(src, dst) != 0) buffer = newsizedstringobject((char *)NULL, size);
return err_errno(MacError); if (buffer == NULL)
INCREF(None); return NULL;
return None; BGN_SAVE
size = read(fd, getstringvalue(buffer), size);
END_SAVE
if (size < 0) {
DECREF(buffer);
return mac_error();
}
resizestring(&buffer, size);
return buffer;
} }
static object *
mac_rename(self, args)
object *self;
object *args;
{
return mac_2str(args, rename);
}
static object * static object *
mac_rmdir(self, args) mac_rmdir(self, args)
object *self; object *self;
object *args; object *args;
{ {
char *path; return mac_1str(args, rmdir);
if (!getstrarg(args, &path))
return NULL;
if (rmdir(path) != 0)
return err_errno(MacError);
INCREF(None);
return None;
} }
static object * static object *
mac_stat(self, args) mac_stat(self, args)
object *self; object *self;
...@@ -158,75 +363,83 @@ mac_stat(self, args) ...@@ -158,75 +363,83 @@ mac_stat(self, args)
{ {
struct stat st; struct stat st;
char *path; char *path;
object *v; int res;
if (!getstrarg(args, &path)) if (!getargs(args, "s", &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 NULL;
} BGN_SAVE
return v; res = stat(path, &st);
END_SAVE
if (res != 0)
return mac_error();
return mkvalue("(llll)",
(long)st.st_mode,
(long)st.st_size,
(long)st.st_rsize,
(long)st.st_mtime);
} }
static object * static object *
mac_sync(self, args) mac_sync(self, args)
object *self; object *self;
object *args; object *args;
{ {
int res;
if (!getnoarg(args)) if (!getnoarg(args))
return NULL; return NULL;
sync(); BGN_SAVE
res = sync();
END_SAVE
if (res != 0)
return mac_error();
INCREF(None); INCREF(None);
return None; return None;
} }
static object * static object *
mac_unlink(self, args) mac_unlink(self, args)
object *self; object *self;
object *args; object *args;
{ {
char *path; return mac_1str(args, unlink);
if (!getstrarg(args, &path))
return NULL;
if (unlink(path) != 0)
return err_errno(MacError);
INCREF(None);
return None;
} }
static object *
mac_write(self, args)
object *self;
object *args;
{
int fd, size;
char *buffer;
if (!getargs(args, "(is#)", &fd, &buffer, &size))
return NULL;
BGN_SAVE
size = write(fd, buffer, size);
END_SAVE
if (size < 0)
return mac_error();
return newintobject((long)size);
}
static struct methodlist mac_methods[] = { static struct methodlist mac_methods[] = {
{"access", mac_access},
{"chdir", mac_chdir}, {"chdir", mac_chdir},
{"close", mac_close},
{"dup", mac_dup},
{"fdopen", mac_fdopen},
{"getbootvol", mac_getbootvol}, /* non-standard */
{"getcwd", mac_getcwd}, {"getcwd", mac_getcwd},
{"listdir", mac_listdir}, {"listdir", mac_listdir},
{"lseek", mac_lseek},
{"mkdir", mac_mkdir}, {"mkdir", mac_mkdir},
{"open", mac_open},
{"read", mac_read},
{"rename", mac_rename}, {"rename", mac_rename},
{"rmdir", mac_rmdir}, {"rmdir", mac_rmdir},
{"stat", mac_stat}, {"stat", mac_stat},
{"sync", mac_sync}, {"sync", mac_sync},
{"unlink", mac_unlink}, {"unlink", mac_unlink},
{"write", mac_write},
{NULL, NULL} /* Sentinel */ {NULL, NULL} /* Sentinel */
}; };
...@@ -234,7 +447,7 @@ static struct methodlist mac_methods[] = { ...@@ -234,7 +447,7 @@ static struct methodlist mac_methods[] = {
void void
initmac() initmac()
{ {
object *m, *d; object *m, *d, *v;
m = initmodule("mac", mac_methods); m = initmodule("mac", mac_methods);
d = getmoduledict(m); d = getmoduledict(m);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment