X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmono-config.c;h=d0af8b07f6163ac3f6b65baf332be61e71dc5daa;hb=37e3c51b13ccfc964103ae2bcfe7a5aeb7008bd7;hp=141b594766d1b24ea62f12fc02f2266497709fee;hpb=24845a088636f97398dcff1f1b50dc8ac51756c0;p=mono.git diff --git a/mono/metadata/mono-config.c b/mono/metadata/mono-config.c index 141b594766d..d0af8b07f61 100644 --- a/mono/metadata/mono-config.c +++ b/mono/metadata/mono-config.c @@ -17,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" @@ -31,32 +33,32 @@ #define CONFIG_OS "netbsd" #elif defined(__OpenBSD__) #define CONFIG_OS "openbsd" -#elif defined(__WIN32__) +#elif defined(__WIN32__) || defined(TARGET_WIN32) #define CONFIG_OS "windows" #elif defined(_IBMR2) #define CONFIG_OS "aix" #elif defined(__hpux) #define CONFIG_OS "hpux" -#elif defined(SN_TARGET_PS3) -#define CONFIG_OS "CellOS" +#elif defined(__HAIKU__) +#define CONFIG_OS "haiku" #else #warning Unknown operating system #define CONFIG_OS "unknownOS" #endif #ifndef CONFIG_CPU -#if defined(__i386__) +#if defined(__i386__) || defined(TARGET_X86) #define CONFIG_CPU "x86" #define CONFIG_WORDSIZE "32" -#elif defined(__x86_64__) +#elif defined(__x86_64__) || defined(TARGET_AMD64) #define CONFIG_CPU "x86-64" #define CONFIG_WORDSIZE "64" #elif defined(sparc) || defined(__sparc__) #define CONFIG_CPU "sparc" #define CONFIG_WORDSIZE "32" -#elif defined(__ppc64__) || defined(__powerpc64__) +#elif defined(__ppc64__) || defined(__powerpc64__) || defined(TARGET_POWERPC) #define CONFIG_WORDSIZE "64" -#ifdef __mono_ppc_ilp32__ +#ifdef __mono_ppc_ilp32__ # define CONFIG_CPU "ppc64ilp32" #else # define CONFIG_CPU "ppc64" @@ -76,17 +78,11 @@ #elif defined(__ia64__) #define CONFIG_CPU "ia64" #define CONFIG_WORDSIZE "64" -#elif defined(__alpha__) -#define CONFIG_CPU "alpha" -#define CONFIG_WORDSIZE "64" -#elif defined(hppa) || defined(__hppa__) -#define CONFIG_CPU "hppa" -#define CONFIG_WORDSIZE "32" #elif defined(mips) || defined(__mips) || defined(_mips) #define CONFIG_CPU "mips" #define CONFIG_WORDSIZE "32" #else -#warning Unknown CPU +#error Unknown CPU #define CONFIG_CPU "unknownCPU" #endif #endif @@ -130,6 +126,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; @@ -144,6 +143,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; @@ -210,6 +215,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 @@ -353,6 +365,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 @@ -374,15 +394,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; } @@ -397,7 +425,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)); } @@ -405,6 +434,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); } @@ -474,8 +504,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); @@ -490,7 +522,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); @@ -513,7 +545,7 @@ void mono_config_parse (const char *filename) { const char *home; char *mono_cfg; -#ifndef PLATFORM_WIN32 +#ifndef TARGET_WIN32 char *user_cfg; #endif @@ -532,7 +564,7 @@ mono_config_parse (const char *filename) { mono_config_parse_file (mono_cfg); g_free (mono_cfg); -#ifndef PLATFORM_WIN32 +#if !defined(TARGET_WIN32) && !defined(__native_client__) home = g_get_home_dir (); user_cfg = g_strconcat (home, G_DIR_SEPARATOR_S, ".mono/config", NULL); mono_config_parse_file (user_cfg); @@ -540,8 +572,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) @@ -549,7 +579,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* @@ -573,17 +603,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]; @@ -687,9 +743,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 */ }; @@ -697,3 +758,49 @@ 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); +} + +static mono_bool mono_server_mode = FALSE; + +void +mono_config_set_server_mode (mono_bool server_mode) +{ + mono_server_mode = server_mode; +} + +mono_bool +mono_config_is_server_mode (void) +{ + return mono_server_mode; +} +