Added lockf() call
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c
index c547ed0..fd7b30c 100644
--- a/Modules/fcntlmodule.c
+++ b/Modules/fcntlmodule.c
@@ -181,7 +181,51 @@
 	return None;
 }
 
+/* lockf(fd, operation) */
+static object *
+fcntl_lockf(self, args)
+	object *self; /* Not used */
+	object *args;
+{
+	int fd, code, len = 0, start = 0, whence = 0, ret;
+	FILE *f;
 
+	if (!PyArg_ParseTuple(args, "ii|iii", &fd, &code, &len, 
+			       &start, &whence))
+	    return NULL;
+
+	BGN_SAVE
+#ifndef LOCK_SH
+#define LOCK_SH		1	/* shared lock */
+#define LOCK_EX		2	/* exclusive lock */
+#define LOCK_NB		4	/* don't block when locking */
+#define LOCK_UN		8	/* unlock */
+#endif
+	{
+		struct flock l;
+		if (code == LOCK_UN)
+			l.l_type = F_UNLCK;
+		else if (code & LOCK_SH)
+			l.l_type = F_RDLCK;
+		else if (code & LOCK_EX)
+			l.l_type = F_WRLCK;
+		else {
+			err_setstr(ValueError, "unrecognized flock argument");
+			return NULL;
+		}
+		l.l_len = len;
+		l.l_start = start;
+		l.l_whence = whence;
+		ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
+	}
+	END_SAVE
+	if (ret < 0) {
+		err_errno(IOError);
+		return NULL;
+	}
+	INCREF(None);
+	return None;
+}
 
 /* List of functions */
 
@@ -189,6 +233,7 @@
 	{"fcntl",	fcntl_fcntl},
 	{"ioctl",	fcntl_ioctl},
 	{"flock",	fcntl_flock},
+	{"lockf",       fcntl_lockf, 1},
 	{NULL,		NULL}		/* sentinel */
 };