mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			1215 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			1215 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C
		
	
	
	
| /* java_io_VMFile.c - Native methods for java.io.File class
 | |
|    Copyright (C) 1998, 2004, 2006 Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
|  
 | |
| GNU Classpath is distributed in the hope that it will be useful, but
 | |
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| /* do not move; needed here because of some macro definitions */
 | |
| #include <config.h>
 | |
| 
 | |
| #include <assert.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| #if defined (HAVE_LSTAT) && defined (HAVE_READLINK)
 | |
| #include <sys/types.h>
 | |
| #include <sys/stat.h>
 | |
| #include <unistd.h>
 | |
| #endif
 | |
| 
 | |
| #include <jni.h>
 | |
| #include <jcl.h>
 | |
| #include "cpio.h"
 | |
| #include "cpnative.h"
 | |
| 
 | |
| #include "java_io_VMFile.h"
 | |
| 
 | |
| /* ***** PRIVATE FUNCTIONS DELCARATION ***** */
 | |
| 
 | |
| /**
 | |
|  * Enables of disables the passed permission bit of a file.
 | |
|  */
 | |
| static jboolean set_file_permissions (JNIEnv *env, jstring name,
 | |
|                                       jboolean enable,
 | |
|                                       jboolean ownerOnly,
 | |
|                                       int permissions);
 | |
| 
 | |
| /* ***** END: PRIVATE FUNCTIONS DELCARATION ***** */
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * Method to create an empty file.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    create
 | |
