1994-01-05 12:17:15 -04:00
|
|
|
/***********************************************************
|
1995-01-08 10:33:34 -04:00
|
|
|
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
|
|
|
|
The Netherlands.
|
1994-01-05 12:17:15 -04:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
******************************************************************/
|
|
|
|
|
1994-05-06 12:54:15 -03:00
|
|
|
/* Mac module implementation */
|
1994-01-05 12:17:15 -04:00
|
|
|
|
|
|
|
#include "allobjects.h"
|
|
|
|
#include "modsupport.h"
|
1994-05-06 12:54:15 -03:00
|
|
|
#include "ceval.h"
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <errno.h>
|
1994-08-29 05:42:37 -03:00
|
|
|
|
|
|
|
#ifdef THINK_C
|
|
|
|
#include "unix.h"
|
|
|
|
#undef S_IFMT
|
|
|
|
#undef S_IFDIR
|
|
|
|
#undef S_IFCHR
|
|
|
|
#undef S_IFBLK
|
|
|
|
#undef S_IFREG
|
|
|
|
#undef S_ISDIR
|
|
|
|
#undef S_ISREG
|
|
|
|
#endif
|
|
|
|
|
1996-10-15 13:13:33 -03:00
|
|
|
#include "macstat.h"
|
1996-02-14 12:02:30 -04:00
|
|
|
#ifdef USE_GUSI
|
1996-10-15 13:13:33 -03:00
|
|
|
/* Remove defines from macstat.h */
|
|
|
|
#undef S_IFMT
|
|
|
|
#undef S_IFDIR
|
|
|
|
#undef S_IFREG
|
|
|
|
#undef S_IREAD
|
|
|
|
#undef S_IWRITE
|
|
|
|
#undef S_IEXEC
|
|
|
|
|
1996-02-20 12:24:37 -04:00
|
|
|
#include <GUSI.h>
|
1996-02-14 12:02:30 -04:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <stat.h>
|
|
|
|
#else
|
1996-10-15 13:13:33 -03:00
|
|
|
#define stat macstat
|
1996-02-14 12:02:30 -04:00
|
|
|
#endif
|
1994-05-06 12:54:15 -03:00
|
|
|
|
1995-01-26 12:34:53 -04:00
|
|
|
#ifdef __MWERKS__
|
|
|
|
#include <unix.h>
|
|
|
|
#else
|
1994-05-06 12:54:15 -03:00
|
|
|
#include <fcntl.h>
|
1994-12-14 09:48:38 -04:00
|
|
|
#endif
|
1994-05-06 12:54:15 -03:00
|
|
|
|
1996-02-20 12:24:37 -04:00
|
|
|
/* Optional routines, for some compiler/runtime combinations */
|
1995-02-13 12:19:04 -04:00
|
|
|
#if defined(__MWERKS__) && defined(__powerc)
|
1995-01-22 12:52:38 -04:00
|
|
|
#define MALLOC_DEBUG
|
|
|
|
#endif
|
1996-02-20 12:24:37 -04:00
|
|
|
#if defined(USE_GUSI) || !defined(__MWERKS__)
|
|
|
|
#define WEHAVE_FDOPEN
|
|
|
|
#endif
|
|
|
|
#if defined(MPW) || defined(USE_GUSI)
|
|
|
|
#define WEHAVE_DUP
|
|
|
|
#endif
|
1995-01-22 12:52:38 -04:00
|
|
|
|
1994-08-19 07:51:31 -03:00
|
|
|
#include "macdefs.h"
|
1996-02-14 12:02:30 -04:00
|
|
|
#ifdef USE_GUSI
|
|
|
|
#include <dirent.h>
|
|
|
|
#else
|
1994-08-19 07:51:31 -03:00
|
|
|
#include "dirent.h"
|
1996-02-14 12:02:30 -04:00
|
|
|
#endif
|
1994-05-06 12:54:15 -03:00
|
|
|
|
|
|
|
#ifndef MAXPATHLEN
|
|
|
|
#define MAXPATHLEN 1024
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Prototypes for Unix simulation on Mac */
|
|
|
|
|
1996-02-20 12:24:37 -04:00
|
|
|
#ifndef USE_GUSI
|
|
|
|
|
1994-05-06 12:56:22 -03:00
|
|
|
int chdir PROTO((const char *path));
|
|
|
|
int mkdir PROTO((const char *path, int mode));
|
|
|
|
DIR * opendir PROTO((char *));
|
1994-05-06 12:54:15 -03:00
|
|
|
void closedir PROTO((DIR *));
|
1994-08-19 07:51:31 -03:00
|
|
|
struct dirent * readdir PROTO((DIR *));
|
1994-05-06 12:56:22 -03:00
|
|
|
int rmdir PROTO((const char *path));
|
1994-05-06 12:54:15 -03:00
|
|
|
int sync PROTO((void));
|
1996-02-20 12:24:37 -04:00
|
|
|
|
|
|
|
#if defined(THINK_C) || defined(__SC__)
|
1994-08-29 05:42:37 -03:00
|
|
|
int unlink PROTO((char *));
|
|
|
|
#else
|
1994-05-06 12:56:22 -03:00
|
|
|
int unlink PROTO((const char *));
|
1994-08-29 05:42:37 -03:00
|
|
|
#endif
|
1994-05-06 12:54:15 -03:00
|
|
|
|
1996-02-20 12:24:37 -04:00
|
|
|
#endif /* USE_GUSI */
|
|
|
|
|
|
|
|
char *getwd PROTO((char *));
|
|
|
|
char *getbootvol PROTO((void));
|
1994-01-05 12:17:15 -04:00
|
|
|
|
|
|
|
|
1994-05-06 12:54:15 -03:00
|
|
|
static object *MacError; /* Exception mac.error */
|
1994-01-05 12:17:15 -04:00
|
|
|
|
1994-05-06 12:54:15 -03:00
|
|
|
/* Set a MAC-specific error from errno, and return NULL */
|
|
|
|
|
|
|
|
static object *
|
|
|
|
mac_error()
|
|
|
|
{
|
1994-05-06 12:56:22 -03:00
|
|
|
return err_errno(MacError);
|
1994-05-06 12:54:15 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
/* 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;
|
|
|
|
}
|
|
|
|
|
1994-01-05 12:17:15 -04:00
|
|
|
static object *
|
|
|
|
mac_chdir(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
|
|
|
{
|
1996-03-06 12:21:34 -04:00
|
|
|
#ifdef USE_GUSI
|
|
|
|
object *rv;
|
|
|
|
|
|
|
|
/* Change MacOS's idea of wd too */
|
|
|
|
rv = mac_1str(args, chdir);
|
|
|
|
PyMac_FixGUSIcd();
|
|
|
|
return rv;
|
|
|
|
#else
|
1994-05-06 12:54:15 -03:00
|
|
|
return mac_1str(args, chdir);
|
1996-03-06 12:21:34 -04:00
|
|
|
#endif
|
|
|
|
|
1994-05-06 12:54:15 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
static object *
|
|
|
|
mac_close(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
|
|
|
{
|
|
|
|
int fd, res;
|
|
|
|
if (!getargs(args, "i", &fd))
|
1994-01-05 12:17:15 -04:00
|
|
|
return NULL;
|
1994-05-06 12:54:15 -03:00
|
|
|
BGN_SAVE
|
|
|
|
res = close(fd);
|
|
|
|
END_SAVE
|
1996-02-20 12:24:37 -04:00
|
|
|
#ifndef USE_GUSI
|
|
|
|
/* GUSI gives surious errors here? */
|
1994-05-06 12:54:15 -03:00
|
|
|
if (res < 0)
|
|
|
|
return mac_error();
|
1996-02-20 12:24:37 -04:00
|
|
|
#endif
|
1994-01-05 12:17:15 -04:00
|
|
|
INCREF(None);
|
|
|
|
return None;
|
|
|
|
}
|
|
|
|
|
1996-02-20 12:24:37 -04:00
|
|
|
#ifdef WEHAVE_DUP
|
1994-05-06 12:56:22 -03:00
|
|
|
|
1994-05-06 12:54:15 -03:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
1996-02-20 12:24:37 -04:00
|
|
|
#endif
|
1994-08-26 06:09:48 -03:00
|
|
|
|
1996-02-20 12:24:37 -04:00
|
|
|
#ifdef WEHAVE_FDOPEN
|
1994-05-06 12:54:15 -03:00
|
|
|
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);
|
|
|
|
}
|
1994-12-14 09:48:38 -04:00
|
|
|
#endif
|
1994-05-06 12:54:15 -03:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
1994-01-05 12:17:15 -04:00
|
|
|
|
|
|
|
static object *
|
|
|
|
mac_getcwd(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
|
|
|
{
|
1994-05-06 12:54:15 -03:00
|
|
|
char path[MAXPATHLEN];
|
|
|
|
char *res;
|
1994-01-05 12:17:15 -04:00
|
|
|
if (!getnoarg(args))
|
|
|
|
return NULL;
|
1994-05-06 12:54:15 -03:00
|
|
|
BGN_SAVE
|
1996-02-20 12:24:37 -04:00
|
|
|
#ifdef USE_GUSI
|
|
|
|
res = getcwd(path, sizeof path);
|
|
|
|
#else
|
1994-05-06 12:54:15 -03:00
|
|
|
res = getwd(path);
|
1996-02-20 12:24:37 -04:00
|
|
|
#endif
|
1994-05-06 12:54:15 -03:00
|
|
|
END_SAVE
|
|
|
|
if (res == NULL) {
|
|
|
|
err_setstr(MacError, path);
|
1994-01-05 12:17:15 -04:00
|
|
|
return NULL;
|
|
|
|
}
|
1994-05-06 12:54:15 -03:00
|
|
|
return newstringobject(res);
|
1994-01-05 12:17:15 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static object *
|
|
|
|
mac_listdir(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
|
|
|
{
|
|
|
|
char *name;
|
1994-05-06 12:54:15 -03:00
|
|
|
object *d, *v;
|
1994-01-05 12:17:15 -04:00
|
|
|
DIR *dirp;
|
1994-08-19 07:51:31 -03:00
|
|
|
struct dirent *ep;
|
1994-05-06 12:54:15 -03:00
|
|
|
if (!getargs(args, "s", &name))
|
1994-01-05 12:17:15 -04:00
|
|
|
return NULL;
|
1994-05-06 12:54:15 -03:00
|
|
|
BGN_SAVE
|
|
|
|
if ((dirp = opendir(name)) == NULL) {
|
|
|
|
RET_SAVE
|
|
|
|
return mac_error();
|
|
|
|
}
|
1994-01-05 12:17:15 -04:00
|
|
|
if ((d = newlistobject(0)) == NULL) {
|
|
|
|
closedir(dirp);
|
1994-05-06 12:54:15 -03:00
|
|
|
RET_SAVE
|
1994-01-05 12:17:15 -04:00
|
|
|
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);
|
1994-05-06 12:54:15 -03:00
|
|
|
END_SAVE
|
|
|
|
|
1994-01-05 12:17:15 -04:00
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
1994-05-06 12:54:15 -03:00
|
|
|
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);
|
|
|
|
}
|
1996-02-14 12:02:30 -04:00
|
|
|
|
1994-01-05 12:17:15 -04:00
|
|
|
static object *
|
|
|
|
mac_mkdir(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
1994-05-06 12:54:15 -03:00
|
|
|
{
|
1996-02-21 08:33:50 -04:00
|
|
|
int res;
|
|
|
|
char *path;
|
|
|
|
int mode = 0777; /* Unused */
|
|
|
|
if (!newgetargs(args, "s|i", &path, &mode))
|
|
|
|
return NULL;
|
|
|
|
BGN_SAVE
|
1996-08-06 13:06:31 -03:00
|
|
|
#ifdef USE_GUSI
|
|
|
|
res = mkdir(path);
|
|
|
|
#else
|
1996-02-21 08:33:50 -04:00
|
|
|
res = mkdir(path, mode);
|
1996-08-06 13:06:31 -03:00
|
|
|
#endif
|
1996-02-21 08:33:50 -04:00
|
|
|
END_SAVE
|
|
|
|
if (res < 0)
|
|
|
|
return mac_error();
|
|
|
|
INCREF(None);
|
|
|
|
return None;
|
1994-05-06 12:54:15 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
static object *
|
|
|
|
mac_open(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
1994-01-05 12:17:15 -04:00
|
|
|
{
|
|
|
|
char *path;
|
|
|
|
int mode;
|
1994-05-06 12:54:15 -03:00
|
|
|
int fd;
|
1994-01-05 12:17:15 -04:00
|
|
|
if (!getargs(args, "(si)", &path, &mode))
|
|
|
|
return NULL;
|
1994-05-06 12:54:15 -03:00
|
|
|
BGN_SAVE
|
|
|
|
fd = open(path, mode);
|
|
|
|
END_SAVE
|
|
|
|
if (fd < 0)
|
|
|
|
return mac_error();
|
|
|
|
return newintobject((long)fd);
|
1994-01-05 12:17:15 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static object *
|
1994-05-06 12:54:15 -03:00
|
|
|
mac_read(self, args)
|
1994-01-05 12:17:15 -04:00
|
|
|
object *self;
|
|
|
|
object *args;
|
|
|
|
{
|
1994-05-06 12:54:15 -03:00
|
|
|
int fd, size;
|
|
|
|
object *buffer;
|
|
|
|
if (!getargs(args, "(ii)", &fd, &size))
|
1994-01-05 12:17:15 -04:00
|
|
|
return NULL;
|
1994-05-06 12:54:15 -03:00
|
|
|
buffer = newsizedstringobject((char *)NULL, size);
|
|
|
|
if (buffer == NULL)
|
|
|
|
return NULL;
|
|
|
|
BGN_SAVE
|
|
|
|
size = read(fd, getstringvalue(buffer), size);
|
|
|
|
END_SAVE
|
|
|
|
if (size < 0) {
|
|
|
|
DECREF(buffer);
|
|
|
|
return mac_error();
|
|
|
|
}
|
|
|
|
resizestring(&buffer, size);
|
|
|
|
return buffer;
|
1994-01-05 12:17:15 -04:00
|
|
|
}
|
|
|
|
|
1994-05-06 12:54:15 -03:00
|
|
|
static object *
|
|
|
|
mac_rename(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
|
|
|
{
|
|
|
|
return mac_2str(args, rename);
|
|
|
|
}
|
1994-01-05 12:17:15 -04:00
|
|
|
|
|
|
|
static object *
|
|
|
|
mac_rmdir(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
|
|
|
{
|
1994-05-06 12:54:15 -03:00
|
|
|
return mac_1str(args, rmdir);
|
1994-01-05 12:17:15 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
static object *
|
|
|
|
mac_stat(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
|
|
|
{
|
1996-10-15 13:13:33 -03:00
|
|
|
struct stat st;
|
1994-01-05 12:17:15 -04:00
|
|
|
char *path;
|
1994-05-06 12:54:15 -03:00
|
|
|
int res;
|
|
|
|
if (!getargs(args, "s", &path))
|
1994-01-05 12:17:15 -04:00
|
|
|
return NULL;
|
1994-05-06 12:54:15 -03:00
|
|
|
BGN_SAVE
|
1996-10-15 13:13:33 -03:00
|
|
|
res = stat(path, &st);
|
1994-05-06 12:54:15 -03:00
|
|
|
END_SAVE
|
|
|
|
if (res != 0)
|
|
|
|
return mac_error();
|
1996-10-15 13:13:33 -03:00
|
|
|
#if 1
|
|
|
|
return mkvalue("(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);
|
|
|
|
#else
|
1994-08-19 07:51:31 -03:00
|
|
|
return mkvalue("(llllllllll)",
|
1994-05-06 12:54:15 -03:00
|
|
|
(long)st.st_mode,
|
1994-08-26 06:09:48 -03:00
|
|
|
(long)st.st_ino,
|
1994-08-19 07:51:31 -03:00
|
|
|
(long)st.st_dev,
|
|
|
|
(long)st.st_nlink,
|
|
|
|
(long)st.st_uid,
|
|
|
|
(long)st.st_gid,
|
1994-05-06 12:54:15 -03:00
|
|
|
(long)st.st_size,
|
1994-08-19 07:51:31 -03:00
|
|
|
(long)st.st_atime,
|
|
|
|
(long)st.st_mtime,
|
|
|
|
(long)st.st_ctime);
|
1996-10-15 13:13:33 -03:00
|
|
|
#endif
|
1994-01-05 12:17:15 -04:00
|
|
|
}
|
|
|
|
|
1995-08-08 11:10:22 -03:00
|
|
|
static object *
|
|
|
|
mac_xstat(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
|
|
|
{
|
1996-10-15 13:13:33 -03:00
|
|
|
struct macstat mst;
|
|
|
|
struct stat st;
|
1995-08-08 11:10:22 -03:00
|
|
|
char *path;
|
|
|
|
int res;
|
|
|
|
if (!getargs(args, "s", &path))
|
|
|
|
return NULL;
|
1996-10-15 13:13:33 -03:00
|
|
|
/*
|
|
|
|
** 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.
|
|
|
|
*/
|
1995-08-08 11:10:22 -03:00
|
|
|
BGN_SAVE
|
1996-10-15 13:13:33 -03:00
|
|
|
res = macstat(path, &mst);
|
1995-08-08 11:10:22 -03:00
|
|
|
END_SAVE
|
|
|
|
if (res != 0)
|
|
|
|
return mac_error();
|
1996-10-15 13:13:33 -03:00
|
|
|
BGN_SAVE
|
|
|
|
res = stat(path, &st);
|
|
|
|
END_SAVE
|
|
|
|
if (res != 0)
|
|
|
|
return mac_error();
|
|
|
|
#if 1
|
|
|
|
return mkvalue("(llllllldddls#s#)",
|
1996-02-14 12:02:30 -04:00
|
|
|
(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,
|
1996-10-15 13:13:33 -03:00
|
|
|
(double)st.st_atime,
|
|
|
|
(double)st.st_mtime,
|
|
|
|
(double)st.st_ctime,
|
|
|
|
(long)mst.st_rsize,
|
|
|
|
mst.st_creator, 4,
|
|
|
|
mst.st_type, 4);
|
1996-02-14 12:02:30 -04:00
|
|
|
#else
|
1995-08-08 11:10:22 -03:00
|
|
|
return mkvalue("(llllllllllls#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,
|
|
|
|
(long)st.st_atime,
|
|
|
|
(long)st.st_mtime,
|
|
|
|
(long)st.st_ctime,
|
1996-10-15 13:13:33 -03:00
|
|
|
(long)mst.st_rsize,
|
|
|
|
mst.st_creator, 4,
|
|
|
|
mst.st_type, 4);
|
1996-02-14 12:02:30 -04:00
|
|
|
#endif
|
1995-08-08 11:10:22 -03:00
|
|
|
}
|
|
|
|
|
1994-01-05 12:17:15 -04:00
|
|
|
static object *
|
|
|
|
mac_sync(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
|
|
|
{
|
1994-05-06 12:54:15 -03:00
|
|
|
int res;
|
1994-01-05 12:17:15 -04:00
|
|
|
if (!getnoarg(args))
|
|
|
|
return NULL;
|
1994-05-06 12:54:15 -03:00
|
|
|
BGN_SAVE
|
|
|
|
res = sync();
|
|
|
|
END_SAVE
|
|
|
|
if (res != 0)
|
|
|
|
return mac_error();
|
1994-01-05 12:17:15 -04:00
|
|
|
INCREF(None);
|
|
|
|
return None;
|
|
|
|
}
|
|
|
|
|
|
|
|
static object *
|
|
|
|
mac_unlink(self, args)
|
|
|
|
object *self;
|
|
|
|
object *args;
|
|
|
|
{
|
1994-08-29 05:42:37 -03:00
|
|
|
return mac_1str(args, (int (*)(const char *))unlink);
|
1994-01-05 12:17:15 -04:00
|
|
|
}
|
|
|
|
|
1994-05-06 12:54:15 -03:00
|
|
|
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);
|
|
|
|
}
|
1994-01-05 12:17:15 -04:00
|
|
|
|
1995-01-18 09:58:04 -04:00
|
|
|
#ifdef MALLOC_DEBUG
|
|
|
|
static object *
|
|
|
|
mac_mstats(self, args)
|
|
|
|
object*self;
|
|
|
|
object *args;
|
|
|
|
{
|
|
|
|
mstats("python");
|
|
|
|
INCREF(None);
|
|
|
|
return None;
|
|
|
|
}
|
|
|
|
#endif MALLOC_DEBUG
|
|
|
|
|
1994-01-05 12:17:15 -04:00
|
|
|
static struct methodlist mac_methods[] = {
|
|
|
|
{"chdir", mac_chdir},
|
1994-05-06 12:54:15 -03:00
|
|
|
{"close", mac_close},
|
1996-02-20 12:24:37 -04:00
|
|
|
#ifdef WEHAVE_DUP
|
1994-05-06 12:54:15 -03:00
|
|
|
{"dup", mac_dup},
|
1994-05-06 12:56:22 -03:00
|
|
|
#endif
|
1996-02-20 12:24:37 -04:00
|
|
|
#ifdef WEHAVE_FDOPEN
|
1994-08-26 06:09:48 -03:00
|
|
|
{"fdopen", mac_fdopen},
|
1994-12-14 09:48:38 -04:00
|
|
|
#endif
|
1994-05-06 12:54:15 -03:00
|
|
|
{"getbootvol", mac_getbootvol}, /* non-standard */
|
1994-01-05 12:17:15 -04:00
|
|
|
{"getcwd", mac_getcwd},
|
1995-02-19 11:50:35 -04:00
|
|
|
{"listdir", mac_listdir, 0},
|
1994-05-06 12:54:15 -03:00
|
|
|
{"lseek", mac_lseek},
|
1996-02-21 08:33:50 -04:00
|
|
|
{"mkdir", mac_mkdir, 1},
|
1994-05-06 12:54:15 -03:00
|
|
|
{"open", mac_open},
|
|
|
|
{"read", mac_read},
|
1994-01-05 12:17:15 -04:00
|
|
|
{"rename", mac_rename},
|
|
|
|
{"rmdir", mac_rmdir},
|
|
|
|
{"stat", mac_stat},
|
1995-08-08 11:10:22 -03:00
|
|
|
{"xstat", mac_xstat},
|
1994-01-05 12:17:15 -04:00
|
|
|
{"sync", mac_sync},
|
1996-02-21 08:33:50 -04:00
|
|
|
{"remove", mac_unlink},
|
1994-01-05 12:17:15 -04:00
|
|
|
{"unlink", mac_unlink},
|
1994-05-06 12:54:15 -03:00
|
|
|
{"write", mac_write},
|
1995-01-18 09:58:04 -04:00
|
|
|
#ifdef MALLOC_DEBUG
|
|
|
|
{"mstats", mac_mstats},
|
|
|
|
#endif
|
1994-05-06 12:54:15 -03:00
|
|
|
|
1994-01-05 12:17:15 -04:00
|
|
|
{NULL, NULL} /* Sentinel */
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
initmac()
|
|
|
|
{
|
1995-01-18 09:58:04 -04:00
|
|
|
object *m, *d;
|
1994-01-05 12:17:15 -04:00
|
|
|
|
|
|
|
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");
|
|
|
|
}
|