1 /* loadmsgcat.c -- load needed message catalogs
2 Copyright (C) 1995 Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 #include <sys/types.h>
26 #if defined STDC_HEADERS || defined _LIBC
30 #if defined HAVE_UNISTD_H || defined _LIBC
34 #if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC
35 # include <sys/mman.h>
41 /* @@ end of prolog @@ */
44 /* Rename the non ANSI C functions. This is required by the standard
45 because some ANSI C functions will require linking with this object
46 file and the name space must not be polluted. */
47 # define fstat __fstat
49 # define close __close
52 # define munmap __munmap
55 /* We need a sign, whether a new catalog was loaded, which can be associated
56 with all translations. This is important if the translations are
57 cached by one of GCC's features. */
61 /* Load the message catalogs specified by FILENAME. If it is no valid
62 message catalog do nothing. */
64 _nl_load_domain (domain
)
65 struct loaded_domain
*domain
;
69 struct mo_file_header
*data
= (struct mo_file_header
*) -1;
70 #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
78 /* Try to open the addressed file. */
79 fd
= open (domain
->filename
, O_RDONLY
);
83 /* We must know about the size of the file. */
84 if (fstat (fd
, &st
) != 0
85 && st
.st_size
< (off_t
) sizeof (struct mo_file_header
))
87 /* Something went wrong. */
92 #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
94 /* Now we are ready to load the file. If mmap() is available we try
95 this first. If not available or it failed we try to load it. */
96 data
= (struct mo_file_header
*) mmap (NULL
, st
.st_size
, PROT_READ
,
99 if (data
!= (struct mo_file_header
*) -1)
101 /* mmap() call was successful. */
107 /* If the data is not yet available (i.e. mmap'ed) we try to load
109 if (data
== (struct mo_file_header
*) -1)
114 data
= (struct mo_file_header
*) malloc (st
.st_size
);
118 to_read
= st
.st_size
;
119 read_ptr
= (char *) data
;
122 long int nb
= (long int) read (fd
, read_ptr
, to_read
);
137 /* Using the magic number we can test whether it really is a message
139 if (data
->magic
!= _MAGIC
&& data
->magic
!= _MAGIC_SWAPPED
)
141 /* The magic number is wrong: not a message catalog file. */
142 #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
145 munmap ((caddr_t
) data
, st
.st_size
);
152 domain
->data
= (char *) data
;
153 domain
->must_swap
= data
->magic
!= _MAGIC
;
155 /* Fill in the information about the available tables. */
156 switch (W (domain
->must_swap
, data
->revision
))
159 domain
->nstrings
= W (domain
->must_swap
, data
->nstrings
);
160 domain
->orig_tab
= (struct string_desc
*)
161 ((char *) data
+ W (domain
->must_swap
, data
->orig_tab_offset
));
162 domain
->trans_tab
= (struct string_desc
*)
163 ((char *) data
+ W (domain
->must_swap
, data
->trans_tab_offset
));
164 domain
->hash_size
= W (domain
->must_swap
, data
->hash_tab_size
);
165 domain
->hash_tab
= (nls_uint32
*)
166 ((char *) data
+ W (domain
->must_swap
, data
->hash_tab_offset
));
169 /* This is an illegal revision. */
170 #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
173 munmap ((caddr_t
) data
, st
.st_size
);
181 /* Show that one domain is changed. This might make some cached
182 translation invalid. */