diff options
author | Guido van Rossum <guido@python.org> | 1992-08-17 08:55:12 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1992-08-17 08:55:12 (GMT) |
commit | 0297512a08698cdee4bebe044a40b08b406398a8 (patch) | |
tree | 52ceb535f0f2b4068f1a5ce1f17c199477437b67 /Modules/fcntlmodule.c | |
parent | 94390a4eaf48c3ddf91cdbf78fcf5db7b57972ec (diff) | |
download | cpython-0297512a08698cdee4bebe044a40b08b406398a8.zip cpython-0297512a08698cdee4bebe044a40b08b406398a8.tar.gz cpython-0297512a08698cdee4bebe044a40b08b406398a8.tar.bz2 |
struct: pack/unpack binary structs; fcntl: fcntl(), ioctl().
Diffstat (limited to 'Modules/fcntlmodule.c')
-rw-r--r-- | Modules/fcntlmodule.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c new file mode 100644 index 0000000..d4d48f8 --- /dev/null +++ b/Modules/fcntlmodule.c @@ -0,0 +1,146 @@ +/*********************************************************** +Copyright 1991, 1992 by Stichting Mathematisch Centrum, 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. + +******************************************************************/ + +/* fcntl module */ + +#include "allobjects.h" +#include "modsupport.h" + + +/* fcntl(fd, opt, [arg]) */ + +static object * +fcntl_fcntl(self, args) + object *self; /* Not used */ + object *args; +{ + int fd; + int code; + int arg; + int ret; + char *str; + int len; + char buf[1024]; + + if (getargs(args, "(iis#)", &fd, &code, &str, &len)) { + if (len > sizeof buf) { + err_setstr(ValueError, "fcntl string arg too long"); + return NULL; + } + memcpy(buf, str, len); + if (fcntl(fd, code, buf) < 0) { + err_errno(IOError); + return NULL; + } + return newsizedstringobject(buf, len); + } + + err_clear(); + if (getargs(args, "(ii)", &fd, &code)) + arg = 0; + else { + err_clear(); + if (!getargs(args, "(iii)", &fd, &code, &arg)) + return NULL; + } + ret = fcntl(fd, code, arg); + if (ret < 0) { + err_errno(IOError); + return NULL; + } + return newintobject((long)ret); +} + + +/* ioctl(fd, opt, [arg]) */ + +static object * +fcntl_ioctl(self, args) + object *self; /* Not used */ + object *args; +{ + int fd; + int code; + int arg; + int ret; + char *str; + int len; + char buf[1024]; + + if (getargs(args, "(iis#)", &fd, &code, &str, &len)) { + if (len > sizeof buf) { + err_setstr(ValueError, "ioctl string arg too long"); + return NULL; + } + memcpy(buf, str, len); + if (ioctl(fd, code, buf) < 0) { + err_errno(IOError); + return NULL; + } + return newsizedstringobject(buf, len); + } + + err_clear(); + if (getargs(args, "(ii)", &fd, &code)) + arg = 0; + else { + err_clear(); + if (!getargs(args, "(iii)", &fd, &code, &arg)) + return NULL; + } + ret = ioctl(fd, code, arg); + if (ret < 0) { + err_errno(IOError); + return NULL; + } + return newintobject((long)ret); +} + + +/* List of functions */ + +static struct methodlist fcntl_methods[] = { + {"fcntl", fcntl_fcntl}, + {"ioctl", fcntl_ioctl}, + {NULL, NULL} /* sentinel */ +}; + + +/* Module initialisation */ + +void +initfcntl() +{ + object *m, *d; + + /* Create the module and add the functions */ + m = initmodule("fcntl", fcntl_methods); + + /* Add some symbolic constants to the module */ + d = getmoduledict(m); + + /* Check for errors */ + if (err_occurred()) + fatal("can't initialize module fcntl"); +} |