X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmono-config.c;h=e73b23ab258c325e5a9b03058204f070a39b91f3;hb=8bee07fc5845602eb65d07df83d82e8e150fb96b;hp=f6e56819353c6ec6064d59a4ebd275fe767f1657;hpb=9530c5256847039bb3af8aa7e5cb10d4ea5f5051;p=mono.git diff --git a/mono/metadata/mono-config.c b/mono/metadata/mono-config.c index f6e56819353..e73b23ab258 100644 --- a/mono/metadata/mono-config.c +++ b/mono/metadata/mono-config.c @@ -5,7 +5,8 @@ * * Author: Paolo Molaro (lupus@ximian.com) * - * (C) 2002 Ximian, Inc. + * Copyright 2002-2003 Ximian, Inc (http://www.ximian.com) + * Copyright 2004-2009 Novell, Inc (http://www.novell.com) */ #include "config.h" #include @@ -16,9 +17,11 @@ #include "mono/metadata/mono-config.h" #include "mono/metadata/metadata-internals.h" #include "mono/metadata/object-internals.h" -#include "mono/utils/mono-logger.h" +#include "mono/utils/mono-logger-internal.h" -#if defined(__linux__) +#if defined(TARGET_PS3) +#define CONFIG_OS "CellOS" +#elif defined(__linux__) #define CONFIG_OS "linux" #elif defined(__APPLE__) #define CONFIG_OS "osx" @@ -36,11 +39,14 @@ #define CONFIG_OS "aix" #elif defined(__hpux) #define CONFIG_OS "hpux" +#elif defined(__HAIKU__) +#define CONFIG_OS "haiku" #else #warning Unknown operating system #define CONFIG_OS "unknownOS" #endif +#ifndef CONFIG_CPU #if defined(__i386__) #define CONFIG_CPU "x86" #define CONFIG_WORDSIZE "32" @@ -50,9 +56,13 @@ #elif defined(sparc) || defined(__sparc__) #define CONFIG_CPU "sparc" #define CONFIG_WORDSIZE "32" -#elif defined(__ppc64__) || defined(__powerpc64__) -#define CONFIG_CPU "ppc64" +#elif defined(__ppc64__) || defined(__powerpc64__) || defined(TARGET_POWERPC) #define CONFIG_WORDSIZE "64" +#ifdef __mono_ppc_ilp32__ +# define CONFIG_CPU "ppc64ilp32" +#else +# define CONFIG_CPU "ppc64" +#endif #elif defined(__ppc__) || defined(__powerpc__) #define CONFIG_CPU "ppc" #define CONFIG_WORDSIZE "32" @@ -78,9 +88,10 @@ #define CONFIG_CPU "mips" #define CONFIG_WORDSIZE "32" #else -#warning Unknown CPU +#error Unknown CPU #define CONFIG_CPU "unknownCPU" #endif +#endif static void start_element (GMarkupParseContext *context, const gchar *element_name, @@ -121,6 +132,9 @@ mono_parser = { static GHashTable *config_handlers; +static const char *mono_cfg_dir = NULL; +static char *mono_cfg_dir_allocated = NULL; + /* when this interface is stable, export it. */ typedef struct MonoParseHandler MonoParseHandler; @@ -135,6 +149,12 @@ struct MonoParseHandler { void (*finish) (gpointer user_data); }; +typedef struct { + MonoAssemblyBindingInfo *info; + void (*info_parsed)(MonoAssemblyBindingInfo *info, void *user_data); + void *user_data; +} ParserUserData; + typedef struct { MonoParseHandler *current; void *user_data; @@ -201,6 +221,13 @@ static void parse_error (GMarkupParseContext *context, GError *error, gpointer user_data) { + ParseState *state = user_data; + const gchar *msg; + const gchar *filename; + + filename = state && state->user_data ? (gchar *) state->user_data : ""; + msg = error && error->message ? error->message : ""; + g_warning ("Error parsing %s: %s", filename, msg); } static int @@ -317,7 +344,7 @@ legacyUEP_start (gpointer user_data, (attribute_names [0] != NULL) && (strcmp (attribute_names [0], "enabled") == 0)) { if ((strcmp (attribute_values [0], "1") == 0) || - (g_strcasecmp (attribute_values [0], "true") == 0)) { + (g_ascii_strcasecmp (attribute_values [0], "true") == 0)) { mono_runtime_unhandled_exception_policy_set (MONO_UNHANDLED_POLICY_LEGACY); } } @@ -344,6 +371,14 @@ mono_config_init (void) g_hash_table_insert (config_handlers, (gpointer) legacyUEP_handler.element_name, (gpointer) &legacyUEP_handler); } +void +mono_config_cleanup (void) +{ + if (config_handlers) + g_hash_table_destroy (config_handlers); + g_free (mono_cfg_dir_allocated); +} + /* FIXME: error handling */ static void @@ -365,15 +400,23 @@ mono_config_parse_xml_with_context (ParseState *state, const char *text, gsize l static int mono_config_parse_file_with_context (ParseState *state, const char *filename) { - char *text; + gchar *text; gsize len; + gint offset; mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_CONFIG, "Config attempting to parse: '%s'.", filename); if (!g_file_get_contents (filename, &text, &len, NULL)) return 0; - mono_config_parse_xml_with_context (state, text, len); + + + offset = 0; + if (len > 3 && text [0] == '\xef' && text [1] == (gchar) '\xbb' && text [2] == '\xbf') + offset = 3; /* Skip UTF-8 BOM */ + if (state->user_data == NULL) + state->user_data = (gpointer) filename; + mono_config_parse_xml_with_context (state, text + offset, len - offset); g_free (text); return 1; } @@ -388,7 +431,8 @@ void mono_config_parse_memory (const char *buffer) { ParseState state = {NULL}; - + + state.user_data = (gpointer) ""; mono_config_parse_xml_with_context (&state, buffer, strlen (buffer)); } @@ -396,6 +440,7 @@ static void mono_config_parse_file (const char *filename) { ParseState state = {NULL}; + state.user_data = (gpointer) filename; mono_config_parse_file_with_context (&state, filename); } @@ -465,8 +510,10 @@ mono_config_for_assembly (MonoImage *assembly) state.assembly = assembly; bundled_config = mono_config_string_for_assembly_file (assembly->module_name); - if (bundled_config) + if (bundled_config) { + state.user_data = (gpointer) ""; mono_config_parse_xml_with_context (&state, bundled_config, strlen (bundled_config)); + } cfg_name = g_strdup_printf ("%s.config", mono_image_get_filename (assembly)); mono_config_parse_file_with_context (&state, cfg_name); @@ -481,7 +528,7 @@ mono_config_for_assembly (MonoImage *assembly) got_it += mono_config_parse_file_with_context (&state, cfg); g_free (cfg); -#ifndef PLATFORM_WIN32 +#ifdef TARGET_WIN32 cfg = g_build_filename (home, ".mono", "assemblies", aname, cfg_name, NULL); got_it += mono_config_parse_file_with_context (&state, cfg); g_free (cfg); @@ -504,7 +551,7 @@ void mono_config_parse (const char *filename) { const char *home; char *mono_cfg; -#ifndef PLATFORM_WIN32 +#ifndef TARGET_WIN32 char *user_cfg; #endif @@ -523,7 +570,7 @@ mono_config_parse (const char *filename) { mono_config_parse_file (mono_cfg); g_free (mono_cfg); -#ifndef PLATFORM_WIN32 +#ifndef TARGET_WIN32 home = g_get_home_dir (); user_cfg = g_strconcat (home, G_DIR_SEPARATOR_S, ".mono/config", NULL); mono_config_parse_file (user_cfg); @@ -531,8 +578,6 @@ mono_config_parse (const char *filename) { #endif } -static const char *mono_cfg_dir = NULL; - /* Invoked during startup */ void mono_set_config_dir (const char *dir) @@ -540,7 +585,7 @@ mono_set_config_dir (const char *dir) /* If this variable is set, overrides the directory computed */ mono_cfg_dir = g_getenv ("MONO_CFG_DIR"); if (mono_cfg_dir == NULL) - mono_cfg_dir = g_strdup (dir); + mono_cfg_dir = mono_cfg_dir_allocated = g_strdup (dir); } const char* @@ -564,17 +609,43 @@ mono_get_machine_config (void) return bundled_machine_config; } +static void +assembly_binding_end (gpointer user_data, const char *element_name) +{ + ParserUserData *pud = user_data; + + if (!strcmp (element_name, "dependentAssembly")) { + if (pud->info_parsed && pud->info) { + pud->info_parsed (pud->info, pud->user_data); + g_free (pud->info->name); + g_free (pud->info->culture); + } + } +} + static void publisher_policy_start (gpointer user_data, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values) { + ParserUserData *pud; MonoAssemblyBindingInfo *info; int n; - info = user_data; - if (!strcmp (element_name, "assemblyIdentity")) { + pud = user_data; + info = pud->info; + if (!strcmp (element_name, "dependentAssembly")) { + info->name = NULL; + info->culture = NULL; + info->has_old_version_bottom = FALSE; + info->has_old_version_top = FALSE; + info->has_new_version = FALSE; + info->is_valid = FALSE; + memset (&info->old_version_bottom, 0, sizeof (info->old_version_bottom)); + memset (&info->old_version_top, 0, sizeof (info->old_version_top)); + memset (&info->new_version, 0, sizeof (info->new_version)); + } if (!strcmp (element_name, "assemblyIdentity")) { for (n = 0; attribute_names [n]; n++) { const gchar *attribute_name = attribute_names [n]; @@ -678,9 +749,14 @@ publisher_policy_parser = { void mono_config_parse_publisher_policy (const gchar *filename, MonoAssemblyBindingInfo *info) { + ParserUserData user_data = { + info, + NULL, + NULL + }; ParseState state = { &publisher_policy_parser, /* MonoParseHandler */ - info, /* user_data */ + &user_data, /* user_data */ NULL, /* MonoImage (we don't need it right now)*/ TRUE /* We are already inited */ }; @@ -688,3 +764,35 @@ mono_config_parse_publisher_policy (const gchar *filename, MonoAssemblyBindingIn mono_config_parse_file_with_context (&state, filename); } +static MonoParseHandler +config_assemblybinding_parser = { + "", /* We don't need to use declare an xml element */ + NULL, + publisher_policy_start, + NULL, + assembly_binding_end, + NULL +}; + +void +mono_config_parse_assembly_bindings (const char *filename, int amajor, int aminor, void *user_data, void (*infocb)(MonoAssemblyBindingInfo *info, void *user_data)) +{ + MonoAssemblyBindingInfo info; + ParserUserData pud; + ParseState state; + + info.major = amajor; + info.minor = aminor; + + pud.info = &info; + pud.info_parsed = infocb; + pud.user_data = user_data; + + state.current = &config_assemblybinding_parser; /* MonoParseHandler */ + state.user_data = &pud; + state.assembly = NULL; /* MonoImage (we don't need it right now)*/ + state.inited = TRUE; /* We are already inited */ + + mono_config_parse_file_with_context (&state, filename); +} +