[kaffe] CVS kaffe (kaz): libraries/clib/io/File.c (java_io_VMFile_list):

Kaffe CVS cvs-commits at kaffe.org
Wed Aug 10 08:40:41 PDT 2005


PatchSet 6805 
Date: 2005/08/10 15:35:35
Author: kaz
Branch: HEAD
Tag: (none) 
Log:
2005-08-10  Ito Kazumitsu  <kaz at maczuka.gcd.org>

        * libraries/clib/io/File.c (java_io_VMFile_list):
        Keep the order of files as returned by readdir so that
        the result may be similar to that of other VM's.
        Suggested by Wolfgang Baer <WBaer at gmx.de>.

Members: 
	ChangeLog:1.4330->1.4331 
	libraries/clib/io/File.c:INITIAL->1.27 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4330 kaffe/ChangeLog:1.4331
--- kaffe/ChangeLog:1.4330	Wed Aug 10 14:36:28 2005
+++ kaffe/ChangeLog	Wed Aug 10 15:35:35 2005
@@ -1,3 +1,10 @@
+2005-08-10  Ito Kazumitsu  <kaz at maczuka.gcd.org>
+
+	* libraries/clib/io/File.c (java_io_VMFile_list):
+	Keep the order of files as returned by readdir so that
+	the result may be similar to that of other VM's.
+	Suggested by Wolfgang Baer <WBaer at gmx.de>.
+
 2005-08-10   Wolfgang Baer <WBaer at gmx.de>
 
 	* kaffe/scripts/jdb.in: Add some explanations to the output of the jdb
===================================================================
Checking out kaffe/libraries/clib/io/File.c
RCS:  /home/cvs/kaffe/kaffe/libraries/clib/io/File.c,v
VERS: 1.27
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/clib/io/File.c	Wed Aug 10 15:40:41 2005
@@ -0,0 +1,345 @@
+/*
+ * java.io.File.c
+ *
+ * Copyright (c) 1996, 1997, 1998, 1999
+ *	Transvirtual Technologies, Inc.  All rights reserved.
+ * Copyright (c) 2003
+ *      Kaffe's team.
+ *
+ * See the file "license.terms" for information on usage and redistribution 
+ * of this file. 
+ */
+
+#include "config.h"
+#include "config-std.h"
+#include "config-io.h"
+#include "config-mem.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <native.h>
+#include <jsyscall.h>
+#ifdef HAVE_UTIME_H
+#include <utime.h>
+#endif
+#include "defs.h"
+#include "files.h"
+#include "../../../include/system.h"
+#include "java_io_VMFile.h"
+#include "support.h"
+#include "stringSupport.h"
+
+/*
+ * Is named item a file?
+ */
+jboolean java_io_VMFile_isFile(struct Hjava_lang_String* fileName)
+{
+  struct stat buf;
+  char str[MAXPATHLEN];
+  int r;
+  
+  stringJava2CBuf(fileName, str, sizeof(str));
+  
+  r = KSTAT(str, &buf);
+  if (r == 0 && S_ISREG(buf.st_mode)) {
+    return (1);
+  }
+  else {
+    return (0);
+  }
+}
+
+/*
+ * Is named item a directory?
+ */
+jboolean java_io_VMFile_isDirectory(struct Hjava_lang_String* fileName)
+{
+  struct stat buf;
+  char str[MAXPATHLEN];
+  int r;
+
+  stringJava2CBuf(fileName, str, sizeof(str));
+  
+  r = KSTAT(str, &buf);
+  if (r == 0 && S_ISDIR(buf.st_mode)) {
+    return (1);
+  }
+  else {
+    return (0);
+  }
+}
+
+/*
+ * Does named file exist?
+ */
+jboolean java_io_VMFile_exists(struct Hjava_lang_String* fileName)
+{
+  struct stat buf;
+  char str[MAXPATHLEN];
+  
+  stringJava2CBuf(fileName, str, sizeof(str));
+  
+  /* A file exists if I can stat it */
+  return (KSTAT(str, &buf) == 0);
+}
+
+/*
+ * Last modified time on file.
+ */
+jlong java_io_VMFile_lastModified(struct Hjava_lang_String* fileName)
+{
+  struct stat buf;
+  char str[MAXPATHLEN];
+  int r;
+  
+  stringJava2CBuf(fileName, str, sizeof(str));
+  
+  r = KSTAT(str, &buf);
+  if (r != 0) {
+    return ((jlong)0);
+  }
+  return ((jlong)buf.st_mtime * (jlong)1000);
+}
+
+/*
+ * Can I write to this file?
+ */
+jboolean
+java_io_VMFile_canWrite(struct Hjava_lang_String* fileName)
+{
+	char str[MAXPATHLEN];
+	int r;
+
+	stringJava2CBuf(fileName, str, sizeof(str));
+	/* XXX make part of jsyscall interface !? */
+	r = access(str, W_OK);
+	return (r < 0 ? 0 : 1);
+}
+
+/*
+ * Can I read from this file.
+ */
+jboolean java_io_VMFile_canRead(struct Hjava_lang_String* fileName)
+{
+  char str[MAXPATHLEN];
+  int r;
+  
+  stringJava2CBuf(fileName, str, sizeof(str));
+  /* XXX make part of jsyscall interface !? */
+  r = access(str, R_OK);
+  return (r < 0 ? 0 : 1);
+}
+
+/*
+ * Return length of file.
+ */
+jlong java_io_VMFile_length(struct Hjava_lang_String* fileName)
+{
+  struct stat buf;
+  char str[MAXPATHLEN];
+  int r;
+  
+  stringJava2CBuf(fileName, str, sizeof(str));
+  
+  r = KSTAT(str, &buf);
+  if (r != 0) {
+    return ((jlong)0);
+  }
+  return ((jlong)buf.st_size);
+}
+
+/*
+ * Create a directory.
+ */
+jboolean java_io_VMFile_mkdir(struct Hjava_lang_String* fileName)
+{
+  char str[MAXPATHLEN];
+  int r;
+  
+  stringJava2CBuf(fileName, str, sizeof(str));
+  r = KMKDIR(str, 0777);
+  return (r != 0 ? 0 : 1);
+}
+
+/*
+ * Rename a file.
+ */
+jboolean java_io_VMFile_renameTo(struct Hjava_lang_String* fromName,
+				 struct Hjava_lang_String* toName)
+{
+  char str[MAXPATHLEN];
+  char str2[MAXPATHLEN];
+  int r;
+  
+  stringJava2CBuf(fromName, str, sizeof(str));
+  stringJava2CBuf(toName, str2, sizeof(str2));
+  
+  r = KRENAME(str, str2);
+  return (r != 0 ? 0 : 1);
+}
+
+/*
+ * Delete a file.
+ */
+jboolean java_io_VMFile_delete(struct Hjava_lang_String* fileName)
+{
+	char str[MAXPATHLEN];
+	int r;
+	
+	stringJava2CBuf(fileName, str, sizeof(str));
+
+	r = KREMOVE(str);
+	return(r != 0 ? 0 : 1);
+}
+
+/*
+ * Get a directory listing.
+ */
+HArrayOfObject* java_io_VMFile_list(struct Hjava_lang_String* dirName)
+{
+#if defined(HAVE_DIRENT_H)
+  char path[MAXPATHLEN];
+  DIR* dir;
+  struct dirent* entry;
+  struct dentry {
+    struct dentry* next;
+    char name[1];
+  };
+  struct dentry* dirlist;
+  struct dentry* mentry;
+  struct dentry* lastentry;
+  HArrayOfObject* array;
+  int count;
+  int i;
+  int oom = 0;
+  
+  stringJava2CBuf(dirName, path, sizeof(path));
+  
+  /* XXX make part of jsyscall interface !? */
+  dir = opendir(path);
+  if (dir == 0) {
+    return (NULL);
+  }
+  
+  dirlist = NULL;
+  lastentry = NULL;
+  count = 0;
+  /* XXX make part of jsyscall interface !? */
+  while ((entry = readdir(dir)) != NULL) {
+    /* We skip '.' and '..' */
+    if (strcmp(".", entry->d_name) == 0 ||
+	strcmp("..", entry->d_name) == 0) {
+      continue;
+    }
+    mentry = KMALLOC(sizeof(struct dentry) + NAMLEN(entry));
+    if (!mentry) {
+      errorInfo info;
+      
+      while (dirlist) {
+	mentry = dirlist;
+	dirlist = dirlist->next;
+	KFREE(mentry);
+      }
+      postOutOfMemory(&info);
+      throwError(&info);
+    }
+    strcpy(mentry->name, entry->d_name);
+    mentry->next = NULL;
+    if (count == 0) {
+        dirlist = mentry;
+    }
+    else {
+        lastentry->next = mentry;
+    }
+    lastentry = mentry;
+    count++;
+  }
+  /* XXX make part of jsyscall interface !? */
+  closedir(dir);
+  
+  array = (HArrayOfObject*)AllocObjectArray(count,
+					    "Ljava/lang/String;", NULL);
+  /* XXX: This assert is a noop.  If AllocObjectArray throws an
+     exception, we leak. */
+  assert(array != NULL);
+  for (i = 0; i < count; i++) {
+    mentry = dirlist;
+    dirlist = mentry->next;
+    unhand_array(array)->body[i] =
+      (Hjava_lang_Object*)checkPtr(stringC2Java(mentry->name));
+    /* if allocation fails, continue freeing mentries in
+       this loop. */
+    oom |= !unhand_array(array)->body[i];
+    KFREE(mentry);
+  }
+  if (oom) {
+    errorInfo info;
+    postOutOfMemory(&info);
+    throwError(&info);
+  }
+  
+  return (array);
+#else
+  return (0);
+#endif
+}
+
+jboolean java_io_VMFile_create(struct Hjava_lang_String* fileName)
+{
+  char str[MAXPATHLEN];
+  int fd;
+  int rc;
+  
+  stringJava2CBuf(fileName, str, sizeof(str));
+
+  rc = KOPEN(str, O_EXCL|O_WRONLY|O_BINARY|O_CREAT, 0600, &fd);
+  switch (rc) {
+  case 0:
+    break;
+  case EEXIST:
+    return 0;
+  default:
+    SignalError("java.io.IOException", SYS_ERROR(rc));
+  }
+  rc = KCLOSE(fd);
+  if (rc != 0)
+    SignalError("java.io.IOException", SYS_ERROR(rc));
+  return 1;
+}
+
+jboolean java_io_VMFile_setLastModified(struct Hjava_lang_String* fileName,
+					jlong thetime)
+{
+#ifdef HAVE_UTIME_H
+  char path[MAXPATHLEN];
+  struct utimbuf ub;
+#endif
+  
+  if (thetime < 0)
+    SignalError("java.lang.IllegalArgumentException", "time < 0");
+#ifdef HAVE_UTIME_H
+  stringJava2CBuf(fileName, path, sizeof(path));
+  ub.actime = (time_t)(thetime / 1000);
+  ub.modtime = ub.actime;
+  return (utime(path, &ub) >= 0);
+#else
+  return 0;
+#endif
+}
+
+jboolean java_io_VMFile_setReadOnly(struct Hjava_lang_String* fileName)
+{
+  struct stat buf;
+  char str[MAXPATHLEN];
+  int r;
+  
+  stringJava2CBuf(fileName, str, sizeof(str));
+  
+  r = KSTAT(str, &buf);
+  if (r != 0)
+    return 0;
+  
+  r = chmod(str, buf.st_mode & ~(S_IWOTH|S_IWGRP|S_IWUSR));
+  return (r == 0);
+}
+




More information about the kaffe mailing list