|  * Signature: (Ljava/lang/String;)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_create (JNIEnv * env,
 | |
| 			    jclass clazz __attribute__ ((__unused__)),
 | |
| 			    jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int fd;
 | |
|   int result;
 | |
| 
 | |
|   filename = JCL_jstring_to_cstring (env, name);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   result = cpio_openFile (filename, &fd, CPFILE_FLAG_CREATE|CPFILE_FLAG_WRITE, CPFILE_PERMISSION_NORMAL);
 | |
|   if (result != CPNATIVE_OK)
 | |
|     {
 | |
|       if (result != EEXIST)
 | |
|         JCL_ThrowException (env,
 | |
| 			    "java/io/IOException",
 | |
| 			    cpnative_getErrorString (result));
 | |
|       JCL_free_cstring (env, name, filename);
 | |
|       return 0;
 | |
|     }
 | |
|   cpio_closeFile (fd);
 | |
| 
 | |
|   JCL_free_cstring (env, name, filename);
 | |
|   return 1;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method checks to see if we have read permission on a file.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    canRead
 | |
|  * Signature: (Ljava/lang/String;)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_canRead (JNIEnv * env,
 | |
|                              jclass clazz __attribute__ ((__unused__)),
 | |
|                              jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int result;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return JNI_FALSE;
 | |
|     }
 | |
| 
 | |
|   result = cpio_checkAccess (filename, CPFILE_FLAG_READ);
 | |
|   
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
|   if (result != CPNATIVE_OK)
 | |
|     return JNI_FALSE;
 | |
| 
 | |
|   return JNI_TRUE;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return JNI_FALSE;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method checks to see if we have write permission on a file.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    canWrite
 | |
|  * Signature: (Ljava/lang/String;)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_canWrite (JNIEnv * env,
 | |
|                               jclass clazz __attribute__ ((__unused__)),
 | |
|                               jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int result;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return JNI_FALSE;
 | |
|     }
 | |
| 
 | |
|   result = cpio_checkAccess (filename, CPFILE_FLAG_WRITE);
 | |
|   
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
|   if (result != CPNATIVE_OK)
 | |
|     {
 | |
|       return JNI_FALSE;
 | |
|     }
 | |
| 
 | |
|   return JNI_TRUE;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return JNI_FALSE;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_canWriteDirectory (JNIEnv *env, jclass clazz, jstring path)
 | |
| {
 | |
|   /* this is only valid on *nix systems  */
 | |
|   return Java_java_io_VMFile_canWrite(env, clazz, path);
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method checks to see if we have execute permission on a file.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    canExecute
 | |
|  * Signature: (Ljava/lang/String;)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_canExecute (JNIEnv * env,
 | |
|                                 jclass clazz __attribute__ ((__unused__)),
 | |
|                                 jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int result;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return JNI_FALSE;
 | |
|     }
 | |
| 
 | |
|   result = cpio_checkAccess (filename, CPFILE_FLAG_EXEC);
 | |
|   
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
|   if (result != CPNATIVE_OK)
 | |
|     return JNI_FALSE;
 | |
|   
 | |
|   return JNI_TRUE;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return JNI_FALSE;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method makes a file read only.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    setReadOnly
 | |
|  * Signature: (Ljava/lang/String;)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_setReadOnly (JNIEnv * env,
 | |
|                                  jclass clazz __attribute__ ((__unused__)),
 | |
|                                  jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int result;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   result = cpio_setFileReadonly (filename);
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
| 
 | |
|   return result == CPNATIVE_OK ? 1 : 0;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method changes the read permission bit of a file.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    setReadable
 | |
|  * Signature: (Ljava/lang/String;ZZ)Z
 | |
|  */
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_setReadable (JNIEnv *env,
 | |
|                                  jclass clazz __attribute__ ((__unused__)),
 | |
|                                  jstring name,
 | |
|                                  jboolean readable,
 | |
|                                  jboolean ownerOnly)
 | |
| {
 | |
|   return set_file_permissions (env, name, readable, ownerOnly,
 | |
|                                CPFILE_FLAG_READ);
 | |
| }
 | |
| 
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method changes the write permission bit of a file.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    setWritable
 | |
|  * Signature: (Ljava/lang/String;ZZ)Z
 | |
|  */
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_setWritable (JNIEnv *env,
 | |
|                                  jclass clazz __attribute__ ((__unused__)),
 | |
|                                  jstring name,
 | |
|                                  jboolean writable,
 | |
|                                  jboolean ownerOnly)
 | |
| {
 | |
|   return set_file_permissions (env, name, writable, ownerOnly,
 | |
|                                CPFILE_FLAG_WRITE);
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method changes the execute permission bit of a file.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    setExecutable
 | |
|  * Signature: (Ljava/lang/String;ZZ)Z
 | |
|  */
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_setExecutable (JNIEnv *env,
 | |
|                                    jclass clazz __attribute__ ((__unused__)),
 | |
|                                    jstring name,
 | |
|                                    jboolean executable,
 | |
|                                    jboolean ownerOnly)
 | |
| {
 | |
|   return set_file_permissions (env, name, executable, ownerOnly,
 | |
|                                CPFILE_FLAG_EXEC);
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| JNIEXPORT jlong JNICALL
 | |
| Java_java_io_VMFile_getTotalSpace (JNIEnv *env,
 | |
|                                    jclass clazz __attribute__ ((__unused__)),
 | |
|                                    jstring path)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   
 | |
|   jlong result;
 | |
|   const char *_path = NULL;
 | |
|   
 | |
|   _path = (*env)->GetStringUTFChars (env, path, 0);
 | |
|   if (_path == NULL)
 | |
|     {
 | |
|       return 0L;
 | |
|     }
 | |
| 
 | |
|   result = cpio_df (_path, TOTAL);
 | |
| 
 | |
|   (*env)->ReleaseStringUTFChars (env, path, _path);
 | |
| 
 | |
|   return result;
 | |
| 
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0L;
 | |
| #endif /* not WITHOUT_FILESYSTEM */  
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| JNIEXPORT jlong JNICALL
 | |
| Java_java_io_VMFile_getFreeSpace (JNIEnv *env,
 | |
|                                   jclass clazz __attribute__ ((__unused__)),
 | |
|                                   jstring path)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   
 | |
|   jlong result;
 | |
|   const char *_path = NULL;
 | |
|   
 | |
|   _path = (*env)->GetStringUTFChars (env, path, 0);
 | |
|   if (_path == NULL)
 | |
|     {
 | |
|       return 0L;
 | |
|     }
 | |
| 
 | |
|   result = cpio_df (_path, FREE);
 | |
| 
 | |
|   (*env)->ReleaseStringUTFChars (env, path, _path);
 | |
| 
 | |
|   return result;
 | |
| 
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0L;
 | |
| #endif /* not WITHOUT_FILESYSTEM */  
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| JNIEXPORT jlong JNICALL
 | |
| Java_java_io_VMFile_getUsableSpace (JNIEnv *env,
 | |
|                                     jclass clazz __attribute__ ((__unused__)),
 | |
|                                     jstring path)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   
 | |
|   jlong result;
 | |
|   const char *_path = NULL;
 | |
|   
 | |
|   _path = (*env)->GetStringUTFChars (env, path, 0);
 | |
|   if (_path == NULL)
 | |
|     {
 | |
|       return 0L;
 | |
|     }
 | |
| 
 | |
|   result = cpio_df (_path, USABLE);
 | |
| 
 | |
|   (*env)->ReleaseStringUTFChars (env, path, _path);
 | |
| 
 | |
|   return result;
 | |
| 
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0L;
 | |
| #endif /* not WITHOUT_FILESYSTEM */  
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method checks to see if a file exists.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    exists
 | |
|  * Signature: (Ljava/lang/String;)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_exists (JNIEnv * env,
 | |
|                             jclass clazz __attribute__ ((__unused__)),
 | |
| 			                jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int result;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   result = cpio_isFileExists (filename);
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
| 
 | |
|   return result == CPNATIVE_OK ? 1 : 0;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method checks to see if a file is a "plain" file; that is, not
 | |
|  * a directory, pipe, etc.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    isFile
 | |
|  * Signature: (Ljava/lang/String;)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_isFile (JNIEnv * env,
 | |
|                             jclass clazz __attribute__ ((__unused__)),
 | |
|                             jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int result;
 | |
|   jint entryType;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   result = cpio_checkType (filename, &entryType);
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
| 
 | |
|   return result == CPNATIVE_OK && entryType == CPFILE_FILE ? 1 : 0;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method checks to see if a file is a directory or not.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    isDirectory
 | |
|  * Signature: (Ljava/lang/String;)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_isDirectory (JNIEnv * env,
 | |
|                                  jclass clazz __attribute__ ((__unused__)),
 | |
|                                  jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int result;
 | |
|   jint entryType;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
|   
 | |
|   result = cpio_checkType (filename, &entryType);
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
| 
 | |
|   return result == CPNATIVE_OK && entryType == CPFILE_DIRECTORY ? 1 : 0;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method returns the length of the file.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    length
 | |
|  * Signature: (Ljava/lang/String;)J
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jlong JNICALL
 | |
| Java_java_io_VMFile_length (JNIEnv * env,
 | |
|                             jclass clazz __attribute__ ((__unused__)),
 | |
|                             jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int tmpfd;
 | |
|   jlong length;
 | |
|   int result;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     return 0;
 | |
| 
 | |
|   /* open file for reading, get size and close file */
 | |
|   result = cpio_openFile (filename, &tmpfd, CPFILE_FLAG_READ, 0);
 | |
|   if (result != CPNATIVE_OK)
 | |
|     return 0;
 | |
| 
 | |
|   result = cpio_getFileSize (tmpfd, &length);
 | |
|   if (result != CPNATIVE_OK)
 | |
|     {
 | |
|       cpio_closeFile (tmpfd);
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   result = cpio_closeFile (tmpfd);
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
| 
 | |
|   return result == CPNATIVE_OK ? length : 0;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method returns the modification date of the file.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    lastModified
 | |
|  * Signature: (Ljava/lang/String;)J
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jlong JNICALL
 | |
| Java_java_io_VMFile_lastModified (JNIEnv * env,
 | |
|                                   jclass clazz __attribute__ ((__unused__)),
 | |
|                                   jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   jlong mtime;
 | |
|   int result;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   result = cpio_getModificationTime (filename, &mtime);
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
| 
 | |
|   return result == CPNATIVE_OK ? mtime : 0;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method sets the modification date of the file.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    setLastModified
 | |
|  * Signature: (Ljava/lang/String;J)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_setLastModified (JNIEnv * env,
 | |
|                                      jclass clazz __attribute__ ((__unused__)),
 | |
|                                      jstring name, jlong newtime)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int result;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   result = cpio_setModificationTime (filename, newtime);
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
| 
 | |
|   return result == CPNATIVE_OK ? 1 : 0;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method deletes a file (actually a name for a file - additional
 | |
|  * links could exist).
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    delete
 | |
|  * Signature: (Ljava/lang/String;)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_delete (JNIEnv * env,
 | |
|                             jclass clazz __attribute__ ((__unused__)),
 | |
|                             jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int result;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   result = cpio_removeFile (filename);
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
| 
 | |
|   return result == CPNATIVE_OK ? 1 : 0;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method creates a directory.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    mkdir
 | |
|  * Signature: (Ljava/lang/String;)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_mkdir (JNIEnv * env,
 | |
|                            jclass clazz __attribute__ ((__unused__)),
 | |
|                            jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *pathname;
 | |
|   int result;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   pathname = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (pathname == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   result = cpio_mkdir (pathname);
 | |
|   (*env)->ReleaseStringUTFChars (env, name, pathname);
 | |
| 
 | |
|   return (result == CPNATIVE_OK) ? 1 : 0;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method renames a (link to a) file.
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    renameTo
 | |
|  * Signature: (Ljava/lang/String;Ljava/lang/String;)Z
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jboolean JNICALL
 | |
| Java_java_io_VMFile_renameTo (JNIEnv * env,
 | |
|                               jclass clazz __attribute__ ((__unused__)),
 | |
|                               jstring t, jstring d)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *old_filename, *new_filename;
 | |
|   int result;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   old_filename = (*env)->GetStringUTFChars (env, t, 0);
 | |
|   if (old_filename == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   new_filename = (*env)->GetStringUTFChars (env, d, 0);
 | |
|   if (new_filename == NULL)
 | |
|     {
 | |
|       (*env)->ReleaseStringUTFChars (env, t, old_filename);
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   result = cpio_rename (old_filename, new_filename);
 | |
|   (*env)->ReleaseStringUTFChars (env, d, new_filename);
 | |
|   (*env)->ReleaseStringUTFChars (env, t, old_filename);
 | |
| 
 | |
|   return (result == CPNATIVE_OK) ? 1 : 0;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method returns an array of String representing all the files
 | |
|  * in a directory except "." and "..".
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    list
 | |
|  * Signature: (Ljava/lang/String;)[Ljava/lang/String;
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jobjectArray JNICALL
 | |
| Java_java_io_VMFile_list (JNIEnv * env,
 | |
|                           jclass clazz __attribute__ ((__unused__)),
 | |
|                           jstring name)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const int REALLOC_SIZE = 10;
 | |
| 
 | |
|   const char *dirname;
 | |
|   int result;
 | |
|   char **filelist;
 | |
|   void *handle;
 | |
|   char *filename = (char *) JCL_malloc (env, FILENAME_MAX);
 | |
|   unsigned long int filelist_count, max_filelist_count;
 | |
|   char **tmp_filelist;
 | |
|   jclass str_clazz;
 | |
|   jobjectArray filearray;
 | |
|   unsigned long int i;
 | |
|   jstring str;
 | |
| 
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   dirname = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (dirname == NULL)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   /* open directory for reading */
 | |
|   result = cpio_openDir (dirname, &handle);
 | |
| 
 | |
|   (*env)->ReleaseStringUTFChars (env, name, dirname);
 | |
| 
 | |
|   if (result != CPNATIVE_OK)
 | |
|     {
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   /* allocate filelist */
 | |
|   filelist = (char **) JCL_malloc (env, sizeof (char *) * REALLOC_SIZE);
 | |
|   if (filelist == NULL)
 | |
|     {
 | |
|       result = cpio_closeDir (handle);
 | |
|       return 0;
 | |
|     }
 | |
|   filelist_count = 0;
 | |
|   max_filelist_count = REALLOC_SIZE;
 | |
| 
 | |
|   /* read the files from the directory */
 | |
|   result = cpio_readDir (handle, filename);
 | |
|   while (result == CPNATIVE_OK)
 | |
|     {
 | |
|       if ((strcmp (filename, ".") != 0) && (strcmp (filename, "..") != 0))
 | |
| 	{
 | |
| 	  /* allocate more memory if necessary */
 | |
| 	  if (filelist_count >= max_filelist_count)
 | |
| 	    {
 | |
| 	      tmp_filelist = (char **) JCL_realloc (env,
 | |
| 						    filelist,
 | |
| 						    (max_filelist_count +
 | |
| 						     REALLOC_SIZE) *
 | |
| 						    sizeof (char *));
 | |
| 	      if (tmp_filelist == NULL)
 | |
| 		{
 | |
| 		  for (i = 0; i < filelist_count; i++)
 | |
| 		    {
 | |
| 		      JCL_free (env, filelist[i]);
 | |
| 		    }
 | |
| 		  JCL_free (env, filelist);
 | |
| 		  result = cpio_closeDir (handle);
 | |
| 		  return 0;
 | |
| 		}
 | |
| 	      filelist = tmp_filelist;
 | |
| 	      max_filelist_count += REALLOC_SIZE;
 | |
| 	    }
 | |
| 
 | |
| 	  /* save entry in list (avoid strdup, because it is not ANSI C, thus difficult to port) */
 | |
| 	  filelist[filelist_count] =
 | |
| 	    (char *) JCL_malloc (env, strlen (filename) + 1);
 | |
| 	  assert (filelist[filelist_count] != NULL);
 | |
| 	  strcpy (filelist[filelist_count], filename);
 | |
| 	  filelist_count++;
 | |
| 	}
 | |
| 
 | |
|       /* read next directory entry */
 | |
|       result = cpio_readDir (handle, filename);
 | |
|     }
 | |
| 
 | |
|   JCL_free (env, filename);
 | |
| 
 | |
|   /* close directory */
 | |
|   result = cpio_closeDir (handle);
 | |
| 
 | |
|   /* put the list of files into a Java String array and return it */
 | |
|   str_clazz = (*env)->FindClass (env, "java/lang/String");
 | |
|   if (str_clazz == NULL)
 | |
|     {
 | |
|       for (i = 0; i < filelist_count; i++)
 | |
| 	{
 | |
| 	  JCL_free (env, filelist[i]);
 | |
| 	}
 | |
|       JCL_free (env, filelist);
 | |
|       return 0;
 | |
|     }
 | |
|   filearray = (*env)->NewObjectArray (env, filelist_count, str_clazz, 0);
 | |
|   if (filearray == NULL)
 | |
|     {
 | |
|       for (i = 0; i < filelist_count; i++)
 | |
| 	{
 | |
| 	  JCL_free (env, filelist[i]);
 | |
| 	}
 | |
|       JCL_free (env, filelist);
 | |
|       return 0;
 | |
|     }
 | |
| 
 | |
|   (*env)->DeleteLocalRef (env, str_clazz);
 | |
| 
 | |
|   for (i = 0; i < filelist_count; i++)
 | |
|     {
 | |
|       /* create new string */
 | |
|       str = (*env)->NewStringUTF (env, filelist[i]);
 | |
|       if (str == NULL)
 | |
| 	{
 | |
| 	  /* We don't clean up everything here, but if this failed,
 | |
| 	     something serious happened anyway */
 | |
| 	  for (i = 0; i < filelist_count; i++)
 | |
| 	    {
 | |
| 	      JCL_free (env, filelist[i]);
 | |
| 	    }
 | |
| 	  JCL_free (env, filelist);
 | |
| 	  return 0;
 | |
| 	}
 | |
| 
 | |
|       /* save into array */
 | |
|       (*env)->SetObjectArrayElement (env, filearray, i, str);
 | |
| 
 | |
|       /* delete local reference */
 | |
|       (*env)->DeleteLocalRef (env, str);
 | |
|     }
 | |
| 
 | |
|   /* free resources */
 | |
|   for (i = 0; i < filelist_count; i++)
 | |
|     {
 | |
|       JCL_free (env, filelist[i]);
 | |
|     }
 | |
|   JCL_free (env, filelist);
 | |
| 
 | |
|   return filearray;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return 0;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * These two methods are used to maintain dynamically allocated
 | |
|  * buffers for getCanonicalPath without the overhead of calling
 | |
|  * realloc every time a buffer is modified.  Buffers are sized
 | |
|  * at the smallest multiple of CHUNKSIZ that is greater than or
 | |
|  * equal to the desired length.  The default CHUNKSIZ is 256,
 | |
|  * longer than most paths, so in most cases a getCanonicalPath
 | |
|  * will require only one malloc per buffer.
 | |
|  */
 | |
| 
 | |
| #define CHUNKLOG 8
 | |
| #define CHUNKSIZ (1 << CHUNKLOG)
 | |
| 
 | |
| static int
 | |
| nextChunkSize (int size)
 | |
| {
 | |
|   return ((size >> CHUNKLOG) + ((size & (CHUNKSIZ - 1)) ? 1 : 0)) << CHUNKLOG;
 | |
| }
 | |
| 
 | |
| static char *
 | |
| maybeGrowBuf (JNIEnv *env, char *buf, int *size, int required)
 | |
| {
 | |
|   if (required > *size)
 | |
|     {
 | |
|       *size = nextChunkSize (required);
 | |
|       buf = JCL_realloc (env, buf, *size);
 | |
|     }
 | |
|   return buf;
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * This method converts a path to canonical form on GNU/Posix systems.
 | |
|  * This involves the removal of redundant separators, references to
 | |
|  * "." and "..", and symbolic links.
 | |
|  *
 | |
|  * The conversion proceeds on a component-by-component basis: symbolic
 | |
|  * links and references to ".."  are resolved as and when they occur.
 | |
|  * This means that if "/foo/bar" is a symbolic link to "/baz" then the
 | |
|  * canonical form of "/foo/bar/.." is "/" and not "/foo".
 | |
|  *
 | |
|  * In order to mimic the behaviour of proprietary JVMs, non-existant
 | |
|  * path components are allowed (a departure from the normal GNU system
 | |
|  * convention).  This means that if "/foo/bar" is a symbolic link to
 | |
|  * "/baz", the canonical form of "/non-existant-directory/../foo/bar"
 | |
|  * is "/baz".
 | |
|  *
 | |
|  * Class:     java_io_VMFile
 | |
|  * Method:    toCanonicalForm
 | |
|  * Signature: (Ljava/lang/String)Ljava/lang/String
 | |
|  */
 | |
| 
 | |
| JNIEXPORT jstring JNICALL
 | |
| Java_java_io_VMFile_toCanonicalForm (JNIEnv *env,
 | |
| 				                     jclass class __attribute__ ((__unused__)),
 | |
| 				                     jstring jpath)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *path;
 | |
|   char *src, *dst;
 | |
|   int srci, dsti;
 | |
|   int srcl, dstl;
 | |
|   int len;
 | |
|   int fschecks;
 | |
| #if defined (HAVE_LSTAT) && defined (HAVE_READLINK)
 | |
|   struct stat sb;
 | |
| #endif /* HAVE_LSTAT && HAVE_READLINK */
 | |
| 
 | |
|   path = JCL_jstring_to_cstring (env, jpath);
 | |
|   if (path == NULL)
 | |
|     return NULL;
 | |
| 
 | |
|   /* It is the caller's responsibility to ensure the path is absolute. */
 | |
|   if (path[0] == 0 || path[0] != '/')
 | |
|     {
 | |
|       JCL_free_cstring (env, jpath, path);
 | |
|       JCL_ThrowException (env, "java/lang/RuntimeException", "Not absolute");
 | |
|       return NULL;
 | |
|     }
 | |
| 
 | |
|   len = strlen (path);
 | |
|   srcl = nextChunkSize (len + 1);
 | |
|   src = JCL_malloc (env, srcl);
 | |
|   if (src == NULL)
 | |
|     {
 | |
|       JCL_free_cstring (env, jpath, path);
 | |
|       return NULL;
 | |
|     }
 | |
|   strcpy (src, path);
 | |
|   JCL_free_cstring (env, jpath, path);
 | |
|   srci = 1;
 | |
| 
 | |
|   dstl = nextChunkSize (2);  
 | |
|   dst = JCL_malloc (env, dstl);
 | |
|   if (dst == NULL)
 | |
|     {
 | |
|       JCL_free (env, src);
 | |
|       return NULL;
 | |
|     }
 | |
|   dst[0] = '/';
 | |
|   dsti = 1;
 | |
| 
 | |
|   fschecks = JNI_TRUE;
 | |
| 
 | |
|   while (src[srci] != '\0')
 | |
|     {
 | |
|       int tmpi, dsti_save;
 | |
| 
 | |
|       /* Skip slashes. */
 | |
|       while (src[srci] == '/')
 | |
| 	srci++;
 | |
|       tmpi = srci;
 | |
|       /* Find next slash. */
 | |
|       while (src[srci] != '/' && src[srci] != '\0')
 | |
| 	srci++;
 | |
|       if (srci == tmpi)
 | |
| 	/* We hit the end. */
 | |
| 	break;
 | |
|       len = srci - tmpi;
 | |
| 
 | |
|       /* Handle "." and "..". */
 | |
|       if (len == 1 && src[tmpi] == '.')
 | |
| 	continue;
 | |
|       if (len == 2 && src[tmpi] == '.' && src[tmpi + 1] == '.')
 | |
| 	{
 | |
| 	  while (dsti > 1 && dst[dsti - 1] != '/')
 | |
| 	    dsti--;
 | |
| 	  if (dsti != 1)
 | |
| 	    dsti--;
 | |
| 	  /* Reenable filesystem checking if disabled, as we might
 | |
| 	   * have reversed over whatever caused the problem before.
 | |
| 	   * At least one proprietary JVM has inconsistencies because
 | |
| 	   * it does not do this.
 | |
| 	   */
 | |
| 	  fschecks = JNI_TRUE;
 | |
| 	  continue;
 | |
| 	}
 | |
| 
 | |
|       /* Handle real path components. */
 | |
|       dst = maybeGrowBuf (env,
 | |
| 			  dst, &dstl, dsti + (dsti > 1 ? 1 : 0) + len + 1);
 | |
|       if (dst == NULL)
 | |
| 	{
 | |
| 	  JCL_free (env, src);
 | |
| 	  return NULL;
 | |
| 	}
 | |
|       dsti_save = dsti;
 | |
|       if (dsti > 1)
 | |
| 	dst[dsti++] = '/';
 | |
|       strncpy (&dst[dsti], &src[tmpi], len);
 | |
|       dsti += len;
 | |
|       if (fschecks == JNI_FALSE)
 | |
| 	continue;
 | |
| 
 | |
| #if defined (HAVE_LSTAT) && defined (HAVE_READLINK)
 | |
|       dst[dsti] = '\0';
 | |
|       if (lstat (dst, &sb) == 0)
 | |
| 	{
 | |
| 	  if (S_ISLNK (sb.st_mode))
 | |
| 	    {
 | |
| 	      int tmpl = CHUNKSIZ;
 | |
| 	      char *tmp = JCL_malloc (env, tmpl);
 | |
| 	      if (tmp == NULL)
 | |
| 		{
 | |
| 		  JCL_free (env, src);
 | |
| 		  JCL_free (env, dst);
 | |
| 		  return NULL;
 | |
| 		}
 | |
| 
 | |
| 	      while (1)
 | |
| 		{
 | |
| 		  tmpi = readlink (dst, tmp, tmpl);
 | |
| 		  if (tmpi < 1)
 | |
| 		    {
 | |
| 		      JCL_free (env, src);
 | |
| 		      JCL_free (env, dst);
 | |
| 		      JCL_free (env, tmp);
 | |
| 		      JCL_ThrowException (env, "java/io/IOException",
 | |
| 					  "readlink failed");
 | |
| 		      return NULL;
 | |
| 		    }
 | |
| 		  if (tmpi < tmpl)
 | |
| 		    break;
 | |
| 		  tmpl += CHUNKSIZ;
 | |
| 		  tmp = JCL_realloc (env, tmp, tmpl);
 | |
| 		}
 | |
| 
 | |
| 	      /* Prepend the link's path to src. */
 | |
| 	      tmp = maybeGrowBuf (env,
 | |
| 				  tmp, &tmpl, tmpi + strlen (&src[srci]) + 1);
 | |
| 	      if (tmp == NULL)
 | |
| 		{
 | |
| 		  JCL_free (env, src);
 | |
| 		  JCL_free (env, dst);
 | |
| 		  return NULL;
 | |
| 		}
 | |
| 
 | |
| 	      strcpy (&tmp[tmpi], &src[srci]);
 | |
| 	      JCL_free (env, src);
 | |
| 	      src = tmp;
 | |
| 	      srcl = tmpl;
 | |
| 	      srci = 0;
 | |
| 
 | |
| 	      /* Either replace or append dst depending on whether the
 | |
| 	       * link is relative or absolute.
 | |
| 	       */
 | |
| 	      dsti = src[0] == '/' ? 1 : dsti_save;
 | |
| 	    }
 | |
| 	}
 | |
|       else
 | |
| 	{
 | |
| 	  /* Something doesn't exist, or we don't have permission to
 | |
| 	   * read it, or a previous path component is a directory, or
 | |
| 	   * a symlink is looped.  Whatever, we can't check the
 | |
| 	   * filesystem any more.
 | |
| 	   */
 | |
| 	  fschecks = JNI_FALSE;
 | |
| 	}
 | |
| #endif /* HAVE_LSTAT && HAVE_READLINK */
 | |
|     }
 | |
|   dst[dsti] = '\0';
 | |
| 
 | |
|   jpath = (*env)->NewStringUTF (env, dst);
 | |
|   JCL_free (env, src);
 | |
|   JCL_free (env, dst);
 | |
|   return jpath;
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return NULL;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /* ***** PRIVATE FUNCTIONS IMPLEMENTATION ***** */
 | |
| 
 | |
| static jboolean set_file_permissions (JNIEnv *env, jstring name,
 | |
|                                       jboolean enable,
 | |
|                                       jboolean ownerOnly,
 | |
|                                       int permissions)
 | |
| {
 | |
| #ifndef WITHOUT_FILESYSTEM
 | |
|   const char *filename;
 | |
|   int result = JNI_FALSE;
 | |
|   
 | |
|   /* Don't use the JCL convert function because it throws an exception
 | |
|      on failure */
 | |
|   filename = (*env)->GetStringUTFChars (env, name, 0);
 | |
|   if (filename == NULL)
 | |
|     {
 | |
|       return JNI_FALSE;
 | |
|     }
 | |
|   
 | |
|   if (ownerOnly)
 | |
|     {
 | |
|       permissions |= CPFILE_FLAG_USR; 
 | |
|     }
 | |
|   
 | |
|   if (!enable)
 | |
|     {
 | |
|       permissions |= CPFILE_FLAG_OFF;
 | |
|     }
 | |
|   
 | |
|   result = cpio_chmod (filename, permissions);
 | |
|   (*env)->ReleaseStringUTFChars (env, name, filename);
 | |
|   
 | |
|   return result == CPNATIVE_OK ? JNI_TRUE : JNI_FALSE;
 | |
|   
 | |
| #else /* not WITHOUT_FILESYSTEM */
 | |
|   return JNI_FALSE;
 | |
| #endif /* not WITHOUT_FILESYSTEM */
 | |
| }
 |