New posix functions open, close, dup, dup2, lseek, read, write, fstat, pipe.

Improved some comments and defaults in the Makefile.
This commit is contained in:
Guido van Rossum 1993-05-17 08:34:16 +00:00
parent 02cf582e73
commit 687dd13bfe
1 changed files with 233 additions and 27 deletions

View File

@ -135,10 +135,7 @@ static object *PosixError; /* Exception posix.error */
/* Set a POSIX-specific error from errno, and return NULL */
static object *
posix_error()
{
return err_errno(PosixError);
static object * posix_error() { return err_errno(PosixError);
}
@ -207,7 +204,6 @@ posix_do_stat(self, args, statfunc)
{
struct stat st;
char *path;
object *v;
int res;
if (!getstrarg(args, &path))
return NULL;
@ -216,7 +212,7 @@ posix_do_stat(self, args, statfunc)
END_SAVE
if (res != 0)
return posix_error();
v = mkvalue("(llllllllll)",
return mkvalue("(llllllllll)",
(long)st.st_mode,
(long)st.st_ino,
(long)st.st_dev,
@ -664,7 +660,7 @@ posix_setpgrp(self, args)
#else
if (setpgrp(0, 0) < 0)
#endif
return err_errno(PosixError);
return posix_error();
INCREF(None);
return None;
}
@ -823,10 +819,8 @@ posix_times(self, args)
return NULL;
errno = 0;
c = times(&t);
if (c == (clock_t) -1) {
err_errno(PosixError);
return NULL;
}
if (c == (clock_t) -1)
return posix_error();
return mkvalue("dddd",
(double)t.tms_utime / HZ,
(double)t.tms_stime / HZ,
@ -845,10 +839,8 @@ posix_setsid(self, args)
{
if (!getnoarg(args))
return NULL;
if (setsid() < 0) {
err_errno(PosixError);
return NULL;
}
if (setsid() < 0)
return posix_error();
INCREF(None);
return None;
}
@ -861,10 +853,8 @@ posix_setpgid(self, args)
int pid, pgrp;
if (!getargs(args, "(ii)", &pid, &pgrp))
return NULL;
if (setpgid(pid, pgrp) < 0) {
err_errno(PosixError);
return NULL;
}
if (setpgid(pid, pgrp) < 0)
return posix_error();
INCREF(None);
return None;
}
@ -878,10 +868,8 @@ posix_tcgetpgrp(self, args)
if (!getargs(args, "i", &fd))
return NULL;
pgid = tcgetpgrp(fd);
if (pgid < 0) {
err_errno(PosixError);
return NULL;
}
if (pgid < 0)
return posix_error();
return newintobject((long)pgid);
}
@ -893,16 +881,221 @@ posix_tcsetpgrp(self, args)
int fd, pgid;
if (!getargs(args, "(ii)", &fd, &pgid))
return NULL;
if (tcsetpgrp(fd, pgid) < 0) {
err_errno(PosixError);
return NULL;
}
if (tcsetpgrp(fd, pgid) < 0)
return posix_error();
INCREF(None);
return None;
}
#endif /* DO_PG */
/* Functions acting on file descriptors */
object *
posix_open(self, args)
object *self;
object *args;
{
char *file;
int flag;
int mode = 0777;
int fd;
if (!getargs(args, "(si)", &file, &flag)) {
err_clear();
if (!getargs(args, "(sii)", &file, &flag, &mode))
return NULL;
}
BGN_SAVE
fd = open(file, flag, mode);
END_SAVE
if (fd < 0)
return posix_error();
return newintobject((long)fd);
}
object *
posix_close(self, args)
object *self;
object *args;
{
int fd, res;
if (!getargs(args, "i", &fd))
return NULL;
BGN_SAVE
res = close(fd);
END_SAVE
if (res < 0)
return posix_error();
INCREF(None);
return None;
}
object *
posix_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 posix_error();
return newintobject((long)fd);
}
object *
posix_dup2(self, args)
object *self;
object *args;
{
int fd, fd2, res;
if (!getargs(args, "(ii)", &fd, &fd2))
return NULL;
BGN_SAVE
res = dup2(fd, fd2);
END_SAVE
if (res < 0)
return posix_error();
INCREF(None);
return None;
}
object *
posix_lseek(self, args)
object *self;
object *args;
{
int fd, how;
long pos, res;
if (!getargs(args, "(ili)", &fd, &pos, &how))
return NULL;
#ifdef SEEK_SET
/* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
switch (how) {
case 0: how = SEEK_SET; break;
case 1: how = SEEK_CUR; break;
case 2: how = SEEK_END; break;
}
#endif
BGN_SAVE
res = lseek(fd, pos, how);
END_SAVE
if (res < 0)
return posix_error();
return newintobject(res);
}
object *
posix_read(self, args)
object *self;
object *args;
{
int fd, size;
object *buffer;
if (!getargs(args, "(ii)", &fd, &size))
return NULL;
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 posix_error();
}
resizestring(&buffer, size);
return buffer;
}
object *
posix_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 posix_error();
return newintobject((long)size);
}
object *
posix_fstat(self, args)
object *self;
object *args;
{
int fd;
struct stat st;
int res;
if (!getargs(args, "i", &fd))
return NULL;
BGN_SAVE
res = fstat(fd, &st);
END_SAVE
if (res != 0)
return posix_error();
return mkvalue("(llllllllll)",
(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);
}
static object *
posix_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 posix_error();
/* From now on, ignore SIGPIPE and let the error checking
do the work. */
(void) signal(SIGPIPE, SIG_IGN);
return newopenfileobject(fp, "(fdopen)", mode, fclose);
}
#ifndef MSDOS
object *
posix_pipe(self, args)
object *self;
object *args;
{
int fds[2];
int res;
if (!getargs(args, ""))
return NULL;
BGN_SAVE
res = pipe(fds);
END_SAVE
if (res != 0)
return posix_error();
return mkvalue("(ii)", fds[0], fds[1]);
}
#endif /* MSDOS */
static struct methodlist posix_methods[] = {
{"chdir", posix_chdir},
@ -960,6 +1153,19 @@ static struct methodlist posix_methods[] = {
{"tcsetpgrp", posix_tcsetpgrp},
#endif
{"open", posix_open},
{"close", posix_close},
{"dup", posix_dup},
{"dup2", posix_dup2},
{"lseek", posix_lseek},
{"read", posix_read},
{"write", posix_write},
{"fstat", posix_fstat},
{"fdopen", posix_fdopen},
#ifndef MSDOS
{"pipe", posix_pipe},
#endif
{NULL, NULL} /* Sentinel */
};