null+****@clear*****
null+****@clear*****
2011年 4月 29日 (金) 19:13:17 JST
Kouhei Sutou 2011-04-29 10:13:17 +0000 (Fri, 29 Apr 2011) New Revision: 60d9bbd074e167d63ec10ce2c5fab1614cef3c72 Log: [win32] guess default document root path from DLL path. PATH_SEPARATOR is removed. Groonga always uses "/" as its internal path separator. Modified files: configure.ac lib/groonga_in.h lib/plugin.c lib/proc.c lib/str.c lib/util.c lib/util.h src/groonga.c Modified: configure.ac (+1 -0) =================================================================== --- configure.ac 2011-04-29 04:03:24 +0000 (9e78186) +++ configure.ac 2011-04-29 10:13:17 +0000 (dd076b4) @@ -799,6 +799,7 @@ GRN_DEFS="$GRN_DEFS -DGRN_PLUGINS_DIR=\\\"\"\$(pluginsdir)\"\\\"" GRN_DEFS="$GRN_DEFS -DGRN_RELATIVE_PLUGINS_DIR=\\\"\"lib/\$(relative_pluginsdir)\"\\\"" GRN_DEFS="$GRN_DEFS -DGRN_LOG_PATH=\\\"\"\$(grn_log_path)\"\\\"" GRN_DEFS="$GRN_DEFS -DGRN_DEFAULT_DOCUMENT_ROOT=\\\"\"\$(pkgdatadir)/admin_html\"\\\"" +GRN_DEFS="$GRN_DEFS -DGRN_DEFAULT_RELATIVE_DOCUMENT_ROOT=\\\"\"share/\$(PACKAGE)/admin_html\"\\\"" AC_SUBST(GRN_DEFS) CFLAGS="$CFLAGS $OPT_CFLAGS " LIBS="$LIBS $ZLIB_LIBS $LZO_LIBS $RT_LIBS $PTHREAD_LIBS $M_LIBS $NSL_LIBS $SOCKET_LIBS $WINDOWS_LIBS" Modified: lib/groonga_in.h (+1 -3) =================================================================== --- lib/groonga_in.h 2011-04-29 04:03:24 +0000 (89a7a3e) +++ lib/groonga_in.h 2011-04-29 10:13:17 +0000 (1f4a107) @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2009 Brazil +/* Copyright(C) 2009-2011 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -146,7 +146,6 @@ #undef MSG_WAITALL #define MSG_WAITALL 0 /* before Vista, not supported... */ -#define PATH_SEPARATOR "/" #define fpclassify _fpclass #define CASE_FP_NAN case _FPCLASS_SNAN: case _FPCLASS_QNAN: #define CASE_FP_INFINITE case _FPCLASS_NINF: case _FPCLASS_PINF: @@ -186,7 +185,6 @@ typedef char int_least8_t; # ifndef UINT_LEAST8_MAX typedef unsigned char uint_least8_t; # endif /* UINT_LEAST8_MAX */ -# define PATH_SEPARATOR "/" typedef int grn_sock; # define grn_sock_close close # define CALLBACK Modified: lib/plugin.c (+19 -76) =================================================================== --- lib/plugin.c 2011-04-29 04:03:24 +0000 (37fc45b) +++ lib/plugin.c 2011-04-29 10:13:17 +0000 (61ef742) @@ -20,6 +20,7 @@ #include "db.h" #include "plugin_in.h" #include "ql.h" +#include "util.h" static grn_hash *grn_plugins = NULL; @@ -280,11 +281,11 @@ grn_plugin_register_by_path(grn_ctx *ctx, const char *path) } else { const char *base_name; - base_name = strrchr(path, PATH_SEPARATOR[0]); + base_name = strrchr(path, '/'); if (base_name) { complemented_libs_path[0] = '\0'; strncat(complemented_libs_path, path, base_name - path); - strcat(complemented_libs_path, PATH_SEPARATOR ".libs"); + strcat(complemented_libs_path, "/.libs"); strcat(complemented_libs_path, base_name); strcat(complemented_libs_path, GRN_PLUGIN_SUFFIX); plugin_file = fopen(complemented_libs_path, "r"); @@ -324,79 +325,25 @@ static const char * default_plugins_dir(void) { if (!win32_plugins_dir) { - wchar_t dll_filename[MAX_PATH]; - DWORD dll_filename_size; - dll_filename_size = GetModuleFileNameW(NULL, dll_filename, MAX_PATH); - if (dll_filename_size == 0) { - win32_plugins_dir = GRN_PLUGINS_DIR; - } else { - char *plugins_dir; - DWORD ansi_dll_filename_size; - ansi_dll_filename_size = - WideCharToMultiByte(CP_ACP, 0, dll_filename, dll_filename_size, - NULL, 0, NULL, NULL); - if (ansi_dll_filename_size == 0) { - win32_plugins_dir = GRN_PLUGINS_DIR; - } else { - char *path; - const char *relative_path = GRN_RELATIVE_PLUGINS_DIR; - plugins_dir = malloc(ansi_dll_filename_size + - strlen(relative_path)); - WideCharToMultiByte(CP_ACP, 0, dll_filename, dll_filename_size, - plugins_dir, ansi_dll_filename_size, - NULL, NULL); - if ((path = strrchr(plugins_dir, '\\'))) { - *path = '\0'; - } - path = strrchr(plugins_dir, '\\'); - if (path && (strcasecmp(path + 1, "bin") == 0 || - strcasecmp(path + 1, "lib") == 0)) { - *path = '\0'; - } else { - path = plugins_dir + strlen(plugins_dir); - } - *path = '\\'; - path++; - while (*relative_path) { - if (*relative_path == '/') { - *path = '\\'; - } else { - *path = *relative_path; - } - relative_path++; - path++; - } - *path = '\0'; - win32_plugins_dir = plugins_dir; - } - } + const char *base_dir; + const char *relative_path = GRN_RELATIVE_PLUGINS_DIR; + char *plugins_dir; + char *path; + size_t base_dir_length; + + base_dir = grn_win32_base_dir(); + base_dir_length = strlen(base_dir); + plugins_dir = malloc(base_dir_length + strlen("/") + strlen(relative_path)); + strcpy(plugins_dir, base_dir); + strcat(plugins_dir, "/"); + strcat(plugins_dir, relative_path); + win32_plugins_dir = plugins_dir; } return win32_plugins_dir; } -static void -normalize_path_separator_in_path(char *path) -{ - for (; *path; path++) { - if (*path == '\\') { - *path = PATH_SEPARATOR[0]; - } - } -} - -static void -normalize_path_separator_in_name(char *name) -{ - for (; *name; name++) { - if (*name == '/') { - *name = PATH_SEPARATOR[0]; - } - } -} #else /* WIN32 */ # define default_plugins_dir() GRN_PLUGINS_DIR -# define normalize_path_separator_in_path(path) -# define normalize_path_separator_in_name(name) #endif /* WIN32 */ grn_rc @@ -413,11 +360,10 @@ grn_plugin_register(grn_ctx *ctx, const char *name) plugins_dir = default_plugins_dir(); } strcpy(path, plugins_dir); - normalize_path_separator_in_path(path); dir_last_char = plugins_dir[strlen(path) - 1]; - if (dir_last_char != PATH_SEPARATOR[0]) { - strcat(path, PATH_SEPARATOR); + if (dir_last_char != '/') { + strcat(path, "/"); } name_length = strlen(name); @@ -430,10 +376,7 @@ grn_plugin_register(grn_ctx *ctx, const char *name) return ctx->rc; } - strcpy(normalized_name, name); - normalize_path_separator_in_name(normalized_name); - - strcat(path, normalized_name); + strcat(path, name); return grn_plugin_register_by_path(ctx, path); } Modified: lib/proc.c (+4 -4) =================================================================== --- lib/proc.c 2011-04-29 04:03:24 +0000 (c42ab18) +++ lib/proc.c 2011-04-29 10:13:17 +0000 (376d752) @@ -1037,12 +1037,12 @@ proc_missing(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) return NULL; } grn_document_root_len = (int)l; - if (l > 0 && grn_document_root[l - 1] == PATH_SEPARATOR[0]) { grn_document_root_len--; } + if (l > 0 && grn_document_root[l - 1] == '/') { grn_document_root_len--; } } if ((plen = GRN_TEXT_LEN(VAR(0))) + grn_document_root_len < PATH_MAX) { char path[PATH_MAX]; memcpy(path, grn_document_root, grn_document_root_len); - path[grn_document_root_len] = PATH_SEPARATOR[0]; + path[grn_document_root_len] = '/'; grn_str_url_path_normalize(ctx, GRN_TEXT_VALUE(VAR(0)), GRN_TEXT_LEN(VAR(0)), @@ -1052,8 +1052,8 @@ proc_missing(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) } else { uint32_t abbrlen = 32; ERR(GRN_INVALID_ARGUMENT, - "too long path name: <%s%c%.*s...> %u(%u)", - grn_document_root, PATH_SEPARATOR[0], + "too long path name: <%s/%.*s...> %u(%u)", + grn_document_root, abbrlen < plen ? abbrlen : plen, GRN_TEXT_VALUE(VAR(0)), plen + grn_document_root_len, PATH_MAX); } Modified: lib/str.c (+4 -4) =================================================================== --- lib/str.c 2011-04-29 04:03:24 +0000 (236c72a) +++ lib/str.c 2011-04-29 10:13:17 +0000 (4476acd) @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2009 Brazil +/* Copyright(C) 2009-2011 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -3219,9 +3219,9 @@ grn_str_url_path_normalize(grn_ctx *ctx, const char *path, size_t path_len, if (pc == p + 2 && *(p + 1) == '.') { /* '..' */ if (b - buf >= 2) { - for (b -= 2; *b != PATH_SEPARATOR[0] && b >= buf; b--) {} + for (b -= 2; *b != '/' && b >= buf; b--) {} } - if (*b == PATH_SEPARATOR[0]) { + if (*b == '/') { b++; ERR(GRN_INVALID_ARGUMENT, "parent path doesn't exist."); } @@ -3238,7 +3238,7 @@ grn_str_url_path_normalize(grn_ctx *ctx, const char *path, size_t path_len, b += pc - p; p = pc; if (p < pe && *pc == '/' && be > b) { - *b++ = PATH_SEPARATOR[0]; + *b++ = '/'; p++; } } Modified: lib/util.c (+49 -1) =================================================================== --- lib/util.c 2011-04-29 04:03:24 +0000 (dea483f) +++ lib/util.c 2011-04-29 10:13:17 +0000 (7190b69) @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2010 Brazil +/* Copyright(C) 2010-2011 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -691,3 +691,51 @@ grn_p_geo_point(grn_ctx *ctx, grn_geo_point *point) grn_p(ctx, &obj); grn_obj_unlink(ctx, &obj); } + +#ifdef WIN32 +static char *win32_base_dir = NULL; +const char * +grn_win32_base_dir(void) +{ + if (!win32_base_dir) { + wchar_t dll_filename[MAX_PATH]; + DWORD dll_filename_size; + dll_filename_size = GetModuleFileNameW(NULL, dll_filename, MAX_PATH); + if (dll_filename_size == 0) { + win32_base_dir = "."; + } else { + DWORD ansi_dll_filename_size; + ansi_dll_filename_size = + WideCharToMultiByte(CP_ACP, 0, dll_filename, dll_filename_size, + NULL, 0, NULL, NULL); + if (ansi_dll_filename_size == 0) { + win32_base_dir = "."; + } else { + char *path; + win32_base_dir = malloc(ansi_dll_filename_size); + WideCharToMultiByte(CP_ACP, 0, dll_filename, dll_filename_size, + win32_base_dir, ansi_dll_filename_size, + NULL, NULL); + win32_base_dir[ansi_dll_filename_size] = '\0'; + if ((path = strrchr(win32_base_dir, '\\'))) { + *path = '\0'; + } + path = strrchr(win32_base_dir, '\\'); + if (path && (strcasecmp(path + 1, "bin") == 0 || + strcasecmp(path + 1, "lib") == 0)) { + *path = '\0'; + } else { + path = win32_base_dir + strlen(win32_base_dir); + *path = '\0'; + } + for (path = win32_base_dir; *path; path++) { + if (*path == '\\') { + *path = '/'; + } + } + } + } + } + return win32_base_dir; +} +#endif Modified: lib/util.h (+4 -1) =================================================================== --- lib/util.h 2011-04-29 04:03:24 +0000 (748a89e) +++ lib/util.h 2011-04-29 10:13:17 +0000 (a698675) @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2010 Brazil +/* Copyright(C) 2010-2011 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -36,6 +36,9 @@ grn_obj *grn_inspect_name(grn_ctx *ctx, grn_obj *buffer, grn_obj *obj); void grn_p(grn_ctx *ctx, grn_obj *obj); void grn_p_geo_point(grn_ctx *ctx, grn_geo_point *point); +GRN_API const char *grn_win32_base_dir(void); +GRN_API char *grn_path_separator_to_system(char *dest, char *groonga_path); + #ifdef __cplusplus } #endif Modified: src/groonga.c (+16 -2) =================================================================== --- src/groonga.c 2011-04-29 04:03:24 +0000 (87b0d6a) +++ src/groonga.c 2011-04-29 10:13:17 +0000 (f347340) @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2009-2010 Brazil +/* Copyright(C) 2009-2011 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -2059,6 +2059,20 @@ show_config(FILE *out, const grn_str_getopt_opt *opts, int flags) } } +#ifdef WIN32 +static char win32_default_document_root[PATH_MAX]; +static char * +default_document_root(void) +{ + strcpy(win32_default_document_root, grn_win32_base_dir()); + strcat(win32_default_document_root, "/"); + strcat(win32_default_document_root, GRN_DEFAULT_RELATIVE_DOCUMENT_ROOT); + return win32_default_document_root; +} +#else +# define default_document_root() GRN_DEFAULT_DOCUMENT_ROOT +#endif + int main(int argc, char **argv) { @@ -2195,7 +2209,7 @@ main(int argc, char **argv) if (admin_html_path) { grn_document_root = admin_html_path; } else { - grn_document_root = GRN_DEFAULT_DOCUMENT_ROOT; + grn_document_root = default_document_root(); } } if (protocol) {