aboutsummaryrefslogtreecommitdiff
path: root/locale
diff options
context:
space:
mode:
Diffstat (limited to 'locale')
-rw-r--r--locale/findlocale.c6
-rw-r--r--locale/loadlocale.c46
-rw-r--r--locale/programs/localedef.c6
3 files changed, 41 insertions, 17 deletions
diff --git a/locale/findlocale.c b/locale/findlocale.c
index e2fdd06f6d..af2b36439e 100644
--- a/locale/findlocale.c
+++ b/locale/findlocale.c
@@ -21,7 +21,9 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <sys/mman.h>
+#ifdef _POSIX_MAPPED_FILES
+# include <sys/mman.h>
+#endif
#include "localeinfo.h"
@@ -211,6 +213,7 @@ _nl_remove_locale (int locale, struct locale_data *data)
/* Free the name. */
free ((char *) data->name);
+#ifdef _POSIX_MAPPED_FILES
/* Really delete the data. First delete the real data. */
if (data->mmaped)
{
@@ -223,6 +226,7 @@ _nl_remove_locale (int locale, struct locale_data *data)
}
}
else
+#endif /* _POSIX_MAPPED_FILES */
/* The memory was malloced. */
free ((void *) data->filedata);
diff --git a/locale/loadlocale.c b/locale/loadlocale.c
index d856063d52..8649abb241 100644
--- a/locale/loadlocale.c
+++ b/locale/loadlocale.c
@@ -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"
@@ -113,24 +115,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);
@@ -156,13 +166,12 @@ _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))
/* Good data file in our byte order. */
@@ -175,7 +184,12 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
/* Bad data file in either byte order. */
{
puntmap:
- __munmap ((caddr_t) filedata, st.st_size);
+#ifdef _POSIX_MAPPED_FILES
+ if (mmaped)
+ __munmap ((caddr_t) filedata, st.st_size);
+ else
+#endif /* _POSIX_MAPPED_FILES */
+ free (filedata);
puntfd:
__close (fd);
return;
@@ -228,9 +242,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);
diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c
index 6d32a3fbfa..94d6255378 100644
--- a/locale/programs/localedef.c
+++ b/locale/programs/localedef.c
@@ -30,7 +30,9 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <sys/mman.h>
+#ifdef _POSIX2_LOCALEDEF
+# include <sys/mman.h>
+#endif
#include <sys/stat.h>
#include "error.h"
@@ -276,10 +278,12 @@ cannot `stat' locale file `%s'"),
fname);
localedef->len[cat] = st.st_size;
+#ifdef _POSIX_MAPPED_FILES
localedef->categories[cat].generic
= mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (localedef->categories[cat].generic == MAP_FAILED)
+#endif /* _POSIX_MAPPED_FILES */
{
size_t left = st.st_size;
void *read_ptr;