summaryrefslogtreecommitdiffstats
path: root/Modules/fcntlmodule.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1992-08-17 08:55:12 (GMT)
committerGuido van Rossum <guido@python.org>1992-08-17 08:55:12 (GMT)
commit0297512a08698cdee4bebe044a40b08b406398a8 (patch)
tree52ceb535f0f2b4068f1a5ce1f17c199477437b67 /Modules/fcntlmodule.c
parent94390a4eaf48c3ddf91cdbf78fcf5db7b57972ec (diff)
downloadcpython-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.c146
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");
+}