public inbox for java-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [classpath-095-merge-branch] implement java.io.File methods
@ 2007-05-17 21:24 Matthias Klose
  2007-05-21 18:22 ` Tom Tromey
  0 siblings, 1 reply; 4+ messages in thread
From: Matthias Klose @ 2007-05-17 21:24 UTC (permalink / raw)
  To: Java Patch List

[-- Attachment #1: Type: text/plain, Size: 546 bytes --]

This patch implements the native support for new methods in java.io.File.
Checked in to the classpath-095-merge-branch.

Missing are the native changes for natFileWin32.cc (only natFilePosix.cc done).

2007-05-17  Matthias Klose  <doko@ubuntu.com>

        * java/io/File.java: Merge with classpath-0.95, new method
        setFilePermissions, new attribute EXEC.
        * java/io/natFilePosix.cc (setFilePermissions): New.
        _access: Handle EXEC query.
        * classpath/lib/java/io/File.class, java/io/File.h: Regenerate.


  Matthias

[-- Attachment #2: cp-file-merge.diff --]
[-- Type: text/plain, Size: 10283 bytes --]

2007-05-17  Matthias Klose  <doko@ubuntu.com>

	* java/io/File.java: Merge with classpath-0.95, new method
	setFilePermissions, new attribute EXEC.
	* java/io/natFilePosix.cc (setFilePermissions): New.
	_access: Handle EXEC query.
	* classpath/lib/java/io/File.class, java/io/File.h: Regenerate.
 
Index: java/io/File.java
===================================================================
--- java/io/File.java	(revision 124801)
+++ java/io/File.java	(working copy)
@@ -67,6 +67,7 @@
   private final static int READ = 0;
   private final static int WRITE = 1;
   private final static int EXISTS = 2;
+  private final static int EXEC = 3;
 
   // QUERY arguments to stat function.
   private final static int DIRECTORY = 0;
@@ -182,6 +183,27 @@
     return _access (WRITE);
   }
   
+  /**
+   * This method tests whether or not the current thread is allowed to
+   * to execute the file pointed to by this object. This will be true if and
+   * and only if 1) the file exists and 2) the <code>SecurityManager</code>
+   * (if any) allows access to the file via it's <code>checkExec</code>
+   * method 3) the file is executable.
+   *
+   * @return <code>true</code> if execution is allowed, 
+   * <code>false</code> otherwise
+   *
+   * @exception SecurityException If the <code>SecurityManager</code> 
+   * does not allow access to the file
+   */
+  public boolean canExecute()
+  {
+    if (!exists())
+      return false;
+    checkExec();
+    return _access (EXEC);
+  }
+
   private native boolean performCreate() throws IOException;
 
   /**
@@ -1139,6 +1161,159 @@
   }
 
   /*
+   * This native method sets file permissions.
+   */
+  private native boolean setFilePermissions(boolean enable, boolean ownerOnly,
+					    int permissions);
+
+  /**
+   * This method sets the owner's read permission for the File represented by
+   * this object.
+   * 
+   * It is the same as calling <code>setReadable(readable, true)</code>.
+   * 
+   * @param <code>readable</code> <code>true</code> to set read permission,
+   * <code>false</code> to unset the read permission.
+   * @return <code>true</code> if the file permissions are changed,
+   * <code>false</code> otherwise.
+   * @exception SecurityException If write access of the file is not permitted.
+   * @see #setReadable(boolean, boolean)
+   * @since 1.6
+   */
+  public boolean setReadable(boolean readable)
+  {
+    return setReadable(readable, true);
+  }
+  
+  /**
+   * This method sets the read permissions for the File represented by
+   * this object.
+   * 
+   * If <code>ownerOnly</code> is set to <code>true</code> then only the
+   * read permission bit for the owner of the file is changed.
+   * 
+   * If <code>ownerOnly</code> is set to <code>false</code>, the file
+   * permissions are changed so that the file can be read by everyone.
+   * 
+   * On unix like systems this sets the <code>user</code>, <code>group</code>
+   * and <code>other</code> read bits and is equal to call
+   * <code>chmod a+r</code> on the file.
+   * 
+   * @param <code>readable</code> <code>true</code> to set read permission,
+   * <code>false</code> to unset the read permission.
+   * @param <code>ownerOnly</code> <code>true</code> to set read permission
+   * for owner only, <code>false</code> for all.
+   * @return <code>true</code> if the file permissions are changed,
+   * <code>false</code> otherwise.
+   * @exception SecurityException If write access of the file is not permitted.
+   * @see #setReadable(boolean)
+   * @since 1.6
+   */
+  public boolean setReadable(boolean readable, boolean ownerOnly)
+  {
+    checkWrite();
+    return setFilePermissions(readable, ownerOnly, READ);
+  }
+  
+  /**
+   * This method sets the owner's write permission for the File represented by
+   * this object.
+   * 
+   * It is the same as calling <code>setWritable(readable, true)</code>. 
+   * 
+   * @param <code>writable</code> <code>true</code> to set write permission,
+   * <code>false</code> to unset write permission.
+   * @return <code>true</code> if the file permissions are changed,
+   * <code>false</code> otherwise.
+   * @exception SecurityException If write access of the file is not permitted.
+   * @see #setWritable(boolean, boolean)
+   * @since 1.6
+   */
+  public boolean setWritable(boolean writable)
+  {
+    return setWritable(writable, true);
+  }
+  
+  /**
+   * This method sets the write permissions for the File represented by
+   * this object.
+   * 
+   * If <code>ownerOnly</code> is set to <code>true</code> then only the
+   * write permission bit for the owner of the file is changed.
+   * 
+   * If <code>ownerOnly</code> is set to <code>false</code>, the file
+   * permissions are changed so that the file can be written by everyone.
+   * 
+   * On unix like systems this set the <code>user</code>, <code>group</code>
+   * and <code>other</code> write bits and is equal to call
+   * <code>chmod a+w</code> on the file.
+   * 
+   * @param <code>writable</code> <code>true</code> to set write permission,
+   * <code>false</code> to unset write permission.
+   * @param <code>ownerOnly</code> <code>true</code> to set write permission
+   * for owner only, <code>false</code> for all. 
+   * @return <code>true</code> if the file permissions are changed,
+   * <code>false</code> otherwise.
+   * @exception SecurityException If write access of the file is not permitted.
+   * @see #setWritable(boolean)
+   * @since 1.6
+   */
+  public boolean setWritable(boolean writable, boolean ownerOnly)
+  {
+    checkWrite();
+    return setFilePermissions(writable, ownerOnly, WRITE);
+  }
+  
+  /**
+   * This method sets the owner's execute permission for the File represented
+   * by this object.
+   * 
+   * It is the same as calling <code>setExecutable(readable, true)</code>. 
+   * 
+   * @param <code>executable</code> <code>true</code> to set execute permission,
+   * <code>false</code> to unset execute permission.
+   * @return <code>true</code> if the file permissions are changed,
+   * <code>false</code> otherwise.
+   * @exception SecurityException If write access of the file is not permitted.
+   * @see #setExecutable(boolean, boolean)
+   * @since 1.6
+   */
+  public boolean setExecutable(boolean executable) 
+  {
+    return setExecutable(executable, true);
+  }
+  
+  /**
+   * This method sets the execute permissions for the File represented by
+   * this object.
+   * 
+   * If <code>ownerOnly</code> is set to <code>true</code> then only the
+   * execute permission bit for the owner of the file is changed.
+   * 
+   * If <code>ownerOnly</code> is set to <code>false</code>, the file
+   * permissions are changed so that the file can be executed by everyone.
+   * 
+   * On unix like systems this set the <code>user</code>, <code>group</code>
+   * and <code>other</code> write bits and is equal to call
+   * <code>chmod a+x</code> on the file.
+   * 
+   * @param <code>executable</code> <code>true</code> to set write permission,
+   * <code>false</code> to unset write permission.
+   * @param <code>ownerOnly</code> <code>true</code> to set write permission
+   * for owner only, <code>false</code> for all. 
+   * @return <code>true</code> if the file permissions are changed,
+   * <code>false</code> otherwise.
+   * @exception SecurityException If write access of the file is not permitted.
+   * @see #setExecutable(boolean)
+   * @since 1.6
+   */
+  public boolean setExecutable(boolean executable, boolean ownerOnly)
+  {
+    checkWrite();
+    return setFilePermissions(executable, ownerOnly, EXEC);
+  }
+
+  /*
    * This native method sets the permissions to make the file read only.
    */
   private native boolean performSetReadOnly();
@@ -1372,6 +1547,15 @@
       s.checkRead(path);
   }
 
+  private void checkExec()
+  {
+    // Check the SecurityManager
+    SecurityManager s = System.getSecurityManager();
+    
+    if (s != null)
+      s.checkExec(path);
+  }
+
   /** 
    * Calling this method requests that the file represented by this object
    * be deleted when the virtual machine exits.  Note that this request cannot
Index: java/io/natFilePosix.cc
===================================================================
--- java/io/natFilePosix.cc	(revision 124801)
+++ java/io/natFilePosix.cc	(working copy)
@@ -43,15 +43,18 @@
   char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1);
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
-  JvAssert (query == READ || query == WRITE || query == EXISTS);
+  JvAssert (query == READ || query == WRITE || query == EXISTS
+	    || query == EXEC);
 #ifdef HAVE_ACCESS
   int mode;
   if (query == READ)
     mode = R_OK;
   else if (query == WRITE)
     mode = W_OK;
+  else if (query == EXISTS)
+    mode = F_OK;
   else
-    mode = F_OK;
+    mode = X_OK;
   return ::access (buf, mode) == 0;
 #else
   return false;
@@ -344,6 +347,54 @@
 }
 
 jboolean
+java::io::File::setFilePermissions (jboolean enable,
+				    jboolean ownerOnly,
+				    jint permissions)
+{
+  char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1);
+  jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
+  buf[total] = '\0';
+  JvAssert (permissions == READ || permissions == WRITE || permissions == EXEC);
+#if defined (HAVE_STAT) && defined (HAVE_CHMOD)
+  mode_t mode = 0;
+
+  struct stat sb;
+  if (::stat (buf, &sb))
+    return false;
+
+  if (ownerOnly)
+    {
+      if (permissions == READ)
+        mode |= S_IRUSR;
+      else if (permissions == WRITE)
+        mode |= S_IWUSR;
+      else if (permissions == EXEC)
+        mode |= S_IXUSR;
+    }
+  else
+    {
+      if (permissions == READ)
+        mode |= (S_IRUSR | S_IRGRP | S_IROTH);
+      else if (permissions == WRITE)
+        mode |= (S_IWUSR | S_IWGRP | S_IWOTH);
+      else if (permissions == EXEC)
+        mode |= (S_IXUSR | S_IXGRP | S_IXOTH);
+    }
+  
+  if (enable)
+    mode = sb.st_mode | mode;
+  else
+    mode = sb.st_mode & ~mode;
+  
+  if (::chmod(buf, mode) < 0)
+    return false;
+  return true;
+#else
+  return false;
+#endif
+}
+
+jboolean
 java::io::File::performSetReadOnly (void)
 {
   char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1);

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [classpath-095-merge-branch] implement java.io.File methods
  2007-05-17 21:24 [classpath-095-merge-branch] implement java.io.File methods Matthias Klose
@ 2007-05-21 18:22 ` Tom Tromey
  2007-05-24  7:09   ` Matthias Klose
  0 siblings, 1 reply; 4+ messages in thread
From: Tom Tromey @ 2007-05-21 18:22 UTC (permalink / raw)
  To: Matthias Klose; +Cc: Java Patch List

>>>>> "Matthias" == Matthias Klose <doko@ubuntu.com> writes:

Matthias> This patch implements the native support for new methods in
Matthias> java.io.File.  Checked in to the classpath-095-merge-branch.

Matthias> Missing are the native changes for natFileWin32.cc (only
Matthias> natFilePosix.cc done).

Maybe you could add stubs to the other File implementations that throw
an exception, just so we can keep them linking for the time being.
Mohan, could you try a patch if Matthias (or someone :) wrote one?  Or
would you prefer it if the work simply went in on trunk, temporarily
breaking the Windows build?

Tom

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [classpath-095-merge-branch] implement java.io.File methods
  2007-05-21 18:22 ` Tom Tromey
