Reduce code duplication by separating _PathLocle detection code into

internal helper function.
This commit is contained in:
phantom 2003-06-25 22:42:33 +00:00
parent c04a5c6e67
commit 5ee7a43fea
3 changed files with 37 additions and 37 deletions

View File

@ -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);
}

View File

@ -34,4 +34,6 @@
extern char *_PathLocale;
int __detect_path_locale(void);
#endif /* !_SETLOCALE_H_ */

View File

@ -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, "/");