1 // natFile.cc - Native part of File class for POSIX.
3 /* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
15 #include <sys/param.h>
17 #include <sys/types.h>
31 #include <java/io/File.h>
32 #include <java/io/IOException.h>
33 #include <java/util/ArrayList.h>
34 #include <java/lang/String.h>
35 #include <java/io/FilenameFilter.h>
36 #include <java/io/FileFilter.h>
37 #include <java/lang/System.h>
40 java::io::File::_access (jint query)
43 jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
45 JvAssert (query == READ || query == WRITE || query == EXISTS);
50 else if (query == WRITE)
54 return ::access (buf, mode) == 0;
61 java::io::File::_stat (jint query)
64 jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
67 if (query == ISHIDDEN)
68 return (getName()->charAt(0) == '.');
72 if (::stat (buf, &sb))
75 JvAssert (query == DIRECTORY || query == ISFILE);
76 jboolean r = S_ISDIR (sb.st_mode);
77 return query == DIRECTORY ? r : ! r;
84 java::io::File::attr (jint query)
87 jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
92 // FIXME: not sure about return value here.
93 if (::stat (buf, &sb))
96 JvAssert (query == MODIFIED || query == LENGTH);
97 return query == MODIFIED ? (jlong)sb.st_mtime * 1000 : sb.st_size;
99 // There's no good choice here.
105 java::io::File::getCanonicalPath (void)
107 char buf[MAXPATHLEN], buf2[MAXPATHLEN];
108 jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
112 if (realpath (buf, buf2) == NULL)
113 throw new IOException (JvNewStringLatin1 (strerror (errno)));
115 // FIXME: what encoding to assume for file names? This affects many
117 return JvNewStringUTF (buf2);
119 return JvNewStringUTF (buf);
124 java::io::File::isAbsolute (void)
126 return path->charAt(0) == '/';
130 java::io::File::performList (java::io::FilenameFilter *filter,
131 java::io::FileFilter *fileFilter,
132 java::lang::Class *result_type)
134 /* Some systems have dirent.h, but no directory reading functions like
136 #if defined(HAVE_DIRENT_H) && defined(HAVE_OPENDIR)
137 char buf[MAXPATHLEN];
138 jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
141 DIR *dir = opendir (buf);
146 java::util::ArrayList *list = new java::util::ArrayList ();
148 #ifdef HAVE_READDIR_R
149 int name_max = pathconf (buf, _PC_NAME_MAX);
150 char dbuf[sizeof (struct dirent) + name_max + 1];
151 while (readdir_r (dir, (struct dirent *) dbuf, &d) == 0 && d != NULL)
152 #else /* HAVE_READDIR_R */
153 while ((d = readdir (dir)) != NULL)
154 #endif /* HAVE_READDIR_R */
156 // Omit "." and "..".
157 if (d->d_name[0] == '.'
158 && (d->d_name[1] == '\0'
159 || (d->d_name[1] == '.' && d->d_name[2] == '\0')))
162 jstring name = JvNewStringUTF (d->d_name);
163 if (filter && ! filter->accept(this, name))
166 if (result_type == &java::io::File::class$)
168 java::io::File *file = new java::io::File (this, name);
169 if (fileFilter && ! fileFilter->accept(file))
180 jobjectArray ret = JvNewObjectArray (list->size(), result_type, NULL);
183 #else /* HAVE_DIRENT_H && HAVE_OPENDIR */
185 #endif /* HAVE_DIRENT_H && HAVE_OPENDIR */
189 java::io::File::performMkdir (void)
191 char buf[MAXPATHLEN];
192 jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
196 return ::mkdir (buf, 0755) == 0;
203 java::io::File::performSetReadOnly (void)
205 char buf[MAXPATHLEN];
206 jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
209 #if defined (HAVE_STAT) && defined (HAVE_CHMOD)
211 if (::stat (buf, &sb))
214 if (::chmod(buf, sb.st_mode & 0555))
222 static JArray<java::io::File *> *unixroot;
224 JArray< ::java::io::File *>*
225 java::io::File::performListRoots ()
227 if (unixroot == NULL)
229 ::java::io::File *f = new ::java::io::File (JvNewStringLatin1 ("/"));
230 unixroot = reinterpret_cast <JArray<java::io::File *>*>
231 (JvNewObjectArray (1, &java::io::File::class$, f));
232 elements (unixroot) [0] = f;
238 java::io::File::performRenameTo (File *dest)
240 char buf[MAXPATHLEN];
241 jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
243 char buf2[MAXPATHLEN];
244 total = JvGetStringUTFRegion (dest->path, 0, dest->path->length(), buf2);
248 return ::rename (buf, buf2) == 0;
255 java::io::File::performSetLastModified (jlong time)
260 char buf[MAXPATHLEN];
261 jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
264 tb.actime = time / 1000;
265 tb.modtime = time / 1000;
266 return ::utime (buf, &tb);
273 java::io::File::performCreate (void)
275 char buf[MAXPATHLEN];
276 jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
279 int fd = ::open (buf, O_CREAT | O_EXCL, 0644);
285 throw new IOException (JvNewStringLatin1 (strerror (errno)));
295 java::io::File::performDelete (void)
297 char buf[MAXPATHLEN];
298 jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
305 if (errno == ENOTDIR)
307 return ::unlink (buf) == 0;
308 #endif // HAVE_UNLINK
313 java::io::File::init_native ()
315 maxPathLen = MAXPATHLEN;
316 caseSensitive = true;