/* src/vmcore/suck.c - functions to read LE ordered types from a buffer
- Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
- C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
- E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
- J. Wenninger, Institut f. Computersprachen - TU Wien
+ Copyright (C) 1996-2005, 2006, 2007, 2008
+ CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: suck.c 7246 2007-01-29 18:49:05Z twisti $
-
*/
#include "config.h"
-#include <dirent.h>
-#include <sys/stat.h>
+#include <assert.h>
#include <stdlib.h>
#include "vm/types.h"
#include "mm/memory.h"
-#if defined(ENABLE_THREADS)
-# include "threads/native/lock.h"
-#else
-# include "threads/none/lock.h"
-#endif
+#include "threads/lock-common.h"
#include "toolbox/list.h"
#include "toolbox/logging.h"
#include "toolbox/util.h"
-#include "vm/exceptions.h"
+#include "vm/exceptions.hpp"
#include "vm/properties.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
#include "vmcore/loader.h"
#include "vmcore/options.h"
#include "vmcore/suck.h"
+#include "vmcore/os.hpp"
#include "vmcore/zip.h"
/* global variables ***********************************************************/
-list *list_classpath_entries;
+list_t *list_classpath_entries;
/* suck_init *******************************************************************
bool suck_init(void)
{
+ TRACESUBSYSTEMINITIALIZATION("suck_init");
+
list_classpath_entries = list_create(OFFSET(list_classpath_entry, linkage));
/* everything's ok */
*******************************************************************************/
-#if defined(__LINUX__)
static int scandir_filter(const struct dirent *a)
-#else
-static int scandir_filter(struct dirent *a)
-#endif
{
s4 namlen;
*******************************************************************************/
-void suck_add_from_property(char *key)
+void suck_add_from_property(const char *key)
{
- char *value;
- char *start;
- char *end;
+ const char *value;
+ const char *start;
+ const char *end;
char *path;
s4 pathlen;
struct dirent **namelist;
s4 n;
s4 i;
s4 namlen;
- char *tmpbootclasspath;
+ char *boot_class_path;
+ char *p;
/* get the property value */
/* scan the directory found for zip/jar files */
- n = scandir(path, &namelist, scandir_filter, alphasort);
+ n = os_scandir(path, &namelist, scandir_filter, alphasort);
/* On error, just continue, this should be ok. */
namlen = strlen(namelist[i]->d_name);
#endif
- /* reallocate memory for bootclasspath */
-
- tmpbootclasspath = MNEW(char,
- pathlen + strlen("/") + namlen +
- strlen(":") +
- strlen(_Jv_bootclasspath) +
- strlen("0"));
+ /* Allocate memory for bootclasspath. */
- /* prepend the file found to bootclasspath */
+ // FIXME Make boot_class_path const char*.
+ boot_class_path = (char*) properties_get("sun.boot.class.path");
- strcpy(tmpbootclasspath, path);
- strcat(tmpbootclasspath, "/");
- strcat(tmpbootclasspath, namelist[i]->d_name);
- strcat(tmpbootclasspath, ":");
+ p = MNEW(char,
+ pathlen + strlen("/") + namlen +
+ strlen(":") +
+ strlen(boot_class_path) +
+ strlen("0"));
- strcat(tmpbootclasspath, _Jv_bootclasspath);
+ /* Prepend the file found to the bootclasspath. */
- /* free old bootclasspath memory */
+ strcpy(p, path);
+ strcat(p, "/");
+ strcat(p, namelist[i]->d_name);
+ strcat(p, ":");
+ strcat(p, boot_class_path);
- MFREE(_Jv_bootclasspath, u1, strlen(_Jv_bootclasspath));
+ properties_add("sun.boot.class.path", p);
+ properties_add("java.boot.class.path", p);
- /* and set the new bootclasspath */
-
- _Jv_bootclasspath = tmpbootclasspath;
+ MFREE(boot_class_path, char, strlen(boot_class_path));
/* free the memory allocated by scandir */
/* (We use `free` as the memory came from the C library.) */
{
#ifdef ENABLE_VERIFIER
if (len < 0 || ((cb->data + cb->size) - cb->pos) < len) {
- exceptions_throw_classformaterror((cb)->class, "Truncated class file");
+ exceptions_throw_classformaterror(cb->clazz, "Truncated class file");
return false;
}
#endif /* ENABLE_VERIFIER */
suck_nbytes((u1*) (&f), cb, 4);
#endif
- if (sizeof(float) != 4) {
- exceptions_throw_internalerror("Incompatible float-format");
-
- /* XXX should we exit in such a case? */
- throw_exception_exit();
- }
+ assert(sizeof(float) == 4);
return f;
}
u1 buffer[8];
u2 i;
-#if defined(__ARM__) && defined(__ARMEL__) && !defined(__VFP_FP__)
+# if defined(__ARM__) && defined(__ARMEL__) && !defined(__VFP_FP__)
/*
* On little endian ARM processors when using FPA, word order
* of doubles is still big endian. So take that into account
buffer[3 - i] = suck_u1(cb);
for (i = 0; i < 4; i++)
buffer[7 - i] = suck_u1(cb);
-#else
+# else
for (i = 0; i < 8; i++)
buffer[7 - i] = suck_u1(cb);
-#endif /* defined(__ARM__) && ... */
+# endif /* defined(__ARM__) && ... */
MCOPY((u1 *) (&d), buffer, u1, 8);
#else
suck_nbytes((u1*) (&d), cb, 8);
#endif
- if (sizeof(double) != 8) {
- exceptions_throw_internalerror("Incompatible double-format");
-
- /* XXX should we exit in such a case? */
- throw_exception_exit();
- }
+ assert(sizeof(double) == 8);
return d;
}
strcpy(path, lce->path);
strcat(path, filename);
- classfile = fopen(path, "r");
+ classfile = os_fopen(path, "r");
if (classfile) { /* file exists */
- if (!stat(path, &buffer)) { /* read classfile data */
+ if (!os_stat(path, &buffer)) { /* read classfile data */
cb = NEW(classbuffer);
- cb->class = c;
+ cb->clazz = c;
cb->size = buffer.st_size;
cb->data = MNEW(u1, cb->size);
cb->pos = cb->data;
/* read class data */
- len = fread(cb->data, 1, cb->size, classfile);
+ len = os_fread((void *) cb->data, 1, cb->size,
+ classfile);
if (len != buffer.st_size) {
suck_stop(cb);
/* close the class file */
- fclose(classfile);
+ os_fclose(classfile);
}
}