⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
字号:
/* * java.io.File.c * * Copyright (c) 1996, 1997, 1998, 1999 *	Transvirtual Technologies, Inc.  All rights reserved. * Copyright (c) 2003, 2006 *      Kaffe's team. * Copyright (c) 2006 *      Free Software Foundation, Inc. * * 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 "jni.h"#include "java_io_VMFile.h"#include "support.h"#include "stringSupport.h"/* * Is named item a file? */JNIEXPORT jboolean JNICALLJava_java_io_VMFile_isFile (JNIEnv * env,			    jobject obj __attribute__ ((__unused__)),			    jstring name){  const char *filename;  int r;  struct stat buf;    filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }  r = KSTAT(filename, &buf);  (*env)->ReleaseStringUTFChars (env, name, filename);  if (r == 0 && S_ISREG(buf.st_mode)) {    return (1);  }  else {    return (0);  }}/* * Is named item a directory? */JNIEXPORT jboolean JNICALLJava_java_io_VMFile_isDirectory (JNIEnv * env,				 jobject obj __attribute__ ((__unused__)),				 jstring name){  const char * filename;  int r;  struct stat buf;  filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }    r = KSTAT(filename, &buf);  (*env)->ReleaseStringUTFChars (env, name, filename);  if (r == 0 && S_ISDIR(buf.st_mode)) {    return (1);  }  else {    return (0);  }}/* * Does named file exist? */JNIEXPORT jboolean JNICALLJava_java_io_VMFile_exists (JNIEnv * env,			    jobject obj __attribute__ ((__unused__)),			    jstring name){  const char *filename;  int result;  struct stat buf;    filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }    /* A file exists if I can stat it */  result = KSTAT(filename, &buf);  (*env)->ReleaseStringUTFChars (env, name, filename);  return result == 0;}/* * Last modified time on file. */JNIEXPORT jlong JNICALLJava_java_io_VMFile_lastModified (JNIEnv * env,				  jobject obj __attribute__ ((__unused__)),				  jstring name){  const char *filename;  struct stat buf;  int r;    filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }    r = KSTAT(filename, &buf);  (*env)->ReleaseStringUTFChars (env, name, filename);  if (r != 0) {    return ((jlong)0);  }  return ((jlong)buf.st_mtime * (jlong)1000);}/* * Can I write to this file? */JNIEXPORT jboolean JNICALLJava_java_io_VMFile_canWrite (JNIEnv * env,			      jobject obj __attribute__ ((__unused__)),			      jstring name){  const char *filename;  int r;  filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }  /* XXX make part of jsyscall interface !? */  r = access(filename, W_OK);  (*env)->ReleaseStringUTFChars (env, name, filename);  return (r < 0 ? 0 : 1);}/* * Can I read from this file. */JNIEXPORT jboolean JNICALLJava_java_io_VMFile_canRead (JNIEnv * env,			     jobject obj __attribute__ ((__unused__)),			     jstring name){  const char *filename;  int r;    filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }  /* XXX make part of jsyscall interface !? */  r = access(filename, R_OK);  (*env)->ReleaseStringUTFChars (env, name, filename);  return (r < 0 ? 0 : 1);}/* * Return length of file. */JNIEXPORT jlong JNICALLJava_java_io_VMFile_length (JNIEnv * env,			    jobject obj __attribute__ ((__unused__)),			    jstring name){  const char *filename;  struct stat buf;  int r;    filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }    r = KSTAT(filename, &buf);  (*env)->ReleaseStringUTFChars (env, name, filename);  if (r != 0) {    return ((jlong)0);  }  return ((jlong)buf.st_size);}/* * Create a directory. */JNIEXPORT jboolean JNICALLJava_java_io_VMFile_mkdir (JNIEnv * env,			   jobject obj __attribute__ ((__unused__)),			   jstring name){  const char *filename;  int r;    filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }   r = KMKDIR(filename, 0777);  (*env)->ReleaseStringUTFChars (env, name, filename);  return (r != 0 ? 0 : 1);}/* * Rename a file. */JNIEXPORT jboolean JNICALLJava_java_io_VMFile_renameTo (JNIEnv * env,			      jobject obj __attribute__ ((__unused__)),			      jstring t, jstring d){  const char *old_filename, *new_filename;  int r;  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);    }  r = KRENAME(old_filename, new_filename);  (*env)->ReleaseStringUTFChars (env, t, old_filename);  (*env)->ReleaseStringUTFChars (env, t, new_filename);  return (r != 0 ? 0 : 1);}/* * Delete a file. */JNIEXPORT jboolean JNICALLJava_java_io_VMFile_delete (JNIEnv * env,			    jobject obj __attribute__ ((__unused__)),			    jstring name){  const char *filename;  int r;	  filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }  r = KREMOVE(filename);  (*env)->ReleaseStringUTFChars (env, name, filename);  return(r != 0 ? 0 : 1);}/* * Get a directory listing. */JNIEXPORT jobjectArray JNICALLJava_java_io_VMFile_list (JNIEnv * env, jobject obj			  __attribute__ ((__unused__)), jstring name){#if defined(HAVE_DIRENT_H)  const char *dirname;  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;  dirname = (*env)->GetStringUTFChars (env, name, 0);  if (dirname == NULL)    {      return (0);    }    /* XXX make part of jsyscall interface !? */  dir = opendir(dirname);  (*env)->ReleaseStringUTFChars (env, name, dirname);  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}JNIEXPORT jboolean JNICALLJava_java_io_VMFile_create (JNIEnv * env,			    jclass clazz __attribute__ ((__unused__)),			    jstring name){  const char *filename;  int fd;  int rc;    filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }   rc = KOPEN(filename, O_EXCL|O_WRONLY|O_BINARY|O_CREAT, 0600, &fd);  (*env)->ReleaseStringUTFChars (env, name, filename);  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;}JNIEXPORT jboolean JNICALLJava_java_io_VMFile_setLastModified (JNIEnv * env,				     jobject obj __attribute__ ((__unused__)),				     jstring name, jlong newtime){#ifdef HAVE_UTIME_H  const char *filename;  int result;  struct utimbuf ub;#endif    if (newtime < 0)    SignalError("java.lang.IllegalArgumentException", "time < 0");#ifdef HAVE_UTIME_H  ub.actime = (time_t)(newtime / 1000);  ub.modtime = ub.actime;  filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }  result = utime(filename, &ub);  (*env)->ReleaseStringUTFChars (env, name, filename);  return result >= 0;#else  return 0;#endif}JNIEXPORT jboolean JNICALLJava_java_io_VMFile_setReadOnly (JNIEnv * env,				 jobject obj __attribute__ ((__unused__)),				 jstring name){  const char *filename;  struct stat buf;  int r;    filename = (*env)->GetStringUTFChars (env, name, 0);  if (filename == NULL)    {      return (0);    }    r = KSTAT(filename, &buf);  if (r == 0)    r = chmod(filename, buf.st_mode & ~(S_IWOTH|S_IWGRP|S_IWUSR));  (*env)->ReleaseStringUTFChars (env, name, filename);  return (r == 0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -