- {
- /* Map in the file's data. */
- int save = errno;
- filedata = (void *) __mmap ((caddr_t) 0, st.st_size,
- PROT_READ, MAP_FILE|MAP_COPY, fd, 0);
- if (filedata == (void *) -1)
- {
- if (errno == ENOSYS)
- {
- /* No mmap; allocate a buffer and read from the file. */
- filedata = malloc (st.st_size);
- if (filedata)
- {
- off_t to_read = st.st_size;
- ssize_t nread;
- char *p = (char *) filedata;
- while (to_read > 0)
- {
- nread = __read (fd, p, to_read);
- if (nread <= 0)
- {
- free (filedata);
- if (nread == 0)
- errno = EINVAL; /* Bizarreness going on. */
- goto puntfd;
- }
- p += nread;
- to_read -= nread;
- }
- }
- else
- goto puntfd;
- errno = save;
- }
- else
- goto puntfd;
- }
- }
+ newp = (char *) alloca (strlen (file->filename)
+ + 5 + _nl_category_name_sizes[category] + 1);
+ __stpcpy (__stpcpy (__stpcpy (newp, file->filename), "/SYS_"),
+ _nl_category_names[category]);
+
+ fd = __open (newp, O_RDONLY);
+ if (fd < 0)
+ return;
+
+ if (__fstat (fd, &st) < 0)
+ goto puntfd;
+ }
+
+ /* Map in the file's data. */
+ save_err = errno;
+#ifndef MAP_COPY
+ /* Linux seems to lack read-only copy-on-write. */
+#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
+ /* Some systems might lack this; they lose. */
+#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 (filedata == (void *) -1)
+ {
+ if (errno == ENOSYS)
+ {
+ /* No mmap; allocate a buffer and read from the file. */
+ filedata = malloc (st.st_size);
+ if (filedata != NULL)
+ {
+ off_t to_read = st.st_size;
+ ssize_t nread;
+ char *p = (char *) filedata;
+ while (to_read > 0)
+ {
+ nread = __read (fd, p, to_read);
+ if (nread <= 0)
+ {
+ free (filedata);
+ if (nread == 0)
+ errno = EINVAL; /* Bizarreness going on. */
+ goto puntfd;
+ }
+ p += nread;
+ to_read -= nread;
+ }
+ }
+ else
+ goto puntfd;
+ errno = save_err;
+ }
+ else
+ goto puntfd;
+ }