diff options
Diffstat (limited to 'libjava/java/io/natFile.cc')
-rw-r--r-- | libjava/java/io/natFile.cc | 213 |
1 files changed, 136 insertions, 77 deletions
diff --git a/libjava/java/io/natFile.cc b/libjava/java/io/natFile.cc index 2b0da1bebf4..82674fcfae6 100644 --- a/libjava/java/io/natFile.cc +++ b/libjava/java/io/natFile.cc @@ -1,6 +1,6 @@ -// natFile.cc - Native part of File class. +// natFile.cc - Native part of File class for POSIX. -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. @@ -24,23 +24,23 @@ details. */ #include <dirent.h> #endif #include <string.h> +#include <utime.h> #include <gcj/cni.h> #include <jvm.h> #include <java/io/File.h> #include <java/io/IOException.h> -#include <java/util/Vector.h> +#include <java/util/ArrayList.h> #include <java/lang/String.h> #include <java/io/FilenameFilter.h> +#include <java/io/FileFilter.h> #include <java/lang/System.h> jboolean -java::io::File::access (jstring canon, jint query) +java::io::File::access (jint query) { - if (! canon) - return false; char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (canon, 0, canon->length(), buf); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); // FIXME? buf[total] = '\0'; JvAssert (query == READ || query == WRITE || query == EXISTS); @@ -59,15 +59,16 @@ java::io::File::access (jstring canon, jint query) } jboolean -java::io::File::stat (jstring canon, jint query) +java::io::File::stat (jint query) { - if (! canon) - return false; char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (canon, 0, canon->length(), buf); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); // FIXME? buf[total] = '\0'; + if (query == ISHIDDEN) + return (getName()->charAt(0) == '.'); + #ifdef HAVE_STAT struct stat sb; if (::stat (buf, &sb)) @@ -82,13 +83,10 @@ java::io::File::stat (jstring canon, jint query) } jlong -java::io::File::attr (jstring canon, jint query) +java::io::File::attr (jint query) { - if (! canon) - return false; - char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (canon, 0, canon->length(), buf); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); // FIXME? buf[total] = '\0'; @@ -99,8 +97,6 @@ java::io::File::attr (jstring canon, jint query) return 0; JvAssert (query == MODIFIED || query == LENGTH); - // FIXME: time computation is very POSIX-specific -- POSIX and Java - // have the same Epoch. return query == MODIFIED ? (jlong)sb.st_mtime * 1000 : sb.st_size; #else // There's no good choice here. @@ -118,7 +114,7 @@ java::io::File::getCanonicalPath (void) #ifdef HAVE_REALPATH if (realpath (buf, buf2) == NULL) - _Jv_Throw (new IOException (JvNewStringLatin1 (strerror (errno)))); + throw new IOException (JvNewStringLatin1 (strerror (errno))); // FIXME: what encoding to assume for file names? This affects many // calls. @@ -131,57 +127,17 @@ java::io::File::getCanonicalPath (void) jboolean java::io::File::isAbsolute (void) { - // FIXME: cpp define name. - // FIXME: cygwin. -#ifdef WIN32 - if (path->charAt(0) == '/' || path->charAt(0) == '\\') - return true; - if (path->length() < 3) - return false; - // Hard-code A-Za-z because Windows (I think) can't use non-ASCII - // letters as drive names. - if ((path->charAt(0) < 'a' || path->charAt(0) > 'z') - && (path->charAt(0) < 'A' || path->charAt(0) > 'Z')) - return false; - return (path->charAt(1) == ':' - && (path->charAt(2) == '/' || path->charAt(2) == '\\')); -#else return path->charAt(0) == '/'; -#endif } -#ifdef HAVE_DIRENT_H -#if defined(__JV_POSIX_THREADS__) && defined(HAVE_READDIR_R) - -static struct dirent * -get_entry (DIR *dir, struct dirent *e) +jobjectArray +java::io::File::performList (java::io::FilenameFilter *filter, + java::io::FileFilter *fileFilter, + java::lang::Class *result_type) { - struct dirent *r; - if (readdir_r (dir, e, &r) || r == NULL) - return NULL; - return e; -} - -#else /* defined(__JV_POSIX_THREADS__) && defined(HAVE_READDIR_R) */ - -static struct dirent * -get_entry (DIR *dir, struct dirent *) -{ - return readdir (dir); -} - -#endif /* defined(__JV_POSIX_THREADS__) && defined(HAVE_READDIR_R) */ -#endif /* HAVE_DIRENT_H */ - -jstringArray -java::io::File::performList (jstring canon, FilenameFilter *filter) -{ - if (! canon) - return NULL; - #ifdef HAVE_DIRENT_H char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (canon, 0, canon->length(), buf); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); // FIXME? buf[total] = '\0'; @@ -189,26 +145,44 @@ java::io::File::performList (jstring canon, FilenameFilter *filter) if (! dir) return NULL; - java::util::Vector *vec = new java::util::Vector (); - struct dirent *d, d2; - while ((d = get_entry (dir, &d2)) != NULL) + + java::util::ArrayList *list = new java::util::ArrayList (); + struct dirent *d; +#ifdef HAVE_READDIR_R + int name_max = pathconf (buf, _PC_NAME_MAX); + char dbuf[sizeof (struct dirent) + name_max + 1]; + while (readdir_r (dir, (struct dirent *) dbuf, &d) == 0 && d != NULL) +#else /* HAVE_READDIR_R */ + while ((d = readdir (dir)) != NULL) +#endif /* HAVE_READDIR_R */ { - if (! strcmp (d->d_name, ".") || ! strcmp (d->d_name, "..")) + // Omit "." and "..". + if (d->d_name[0] == '.' + && (d->d_name[1] == '\0' + || (d->d_name[1] == '.' && d->d_name[2] == '\0'))) continue; jstring name = JvNewStringUTF (d->d_name); if (filter && ! filter->accept(this, name)) continue; - - vec->addElement(name); + + if (result_type == &java::io::File::class$) + { + java::io::File *file = new java::io::File (this, name); + if (fileFilter && ! fileFilter->accept(file)) + continue; + + list->add(file); + } + else + list->add(name); } closedir (dir); - jobjectArray ret = JvNewObjectArray (vec->size(), canon->getClass(), - NULL); - vec->copyInto(ret); - return reinterpret_cast<jstringArray> (ret); + jobjectArray ret = JvNewObjectArray (list->size(), result_type, NULL); + list->toArray(ret); + return ret; #else /* HAVE_DIRENT_H */ return NULL; #endif /* HAVE_DIRENT_H */ @@ -230,6 +204,42 @@ java::io::File::performMkdir (void) } jboolean +java::io::File::performSetReadOnly (void) +{ + char buf[MAXPATHLEN]; + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + // FIXME? + buf[total] = '\0'; + +#if defined (HAVE_STAT) && defined (HAVE_CHMOD) + struct stat sb; + if (::stat (buf, &sb)) + return false; + + if (::chmod(buf, sb.st_mode & 0555)) + return false; + return true; +#else + return false; +#endif +} + +static JArray<java::io::File *> *unixroot; + +JArray< ::java::io::File *>* +java::io::File::performListRoots () +{ + if (unixroot == NULL) + { + ::java::io::File *f = new ::java::io::File (JvNewStringLatin1 ("/")); + unixroot = reinterpret_cast <JArray<java::io::File *>*> + (JvNewObjectArray (1, &java::io::File::class$, f)); + elements (unixroot) [0] = f; + } + return unixroot; +} + +jboolean java::io::File::performRenameTo (File *dest) { char buf[MAXPATHLEN]; @@ -249,10 +259,52 @@ java::io::File::performRenameTo (File *dest) } jboolean -java::io::File::performDelete (jstring canon) +java::io::File::performSetLastModified (jlong time) { +#ifdef HAVE_UTIME + utimbuf tb; + char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (canon, 0, canon->length(), buf); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + // FIXME? + buf[total] = '\0'; + + tb.actime = time / 1000; + tb.modtime = time / 1000; + return ::utime (buf, &tb); +#else + return false; +#endif +} + +jboolean +java::io::File::performCreate (void) +{ + char buf[MAXPATHLEN]; + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + // FIXME? + buf[total] = '\0'; + + int fd = ::open (buf, O_CREAT | O_EXCL, 0644); + + if (fd < 0) + { + if (errno == EEXIST) + return false; + throw new IOException (JvNewStringLatin1 (strerror (errno))); + } + else + { + ::close (fd); + return true; + } +} + +jboolean +java::io::File::performDelete (void) +{ + char buf[MAXPATHLEN]; + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); // FIXME? buf[total] = '\0'; @@ -260,9 +312,16 @@ java::io::File::performDelete (jstring canon) #ifdef HAVE_RMDIR if (! ::rmdir (buf)) return true; -#endif // HAVE_RMDIR if (errno == ENOTDIR) +#endif // HAVE_RMDIR return ::unlink (buf) == 0; #endif // HAVE_UNLINK return false; } + +void +java::io::File::init_native () +{ + maxPathLen = MAXPATHLEN; + caseSensitive = true; +} |