mirror of
https://github.com/python/cpython.git
synced 2025-11-17 17:46:45 +00:00
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:
parent
02cf582e73
commit
687dd13bfe
1 changed files with 233 additions and 27 deletions
|
|
@ -135,10 +135,7 @@ static object *PosixError; /* Exception posix.error */
|
||||||
|
|
||||||
/* Set a POSIX-specific error from errno, and return NULL */
|
/* Set a POSIX-specific error from errno, and return NULL */
|
||||||
|
|
||||||
static object *
|
static object * posix_error() { return err_errno(PosixError);
|
||||||
posix_error()
|
|
||||||
{
|
|
||||||
return err_errno(PosixError);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -207,7 +204,6 @@ posix_do_stat(self, args, statfunc)
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char *path;
|
char *path;
|
||||||
object *v;
|
|
||||||
int res;
|
int res;
|
||||||
if (!getstrarg(args, &path))
|
if (!getstrarg(args, &path))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -216,7 +212,7 @@ posix_do_stat(self, args, statfunc)
|
||||||
END_SAVE
|
END_SAVE
|
||||||
if (res != 0)
|
if (res != 0)
|
||||||
return posix_error();
|
return posix_error();
|
||||||
v = mkvalue("(llllllllll)",
|
return mkvalue("(llllllllll)",
|
||||||
(long)st.st_mode,
|
(long)st.st_mode,
|
||||||
(long)st.st_ino,
|
(long)st.st_ino,
|
||||||
(long)st.st_dev,
|
(long)st.st_dev,
|
||||||
|
|
@ -664,7 +660,7 @@ posix_setpgrp(self, args)
|
||||||
#else
|
#else
|
||||||
if (setpgrp(0, 0) < 0)
|
if (setpgrp(0, 0) < 0)
|
||||||
#endif
|
#endif
|
||||||
return err_errno(PosixError);
|
return posix_error();
|
||||||
INCREF(None);
|
INCREF(None);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
@ -823,10 +819,8 @@ posix_times(self, args)
|
||||||
return NULL;
|
return NULL;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
c = times(&t);
|
c = times(&t);
|
||||||
if (c == (clock_t) -1) {
|
if (c == (clock_t) -1)
|
||||||
err_errno(PosixError);
|
return posix_error();
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return mkvalue("dddd",
|
return mkvalue("dddd",
|
||||||
(double)t.tms_utime / HZ,
|
(double)t.tms_utime / HZ,
|
||||||
(double)t.tms_stime / HZ,
|
(double)t.tms_stime / HZ,
|
||||||
|
|
@ -845,10 +839,8 @@ posix_setsid(self, args)
|
||||||
{
|
{
|
||||||
if (!getnoarg(args))
|
if (!getnoarg(args))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (setsid() < 0) {
|
if (setsid() < 0)
|
||||||
err_errno(PosixError);
|
return posix_error();
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
INCREF(None);
|
INCREF(None);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
@ -861,10 +853,8 @@ posix_setpgid(self, args)
|
||||||
int pid, pgrp;
|
int pid, pgrp;
|
||||||
if (!getargs(args, "(ii)", &pid, &pgrp))
|
if (!getargs(args, "(ii)", &pid, &pgrp))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (setpgid(pid, pgrp) < 0) {
|
if (setpgid(pid, pgrp) < 0)
|
||||||
err_errno(PosixError);
|
return posix_error();
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
INCREF(None);
|
INCREF(None);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
@ -878,10 +868,8 @@ posix_tcgetpgrp(self, args)
|
||||||
if (!getargs(args, "i", &fd))
|
if (!getargs(args, "i", &fd))
|
||||||
return NULL;
|
return NULL;
|
||||||
pgid = tcgetpgrp(fd);
|
pgid = tcgetpgrp(fd);
|
||||||
if (pgid < 0) {
|
if (pgid < 0)
|
||||||
err_errno(PosixError);
|
return posix_error();
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return newintobject((long)pgid);
|
return newintobject((long)pgid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -893,16 +881,221 @@ posix_tcsetpgrp(self, args)
|
||||||
int fd, pgid;
|
int fd, pgid;
|
||||||
if (!getargs(args, "(ii)", &fd, &pgid))
|
if (!getargs(args, "(ii)", &fd, &pgid))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (tcsetpgrp(fd, pgid) < 0) {
|
if (tcsetpgrp(fd, pgid) < 0)
|
||||||
err_errno(PosixError);
|
return posix_error();
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
INCREF(None);
|
INCREF(None);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* DO_PG */
|
#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[] = {
|
static struct methodlist posix_methods[] = {
|
||||||
{"chdir", posix_chdir},
|
{"chdir", posix_chdir},
|
||||||
|
|
@ -960,6 +1153,19 @@ static struct methodlist posix_methods[] = {
|
||||||
{"tcsetpgrp", posix_tcsetpgrp},
|
{"tcsetpgrp", posix_tcsetpgrp},
|
||||||
#endif
|
#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 */
|
{NULL, NULL} /* Sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue