diff options
Diffstat (limited to 'locale')
-rw-r--r-- | locale/loadlocale.c | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/locale/loadlocale.c b/locale/loadlocale.c index 0bb517ca44..c2d5b89bc1 100644 --- a/locale/loadlocale.c +++ b/locale/loadlocale.c @@ -1,5 +1,5 @@ /* Functions to read locale data files. - Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -23,7 +23,9 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> -#include <sys/mman.h> +#ifdef _POSIX_MAPPED_FILES +# include <sys/mman.h> +#endif #include <sys/stat.h> #include "localeinfo.h" @@ -87,13 +89,17 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) /* LOCALE/LC_foo is a directory; open LOCALE/LC_foo/SYS_LC_foo instead. */ char *newp; + size_t filenamelen; __close (fd); - newp = (char *) alloca (strlen (file->filename) + filenamelen = strlen (file->filename); + newp = (char *) alloca (filenamelen + 5 + _nl_category_name_sizes[category] + 1); - __stpcpy (__stpcpy (__stpcpy (newp, file->filename), "/SYS_"), - _nl_category_names[category]); + __mempcpy (__mempcpy (__mempcpy (newp, file->filename, filenamelen), + "/SYS_", 5), + _nl_category_names[category], + _nl_category_name_sizes[category] + 1); fd = __open (newp, O_RDONLY); if (fd < 0) @@ -105,24 +111,32 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) /* Map in the file's data. */ save_err = errno; -#ifndef MAP_COPY +#ifdef _POSIX_MAPPED_FILES +# ifndef MAP_COPY /* Linux seems to lack read-only copy-on-write. */ -#define MAP_COPY MAP_PRIVATE -#endif -#ifndef MAP_FILE +# define MAP_COPY MAP_PRIVATE +# endif +# ifndef MAP_FILE /* Some systems do not have this flag; it is superfluous. */ -#define MAP_FILE 0 -#endif -#ifndef MAP_INHERIT +# define MAP_FILE 0 +# endif +# ifndef MAP_INHERIT /* Some systems might lack this; they lose. */ -#define MAP_INHERIT 0 -#endif +# define MAP_INHERIT 0 +# endif filedata = (void *) __mmap ((caddr_t) 0, st.st_size, PROT_READ, MAP_FILE|MAP_COPY|MAP_INHERIT, fd, 0); - if ((void *) filedata == MAP_FAILED) + if ((void *) filedata != MAP_FAILED) + { + if (st.st_size < sizeof (*filedata)) + /* This cannot be a locale data file since it's too small. */ + goto puntfd; + } + else { if (errno == ENOSYS) { +#endif /* _POSIX_MAPPED_FILES */ /* No mmap; allocate a buffer and read from the file. */ mmaped = 0; filedata = malloc (st.st_size); @@ -148,19 +162,20 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) else goto puntfd; __set_errno (save_err); +#ifdef _POSIX_MAPPED_FILES } else goto puntfd; } - else if (st.st_size < sizeof (*filedata)) - /* This cannot be a locale data file since it's too small. */ - goto puntfd; +#endif /* _POSIX_MAPPED_FILES */ if (filedata->magic != LIMAGIC (category)) /* Bad data file in either byte order. */ { puntmap: +#ifdef _POSIX_MAPPED_FILES __munmap ((caddr_t) filedata, st.st_size); +#endif puntfd: __close (fd); return; @@ -208,9 +223,11 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) void _nl_unload_locale (struct locale_data *locale) { +#ifdef _POSIX_MAPPED_FILES if (locale->mmaped) __munmap ((caddr_t) locale->filedata, locale->filesize); else +#endif free ((void *) locale->filedata); free (locale); |