diff --git a/scm/custom-rt.scm b/scm/custom-rt.scm index ea94593..967f3c7 100644 --- a/scm/custom-rt.scm +++ b/scm/custom-rt.scm @@ -63,7 +63,10 @@ (define custom-file-path (lambda (gsym) (let* ((group-name (symbol->string gsym)) - (path (string-append (get-config-path! #f) + (config-path (get-config-path #f)) + (path (string-append (if config-path + config-path + "") "/customs/custom-" group-name ".scm"))) diff --git a/scm/dynlib.scm b/scm/dynlib.scm index 991ed55..6b67a77 100644 --- a/scm/dynlib.scm +++ b/scm/dynlib.scm @@ -34,14 +34,15 @@ (define uim-dynlib-load-path (if (setugid?) (list (string-append (sys-pkglibdir) "/plugin")) - (let ((home-dir (or (home-directory (user-name)) "")) - (ld-library-path (getenv "LD_LIBRARY_PATH"))) + (let* ((ld-library-path (getenv "LD_LIBRARY_PATH")) + (config-path (get-config-path #f)) + (user-plugin-path (if config-path + (string-append config-path "/plugin") + '()))) (filter string? (append (list (getenv "LIBUIM_PLUGIN_LIB_DIR") - (if home-dir - (string-append (get-config-path! #f) "/plugin") - '()) - (string-append (sys-pkglibdir) "/plugin")) + user-plugin-path + (string-append (sys-pkglibdir) "/plugin")) ;; XXX (if ld-library-path (string-split ld-library-path ":") diff --git a/scm/plugin.scm b/scm/plugin.scm index 2d5d74a..d187429 100644 --- a/scm/plugin.scm +++ b/scm/plugin.scm @@ -39,12 +39,12 @@ (define uim-plugin-scm-load-path (if (setugid?) (list (sys-pkgdatadir)) - (let ((home-dir (or (home-directory (user-name)) "")) + (let ((config-path (get-config-path #f)) (scm-paths (string-split (load-path) ":"))) (filter string? (append scm-paths - (if home-dir - (list (string-append (get-config-path! #f) "/plugin")) + (if config-path + (list (string-append config-path "/plugin")) '()) (list (sys-pkgdatadir))))))) @@ -71,9 +71,9 @@ ;; TODO: write test (define load-module-conf (lambda () - (let* ((home-dir (or (home-directory (user-name)) "")) - (user-module-dir (if home-dir - (string-append (get-config-path! #f) "/plugin/") + (let* ((config-path (get-config-path #f)) + (user-module-dir (if config-path + (string-append config-path "/plugin/") #f)) (conf-file "installed-modules.scm") (user-conf-file (if user-module-dir @@ -100,9 +100,9 @@ ;; TODO: write test (define load-enabled-modules (lambda () - (let* ((home-dir (or (home-directory (user-name)) "")) - (user-module-dir (if home-dir - (string-append (get-config-path! #f) "/plugin/") + (let* ((config-path (get-config-path #f)) + (user-module-dir (if config-path + (string-append config-path "/plugin/") #f)) (file "loader.scm") (user-file (if user-module-dir diff --git a/uim/uim-helper.c b/uim/uim-helper.c index e4a558f..882aea6 100644 --- a/uim/uim-helper.c +++ b/uim/uim-helper.c @@ -207,7 +207,11 @@ uim_helper_get_pathname(char *helper_path, int len) return UIM_TRUE; path_error: - uim_fatal_error("uim_helper_get_pathname()"); +#if USE_UIM_NOTIFY && !UIM_NON_LIBUIM_PROG + uim_notify_fatal("uim_helper_get_pathname() failed"); +#else + fprintf(stderr, "uim_helper_get_pathname() failed\n"); +#endif helper_path[0] = '\0'; UIM_CATCH_ERROR_END(); diff --git a/uim/uim-posix.c b/uim/uim-posix.c index 83691d8..de8a327 100644 --- a/uim/uim-posix.c +++ b/uim/uim-posix.c @@ -141,21 +141,33 @@ home_directory(uim_lisp user_) return MAKE_STR(home); } -uim_bool -uim_check_dir(const char *dir) +static uim_bool +uim_check_dir_internal(const char *dir, int need_prepare) { struct stat st; if (stat(dir, &st) < 0) - return (mkdir(dir, 0700) < 0) ? UIM_FALSE : UIM_TRUE; + if (need_prepare) + return (mkdir(dir, 0700) < 0) ? UIM_FALSE : UIM_TRUE; + else + return UIM_FALSE; else { mode_t mode = S_IFDIR | S_IRUSR | S_IWUSR | S_IXUSR; return ((st.st_mode & mode) == mode) ? UIM_TRUE : UIM_FALSE; } } +/* FIXME: use appropriate name for this API */ +uim_bool +uim_check_dir(const char *dir) +{ + int need_prepare = UIM_TRUE; + + return uim_check_dir_internal(dir, need_prepare); +} + static uim_lisp -c_check_dir(uim_lisp dir_) +c_prepare_dir(uim_lisp dir_) { if (!uim_check_dir(REFER_C_STR(dir_))) { return uim_scm_f(); @@ -163,8 +175,8 @@ c_check_dir(uim_lisp dir_) return uim_scm_t(); } -uim_bool -uim_get_config_path(char *path, int len, int is_getenv) +static uim_bool +uim_get_config_path_internal(char *path, int len, int is_getenv, int need_prepare) { char home[MAXPATHLEN]; @@ -174,34 +186,63 @@ uim_get_config_path(char *path, int len, int is_getenv) if (!uim_get_home_directory(home, sizeof(home), getuid()) && is_getenv) { char *home_env = getenv("HOME"); - if (!home_env) + if (!home_env) { + path[0] = '\0'; return UIM_FALSE; + } - if (strlcpy(home, home_env, sizeof(home)) >= sizeof(home)) + if (strlcpy(home, home_env, sizeof(home)) >= sizeof(home)) { + path[0] = '\0'; return UIM_FALSE; + } } - if (snprintf(path, len, "%s/.uim.d", home) == -1) + if (snprintf(path, len, "%s/.uim.d", home) < 0) { + path[0] = '\0'; return UIM_FALSE; + } - if (!uim_check_dir(path)) { + if (!uim_check_dir_internal(path, need_prepare)) { return UIM_FALSE; } return UIM_TRUE; } +/* FIXME: use appropriate name for this API */ +uim_bool +uim_get_config_path(char *path, int len, int is_getenv) +{ + int need_prepare = UIM_TRUE; + + return uim_get_config_path_internal(path, len, is_getenv, need_prepare); +} + static uim_lisp -c_get_config_path(uim_lisp is_getenv_) +c_prepare_config_path(uim_lisp is_getenv_) { char path[MAXPATHLEN]; + int need_prepare = UIM_TRUE; - if (!uim_get_config_path(path, sizeof(path), C_BOOL(is_getenv_))) + if (!uim_get_config_path_internal(path, sizeof(path), C_BOOL(is_getenv_), need_prepare)) return uim_scm_f(); return MAKE_STR(path); } static uim_lisp +c_get_config_path(uim_lisp is_getenv_) +{ + char path[MAXPATHLEN]; + int need_prepare = UIM_FALSE; + int exist; + + /* No need to check the existence of path in this function */ + exist = uim_get_config_path_internal(path, sizeof(path), C_BOOL(is_getenv_), need_prepare); + + return MAKE_STR(path); +} + +static uim_lisp file_stat_mode(uim_lisp filename, mode_t mode) { struct stat st; @@ -391,8 +432,9 @@ uim_init_posix_subrs(void) uim_scm_init_proc0("user-name", user_name); uim_scm_init_proc1("home-directory", home_directory); - uim_scm_init_proc1("create/check-directory!", c_check_dir); - uim_scm_init_proc1("get-config-path!", c_get_config_path); + uim_scm_init_proc1("create/check-directory!", c_prepare_dir); + uim_scm_init_proc1("get-config-path!", c_prepare_config_path); + uim_scm_init_proc1("get-config-path", c_get_config_path); uim_scm_init_proc1("file-readable?", file_readablep); uim_scm_init_proc1("file-writable?", file_writablep);