Update.
authorUlrich Drepper <drepper@redhat.com>
Mon, 26 Aug 2002 02:20:11 +0000 (02:20 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 26 Aug 2002 02:20:11 +0000 (02:20 +0000)
* 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>

ChangeLog
locale/programs/locale.c
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/mips/bits/msq.h [new file with mode: 0644]

index a5972e1..879d442 100644 (file)
--- 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.
index 3377bcc..8dea09a 100644 (file)
@@ -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);
     }
 }
index 9a2bbc4..cc37196 100644 (file)
@@ -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 (file)
index 0000000..c2c1dd2
--- /dev/null
@@ -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 */