aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog16
-rw-r--r--locale/programs/locale.c198
-rw-r--r--sysdeps/unix/sysv/linux/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/mips/bits/msq.h74
4 files changed, 191 insertions, 99 deletions
diff --git a/ChangeLog b/ChangeLog
index a5972e105b..879d4420e7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,22 @@
2002-08-25 Ulrich Drepper <drepper@redhat.com>
+ * locale/programs/locale.c: Don't print aliases for non-existing
+ locales for 'locale -a'.
+ Patch by Noah Levitt <nlevitt@columbia.edu> [PR libc/4166].
+
+2002-07-19 H.J. Lu <hjl@gnu.org>
+
+ * sysdeps/unix/sysv/linux/mips/bits/msq.h: New file.
+
+2002-07-16 H.J. Lu <hjl@gnu.org>
+
+ * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add
+ sys/personality.h.
+ * sysdeps/unix/sysv/linux/sys/personality.h: New file.
+
+2002-08-25 Ulrich Drepper <drepper@redhat.com>
+
* elf/tst-tlsmod1.c (in_dso): Make sure the TLS variable access is
not moved ahead of the fputs call.
* elf/tst-tlsmod2.c (in_dso): Likewise.
diff --git a/locale/programs/locale.c b/locale/programs/locale.c
index 3377bcc286..8dea09ae1c 100644
--- a/locale/programs/locale.c
+++ b/locale/programs/locale.c
@@ -347,100 +347,13 @@ write_locales (void)
#define PUT(name) tsearch (name, &all_data, \
(int (*) (const void *, const void *)) strcoll)
+#define GET(name) tfind (name, &all_data, \
+ (int (*) (const void *, const void *)) strcoll)
- /* Now read the locale.alias files. */
- if (argz_create_sep (LOCALE_ALIAS_PATH, ':', &alias_path, &alias_path_len))
- error (1, errno, gettext ("while preparing output"));
-
- entry = NULL;
- while ((entry = argz_next (alias_path, alias_path_len, entry)))
- {
- static const char aliasfile[] = "/locale.alias";
- FILE *fp;
- char full_name[strlen (entry) + sizeof aliasfile];
-
- stpcpy (stpcpy (full_name, entry), aliasfile);
- fp = fopen (full_name, "r");
- if (fp == NULL)
- /* Ignore non-existing files. */
- continue;
-
- /* No threads present. */
- __fsetlocking (fp, FSETLOCKING_BYCALLER);
-
- while (! feof_unlocked (fp))
- {
- /* It is a reasonable approach to use a fix buffer here
- because
- a) we are only interested in the first two fields
- b) these fields must be usable as file names and so must
- not be that long */
- char buf[BUFSIZ];
- char *alias;
- char *value;
- char *cp;
-
- if (fgets_unlocked (buf, BUFSIZ, fp) == NULL)
- /* EOF reached. */
- break;
-
- cp = buf;
- /* Ignore leading white space. */
- while (isspace (cp[0]) && cp[0] != '\n')
- ++cp;
-
- /* A leading '#' signals a comment line. */
- if (cp[0] != '\0' && cp[0] != '#' && cp[0] != '\n')
- {
- alias = cp++;
- while (cp[0] != '\0' && !isspace (cp[0]))
- ++cp;
- /* Terminate alias name. */
- if (cp[0] != '\0')
- *cp++ = '\0';
-
- /* Now look for the beginning of the value. */
- while (isspace (cp[0]))
- ++cp;
-
- if (cp[0] != '\0')
- {
- value = cp++;
- while (cp[0] != '\0' && !isspace (cp[0]))
- ++cp;
- /* Terminate value. */
- if (cp[0] == '\n')
- {
- /* This has to be done to make the following
- test for the end of line possible. We are
- looking for the terminating '\n' which do not
- overwrite here. */
- *cp++ = '\0';
- *cp = '\n';
- }
- else if (cp[0] != '\0')
- *cp++ = '\0';
-
- /* Add the alias. */
- if (! verbose)
- PUT (xstrdup (alias));
- }
- }
-
- /* Possibly not the whole line fits into the buffer.
- Ignore the rest of the line. */
- while (strchr (cp, '\n') == NULL)
- {
- cp = buf;
- if (fgets_unlocked (buf, BUFSIZ, fp) == NULL)
- /* Make sure the inner loop will be left. The outer
- loop will exit at the `feof' test. */
- *cp = '\n';
- }
- }
-
- fclose (fp);
- }
+ /* `POSIX' locale is always available (POSIX.2 4.34.3). */
+ PUT ("POSIX");
+ /* And so is the "C" locale. */
+ PUT ("C");
memset (linebuf, '-', sizeof (linebuf) - 1);
linebuf[sizeof (linebuf) - 1] = '\0';
@@ -570,13 +483,102 @@ write_locales (void)
if (ndirents > 0)
free (dirents);
- if (! verbose)
+ /* Now read the locale.alias files. */
+ if (argz_create_sep (LOCALE_ALIAS_PATH, ':', &alias_path, &alias_path_len))
+ error (1, errno, gettext ("while preparing output"));
+
+ entry = NULL;
+ while ((entry = argz_next (alias_path, alias_path_len, entry)))
{
- /* `POSIX' locale is always available (POSIX.2 4.34.3). */
- PUT ("POSIX");
- /* And so is the "C" locale. */
- PUT ("C");
+ static const char aliasfile[] = "/locale.alias";
+ FILE *fp;
+ char full_name[strlen (entry) + sizeof aliasfile];
+
+ stpcpy (stpcpy (full_name, entry), aliasfile);
+ fp = fopen (full_name, "r");
+ if (fp == NULL)
+ /* Ignore non-existing files. */
+ continue;
+
+ /* No threads present. */
+ __fsetlocking (fp, FSETLOCKING_BYCALLER);
+ while (! feof_unlocked (fp))
+ {
+ /* It is a reasonable approach to use a fix buffer here
+ because
+ a) we are only interested in the first two fields
+ b) these fields must be usable as file names and so must
+ not be that long */
+ char buf[BUFSIZ];
+ char *alias;
+ char *value;
+ char *cp;
+
+ if (fgets_unlocked (buf, BUFSIZ, fp) == NULL)
+ /* EOF reached. */
+ break;
+
+ cp = buf;
+ /* Ignore leading white space. */
+ while (isspace (cp[0]) && cp[0] != '\n')
+ ++cp;
+
+ /* A leading '#' signals a comment line. */
+ if (cp[0] != '\0' && cp[0] != '#' && cp[0] != '\n')
+ {
+ alias = cp++;
+ while (cp[0] != '\0' && !isspace (cp[0]))
+ ++cp;
+ /* Terminate alias name. */
+ if (cp[0] != '\0')
+ *cp++ = '\0';
+
+ /* Now look for the beginning of the value. */
+ while (isspace (cp[0]))
+ ++cp;
+
+ if (cp[0] != '\0')
+ {
+ value = cp++;
+ while (cp[0] != '\0' && !isspace (cp[0]))
+ ++cp;
+ /* Terminate value. */
+ if (cp[0] == '\n')
+ {
+ /* This has to be done to make the following
+ test for the end of line possible. We are
+ looking for the terminating '\n' which do not
+ overwrite here. */
+ *cp++ = '\0';
+ *cp = '\n';
+ }
+ else if (cp[0] != '\0')
+ *cp++ = '\0';
+
+ /* Add the alias. */
+ if (! verbose && GET (value) != NULL)
+ PUT (xstrdup (alias));
+ }
+ }
+
+ /* Possibly not the whole line fits into the buffer.
+ Ignore the rest of the line. */
+ while (strchr (cp, '\n') == NULL)
+ {
+ cp = buf;
+ if (fgets_unlocked (buf, BUFSIZ, fp) == NULL)
+ /* Make sure the inner loop will be left. The outer
+ loop will exit at the `feof' test. */
+ *cp = '\n';
+ }
+ }
+
+ fclose (fp);
+ }
+
+ if (! verbose)
+ {
twalk (all_data, print_names);
}
}
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 9a2bbc492e..cc37196526 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -20,7 +20,7 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
sys/kd.h sys/soundcard.h sys/vt.h \
sys/quota.h sys/fsuid.h \
scsi/sg.h scsi/scsi.h scsi/scsi_ioctl.h sys/pci.h \
- sys/ultrasound.h sys/raw.h
+ sys/ultrasound.h sys/raw.h sys/personality.h
install-others += $(inst_includedir)/bits/syscall.h
diff --git a/sysdeps/unix/sysv/linux/mips/bits/msq.h b/sysdeps/unix/sysv/linux/mips/bits/msq.h
new file mode 100644
index 0000000000..c2c1dd2e85
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/bits/msq.h
@@ -0,0 +1,74 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _SYS_MSG_H
+# error "Never use <bits/msq.h> directly; include <sys/msg.h> instead."
+#endif
+
+#include <bits/types.h>
+
+/* Define options for message queue functions. */
+#define MSG_NOERROR 010000 /* no error if message is too big */
+#ifdef __USE_GNU
+# define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+#endif
+
+/* Types used in the structure definition. */
+typedef unsigned long int msgqnum_t;
+typedef unsigned long int msglen_t;
+
+
+/* Structure of record for one message inside the kernel.
+ The type `struct msg' is opaque. */
+struct msqid_ds
+{
+ struct ipc_perm msg_perm; /* structure describing operation permission */
+ __time_t msg_stime; /* time of last msgsnd command */
+ __time_t msg_rtime; /* time of last msgrcv command */
+ __time_t msg_ctime; /* time of last change */
+ unsigned long int __msg_cbytes; /* current number of bytes on queue */
+ msgqnum_t msg_qnum; /* number of messages currently on queue */
+ msglen_t msg_qbytes; /* max number of bytes allowed on queue */
+ __pid_t msg_lspid; /* pid of last msgsnd() */
+ __pid_t msg_lrpid; /* pid of last msgrcv() */
+ unsigned long int __unused1;
+ unsigned long int __unused2;
+};
+
+#ifdef __USE_MISC
+
+# define msg_cbytes __msg_cbytes
+
+/* ipcs ctl commands */
+# define MSG_STAT 11
+# define MSG_INFO 12
+
+/* buffer for msgctl calls IPC_INFO, MSG_INFO */
+struct msginfo
+ {
+ int msgpool;
+ int msgmap;
+ int msgmax;
+ int msgmnb;
+ int msgmni;
+ int msgssz;
+ int msgtql;
+ unsigned short int msgseg;
+ };
+
+#endif /* __USE_MISC */