Not needed anymore.
[kopensolaris-gnu/glibc.git] / locale / loadlocale.c
index 5894b07..d856063 100644 (file)
@@ -1,22 +1,22 @@
 /* Functions to read locale data files.
-Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <errno.h>
 #include <fcntl.h>
@@ -70,6 +70,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
   struct locale_data *newdata;
   int save_err;
   int swap = 0;
+  int mmaped = 1;
   size_t cnt;
   inline unsigned int SWAP (const unsigned int *inw)
     {
@@ -126,11 +127,12 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
 #endif
   filedata = (void *) __mmap ((caddr_t) 0, st.st_size, PROT_READ,
                              MAP_FILE|MAP_COPY|MAP_INHERIT, fd, 0);
-  if (filedata == (void *) -1)
+  if ((void *) filedata == MAP_FAILED)
     {
       if (errno == ENOSYS)
        {
          /* No mmap; allocate a buffer and read from the file.  */
+         mmaped = 0;
          filedata = malloc (st.st_size);
          if (filedata != NULL)
            {
@@ -144,7 +146,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
                    {
                      free (filedata);
                      if (nread == 0)
-                       errno = EINVAL; /* Bizarreness going on.  */
+                       __set_errno (EINVAL); /* Bizarreness going on.  */
                      goto puntfd;
                    }
                  p += nread;
@@ -153,11 +155,14 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
            }
          else
            goto puntfd;
-         errno = save_err;
+         __set_errno (save_err);
        }
       else
        goto puntfd;
     }
+  else if (st.st_size < sizeof (*filedata))
+    /* This cannot be a locale data file since it's too small.  */
+    goto puntfd;
 
   if (filedata->magic == LIMAGIC (category))
     /* Good data file in our byte order.  */
@@ -184,7 +189,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
        >= (size_t) st.st_size))
     {
       /* Insufficient data.  */
-      errno = EINVAL;
+      __set_errno (EINVAL);
       goto puntmap;
     }
 
@@ -197,6 +202,8 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
   newdata->name = NULL;        /* This will be filled if necessary in findlocale.c. */
   newdata->filedata = (void *) filedata;
   newdata->filesize = st.st_size;
+  newdata->mmaped = mmaped;
+  newdata->usage_count = 0;
   newdata->nstrings = _nl_category_num_items[category];
   for (cnt = 0; cnt < newdata->nstrings; ++cnt)
     {
@@ -204,7 +211,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
       if (idx >= newdata->filesize)
        {
          free (newdata);
-         errno = EINVAL;
+         __set_errno (EINVAL);
          goto puntmap;
        }
       if (_nl_value_types[category][cnt] == word)
@@ -217,3 +224,14 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
   __close (fd);
   file->data = newdata;
 }
+
+void
+_nl_unload_locale (struct locale_data *locale)
+{
+  if (locale->mmaped)
+    __munmap ((caddr_t) locale->filedata, locale->filesize);
+  else
+    free ((void *) locale->filedata);
+
+  free (locale);
+}