Index: configure.ac
===================================================================
RCS file: /cvsroot/classpath/classpath/configure.ac,v
retrieving revision 1.92
diff -u -B -b -r1.92 configure.ac
--- configure.ac	4 Jul 2005 14:31:00 -0000	1.92
+++ configure.ac	10 Jul 2005 20:08:06 -0000
@@ -174,7 +174,8 @@
 		    inttypes.h stdint.h utime.h sys/utime.h sys/filio.h \
 		    sys/time.h \
 		    sys/select.h \
-		    crt_externs.h])
+		    crt_externs.h \
+                    fcntl.h])
 
   AC_EGREP_HEADER(uint32_t, stdint.h, AC_DEFINE(HAVE_INT32_DEFINED, 1, [Define to 1 if you have uint32_t]))
   AC_EGREP_HEADER(uint32_t, inttypes.h, AC_DEFINE(HAVE_INT32_DEFINED, 1, [Define to 1 if you have uint32_t]))
@@ -187,7 +188,8 @@
 		  getsockname getpeername bind listen accept \
 		  recvfrom send sendto setsockopt getsockopt time mktime \
 		  localtime_r \
-		  strerror_r])
+		  strerror_r \
+                  fcntl])
 
   AC_HEADER_TIME
   AC_STRUCT_TM
Index: native/jni/java-nio/gnu_java_nio_channels_FileChannelImpl.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/java-nio/gnu_java_nio_channels_FileChannelImpl.c,v
retrieving revision 1.16
diff -u -B -b -r1.16 gnu_java_nio_channels_FileChannelImpl.c
--- native/jni/java-nio/gnu_java_nio_channels_FileChannelImpl.c	2 Jul 2005 20:32:55 -0000	1.16
+++ native/jni/java-nio/gnu_java_nio_channels_FileChannelImpl.c	10 Jul 2005 20:08:08 -0000
@@ -1,5 +1,5 @@
 /* gnu_java_nio_channels_FileChannelImpl.c -
-   Copyright (C) 2003, 2004  Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -52,6 +52,10 @@
 
 #include "gnu_java_nio_channels_FileChannelImpl.h"
 
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif /* HAVE_FCNTL_H */
+
 /* These values must be kept in sync with FileChannelImpl.java.  */
 #define FILECHANNELIMPL_READ   1
 #define FILECHANNELIMPL_WRITE  2
@@ -686,28 +690,72 @@
 }
 
 JNIEXPORT jboolean JNICALL
-Java_gnu_java_nio_channels_FileChannelImpl_lock (JNIEnv * env,
-						 jobject obj
-						 __attribute__ ((__unused__)),
-						 jlong position
-						 __attribute__ ((__unused__)),
-						 jlong size
-						 __attribute__ ((__unused__)),
-						 jboolean shared
-						 __attribute__ ((__unused__)),
-						 jboolean wait
-						 __attribute__ ((__unused__)))
-{
-  JCL_ThrowException (env, IO_EXCEPTION,
-		      "java.nio.FileChannelImpl.lock(): not implemented");
-  return 0;
+Java_gnu_java_nio_channels_FileChannelImpl_lock (JNIEnv *env, jobject obj,
+                                                 jlong position, jlong size,
+                                                 jboolean shared, jboolean wait)
+{
+#ifdef HAVE_FCNTL
+  int fd = get_native_fd (env, obj);
+  int cmd = wait ? F_SETLKW : F_SETLK;
+  struct flock flock;
+  int ret;
+
+  flock.l_type = shared ? F_RDLCK : F_WRLCK;
+  flock.l_whence = SEEK_SET;
+  flock.l_start = (off_t) position;
+  flock.l_len = (off_t) size;
+
+  ret = fcntl (fd, cmd, &flock);
+  if (ret)
+    {
+      /* Linux man pages for fcntl state that errno might be either
+         EACCES or EAGAIN if we try F_SETLK, and another process has
+         an overlapping lock. */
+      if (errno != EACCES && errno != EAGAIN)
+        {
+          JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+        }
+      return JNI_FALSE;
+    }
+  return JNI_TRUE;
+#else
+  (void) obj;
+  (void) position;
+  (void) size;
+  (void) shared;
+  (void) wait;
+  JCL_ThrowException (env, "java/lang/UnsupportedOperationException",
+                      "file locks not implemented on this platform");
+  return JNI_FALSE;
+#endif /* HAVE_FCNTL */
 }
 
 JNIEXPORT void JNICALL
-Java_gnu_java_nio_channels_FileChannelImpl_unlock (JNIEnv * env,
-						   jobject obj
-						   __attribute__ ((__unused__)), jlong position __attribute__ ((__unused__)), jlong length __attribute__ ((__unused__)))
+Java_gnu_java_nio_channels_FileChannelImpl_unlock (JNIEnv *env,
+                                                   jobject obj,
+                                                   jlong position,
+                                                   jlong length)
 {
-  JCL_ThrowException (env, IO_EXCEPTION,
-		      "java.nio.FileChannelImpl.unlock(): not implemented");
+#ifdef HAVE_FCNTL
+  int fd = get_native_fd (env, obj);
+  struct flock flock;
+  int ret;
+
+  flock.l_type = F_UNLCK;
+  flock.l_whence = SEEK_SET;
+  flock.l_start = (off_t) position;
+  flock.l_len = (off_t) length;
+
+  ret = fcntl (fd, F_SETLK, &flock);
+  if (ret)
+    {
+      JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
+    }
+#else
+  (void) obj;
+  (void) position;
+  (void) length;
+  JCL_ThrowException (env, "java/lang/UnsupportedOperationException",
+                      "file locks not implemented on this platform");
+#endif /* HAVE_FCNTL */
 }