@ 2007-05-24  7:09   ` Matthias Klose
  2007-05-24 15:50     ` Tom Tromey
  0 siblings, 1 reply; 4+ messages in thread
From: Matthias Klose @ 2007-05-24  7:09 UTC (permalink / raw)
  To: tromey; +Cc: Java Patch List, Mohan Embar

[-- Attachment #1: Type: text/plain, Size: 770 bytes --]

Tom Tromey schrieb:
>>>>>> "Matthias" == Matthias Klose <doko@ubuntu.com> writes:
> 
> Matthias> This patch implements the native support for new methods in
> Matthias> java.io.File.  Checked in to the classpath-095-merge-branch.
> 
> Matthias> Missing are the native changes for natFileWin32.cc (only
> Matthias> natFilePosix.cc done).
> 
> Maybe you could add stubs to the other File implementations that throw
> an exception, just so we can keep them linking for the time being.
> Mohan, could you try a patch if Matthias (or someone :) wrote one?  Or
> would you prefer it if the work simply went in on trunk, temporarily
> breaking the Windows build?

Checked in the following dummy implementations on the merge branch, so the build
should not break.

  Matthias



[-- Attachment #2: natFileWin32.diff --]
[-- Type: text/plain, Size: 1565 bytes --]

2007-05-24  Matthias Klose  <doko@ubuntu.com>

	* java/io/natFileWin32.cc (setFilePermissions): New (stub only).
	_access: Handle EXEC query, stub only.
 
Index: java/io/natFileWin32.cc
===================================================================
--- java/io/natFileWin32.cc	(revision 124801)
+++ java/io/natFileWin32.cc	(working copy)
@@ -44,13 +44,17 @@
   if (!canon)
     return false;
 
-  JvAssert (query == READ || query == WRITE || query == EXISTS);
+  JvAssert (query == READ || query == WRITE || query == EXISTS
+	    || query == EXEC);
 
   // FIXME: Is it possible to differentiate between existing and reading?
   // If the file exists but cannot be read because of the secuirty attributes
   // on an NTFS disk this wont work (it reports it can be read but cant)
   // Could we use something from the security API?
   DWORD attributes = GetFileAttributes (canon);
+  // FIXME: handle EXEC
+  if (query == EXEC)
+    return false;
   if ((query == EXISTS) || (query == READ))
     return (attributes == 0xffffffff) ? false : true;
   else
@@ -212,6 +216,25 @@
 }
 
 jboolean
+java::io::File::setFilePermissions (jboolean enable,
+				    jboolean ownerOnly,
+				    jint permissions)
+{
+  JV_TEMP_STRING_WIN32 (canon, getCanonicalPath());
+  if (!canon)
+    return false;
+
+  DWORD attrs = GetFileAttributes (canon);
+  if (attrs != INVALID_FILE_ATTRIBUTES)
+    {
+      // FIXME: implement
+      return false;
+    }
+  else
+    return false;
+}
+
+jboolean
 java::io::File::performMkdir (void)
 {
   JV_TEMP_STRING_WIN32 (cpath, path);

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [classpath-095-merge-branch] implement java.io.File methods
  2007-05-24  7:09   ` Matthias Klose
@ 2007-05-24 15:50     ` Tom Tromey
  0 siblings, 0 replies; 4+ messages in thread
From: Tom Tromey @ 2007-05-24 15:50 UTC (permalink / raw)
  To: Matthias Klose; +Cc: Java Patch List, Mohan Embar

>>>>> "Matthias" == Matthias Klose <doko@ubuntu.com> writes:

Matthias> Checked in the following dummy implementations on the merge
Matthias> branch, so the build should not break.

Thanks Matthias.

I can't think of anything that would block this from the trunk.
I say, give folks a couple days to object, then go ahead with the
merge.

Tom

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2007-05-24 15:50 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-05-17 21:24 [classpath-095-merge-branch] implement java.io.File methods Matthias Klose
2007-05-21 18:22 ` Tom Tromey
2007-05-24  7:09   ` Matthias Klose
2007-05-24 15:50     ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).