mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +00:00
Update.
* 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>
This commit is contained in:
parent
61ae62f270
commit
06a466e7e1
16
ChangeLog
16
ChangeLog
@ -6,6 +6,22 @@
|
||||
(getutent_r_file, internal_getut_r): Updated all callers.
|
||||
(getutline_r_file, pututline_file, updwtmp_file): Likewise.
|
||||
|
||||
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
|
||||
|
@ -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);
|
||||
|
||||
/* 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 && 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)
|
||||
{
|
||||
/* `POSIX' locale is always available (POSIX.2 4.34.3). */
|
||||
PUT ("POSIX");
|
||||
/* And so is the "C" locale. */
|
||||
PUT ("C");
|
||||
|
||||
twalk (all_data, print_names);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
74
sysdeps/unix/sysv/linux/mips/bits/msq.h
Normal file
74
sysdeps/unix/sysv/linux/mips/bits/msq.h
Normal file
@ -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 */
|
Loading…
Reference in New Issue
Block a user