From fca2738d67e713599384b8a3faa49ae674d5801c Mon Sep 17 00:00:00 2001 From: Alexey Zelkin Date: Wed, 25 Jun 2003 22:42:33 +0000 Subject: Reduce code duplication by separating _PathLocle detection code into internal helper function. --- lib/libc/locale/setlocale.c | 53 +++++++++++++++++++++++++---------------- lib/libc/locale/setlocale.h | 2 ++ lib/libc/locale/setrunelocale.c | 19 +++------------ 3 files changed, 37 insertions(+), 37 deletions(-) (limited to 'lib/libc') diff --git a/lib/libc/locale/setlocale.c b/lib/libc/locale/setlocale.c index 48c40bc91718..cea932689776 100644 --- a/lib/libc/locale/setlocale.c +++ b/lib/libc/locale/setlocale.c @@ -262,6 +262,7 @@ loadlocale(category) char *new = new_categories[category]; char *old = current_categories[category]; int (*func)(const char *); + int saved_errno; if ((new[0] == '.' && (new[1] == '\0' || (new[1] == '.' && new[2] == '\0'))) || @@ -270,27 +271,11 @@ loadlocale(category) return (NULL); } - if (_PathLocale == NULL) { - char *p = getenv("PATH_LOCALE"); - - if (p != NULL -#ifndef __NETBSD_SYSCALLS - && !issetugid() -#endif - ) { - if (strlen(p) + 1/*"/"*/ + ENCODING_LEN + - 1/*"/"*/ + CATEGORY_LEN >= PATH_MAX) { - errno = ENAMETOOLONG; - return (NULL); - } - _PathLocale = strdup(p); - if (_PathLocale == NULL) { - errno = ENOMEM; - return (NULL); - } - } else - _PathLocale = _PATH_LOCALE; - } + saved_errno = errno; + errno = __detect_path_locale(); + if (errno != 0) + return (NULL); + errno = saved_errno; switch (category) { case LC_CTYPE: @@ -327,3 +312,29 @@ loadlocale(category) return (NULL); } +/* + * Detect locale storage location and store its value to _PathLocale variable + */ +int +__detect_path_locale(void) +{ + if (_PathLocale == NULL) { + char *p = getenv("PATH_LOCALE"); + + if (p != NULL +#ifndef __NETBSD_SYSCALLS + && !issetugid() +#endif + ) { + if (strlen(p) + 1/*"/"*/ + ENCODING_LEN + + 1/*"/"*/ + CATEGORY_LEN >= PATH_MAX) + return (ENAMETOOLONG); + _PathLocale = strdup(p); + if (_PathLocale == NULL) + return (errno == 0 ? ENOMEM : errno); + } else + _PathLocale = _PATH_LOCALE; + } + return (0); +} + diff --git a/lib/libc/locale/setlocale.h b/lib/libc/locale/setlocale.h index 9804f05f332c..54f6328f00f6 100644 --- a/lib/libc/locale/setlocale.h +++ b/lib/libc/locale/setlocale.h @@ -34,4 +34,6 @@ extern char *_PathLocale; +int __detect_path_locale(void); + #endif /* !_SETLOCALE_H_ */ diff --git a/lib/libc/locale/setrunelocale.c b/lib/libc/locale/setrunelocale.c index cd5384b1c09b..4b1ace4fe186 100644 --- a/lib/libc/locale/setrunelocale.c +++ b/lib/libc/locale/setrunelocale.c @@ -95,23 +95,10 @@ setrunelocale(char *encoding) /* * Slurp the locale file into the cache. */ - if (_PathLocale == NULL) { - char *p = getenv("PATH_LOCALE"); + ret = __detect_path_locale(); + if (ret != 0) + return (ret); - if (p != NULL -#ifndef __NETBSD_SYSCALLS - && !issetugid() -#endif - ) { - if (strlen(p) + 1/*"/"*/ + ENCODING_LEN + - 1/*"/"*/ + CATEGORY_LEN >= PATH_MAX) - return (ENAMETOOLONG); - _PathLocale = strdup(p); - if (_PathLocale == NULL) - return (errno == 0 ? ENOMEM : errno); - } else - _PathLocale = _PATH_LOCALE; - } /* Range checking not needed, encoding length already checked above */ (void) strcpy(name, _PathLocale); (void) strcat(name, "/"); -- cgit v1.2.3