Merge commit '293db26d857ebdef0ceeea5da44f166d91d0e5fb' into master-riscv64
Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
This commit is contained in:
commit
4be26d7c24
@ -1,862 +0,0 @@
|
|||||||
#define _GNU_SOURCE
|
|
||||||
#include <assert.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <locale.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "../locale/hashval.h"
|
|
||||||
#define __LC_LAST 13
|
|
||||||
#include "../locale/locarchive.h"
|
|
||||||
#include "../crypt/md5.h"
|
|
||||||
|
|
||||||
const char *alias_file = DATADIR "/locale/locale.alias";
|
|
||||||
const char *locar_file = PREFIX "/lib/locale/locale-archive";
|
|
||||||
const char *tmpl_file = PREFIX "/lib/locale/locale-archive.tmpl";
|
|
||||||
const char *loc_path = PREFIX "/lib/locale/";
|
|
||||||
/* Flags set by `--verbose` option. */
|
|
||||||
int be_quiet = 1;
|
|
||||||
int verbose = 0;
|
|
||||||
int max_locarchive_open_retry = 10;
|
|
||||||
const char *output_prefix;
|
|
||||||
|
|
||||||
/* Endianness should have been taken care of by localedef. We don't need to do
|
|
||||||
additional swapping. We need this variable exported however, since
|
|
||||||
locarchive.c uses it to determine if it needs to swap endianness of a value
|
|
||||||
before writing to or reading from the archive. */
|
|
||||||
bool swap_endianness_p = false;
|
|
||||||
|
|
||||||
static const char *locnames[] =
|
|
||||||
{
|
|
||||||
#define DEFINE_CATEGORY(category, category_name, items, a) \
|
|
||||||
[category] = category_name,
|
|
||||||
#include "../locale/categories.def"
|
|
||||||
#undef DEFINE_CATEGORY
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
is_prime (unsigned long candidate)
|
|
||||||
{
|
|
||||||
/* No even number and none less than 10 will be passed here. */
|
|
||||||
unsigned long int divn = 3;
|
|
||||||
unsigned long int sq = divn * divn;
|
|
||||||
|
|
||||||
while (sq < candidate && candidate % divn != 0)
|
|
||||||
{
|
|
||||||
++divn;
|
|
||||||
sq += 4 * divn;
|
|
||||||
++divn;
|
|
||||||
}
|
|
||||||
|
|
||||||
return candidate % divn != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long
|
|
||||||
next_prime (unsigned long seed)
|
|
||||||
{
|
|
||||||
/* Make it definitely odd. */
|
|
||||||
seed |= 1;
|
|
||||||
|
|
||||||
while (!is_prime (seed))
|
|
||||||
seed += 2;
|
|
||||||
|
|
||||||
return seed;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
error (int status, int errnum, const char *message, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
|
|
||||||
va_start (args, message);
|
|
||||||
fflush (stdout);
|
|
||||||
fprintf (stderr, "%s: ", program_invocation_name);
|
|
||||||
vfprintf (stderr, message, args);
|
|
||||||
va_end (args);
|
|
||||||
if (errnum)
|
|
||||||
fprintf (stderr, ": %s", strerror (errnum));
|
|
||||||
putc ('\n', stderr);
|
|
||||||
fflush (stderr);
|
|
||||||
if (status)
|
|
||||||
exit (errnum == EROFS ? 0 : status);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
xmalloc (size_t size)
|
|
||||||
{
|
|
||||||
void *p = malloc (size);
|
|
||||||
if (p == NULL)
|
|
||||||
error (EXIT_FAILURE, errno, "could not allocate %zd bytes of memory", size);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
open_tmpl_archive (struct locarhandle *ah)
|
|
||||||
{
|
|
||||||
struct stat64 st;
|
|
||||||
int fd;
|
|
||||||
struct locarhead head;
|
|
||||||
const char *archivefname = ah->fname == NULL ? tmpl_file : ah->fname;
|
|
||||||
|
|
||||||
/* Open the archive. We must have exclusive write access. */
|
|
||||||
fd = open64 (archivefname, O_RDONLY);
|
|
||||||
if (fd == -1)
|
|
||||||
error (EXIT_FAILURE, errno, "cannot open locale archive template file \"%s\"",
|
|
||||||
archivefname);
|
|
||||||
|
|
||||||
if (fstat64 (fd, &st) < 0)
|
|
||||||
error (EXIT_FAILURE, errno, "cannot stat locale archive template file \"%s\"",
|
|
||||||
archivefname);
|
|
||||||
|
|
||||||
/* Read the header. */
|
|
||||||
if (TEMP_FAILURE_RETRY (read (fd, &head, sizeof (head))) != sizeof (head))
|
|
||||||
error (EXIT_FAILURE, errno, "cannot read archive header");
|
|
||||||
|
|
||||||
ah->fd = fd;
|
|
||||||
ah->mmaped = (head.sumhash_offset
|
|
||||||
+ head.sumhash_size * sizeof (struct sumhashent));
|
|
||||||
if (ah->mmaped > (unsigned long) st.st_size)
|
|
||||||
error (EXIT_FAILURE, 0, "locale archive template file truncated");
|
|
||||||
ah->mmaped = st.st_size;
|
|
||||||
ah->reserved = st.st_size;
|
|
||||||
|
|
||||||
/* Now we know how large the administrative information part is.
|
|
||||||
Map all of it. */
|
|
||||||
ah->addr = mmap64 (NULL, ah->mmaped, PROT_READ, MAP_SHARED, fd, 0);
|
|
||||||
if (ah->addr == MAP_FAILED)
|
|
||||||
error (EXIT_FAILURE, errno, "cannot map archive header");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open the locale archive. */
|
|
||||||
extern void open_archive (struct locarhandle *ah, bool readonly);
|
|
||||||
|
|
||||||
/* Close the locale archive. */
|
|
||||||
extern void close_archive (struct locarhandle *ah);
|
|
||||||
|
|
||||||
/* Add given locale data to the archive. */
|
|
||||||
extern int add_locale_to_archive (struct locarhandle *ah, const char *name,
|
|
||||||
locale_data_t data, bool replace);
|
|
||||||
|
|
||||||
extern void add_alias (struct locarhandle *ah, const char *alias,
|
|
||||||
bool replace, const char *oldname,
|
|
||||||
uint32_t *locrec_offset_p);
|
|
||||||
|
|
||||||
extern struct namehashent *
|
|
||||||
insert_name (struct locarhandle *ah,
|
|
||||||
const char *name, size_t name_len, bool replace);
|
|
||||||
|
|
||||||
struct nameent
|
|
||||||
{
|
|
||||||
char *name;
|
|
||||||
struct locrecent *locrec;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct dataent
|
|
||||||
{
|
|
||||||
const unsigned char *sum;
|
|
||||||
uint32_t file_offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
nameentcmp (const void *a, const void *b)
|
|
||||||
{
|
|
||||||
struct locrecent *la = ((const struct nameent *) a)->locrec;
|
|
||||||
struct locrecent *lb = ((const struct nameent *) b)->locrec;
|
|
||||||
uint32_t start_a = -1, end_a = 0;
|
|
||||||
uint32_t start_b = -1, end_b = 0;
|
|
||||||
int cnt;
|
|
||||||
|
|
||||||
for (cnt = 0; cnt < __LC_LAST; ++cnt)
|
|
||||||
if (cnt != LC_ALL)
|
|
||||||
{
|
|
||||||
if (la->record[cnt].offset < start_a)
|
|
||||||
start_a = la->record[cnt].offset;
|
|
||||||
if (la->record[cnt].offset + la->record[cnt].len > end_a)
|
|
||||||
end_a = la->record[cnt].offset + la->record[cnt].len;
|
|
||||||
}
|
|
||||||
assert (start_a != (uint32_t)-1);
|
|
||||||
assert (end_a != 0);
|
|
||||||
|
|
||||||
for (cnt = 0; cnt < __LC_LAST; ++cnt)
|
|
||||||
if (cnt != LC_ALL)
|
|
||||||
{
|
|
||||||
if (lb->record[cnt].offset < start_b)
|
|
||||||
start_b = lb->record[cnt].offset;
|
|
||||||
if (lb->record[cnt].offset + lb->record[cnt].len > end_b)
|
|
||||||
end_b = lb->record[cnt].offset + lb->record[cnt].len;
|
|
||||||
}
|
|
||||||
assert (start_b != (uint32_t)-1);
|
|
||||||
assert (end_b != 0);
|
|
||||||
|
|
||||||
if (start_a != start_b)
|
|
||||||
return (int)start_a - (int)start_b;
|
|
||||||
return (int)end_a - (int)end_b;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
dataentcmp (const void *a, const void *b)
|
|
||||||
{
|
|
||||||
if (((const struct dataent *) a)->file_offset
|
|
||||||
< ((const struct dataent *) b)->file_offset)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (((const struct dataent *) a)->file_offset
|
|
||||||
> ((const struct dataent *) b)->file_offset)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
sumsearchfn (const void *key, const void *ent)
|
|
||||||
{
|
|
||||||
uint32_t keyn = *(uint32_t *)key;
|
|
||||||
uint32_t entn = ((struct dataent *)ent)->file_offset;
|
|
||||||
|
|
||||||
if (keyn < entn)
|
|
||||||
return -1;
|
|
||||||
if (keyn > entn)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
compute_data (struct locarhandle *ah, struct nameent *name, size_t sumused,
|
|
||||||
struct dataent *files, locale_data_t data)
|
|
||||||
{
|
|
||||||
int cnt;
|
|
||||||
struct locrecent *locrec = name->locrec;
|
|
||||||
struct dataent *file;
|
|
||||||
data[LC_ALL].addr = ((char *) ah->addr) + locrec->record[LC_ALL].offset;
|
|
||||||
data[LC_ALL].size = locrec->record[LC_ALL].len;
|
|
||||||
for (cnt = 0; cnt < __LC_LAST; ++cnt)
|
|
||||||
if (cnt != LC_ALL)
|
|
||||||
{
|
|
||||||
data[cnt].addr = ((char *) ah->addr) + locrec->record[cnt].offset;
|
|
||||||
data[cnt].size = locrec->record[cnt].len;
|
|
||||||
if (data[cnt].addr >= data[LC_ALL].addr
|
|
||||||
&& data[cnt].addr + data[cnt].size
|
|
||||||
<= data[LC_ALL].addr + data[LC_ALL].size)
|
|
||||||
__md5_buffer (data[cnt].addr, data[cnt].size, data[cnt].sum);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
file = bsearch (&locrec->record[cnt].offset, files, sumused,
|
|
||||||
sizeof (*files), sumsearchfn);
|
|
||||||
if (file == NULL)
|
|
||||||
error (EXIT_FAILURE, 0, "inconsistent template file");
|
|
||||||
memcpy (data[cnt].sum, file->sum, sizeof (data[cnt].sum));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
fill_archive (struct locarhandle *tmpl_ah,
|
|
||||||
const char *fname,
|
|
||||||
size_t install_langs_count, char *install_langs_list[],
|
|
||||||
size_t nlist, char *list[],
|
|
||||||
const char *primary)
|
|
||||||
{
|
|
||||||
struct locarhandle ah;
|
|
||||||
struct locarhead *head;
|
|
||||||
int result = 0;
|
|
||||||
struct nameent *names;
|
|
||||||
struct namehashent *namehashtab;
|
|
||||||
size_t cnt, used;
|
|
||||||
struct dataent *files;
|
|
||||||
struct sumhashent *sumhashtab;
|
|
||||||
size_t sumused;
|
|
||||||
struct locrecent *primary_locrec = NULL;
|
|
||||||
struct nameent *primary_nameent = NULL;
|
|
||||||
|
|
||||||
head = tmpl_ah->addr;
|
|
||||||
names = (struct nameent *) malloc (head->namehash_used
|
|
||||||
* sizeof (struct nameent));
|
|
||||||
files = (struct dataent *) malloc (head->sumhash_used
|
|
||||||
* sizeof (struct dataent));
|
|
||||||
if (names == NULL || files == NULL)
|
|
||||||
error (EXIT_FAILURE, errno, "could not allocate tables");
|
|
||||||
|
|
||||||
namehashtab = (struct namehashent *) ((char *) tmpl_ah->addr
|
|
||||||
+ head->namehash_offset);
|
|
||||||
sumhashtab = (struct sumhashent *) ((char *) tmpl_ah->addr
|
|
||||||
+ head->sumhash_offset);
|
|
||||||
|
|
||||||
for (cnt = used = 0; cnt < head->namehash_size; ++cnt)
|
|
||||||
if (namehashtab[cnt].locrec_offset != 0)
|
|
||||||
{
|
|
||||||
char * name;
|
|
||||||
int i;
|
|
||||||
assert (used < head->namehash_used);
|
|
||||||
name = tmpl_ah->addr + namehashtab[cnt].name_offset;
|
|
||||||
if (install_langs_count == 0)
|
|
||||||
{
|
|
||||||
/* Always intstall the entry. */
|
|
||||||
names[used].name = name;
|
|
||||||
names[used++].locrec
|
|
||||||
= (struct locrecent *) ((char *) tmpl_ah->addr +
|
|
||||||
namehashtab[cnt].locrec_offset);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Only install the entry if the user asked for it via
|
|
||||||
--install-langs. */
|
|
||||||
for (i = 0; i < install_langs_count; i++)
|
|
||||||
{
|
|
||||||
/* Add one for "_" and one for the null terminator. */
|
|
||||||
size_t len = strlen (install_langs_list[i]) + 2;
|
|
||||||
char *install_lang = (char *)xmalloc (len);
|
|
||||||
strcpy (install_lang, install_langs_list[i]);
|
|
||||||
if (strchr (install_lang, '_') == NULL)
|
|
||||||
strcat (install_lang, "_");
|
|
||||||
if (strncmp (name, install_lang, strlen (install_lang)) == 0)
|
|
||||||
{
|
|
||||||
names[used].name = name;
|
|
||||||
names[used++].locrec
|
|
||||||
= (struct locrecent *) ((char *)tmpl_ah->addr
|
|
||||||
+ namehashtab[cnt].locrec_offset);
|
|
||||||
}
|
|
||||||
free (install_lang);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sort the names. */
|
|
||||||
qsort (names, used, sizeof (struct nameent), nameentcmp);
|
|
||||||
|
|
||||||
for (cnt = sumused = 0; cnt < head->sumhash_size; ++cnt)
|
|
||||||
if (sumhashtab[cnt].file_offset != 0)
|
|
||||||
{
|
|
||||||
assert (sumused < head->sumhash_used);
|
|
||||||
files[sumused].sum = (const unsigned char *) sumhashtab[cnt].sum;
|
|
||||||
files[sumused++].file_offset = sumhashtab[cnt].file_offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sort by file locations. */
|
|
||||||
qsort (files, sumused, sizeof (struct dataent), dataentcmp);
|
|
||||||
|
|
||||||
/* Open the archive. This call never returns if we cannot
|
|
||||||
successfully open the archive. */
|
|
||||||
ah.fname = NULL;
|
|
||||||
if (fname != NULL)
|
|
||||||
ah.fname = fname;
|
|
||||||
open_archive (&ah, false);
|
|
||||||
|
|
||||||
if (primary != NULL)
|
|
||||||
{
|
|
||||||
for (cnt = 0; cnt < used; ++cnt)
|
|
||||||
if (strcmp (names[cnt].name, primary) == 0)
|
|
||||||
break;
|
|
||||||
if (cnt < used)
|
|
||||||
{
|
|
||||||
locale_data_t data;
|
|
||||||
|
|
||||||
compute_data (tmpl_ah, &names[cnt], sumused, files, data);
|
|
||||||
result |= add_locale_to_archive (&ah, primary, data, 0);
|
|
||||||
primary_locrec = names[cnt].locrec;
|
|
||||||
primary_nameent = &names[cnt];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (cnt = 0; cnt < used; ++cnt)
|
|
||||||
if (&names[cnt] == primary_nameent)
|
|
||||||
continue;
|
|
||||||
else if ((cnt > 0 && names[cnt - 1].locrec == names[cnt].locrec)
|
|
||||||
|| names[cnt].locrec == primary_locrec)
|
|
||||||
{
|
|
||||||
const char *oldname;
|
|
||||||
struct namehashent *namehashent;
|
|
||||||
uint32_t locrec_offset;
|
|
||||||
|
|
||||||
if (names[cnt].locrec == primary_locrec)
|
|
||||||
oldname = primary;
|
|
||||||
else
|
|
||||||
oldname = names[cnt - 1].name;
|
|
||||||
namehashent = insert_name (&ah, oldname, strlen (oldname), true);
|
|
||||||
assert (namehashent->name_offset != 0);
|
|
||||||
assert (namehashent->locrec_offset != 0);
|
|
||||||
locrec_offset = namehashent->locrec_offset;
|
|
||||||
add_alias (&ah, names[cnt].name, 0, oldname, &locrec_offset);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
locale_data_t data;
|
|
||||||
|
|
||||||
compute_data (tmpl_ah, &names[cnt], sumused, files, data);
|
|
||||||
result |= add_locale_to_archive (&ah, names[cnt].name, data, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (nlist-- > 0)
|
|
||||||
{
|
|
||||||
const char *fname = *list++;
|
|
||||||
size_t fnamelen = strlen (fname);
|
|
||||||
struct stat64 st;
|
|
||||||
DIR *dirp;
|
|
||||||
struct dirent64 *d;
|
|
||||||
int seen;
|
|
||||||
locale_data_t data;
|
|
||||||
int cnt;
|
|
||||||
|
|
||||||
/* First see whether this really is a directory and whether it
|
|
||||||
contains all the require locale category files. */
|
|
||||||
if (stat64 (fname, &st) < 0)
|
|
||||||
{
|
|
||||||
error (0, 0, "stat of \"%s\" failed: %s: ignored", fname,
|
|
||||||
strerror (errno));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!S_ISDIR (st.st_mode))
|
|
||||||
{
|
|
||||||
error (0, 0, "\"%s\" is no directory; ignored", fname);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
dirp = opendir (fname);
|
|
||||||
if (dirp == NULL)
|
|
||||||
{
|
|
||||||
error (0, 0, "cannot open directory \"%s\": %s: ignored",
|
|
||||||
fname, strerror (errno));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
seen = 0;
|
|
||||||
while ((d = readdir64 (dirp)) != NULL)
|
|
||||||
{
|
|
||||||
for (cnt = 0; cnt < __LC_LAST; ++cnt)
|
|
||||||
if (cnt != LC_ALL)
|
|
||||||
if (strcmp (d->d_name, locnames[cnt]) == 0)
|
|
||||||
{
|
|
||||||
unsigned char d_type;
|
|
||||||
|
|
||||||
/* We have an object of the required name. If it's
|
|
||||||
a directory we have to look at a file with the
|
|
||||||
prefix "SYS_". Otherwise we have found what we
|
|
||||||
are looking for. */
|
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
d_type = d->d_type;
|
|
||||||
|
|
||||||
if (d_type != DT_REG)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
char fullname[fnamelen + 2 * strlen (d->d_name) + 7];
|
|
||||||
|
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (d_type == DT_UNKNOWN)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
strcpy (stpcpy (stpcpy (fullname, fname), "/"),
|
|
||||||
d->d_name);
|
|
||||||
|
|
||||||
if (stat64 (fullname, &st) == -1)
|
|
||||||
/* We cannot stat the file, ignore it. */
|
|
||||||
break;
|
|
||||||
|
|
||||||
d_type = IFTODT (st.st_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (d_type == DT_DIR)
|
|
||||||
{
|
|
||||||
/* We have to do more tests. The file is a
|
|
||||||
directory and it therefore must contain a
|
|
||||||
regular file with the same name except a
|
|
||||||
"SYS_" prefix. */
|
|
||||||
char *t = stpcpy (stpcpy (fullname, fname), "/");
|
|
||||||
strcpy (stpcpy (stpcpy (t, d->d_name), "/SYS_"),
|
|
||||||
d->d_name);
|
|
||||||
|
|
||||||
if (stat64 (fullname, &st) == -1)
|
|
||||||
/* There is no SYS_* file or we cannot
|
|
||||||
access it. */
|
|
||||||
break;
|
|
||||||
|
|
||||||
d_type = IFTODT (st.st_mode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we found a regular file (eventually after
|
|
||||||
following a symlink) we are successful. */
|
|
||||||
if (d_type == DT_REG)
|
|
||||||
++seen;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
closedir (dirp);
|
|
||||||
|
|
||||||
if (seen != __LC_LAST - 1)
|
|
||||||
{
|
|
||||||
/* We don't have all locale category files. Ignore the name. */
|
|
||||||
error (0, 0, "incomplete set of locale files in \"%s\"",
|
|
||||||
fname);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add the files to the archive. To do this we first compute
|
|
||||||
sizes and the MD5 sums of all the files. */
|
|
||||||
for (cnt = 0; cnt < __LC_LAST; ++cnt)
|
|
||||||
if (cnt != LC_ALL)
|
|
||||||
{
|
|
||||||
char fullname[fnamelen + 2 * strlen (locnames[cnt]) + 7];
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
strcpy (stpcpy (stpcpy (fullname, fname), "/"), locnames[cnt]);
|
|
||||||
fd = open64 (fullname, O_RDONLY);
|
|
||||||
if (fd == -1 || fstat64 (fd, &st) == -1)
|
|
||||||
{
|
|
||||||
/* Cannot read the file. */
|
|
||||||
if (fd != -1)
|
|
||||||
close (fd);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (S_ISDIR (st.st_mode))
|
|
||||||
{
|
|
||||||
char *t;
|
|
||||||
close (fd);
|
|
||||||
t = stpcpy (stpcpy (fullname, fname), "/");
|
|
||||||
strcpy (stpcpy (stpcpy (t, locnames[cnt]), "/SYS_"),
|
|
||||||
locnames[cnt]);
|
|
||||||
|
|
||||||
fd = open64 (fullname, O_RDONLY);
|
|
||||||
if (fd == -1 || fstat64 (fd, &st) == -1
|
|
||||||
|| !S_ISREG (st.st_mode))
|
|
||||||
{
|
|
||||||
if (fd != -1)
|
|
||||||
close (fd);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Map the file. */
|
|
||||||
data[cnt].addr = mmap64 (NULL, st.st_size, PROT_READ, MAP_SHARED,
|
|
||||||
fd, 0);
|
|
||||||
if (data[cnt].addr == MAP_FAILED)
|
|
||||||
{
|
|
||||||
/* Cannot map it. */
|
|
||||||
close (fd);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
data[cnt].size = st.st_size;
|
|
||||||
__md5_buffer (data[cnt].addr, st.st_size, data[cnt].sum);
|
|
||||||
|
|
||||||
/* We don't need the file descriptor anymore. */
|
|
||||||
close (fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cnt != __LC_LAST)
|
|
||||||
{
|
|
||||||
while (cnt-- > 0)
|
|
||||||
if (cnt != LC_ALL)
|
|
||||||
munmap (data[cnt].addr, data[cnt].size);
|
|
||||||
|
|
||||||
error (0, 0, "cannot read all files in \"%s\": ignored", fname);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
result |= add_locale_to_archive (&ah, basename (fname), data, 0);
|
|
||||||
|
|
||||||
for (cnt = 0; cnt < __LC_LAST; ++cnt)
|
|
||||||
if (cnt != LC_ALL)
|
|
||||||
munmap (data[cnt].addr, data[cnt].size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We are done. */
|
|
||||||
close_archive (&ah);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void usage()
|
|
||||||
{
|
|
||||||
printf ("\
|
|
||||||
Usage: build-locale-archive [OPTION]... [TEMPLATE-FILE] [ARCHIVE-FILE]\n\
|
|
||||||
Builds a locale archive from a template file.\n\
|
|
||||||
Options:\n\
|
|
||||||
-h, --help Print this usage message.\n\
|
|
||||||
-v, --verbose Verbose execution.\n\
|
|
||||||
-l, --install-langs=LIST Only include locales given in LIST into the \n\
|
|
||||||
locale archive. LIST is a colon separated list\n\
|
|
||||||
of locale prefixes, for example \"de:en:ja\".\n\
|
|
||||||
The special argument \"all\" means to install\n\
|
|
||||||
all languages and it must be present by itself.\n\
|
|
||||||
If \"all\" is present with any other language it\n\
|
|
||||||
will be treated as the name of a locale.\n\
|
|
||||||
If the --install-langs option is missing, all\n\
|
|
||||||
locales are installed. The colon separated list\n\
|
|
||||||
can contain any strings matching the beginning of\n\
|
|
||||||
locale names.\n\
|
|
||||||
If a string does not contain a \"_\", it is added.\n\
|
|
||||||
Examples:\n\
|
|
||||||
--install-langs=\"en\"\n\
|
|
||||||
installs en_US, en_US.iso88591,\n\
|
|
||||||
en_US.iso885915, en_US.utf8,\n\
|
|
||||||
en_GB ...\n\
|
|
||||||
--install-langs=\"en_US.utf8\"\n\
|
|
||||||
installs only en_US.utf8.\n\
|
|
||||||
--install-langs=\"ko\"\n\
|
|
||||||
installs ko_KR, ko_KR.euckr,\n\
|
|
||||||
ko_KR.utf8 but *not* kok_IN\n\
|
|
||||||
because \"ko\" does not contain\n\
|
|
||||||
\"_\" and it is silently added\n\
|
|
||||||
--install-langs\"ko:kok\"\n\
|
|
||||||
installs ko_KR, ko_KR.euckr,\n\
|
|
||||||
ko_KR.utf8, kok_IN, and\n\
|
|
||||||
kok_IN.utf8.\n\
|
|
||||||
--install-langs=\"POSIX\" will\n\
|
|
||||||
installs *no* locales at all\n\
|
|
||||||
because POSIX matches none of\n\
|
|
||||||
the locales. Actually, any string\n\
|
|
||||||
matching nothing will do that.\n\
|
|
||||||
POSIX and C will always be\n\
|
|
||||||
available because they are\n\
|
|
||||||
builtin.\n\
|
|
||||||
Aliases are installed as well,\n\
|
|
||||||
i.e. --install-langs=\"de\"\n\
|
|
||||||
will install not only every locale starting with\n\
|
|
||||||
\"de\" but also the aliases \"deutsch\"\n\
|
|
||||||
and and \"german\" although the latter does not\n\
|
|
||||||
start with \"de\".\n\
|
|
||||||
\n\
|
|
||||||
If the arguments TEMPLATE-FILE and ARCHIVE-FILE are not given the locations\n\
|
|
||||||
where the glibc used expects these files are used by default.\n\
|
|
||||||
");
|
|
||||||
}
|
|
||||||
|
|
||||||
int main (int argc, char *argv[])
|
|
||||||
{
|
|
||||||
char path[4096];
|
|
||||||
DIR *dirp;
|
|
||||||
struct dirent64 *d;
|
|
||||||
struct stat64 st;
|
|
||||||
char *list[16384], *primary;
|
|
||||||
char *lang;
|
|
||||||
int install_langs_count = 0;
|
|
||||||
int i;
|
|
||||||
char *install_langs_arg, *ila_start;
|
|
||||||
char **install_langs_list = NULL;
|
|
||||||
unsigned int cnt = 0;
|
|
||||||
struct locarhandle tmpl_ah;
|
|
||||||
char *new_locar_fname = NULL;
|
|
||||||
size_t loc_path_len = strlen (loc_path);
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
|
|
||||||
static struct option long_options[] =
|
|
||||||
{
|
|
||||||
{"help", no_argument, 0, 'h'},
|
|
||||||
{"verbose", no_argument, 0, 'v'},
|
|
||||||
{"install-langs", required_argument, 0, 'l'},
|
|
||||||
{0, 0, 0, 0}
|
|
||||||
};
|
|
||||||
/* getopt_long stores the option index here. */
|
|
||||||
int option_index = 0;
|
|
||||||
|
|
||||||
c = getopt_long (argc, argv, "vhl:",
|
|
||||||
long_options, &option_index);
|
|
||||||
|
|
||||||
/* Detect the end of the options. */
|
|
||||||
if (c == -1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
printf ("unknown option %s", long_options[option_index].name);
|
|
||||||
if (optarg)
|
|
||||||
printf (" with arg %s", optarg);
|
|
||||||
printf ("\n");
|
|
||||||
usage ();
|
|
||||||
exit (1);
|
|
||||||
|
|
||||||
case 'v':
|
|
||||||
verbose = 1;
|
|
||||||
be_quiet = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'h':
|
|
||||||
usage ();
|
|
||||||
exit (0);
|
|
||||||
|
|
||||||
case 'l':
|
|
||||||
install_langs_arg = ila_start = strdup (optarg);
|
|
||||||
/* If the argument to --install-lang is "all", do
|
|
||||||
not limit the list of languages to install and install
|
|
||||||
them all. We do not support installing a single locale
|
|
||||||
called "all". */
|
|
||||||
#define MAGIC_INSTALL_ALL "all"
|
|
||||||
if (install_langs_arg != NULL
|
|
||||||
&& install_langs_arg[0] != '\0'
|
|
||||||
&& !(strncmp(install_langs_arg, MAGIC_INSTALL_ALL,
|
|
||||||
strlen(MAGIC_INSTALL_ALL)) == 0
|
|
||||||
&& strlen (install_langs_arg) == 3))
|
|
||||||
{
|
|
||||||
/* Count the number of languages we will install. */
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
lang = strtok(install_langs_arg, ":;,");
|
|
||||||
if (lang == NULL)
|
|
||||||
break;
|
|
||||||
install_langs_count++;
|
|
||||||
install_langs_arg = NULL;
|
|
||||||
}
|
|
||||||
free (ila_start);
|
|
||||||
|
|
||||||
/* Reject an entire string made up of delimiters. */
|
|
||||||
if (install_langs_count == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Copy the list. */
|
|
||||||
install_langs_list = (char **)xmalloc (sizeof(char *) * install_langs_count);
|
|
||||||
install_langs_arg = ila_start = strdup (optarg);
|
|
||||||
install_langs_count = 0;
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
lang = strtok(install_langs_arg, ":;,");
|
|
||||||
if (lang == NULL)
|
|
||||||
break;
|
|
||||||
install_langs_list[install_langs_count] = lang;
|
|
||||||
install_langs_count++;
|
|
||||||
install_langs_arg = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '?':
|
|
||||||
/* getopt_long already printed an error message. */
|
|
||||||
usage ();
|
|
||||||
exit (0);
|
|
||||||
|
|
||||||
default:
|
|
||||||
abort ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tmpl_ah.fname = NULL;
|
|
||||||
if (optind < argc)
|
|
||||||
tmpl_ah.fname = argv[optind];
|
|
||||||
if (optind + 1 < argc)
|
|
||||||
new_locar_fname = argv[optind + 1];
|
|
||||||
if (verbose)
|
|
||||||
{
|
|
||||||
if (tmpl_ah.fname)
|
|
||||||
printf("input archive file specified on command line: %s\n",
|
|
||||||
tmpl_ah.fname);
|
|
||||||
else
|
|
||||||
printf("using default input archive file.\n");
|
|
||||||
if (new_locar_fname)
|
|
||||||
printf("output archive file specified on command line: %s\n",
|
|
||||||
new_locar_fname);
|
|
||||||
else
|
|
||||||
printf("using default output archive file.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
dirp = opendir (loc_path);
|
|
||||||
if (dirp == NULL)
|
|
||||||
error (EXIT_FAILURE, errno, "cannot open directory \"%s\"", loc_path);
|
|
||||||
|
|
||||||
open_tmpl_archive (&tmpl_ah);
|
|
||||||
|
|
||||||
if (new_locar_fname)
|
|
||||||
unlink (new_locar_fname);
|
|
||||||
else
|
|
||||||
unlink (locar_file);
|
|
||||||
primary = getenv ("LC_ALL");
|
|
||||||
if (primary == NULL)
|
|
||||||
primary = getenv ("LANG");
|
|
||||||
if (primary != NULL)
|
|
||||||
{
|
|
||||||
if (strncmp (primary, "ja", 2) != 0
|
|
||||||
&& strncmp (primary, "ko", 2) != 0
|
|
||||||
&& strncmp (primary, "zh", 2) != 0)
|
|
||||||
{
|
|
||||||
char *ptr = malloc (strlen (primary) + strlen (".utf8") + 1), *p, *q;
|
|
||||||
/* This leads to invalid locales sometimes:
|
|
||||||
de_DE.iso885915@euro -> de_DE.utf8@euro */
|
|
||||||
if (ptr != NULL)
|
|
||||||
{
|
|
||||||
p = ptr;
|
|
||||||
q = primary;
|
|
||||||
while (*q && *q != '.' && *q != '@')
|
|
||||||
*p++ = *q++;
|
|
||||||
if (*q == '.')
|
|
||||||
while (*q && *q != '@')
|
|
||||||
q++;
|
|
||||||
p = stpcpy (p, ".utf8");
|
|
||||||
strcpy (p, q);
|
|
||||||
primary = ptr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
primary = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy (path, loc_path, loc_path_len);
|
|
||||||
|
|
||||||
while ((d = readdir64 (dirp)) != NULL)
|
|
||||||
{
|
|
||||||
if (strcmp (d->d_name, ".") == 0 || strcmp (d->d_name, "..") == 0)
|
|
||||||
continue;
|
|
||||||
if (strchr (d->d_name, '_') == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
size_t d_name_len = strlen (d->d_name);
|
|
||||||
if (loc_path_len + d_name_len + 1 > sizeof (path))
|
|
||||||
{
|
|
||||||
error (0, 0, "too long filename \"%s\"", d->d_name);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy (path + loc_path_len, d->d_name, d_name_len + 1);
|
|
||||||
if (stat64 (path, &st) < 0)
|
|
||||||
{
|
|
||||||
error (0, errno, "cannot stat \"%s\"", path);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (! S_ISDIR (st.st_mode))
|
|
||||||
continue;
|
|
||||||
if (cnt == 16384)
|
|
||||||
{
|
|
||||||
error (0, 0, "too many directories in \"%s\"", loc_path);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
list[cnt] = strdup (path);
|
|
||||||
if (list[cnt] == NULL)
|
|
||||||
{
|
|
||||||
error (0, errno, "cannot add file to list \"%s\"", path);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (primary != NULL && cnt > 0 && strcmp (primary, d->d_name) == 0)
|
|
||||||
{
|
|
||||||
char *p = list[0];
|
|
||||||
list[0] = list[cnt];
|
|
||||||
list[cnt] = p;
|
|
||||||
}
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
closedir (dirp);
|
|
||||||
/* Store the archive to the file specified as the second argument on the
|
|
||||||
command line or the default locale archive. */
|
|
||||||
fill_archive (&tmpl_ah, new_locar_fname,
|
|
||||||
install_langs_count, install_langs_list,
|
|
||||||
cnt, list, primary);
|
|
||||||
close_archive (&tmpl_ah);
|
|
||||||
truncate (tmpl_file, 0);
|
|
||||||
if (install_langs_count > 0)
|
|
||||||
{
|
|
||||||
free (ila_start);
|
|
||||||
free (install_langs_list);
|
|
||||||
}
|
|
||||||
char *tz_argv[] = { "/usr/sbin/tzdata-update", NULL };
|
|
||||||
execve (tz_argv[0], (char *const *)tz_argv, (char *const *)&tz_argv[1]);
|
|
||||||
exit (0);
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
Short description: Allow access to internal locale archive functions.
|
|
||||||
Author(s): Fedora glibc team <glibc@lists.fedoraproject.org>
|
|
||||||
Origin: PATCH
|
|
||||||
Upstream status: not-needed
|
|
||||||
|
|
||||||
This is a part of commit glibc-2.3.3-1492-ga891c7b,
|
|
||||||
needed for fedora/build-locale-archive.c only.
|
|
||||||
|
|
||||||
2007-04-16 Jakub Jelinek <jakub@redhat.com>
|
|
||||||
|
|
||||||
* locale/programs/locarchive.c (add_alias, insert_name): Remove static.
|
|
||||||
|
|
||||||
diff -Nrup a/locale/programs/locarchive.c b/locale/programs/locarchive.c
|
|
||||||
--- a/locale/programs/locarchive.c 2012-06-05 07:42:49.000000000 -0600
|
|
||||||
+++ b/locale/programs/locarchive.c 2012-06-07 12:15:21.585319540 -0600
|
|
||||||
@@ -252,9 +252,9 @@ oldlocrecentcmp (const void *a, const vo
|
|
||||||
/* forward decls for below */
|
|
||||||
static uint32_t add_locale (struct locarhandle *ah, const char *name,
|
|
||||||
locale_data_t data, bool replace);
|
|
||||||
-static void add_alias (struct locarhandle *ah, const char *alias,
|
|
||||||
- bool replace, const char *oldname,
|
|
||||||
- uint32_t *locrec_offset_p);
|
|
||||||
+void add_alias (struct locarhandle *ah, const char *alias,
|
|
||||||
+ bool replace, const char *oldname,
|
|
||||||
+ uint32_t *locrec_offset_p);
|
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
@@ -635,7 +635,7 @@ close_archive (struct locarhandle *ah)
|
|
||||||
#include "../../intl/explodename.c"
|
|
||||||
#include "../../intl/l10nflist.c"
|
|
||||||
|
|
||||||
-static struct namehashent *
|
|
||||||
+struct namehashent *
|
|
||||||
insert_name (struct locarhandle *ah,
|
|
||||||
const char *name, size_t name_len, bool replace)
|
|
||||||
{
|
|
||||||
@@ -693,7 +693,7 @@ insert_name (struct locarhandle *ah,
|
|
||||||
return &namehashtab[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
-static void
|
|
||||||
+void
|
|
||||||
add_alias (struct locarhandle *ah, const char *alias, bool replace,
|
|
||||||
const char *oldname, uint32_t *locrec_offset_p)
|
|
||||||
{
|
|
30
glibc-fedora-nscd-warnings.patch
Normal file
30
glibc-fedora-nscd-warnings.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
Fedora-specific warnings about using nscd with sssd, and that
|
||||||
|
shared mappings don't show up in nscd -g statistics.
|
||||||
|
|
||||||
|
diff --git a/nscd/nscd.conf b/nscd/nscd.conf
|
||||||
|
index 3730835c50a349c4..b66faa3ca33b4b64 100644
|
||||||
|
--- a/nscd/nscd.conf
|
||||||
|
+++ b/nscd/nscd.conf
|
||||||
|
@@ -3,6 +3,9 @@
|
||||||
|
#
|
||||||
|
# An example Name Service Cache config file. This file is needed by nscd.
|
||||||
|
#
|
||||||
|
+# WARNING: Running nscd with a secondary caching service like sssd may lead to
|
||||||
|
+# unexpected behaviour, especially with how long entries are cached.
|
||||||
|
+#
|
||||||
|
# Legal entries are:
|
||||||
|
#
|
||||||
|
# logfile <file>
|
||||||
|
@@ -22,7 +25,12 @@
|
||||||
|
# suggested-size <service> <prime number>
|
||||||
|
# check-files <service> <yes|no>
|
||||||
|
# persistent <service> <yes|no>
|
||||||
|
+#
|
||||||
|
# shared <service> <yes|no>
|
||||||
|
+# NOTE: Setting 'shared' to a value of 'yes' will accelerate the lookup
|
||||||
|
+# with the help of the client, but these lookups will not be
|
||||||
|
+# counted as cache hits i.e. 'nscd -g' may show '0%'.
|
||||||
|
+#
|
||||||
|
# max-db-size <service> <number bytes>
|
||||||
|
# auto-propagate <service> <yes|no>
|
||||||
|
#
|
@ -1,38 +0,0 @@
|
|||||||
Short description: Do not define _XOPEN_STREAMS.
|
|
||||||
Author(s): Fedora glibc team <glibc@lists.fedoraproject.org>
|
|
||||||
Origin: PATCH
|
|
||||||
Bug-Fedora: #436349
|
|
||||||
Upstream status: not-submitted
|
|
||||||
|
|
||||||
This patch should go upstream. Not defining _XOPEN_STREAMS is the
|
|
||||||
same as setting it to -1 for POSIX conformance. The headers setting
|
|
||||||
needs to be reviewed indepedently.
|
|
||||||
|
|
||||||
This is part of commit glibc-2.3.3-1564-gd0b6ac6
|
|
||||||
|
|
||||||
* Fri Mar 14 2008 Jakub Jelinek <jakub@redhat.com> 2.7.90-11
|
|
||||||
- remove <stropts.h>, define _XOPEN_STREAMS -1 (#436349)
|
|
||||||
|
|
||||||
diff -Nrup a/nptl/sysdeps/unix/sysv/linux/bits/posix_opt.h b/nptl/sysdeps/unix/sysv/linux/bits/posix_opt.h
|
|
||||||
--- a/sysdeps/unix/sysv/linux/bits/posix_opt.h 2012-06-05 07:42:49.000000000 -0600
|
|
||||||
+++ b/sysdeps/unix/sysv/linux/bits/posix_opt.h 2012-06-07 12:15:21.817318674 -0600
|
|
||||||
@@ -188,4 +188,7 @@
|
|
||||||
/* Typed memory objects are not available. */
|
|
||||||
#define _POSIX_TYPED_MEMORY_OBJECTS -1
|
|
||||||
|
|
||||||
+/* Streams are not available. */
|
|
||||||
+#define _XOPEN_STREAMS -1
|
|
||||||
+
|
|
||||||
#endif /* bits/posix_opt.h */
|
|
||||||
diff -Nrup a/streams/Makefile b/streams/Makefile
|
|
||||||
--- a/streams/Makefile 2012-06-05 07:42:49.000000000 -0600
|
|
||||||
+++ b/streams/Makefile 2012-06-07 12:15:21.824318649 -0600
|
|
||||||
@@ -20,7 +20,7 @@
|
|
||||||
|
|
||||||
include ../Makeconfig
|
|
||||||
|
|
||||||
-headers = stropts.h sys/stropts.h bits/stropts.h bits/xtitypes.h
|
|
||||||
+#headers = stropts.h sys/stropts.h bits/stropts.h bits/xtitypes.h
|
|
||||||
routines = isastream getmsg getpmsg putmsg putpmsg fattach fdetach
|
|
||||||
|
|
||||||
include ../Rules
|
|
@ -1,272 +0,0 @@
|
|||||||
Short description: RPM Post-upgrade cleanup program.
|
|
||||||
Author(s): Fedora glibc team <glibc@lists.fedoraproject.org>
|
|
||||||
Origin: PATCH
|
|
||||||
Upstream status: not-needed
|
|
||||||
|
|
||||||
A helper program is needed to clean up the system configuration
|
|
||||||
early during RPM package installation, so that other scriptlets
|
|
||||||
can run successfully.
|
|
||||||
|
|
||||||
diff --git a/elf/Makefile b/elf/Makefile
|
|
||||||
index 2a432d8beebcd207..368dcae477fff2ae 100644
|
|
||||||
--- a/elf/Makefile
|
|
||||||
+++ b/elf/Makefile
|
|
||||||
@@ -117,6 +117,14 @@ others-extras = $(ldconfig-modules)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
+# This needs to be statically linked because it is executed at a time
|
|
||||||
+# when there might be incompatible shared objects on disk, and the
|
|
||||||
+# purpose of this program is to remove them (among other things).
|
|
||||||
+others-static += glibc_post_upgrade
|
|
||||||
+others += glibc_post_upgrade
|
|
||||||
+glibc_post_upgrade-modules := static-stubs
|
|
||||||
+CFLAGS-glibc_post_upgrade.c += -DGCONV_MODULES_DIR='"$(gconvdir)"'
|
|
||||||
+
|
|
||||||
# To find xmalloc.c and xstrdup.c
|
|
||||||
vpath %.c ../locale/programs
|
|
||||||
|
|
||||||
@@ -559,6 +567,8 @@ $(objpfx)sln: $(sln-modules:%=$(objpfx)%.o)
|
|
||||||
|
|
||||||
$(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o)
|
|
||||||
|
|
||||||
+$(objpfx)glibc_post_upgrade: $(glibc_post_upgrade-modules:%=$(objpfx)%.o)
|
|
||||||
+
|
|
||||||
SYSCONF-FLAGS := -D'SYSCONFDIR="$(sysconfdir)"'
|
|
||||||
CFLAGS-ldconfig.c += $(SYSCONF-FLAGS) -D'LIBDIR="$(libdir)"' \
|
|
||||||
-D'SLIBDIR="$(slibdir)"'
|
|
||||||
diff --git a/elf/glibc_post_upgrade.c b/elf/glibc_post_upgrade.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000000000..19b59f70e2308032
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/elf/glibc_post_upgrade.c
|
|
||||||
@@ -0,0 +1,229 @@
|
|
||||||
+#include <sys/types.h>
|
|
||||||
+#include <sys/wait.h>
|
|
||||||
+#include <stdio.h>
|
|
||||||
+#include <errno.h>
|
|
||||||
+#include <unistd.h>
|
|
||||||
+#include <sys/time.h>
|
|
||||||
+#include <dirent.h>
|
|
||||||
+#include <stddef.h>
|
|
||||||
+#include <fcntl.h>
|
|
||||||
+#include <string.h>
|
|
||||||
+
|
|
||||||
+#define LD_SO_CONF "/etc/ld.so.conf"
|
|
||||||
+#define ICONVCONFIG "/usr/sbin/iconvconfig"
|
|
||||||
+
|
|
||||||
+#define verbose_exec(failcode, path...) \
|
|
||||||
+ do \
|
|
||||||
+ { \
|
|
||||||
+ char *const arr[] = { path, NULL }; \
|
|
||||||
+ vexec (failcode, arr); \
|
|
||||||
+ } while (0)
|
|
||||||
+
|
|
||||||
+__attribute__((noinline)) static void vexec (int failcode, char *const path[]);
|
|
||||||
+__attribute__((noinline)) static void says (const char *str);
|
|
||||||
+__attribute__((noinline)) static void sayn (long num);
|
|
||||||
+__attribute__((noinline)) static void message (char *const path[]);
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+main (void)
|
|
||||||
+{
|
|
||||||
+ char initpath[256];
|
|
||||||
+
|
|
||||||
+ char buffer[4096];
|
|
||||||
+ struct pref {
|
|
||||||
+ const char *p;
|
|
||||||
+ int len;
|
|
||||||
+ } prefix[] = { { "libc-", 5 }, { "libm-", 5 },
|
|
||||||
+ { "librt-", 6 }, { "libpthread-", 11 },
|
|
||||||
+ { "librtkaio-", 10 }, { "libthread_db-", 13 } };
|
|
||||||
+ int i, j, fd;
|
|
||||||
+ off_t base;
|
|
||||||
+ ssize_t ret;
|
|
||||||
+
|
|
||||||
+ /* In order to support in-place upgrades, we must immediately remove
|
|
||||||
+ obsolete platform directories after installing a new glibc
|
|
||||||
+ version. RPM only deletes files removed by updates near the end
|
|
||||||
+ of the transaction. If we did not remove the obsolete platform
|
|
||||||
+ directories here, they would be preferred by the dynamic linker
|
|
||||||
+ during the execution of subsequent RPM scriptlets, likely
|
|
||||||
+ resulting in process startup failures. */
|
|
||||||
+ const char *remove_dirs[] =
|
|
||||||
+ {
|
|
||||||
+#if defined (__i386__)
|
|
||||||
+ "/lib/i686",
|
|
||||||
+ "/lib/i686/nosegneg",
|
|
||||||
+#elif defined (__powerpc64__) && _CALL_ELF != 2
|
|
||||||
+ "/lib64/power6",
|
|
||||||
+#endif
|
|
||||||
+ };
|
|
||||||
+ for (j = 0; j < sizeof (remove_dirs) / sizeof (remove_dirs[0]); ++j)
|
|
||||||
+ {
|
|
||||||
+ size_t rmlen = strlen (remove_dirs[j]);
|
|
||||||
+ fd = open (remove_dirs[j], O_RDONLY);
|
|
||||||
+ if (fd >= 0
|
|
||||||
+ && (ret = getdirentries (fd, buffer, sizeof (buffer), &base))
|
|
||||||
+ >= (ssize_t) offsetof (struct dirent, d_name))
|
|
||||||
+ {
|
|
||||||
+ for (base = 0; base + offsetof (struct dirent, d_name) < ret; )
|
|
||||||
+ {
|
|
||||||
+ struct dirent *d = (struct dirent *) (buffer + base);
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < sizeof (prefix) / sizeof (prefix[0]); i++)
|
|
||||||
+ if (! strncmp (d->d_name, prefix[i].p, prefix[i].len))
|
|
||||||
+ {
|
|
||||||
+ char *p = d->d_name + prefix[i].len;
|
|
||||||
+
|
|
||||||
+ while (*p == '.' || (*p >= '0' && *p <= '9')) p++;
|
|
||||||
+ if (p[0] == 's' && p[1] == 'o' && p[2] == '\0'
|
|
||||||
+ && p + 3 - d->d_name
|
|
||||||
+ < sizeof (initpath) - rmlen - 1)
|
|
||||||
+ {
|
|
||||||
+ memcpy (initpath, remove_dirs[j], rmlen);
|
|
||||||
+ initpath[rmlen] = '/';
|
|
||||||
+ strcpy (initpath + rmlen + 1, d->d_name);
|
|
||||||
+ unlink (initpath);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ base += d->d_reclen;
|
|
||||||
+ }
|
|
||||||
+ close (fd);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ int ldsocfd = open (LD_SO_CONF, O_RDONLY);
|
|
||||||
+ struct stat ldsocst;
|
|
||||||
+ if (ldsocfd >= 0 && fstat (ldsocfd, &ldsocst) >= 0)
|
|
||||||
+ {
|
|
||||||
+ char p[ldsocst.st_size + 1];
|
|
||||||
+ if (read (ldsocfd, p, ldsocst.st_size) == ldsocst.st_size)
|
|
||||||
+ {
|
|
||||||
+ p[ldsocst.st_size] = '\0';
|
|
||||||
+ if (strstr (p, "include ld.so.conf.d/*.conf") == NULL)
|
|
||||||
+ {
|
|
||||||
+ close (ldsocfd);
|
|
||||||
+ ldsocfd = open (LD_SO_CONF, O_WRONLY | O_TRUNC);
|
|
||||||
+ if (ldsocfd >= 0)
|
|
||||||
+ {
|
|
||||||
+ size_t slen = strlen ("include ld.so.conf.d/*.conf\n");
|
|
||||||
+ if (write (ldsocfd, "include ld.so.conf.d/*.conf\n", slen)
|
|
||||||
+ != slen
|
|
||||||
+ || write (ldsocfd, p, ldsocst.st_size) != ldsocst.st_size)
|
|
||||||
+ _exit (109);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (ldsocfd >= 0)
|
|
||||||
+ close (ldsocfd);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* If installing bi-arch glibc, rpm sometimes doesn't unpack all files
|
|
||||||
+ before running one of the lib's %post scriptlet. /sbin/ldconfig will
|
|
||||||
+ then be run by the other arch's %post. */
|
|
||||||
+ if (! access ("/sbin/ldconfig", X_OK))
|
|
||||||
+ verbose_exec (110,
|
|
||||||
+ (char *) "/sbin/ldconfig",
|
|
||||||
+ (char *) "/sbin/ldconfig");
|
|
||||||
+
|
|
||||||
+ if (! utimes (GCONV_MODULES_DIR "/gconv-modules.cache", NULL))
|
|
||||||
+ {
|
|
||||||
+ const char *iconv_cache = GCONV_MODULES_DIR "/gconv-modules.cache";
|
|
||||||
+ const char *iconv_dir = GCONV_MODULES_DIR;
|
|
||||||
+ verbose_exec (113,
|
|
||||||
+ (char *) ICONVCONFIG,
|
|
||||||
+ (char *) "/usr/sbin/iconvconfig",
|
|
||||||
+ (char *) "-o",
|
|
||||||
+ (char *) iconv_cache,
|
|
||||||
+ (char *) "--nostdlib",
|
|
||||||
+ (char *) iconv_dir);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ _exit(0);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
+vexec (int failcode, char *const path[])
|
|
||||||
+{
|
|
||||||
+ pid_t pid;
|
|
||||||
+ int status, save_errno;
|
|
||||||
+ int devnull = 0;
|
|
||||||
+
|
|
||||||
+ if (failcode < 0)
|
|
||||||
+ {
|
|
||||||
+ devnull = 1;
|
|
||||||
+ failcode = -failcode;
|
|
||||||
+ }
|
|
||||||
+ pid = vfork ();
|
|
||||||
+ if (pid == 0)
|
|
||||||
+ {
|
|
||||||
+ int fd;
|
|
||||||
+ if (devnull && (fd = open ("/dev/null", O_WRONLY)) >= 0)
|
|
||||||
+ {
|
|
||||||
+ dup2 (fd, 1);
|
|
||||||
+ dup2 (fd, 2);
|
|
||||||
+ close (fd);
|
|
||||||
+ }
|
|
||||||
+ execv (path[0], path + 1);
|
|
||||||
+ save_errno = errno;
|
|
||||||
+ message (path);
|
|
||||||
+ says (" exec failed with errno ");
|
|
||||||
+ sayn (save_errno);
|
|
||||||
+ says ("\n");
|
|
||||||
+ _exit (failcode);
|
|
||||||
+ }
|
|
||||||
+ else if (pid < 0)
|
|
||||||
+ {
|
|
||||||
+ save_errno = errno;
|
|
||||||
+ message (path);
|
|
||||||
+ says (" fork failed with errno ");
|
|
||||||
+ sayn (save_errno);
|
|
||||||
+ says ("\n");
|
|
||||||
+ _exit (failcode + 1);
|
|
||||||
+ }
|
|
||||||
+ if (waitpid (0, &status, 0) != pid || !WIFEXITED (status))
|
|
||||||
+ {
|
|
||||||
+ message (path);
|
|
||||||
+ says (" child terminated abnormally\n");
|
|
||||||
+ _exit (failcode + 2);
|
|
||||||
+ }
|
|
||||||
+ if (WEXITSTATUS (status))
|
|
||||||
+ {
|
|
||||||
+ message (path);
|
|
||||||
+ says (" child exited with exit code ");
|
|
||||||
+ sayn (WEXITSTATUS (status));
|
|
||||||
+ says ("\n");
|
|
||||||
+ _exit (WEXITSTATUS (status));
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+says (const char *str)
|
|
||||||
+{
|
|
||||||
+ write (1, str, strlen (str));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+sayn (long num)
|
|
||||||
+{
|
|
||||||
+ char string[sizeof (long) * 3 + 1];
|
|
||||||
+ char *p = string + sizeof (string) - 1;
|
|
||||||
+
|
|
||||||
+ *p = '\0';
|
|
||||||
+ if (num == 0)
|
|
||||||
+ *--p = '0';
|
|
||||||
+ else
|
|
||||||
+ while (num)
|
|
||||||
+ {
|
|
||||||
+ *--p = '0' + num % 10;
|
|
||||||
+ num = num / 10;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ says (p);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+message (char *const path[])
|
|
||||||
+{
|
|
||||||
+ says ("/usr/sbin/glibc_post_upgrade: While trying to execute ");
|
|
||||||
+ says (path[0]);
|
|
||||||
+}
|
|
@ -1,100 +0,0 @@
|
|||||||
resolv: Enable full ICMP error reporting for UDP DNS sockets
|
|
||||||
|
|
||||||
The Linux kernel suppresses some ICMP error messages by default for UDP
|
|
||||||
sockets. This commit enables full ICMP error reporting, hopefully
|
|
||||||
resulting in faster timeouts.
|
|
||||||
|
|
||||||
diff --git a/resolv/Makefile b/resolv/Makefile
|
|
||||||
index 8f22e6a154621238..ebe1b733f294a97c 100644
|
|
||||||
--- a/resolv/Makefile
|
|
||||||
+++ b/resolv/Makefile
|
|
||||||
@@ -105,7 +105,7 @@ libresolv-routines := res_comp res_debug \
|
|
||||||
res_data res_mkquery res_query res_send \
|
|
||||||
inet_net_ntop inet_net_pton inet_neta base64 \
|
|
||||||
ns_parse ns_name ns_netint ns_ttl ns_print \
|
|
||||||
- ns_samedomain ns_date \
|
|
||||||
+ ns_samedomain ns_date res_enable_icmp \
|
|
||||||
compat-hooks compat-gethnamaddr
|
|
||||||
|
|
||||||
libanl-routines := gai_cancel gai_error gai_misc gai_notify gai_suspend \
|
|
||||||
diff --git a/resolv/res_enable_icmp.c b/resolv/res_enable_icmp.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000000000..bdc9220f08cef71d
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/resolv/res_enable_icmp.c
|
|
||||||
@@ -0,0 +1,37 @@
|
|
||||||
+/* Enable full ICMP errors on a socket.
|
|
||||||
+ Copyright (C) 2019 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, see
|
|
||||||
+ <http://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+#include <errno.h>
|
|
||||||
+#include <netinet/in.h>
|
|
||||||
+#include <sys/socket.h>
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+__res_enable_icmp (int family, int fd)
|
|
||||||
+{
|
|
||||||
+ int one = 1;
|
|
||||||
+ switch (family)
|
|
||||||
+ {
|
|
||||||
+ case AF_INET:
|
|
||||||
+ return setsockopt (fd, SOL_IP, IP_RECVERR, &one, sizeof (one));
|
|
||||||
+ case AF_INET6:
|
|
||||||
+ return setsockopt (fd, SOL_IPV6, IPV6_RECVERR, &one, sizeof (one));
|
|
||||||
+ default:
|
|
||||||
+ __set_errno (EAFNOSUPPORT);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
diff --git a/resolv/res_send.c b/resolv/res_send.c
|
|
||||||
index fa040c1198fadce5..0f6ec83a7ba05986 100644
|
|
||||||
--- a/resolv/res_send.c
|
|
||||||
+++ b/resolv/res_send.c
|
|
||||||
@@ -943,6 +943,18 @@ reopen (res_state statp, int *terrno, int ns)
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* Enable full ICMP error reporting for this
|
|
||||||
+ socket. */
|
|
||||||
+ if (__res_enable_icmp (nsap->sa_family,
|
|
||||||
+ EXT (statp).nssocks[ns]) < 0)
|
|
||||||
+ {
|
|
||||||
+ int saved_errno = errno;
|
|
||||||
+ __res_iclose (statp, false);
|
|
||||||
+ __set_errno (saved_errno);
|
|
||||||
+ *terrno = saved_errno;
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* On a 4.3BSD+ machine (client and server,
|
|
||||||
* actually), sending to a nameserver datagram
|
|
||||||
diff --git a/resolv/resolv-internal.h b/resolv/resolv-internal.h
|
|
||||||
index 6ab8f2af09a7ce0b..1500adc607f2ce3e 100644
|
|
||||||
--- a/resolv/resolv-internal.h
|
|
||||||
+++ b/resolv/resolv-internal.h
|
|
||||||
@@ -100,4 +100,10 @@ libc_hidden_proto (__inet_pton_length)
|
|
||||||
/* Called as part of the thread shutdown sequence. */
|
|
||||||
void __res_thread_freeres (void) attribute_hidden;
|
|
||||||
|
|
||||||
+/* The Linux kernel does not enable all ICMP messages on a UDP socket
|
|
||||||
+ by default. A call this function enables full error reporting for
|
|
||||||
+ the socket FD. FAMILY must be AF_INET or AF_INET6. Returns 0 on
|
|
||||||
+ success, -1 on failure. */
|
|
||||||
+int __res_enable_icmp (int family, int fd) attribute_hidden;
|
|
||||||
+
|
|
||||||
#endif /* _RESOLV_INTERNAL_H */
|
|
@ -1,26 +0,0 @@
|
|||||||
Fix a user-after-free bug in the Systemtap probe in
|
|
||||||
__pthread_timedjoin_ex:
|
|
||||||
|
|
||||||
/* Free the TCB. */
|
|
||||||
__free_tcb (pd);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pd->joinid = NULL;
|
|
||||||
|
|
||||||
LIBC_PROBE (pthread_join_ret, 3, threadid, result, pd->result);
|
|
||||||
|
|
||||||
__free_tcb has freed the stack, the access pd->result is invalid.
|
|
||||||
|
|
||||||
diff --git a/nptl/pthread_join_common.c b/nptl/pthread_join_common.c
|
|
||||||
index ecb78ffba5861bdc..45deba6a74c5efd2 100644
|
|
||||||
--- a/nptl/pthread_join_common.c
|
|
||||||
+++ b/nptl/pthread_join_common.c
|
|
||||||
@@ -101,7 +101,7 @@ __pthread_timedjoin_ex (pthread_t threadid, void **thread_return,
|
|
||||||
else
|
|
||||||
pd->joinid = NULL;
|
|
||||||
|
|
||||||
- LIBC_PROBE (pthread_join_ret, 3, threadid, result, pd->result);
|
|
||||||
+ LIBC_PROBE (pthread_join_ret, 3, threadid, result, result);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
715
glibc.spec
715
glibc.spec
@ -1,5 +1,5 @@
|
|||||||
%define glibcsrcdir glibc-2.29-5-gc096b008d2
|
%define glibcsrcdir glibc-2.30-1-gbe9a328c93
|
||||||
%define glibcversion 2.29
|
%define glibcversion 2.30
|
||||||
# Pre-release tarballs are pulled in from git using a command that is
|
# Pre-release tarballs are pulled in from git using a command that is
|
||||||
# effectively:
|
# effectively:
|
||||||
#
|
#
|
||||||
@ -87,7 +87,7 @@
|
|||||||
Summary: The GNU libc libraries
|
Summary: The GNU libc libraries
|
||||||
Name: glibc
|
Name: glibc
|
||||||
Version: %{glibcversion}
|
Version: %{glibcversion}
|
||||||
Release: 7.0.riscv64%{?dist}
|
Release: 1%{?dist}
|
||||||
|
|
||||||
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
|
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
|
||||||
# libraries.
|
# libraries.
|
||||||
@ -118,7 +118,6 @@ License: LGPLv2+ and LGPLv2+ with exceptions and GPLv2+ and GPLv2+ with exceptio
|
|||||||
|
|
||||||
URL: http://www.gnu.org/software/glibc/
|
URL: http://www.gnu.org/software/glibc/
|
||||||
Source0: %{?glibc_release_url}%{glibcsrcdir}.tar.xz
|
Source0: %{?glibc_release_url}%{glibcsrcdir}.tar.xz
|
||||||
Source1: build-locale-archive.c
|
|
||||||
Source4: nscd.conf
|
Source4: nscd.conf
|
||||||
Source7: nsswitch.conf
|
Source7: nsswitch.conf
|
||||||
Source8: power6emul.c
|
Source8: power6emul.c
|
||||||
@ -137,7 +136,6 @@ Source12: ChangeLog.old
|
|||||||
# - See each individual patch file for origin and upstream status.
|
# - See each individual patch file for origin and upstream status.
|
||||||
# - For new patches follow template.patch format.
|
# - For new patches follow template.patch format.
|
||||||
##############################################################################
|
##############################################################################
|
||||||
Patch1: glibc-post_upgrade.patch
|
|
||||||
Patch2: glibc-fedora-nscd.patch
|
Patch2: glibc-fedora-nscd.patch
|
||||||
Patch3: glibc-rh697421.patch
|
Patch3: glibc-rh697421.patch
|
||||||
Patch4: glibc-fedora-linux-tcsetattr.patch
|
Patch4: glibc-fedora-linux-tcsetattr.patch
|
||||||
@ -146,8 +144,6 @@ Patch6: glibc-fedora-localedef.patch
|
|||||||
Patch7: glibc-fedora-nis-rh188246.patch
|
Patch7: glibc-fedora-nis-rh188246.patch
|
||||||
Patch8: glibc-fedora-manual-dircategory.patch
|
Patch8: glibc-fedora-manual-dircategory.patch
|
||||||
Patch9: glibc-rh827510.patch
|
Patch9: glibc-rh827510.patch
|
||||||
Patch10: glibc-fedora-locarchive.patch
|
|
||||||
Patch11: glibc-fedora-streams-rh436349.patch
|
|
||||||
Patch12: glibc-rh819430.patch
|
Patch12: glibc-rh819430.patch
|
||||||
Patch13: glibc-fedora-localedata-rh61908.patch
|
Patch13: glibc-fedora-localedata-rh61908.patch
|
||||||
Patch14: glibc-fedora-__libc_multiple_libcs.patch
|
Patch14: glibc-fedora-__libc_multiple_libcs.patch
|
||||||
@ -157,11 +153,13 @@ Patch17: glibc-cs-path.patch
|
|||||||
Patch18: glibc-c-utf8-locale.patch
|
Patch18: glibc-c-utf8-locale.patch
|
||||||
Patch23: glibc-python3.patch
|
Patch23: glibc-python3.patch
|
||||||
Patch28: glibc-rh1615608.patch
|
Patch28: glibc-rh1615608.patch
|
||||||
Patch29: glibc-rh1670028.patch
|
|
||||||
Patch99: glibc-rh1674280.patch
|
|
||||||
|
|
||||||
# Backport https://sourceware.org/git/?p=glibc.git;a=commit;h=85bd1ddbdfdfd13cfd06f7c367519b6ed3360843
|
# In progress upstream submission for nsswitch.conf changes:
|
||||||
Patch120: glibc-riscv-85bd1ddbdfdfd13cfd06f7c367519b6ed3360843.patch
|
# https://www.sourceware.org/ml/libc-alpha/2019-03/msg00425.html
|
||||||
|
# In progress upstream submission for nscd.conf changes:
|
||||||
|
# https://www.sourceware.org/ml/libc-alpha/2019-03/msg00436.html
|
||||||
|
Patch31: glibc-fedora-nscd-warnings.patch
|
||||||
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# Continued list of core "glibc" package information:
|
# Continued list of core "glibc" package information:
|
||||||
@ -401,8 +399,11 @@ libraries, as well as national language (locale) support.
|
|||||||
/sbin/ldconfig
|
/sbin/ldconfig
|
||||||
%end
|
%end
|
||||||
|
|
||||||
# We need to run ldconfig manually because ldconfig cannot handle the
|
# We need to run ldconfig manually because __brp_ldconfig assumes that
|
||||||
# relative include path in the /etc/ld.so.conf file we gneerate.
|
# glibc itself is always installed in $RPM_BUILD_ROOT, but with sysroots
|
||||||
|
# we may be installed into a subdirectory of that path. Therefore we
|
||||||
|
# unset __brp_ldconfig and run ldconfig by hand with the sysroots path
|
||||||
|
# passed to -r.
|
||||||
%undefine __brp_ldconfig
|
%undefine __brp_ldconfig
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
@ -659,8 +660,8 @@ This package provides debug information for package %{name}.
|
|||||||
Debug information is useful when developing applications that use this
|
Debug information is useful when developing applications that use this
|
||||||
package or when debugging this package.
|
package or when debugging this package.
|
||||||
|
|
||||||
%endif # %{debuginfocommonarches}
|
%endif
|
||||||
%endif # 0%{?_enable_debug_packages}
|
%endif
|
||||||
|
|
||||||
%if %{with benchtests}
|
%if %{with benchtests}
|
||||||
%package benchtests
|
%package benchtests
|
||||||
@ -1032,15 +1033,17 @@ rm -f %{glibc_sysroot}%{_infodir}/libc.info*
|
|||||||
olddir=`pwd`
|
olddir=`pwd`
|
||||||
pushd %{glibc_sysroot}%{_prefix}/lib/locale
|
pushd %{glibc_sysroot}%{_prefix}/lib/locale
|
||||||
rm -f locale-archive
|
rm -f locale-archive
|
||||||
# Intentionally we do not pass --alias-file=, aliases will be added
|
|
||||||
# by build-locale-archive.
|
|
||||||
$olddir/build-%{target}/elf/ld.so \
|
$olddir/build-%{target}/elf/ld.so \
|
||||||
--library-path $olddir/build-%{target}/ \
|
--library-path $olddir/build-%{target}/ \
|
||||||
$olddir/build-%{target}/locale/localedef \
|
$olddir/build-%{target}/locale/localedef \
|
||||||
|
--alias-file=$olddir/intl/locale.alias \
|
||||||
--prefix %{glibc_sysroot} --add-to-archive \
|
--prefix %{glibc_sysroot} --add-to-archive \
|
||||||
eo *_*
|
eo *_*
|
||||||
# Setup the locale-archive template for use by glibc-all-langpacks.
|
# Historically, glibc-all-langpacks deleted the file on updates (sic),
|
||||||
mv locale-archive{,.tmpl}
|
# so we need to restore it in the posttrans scriptlet (like the old
|
||||||
|
# glibc-all-langpacks versions)
|
||||||
|
ln locale-archive locale-archive.real
|
||||||
|
|
||||||
# Create the file lists for the language specific sub-packages:
|
# Create the file lists for the language specific sub-packages:
|
||||||
for i in eo *_*
|
for i in eo *_*
|
||||||
do
|
do
|
||||||
@ -1094,10 +1097,6 @@ truncate -s 0 %{glibc_sysroot}/etc/gai.conf
|
|||||||
truncate -s 0 %{glibc_sysroot}%{_libdir}/gconv/gconv-modules.cache
|
truncate -s 0 %{glibc_sysroot}%{_libdir}/gconv/gconv-modules.cache
|
||||||
chmod 644 %{glibc_sysroot}%{_libdir}/gconv/gconv-modules.cache
|
chmod 644 %{glibc_sysroot}%{_libdir}/gconv/gconv-modules.cache
|
||||||
|
|
||||||
# Install the upgrade program
|
|
||||||
install -m 700 build-%{target}/elf/glibc_post_upgrade \
|
|
||||||
%{glibc_sysroot}%{_prefix}/sbin/glibc_post_upgrade.%{_target_cpu}
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# Install debug copies of unstripped static libraries
|
# Install debug copies of unstripped static libraries
|
||||||
# - This step must be last in order to capture any additional static
|
# - This step must be last in order to capture any additional static
|
||||||
@ -1121,21 +1120,10 @@ rm -rf %{glibc_sysroot}%{_prefix}/share/zoneinfo
|
|||||||
# XXX: Ideally ld.so.conf should have the timestamp of the spec file, but there
|
# XXX: Ideally ld.so.conf should have the timestamp of the spec file, but there
|
||||||
# doesn't seem to be any macro to give us that. So we do the next best thing,
|
# doesn't seem to be any macro to give us that. So we do the next best thing,
|
||||||
# which is to at least keep the timestamp consistent. The choice of using
|
# which is to at least keep the timestamp consistent. The choice of using
|
||||||
# glibc_post_upgrade.c is arbitrary.
|
# SOURCE0 is arbitrary.
|
||||||
touch -r %{SOURCE0} %{glibc_sysroot}/etc/ld.so.conf
|
touch -r %{SOURCE0} %{glibc_sysroot}/etc/ld.so.conf
|
||||||
touch -r sunrpc/etc.rpc %{glibc_sysroot}/etc/rpc
|
touch -r sunrpc/etc.rpc %{glibc_sysroot}/etc/rpc
|
||||||
|
|
||||||
pushd build-%{target}
|
|
||||||
$GCC -Os -g -static -o build-locale-archive %{SOURCE1} \
|
|
||||||
../build-%{target}/locale/locarchive.o \
|
|
||||||
../build-%{target}/locale/md5.o \
|
|
||||||
../build-%{target}/locale/record-status.o \
|
|
||||||
-I. -DDATADIR=\"%{_datadir}\" -DPREFIX=\"%{_prefix}\" \
|
|
||||||
-L../build-%{target} \
|
|
||||||
-B../build-%{target}/csu/ -lc -lc_nonshared
|
|
||||||
install -m 700 build-locale-archive %{glibc_sysroot}%{_prefix}/sbin/build-locale-archive
|
|
||||||
popd
|
|
||||||
|
|
||||||
# Lastly copy some additional documentation for the packages.
|
# Lastly copy some additional documentation for the packages.
|
||||||
rm -rf documentation
|
rm -rf documentation
|
||||||
mkdir documentation
|
mkdir documentation
|
||||||
@ -1166,6 +1154,7 @@ cp benchtests/scripts/benchout.schema.json %{glibc_sysroot}%{_prefix}/libexec/gl
|
|||||||
cp benchtests/scripts/compare_bench.py %{glibc_sysroot}%{_prefix}/libexec/glibc-benchtests/
|
cp benchtests/scripts/compare_bench.py %{glibc_sysroot}%{_prefix}/libexec/glibc-benchtests/
|
||||||
cp benchtests/scripts/import_bench.py %{glibc_sysroot}%{_prefix}/libexec/glibc-benchtests/
|
cp benchtests/scripts/import_bench.py %{glibc_sysroot}%{_prefix}/libexec/glibc-benchtests/
|
||||||
cp benchtests/scripts/validate_benchout.py %{glibc_sysroot}%{_prefix}/libexec/glibc-benchtests/
|
cp benchtests/scripts/validate_benchout.py %{glibc_sysroot}%{_prefix}/libexec/glibc-benchtests/
|
||||||
|
%endif
|
||||||
|
|
||||||
%if 0%{?_enable_debug_packages}
|
%if 0%{?_enable_debug_packages}
|
||||||
# The #line directives gperf generates do not give the proper
|
# The #line directives gperf generates do not give the proper
|
||||||
@ -1184,7 +1173,6 @@ rm -f %{glibc_sysroot}%{_infodir}/dir
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%ifnarch %{auxarches}
|
%ifnarch %{auxarches}
|
||||||
truncate -s 0 %{glibc_sysroot}/%{_prefix}/lib/locale/locale-archive
|
|
||||||
mkdir -p %{glibc_sysroot}/var/{db,run}/nscd
|
mkdir -p %{glibc_sysroot}/var/{db,run}/nscd
|
||||||
touch %{glibc_sysroot}/var/{db,run}/nscd/{passwd,group,hosts,services}
|
touch %{glibc_sysroot}/var/{db,run}/nscd/{passwd,group,hosts,services}
|
||||||
touch %{glibc_sysroot}/var/run/nscd/{socket,nscd.pid}
|
touch %{glibc_sysroot}/var/run/nscd/{socket,nscd.pid}
|
||||||
@ -1357,12 +1345,12 @@ chmod 0444 master.filelist
|
|||||||
# - The partial (lib*_p.a) static libraries, include files.
|
# - The partial (lib*_p.a) static libraries, include files.
|
||||||
# - The static files, objects, unversioned DSOs, and nscd.
|
# - The static files, objects, unversioned DSOs, and nscd.
|
||||||
# - The bin, locale, some sbin, and share.
|
# - The bin, locale, some sbin, and share.
|
||||||
# - The use of [^gi] is meant to exclude all files except glibc_post_upgrade,
|
# - We want iconvconfig in the main package and we do this by using
|
||||||
# and iconvconfig, which we want in the main packages.
|
# a double negation of -v and [^i] so it removes all files in
|
||||||
|
# sbin *but* iconvconfig.
|
||||||
# - All the libnss files (we add back the ones we want later).
|
# - All the libnss files (we add back the ones we want later).
|
||||||
# - All bench test binaries.
|
# - All bench test binaries.
|
||||||
# - The aux-cache, since it's handled specially in the files section.
|
# - The aux-cache, since it's handled specially in the files section.
|
||||||
# - The build-locale-archive binary since it's in the common package.
|
|
||||||
cat master.filelist \
|
cat master.filelist \
|
||||||
| grep -v \
|
| grep -v \
|
||||||
-e '%{_infodir}' \
|
-e '%{_infodir}' \
|
||||||
@ -1374,14 +1362,13 @@ cat master.filelist \
|
|||||||
-e 'nscd' \
|
-e 'nscd' \
|
||||||
-e '%{_prefix}/bin' \
|
-e '%{_prefix}/bin' \
|
||||||
-e '%{_prefix}/lib/locale' \
|
-e '%{_prefix}/lib/locale' \
|
||||||
-e '%{_prefix}/sbin/[^gi]' \
|
-e '%{_prefix}/sbin/[^i]' \
|
||||||
-e '%{_prefix}/share' \
|
-e '%{_prefix}/share' \
|
||||||
-e '/var/db/Makefile' \
|
-e '/var/db/Makefile' \
|
||||||
-e '/libnss_.*\.so[0-9.]*$' \
|
-e '/libnss_.*\.so[0-9.]*$' \
|
||||||
-e '/libnsl' \
|
-e '/libnsl' \
|
||||||
-e 'glibc-benchtests' \
|
-e 'glibc-benchtests' \
|
||||||
-e 'aux-cache' \
|
-e 'aux-cache' \
|
||||||
-e 'build-locale-archive' \
|
|
||||||
> glibc.filelist
|
> glibc.filelist
|
||||||
|
|
||||||
# Add specific files:
|
# Add specific files:
|
||||||
@ -1451,10 +1438,13 @@ grep '%{_libdir}/lib.*\.a' < master.filelist \
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
# All of the bin and certain sbin files go into the common package except
|
# All of the bin and certain sbin files go into the common package except
|
||||||
# glibc_post_upgrade.* and iconvconfig which need to go in glibc. Likewise
|
# iconvconfig which needs to go in glibc. Likewise nscd is excluded because
|
||||||
# nscd is excluded because it goes in nscd.
|
# it goes in nscd. The iconvconfig binary is kept in the main glibc package
|
||||||
|
# because we use it in the post-install scriptlet to rebuild the
|
||||||
|
# gconv-modules.cache.
|
||||||
grep '%{_prefix}/bin' master.filelist >> common.filelist
|
grep '%{_prefix}/bin' master.filelist >> common.filelist
|
||||||
grep '%{_prefix}/sbin/[^gi]' master.filelist \
|
grep '%{_prefix}/sbin' master.filelist \
|
||||||
|
| grep -v '%{_prefix}/sbin/iconvconfig' \
|
||||||
| grep -v 'nscd' >> common.filelist
|
| grep -v 'nscd' >> common.filelist
|
||||||
# All of the files under share go into the common package since they should be
|
# All of the files under share go into the common package since they should be
|
||||||
# multilib-independent.
|
# multilib-independent.
|
||||||
@ -1468,9 +1458,6 @@ grep '%{_prefix}/share' master.filelist \
|
|||||||
-e '%%dir %{prefix}/share' \
|
-e '%%dir %{prefix}/share' \
|
||||||
>> common.filelist
|
>> common.filelist
|
||||||
|
|
||||||
# Add the binary to build locales to the common subpackage.
|
|
||||||
echo '%{_prefix}/sbin/build-locale-archive' >> common.filelist
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# nscd
|
# nscd
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@ -1520,6 +1507,7 @@ grep '/libnss_[a-z]*\.so$' master.filelist > nss-devel.filelist
|
|||||||
grep '/libnsl-[0-9.]*.so$' master.filelist > libnsl.filelist
|
grep '/libnsl-[0-9.]*.so$' master.filelist > libnsl.filelist
|
||||||
test $(wc -l < libnsl.filelist) -eq 1
|
test $(wc -l < libnsl.filelist) -eq 1
|
||||||
|
|
||||||
|
%if %{with benchtests}
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# glibc-benchtests
|
# glibc-benchtests
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@ -1548,7 +1536,7 @@ echo "%{_libdir}/libpthread_nonshared.a" >> compat-libpthread-nonshared.filelist
|
|||||||
# glibc-debuginfocommon, and glibc-debuginfo
|
# glibc-debuginfocommon, and glibc-debuginfo
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
find_debuginfo_args='--strict-build-id -g'
|
find_debuginfo_args='--strict-build-id -g -i'
|
||||||
%ifarch %{debuginfocommonarches}
|
%ifarch %{debuginfocommonarches}
|
||||||
find_debuginfo_args="$find_debuginfo_args \
|
find_debuginfo_args="$find_debuginfo_args \
|
||||||
-l common.filelist \
|
-l common.filelist \
|
||||||
@ -1608,13 +1596,13 @@ egrep "$auxarches_debugsources" debuginfocommon.sources >> debuginfo.filelist
|
|||||||
egrep -v "$auxarches_debugsources" \
|
egrep -v "$auxarches_debugsources" \
|
||||||
debuginfocommon.sources >> debuginfocommon.filelist
|
debuginfocommon.sources >> debuginfocommon.filelist
|
||||||
|
|
||||||
%endif # %{biarcharches}
|
%endif
|
||||||
|
|
||||||
# Add the list of *.a archives in the debug directory to
|
# Add the list of *.a archives in the debug directory to
|
||||||
# the common debuginfo package.
|
# the common debuginfo package.
|
||||||
list_debug_archives >> debuginfocommon.filelist
|
list_debug_archives >> debuginfocommon.filelist
|
||||||
|
|
||||||
%endif # %{debuginfocommonarches}
|
%endif
|
||||||
|
|
||||||
# Remove some common directories from the common package debuginfo so that we
|
# Remove some common directories from the common package debuginfo so that we
|
||||||
# don't end up owning them.
|
# don't end up owning them.
|
||||||
@ -1634,7 +1622,7 @@ exclude_common_dirs debuginfocommon.filelist
|
|||||||
%endif
|
%endif
|
||||||
exclude_common_dirs debuginfo.filelist
|
exclude_common_dirs debuginfo.filelist
|
||||||
|
|
||||||
%endif # 0%{?_enable_debug_packages}
|
%endif
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# Delete files that we do not intended to ship with the auxarch.
|
# Delete files that we do not intended to ship with the auxarch.
|
||||||
@ -1650,7 +1638,7 @@ sed -e '/%%dir/d;/%%config/d;/%%verify/d;s/%%lang([^)]*) //;s#^/*##' \
|
|||||||
debuginfocommon.filelist \
|
debuginfocommon.filelist \
|
||||||
%endif
|
%endif
|
||||||
| (cd %{glibc_sysroot}; xargs --no-run-if-empty rm -f 2> /dev/null || :)
|
| (cd %{glibc_sysroot}; xargs --no-run-if-empty rm -f 2> /dev/null || :)
|
||||||
%endif # %{auxarches}
|
%endif
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# Run the glibc testsuite
|
# Run the glibc testsuite
|
||||||
@ -1724,24 +1712,28 @@ echo ====================PLT RELOCS LIBC.SO==============
|
|||||||
readelf -Wr %{glibc_sysroot}/%{_lib}/libc-*.so | sed -n -e "$PLTCMD"
|
readelf -Wr %{glibc_sysroot}/%{_lib}/libc-*.so | sed -n -e "$PLTCMD"
|
||||||
echo ====================PLT RELOCS END==================
|
echo ====================PLT RELOCS END==================
|
||||||
|
|
||||||
|
# Obtain a way to run the dynamic loader. Avoid matching the symbolic
|
||||||
|
# link and then pick the first loader (although there should be only
|
||||||
|
# one).
|
||||||
|
run_ldso="$(find %{glibc_sysroot}/%{_lib}/ld-*.so -type f | LC_ALL=C sort | head -n1) --library-path %{glibc_sysroot}/%{_lib}"
|
||||||
|
|
||||||
|
# Show the auxiliary vector as seen by the new library
|
||||||
|
# (even if we do not perform the valgrind test).
|
||||||
|
LD_SHOW_AUXV=1 $run_ldso /bin/true
|
||||||
|
|
||||||
# Finally, check if valgrind runs with the new glibc.
|
# Finally, check if valgrind runs with the new glibc.
|
||||||
# We want to fail building if valgrind is not able to run with this glibc so
|
# We want to fail building if valgrind is not able to run with this glibc so
|
||||||
# that we can then coordinate with valgrind to get it fixed before we update
|
# that we can then coordinate with valgrind to get it fixed before we update
|
||||||
# glibc.
|
# glibc.
|
||||||
pushd build-%{target}
|
|
||||||
|
|
||||||
# Show the auxiliary vector as seen by the new library
|
|
||||||
# (even if we do not perform the valgrind test).
|
|
||||||
LD_SHOW_AUXV=1 elf/ld.so --library-path .:elf:nptl:dlfcn /bin/true
|
|
||||||
|
|
||||||
%if %{with valgrind}
|
%if %{with valgrind}
|
||||||
elf/ld.so --library-path .:elf:nptl:dlfcn \
|
$run_ldso /usr/bin/valgrind --error-exitcode=1 \
|
||||||
/usr/bin/valgrind --error-exitcode=1 \
|
$run_ldso /usr/bin/true
|
||||||
elf/ld.so --library-path .:elf:nptl:dlfcn /usr/bin/true
|
# true --help performs some memory allocations.
|
||||||
|
$run_ldso /usr/bin/valgrind --error-exitcode=1 \
|
||||||
|
$run_ldso /usr/bin/true --help >/dev/null
|
||||||
%endif
|
%endif
|
||||||
popd
|
|
||||||
|
|
||||||
%endif # %{run_glibc_tests}
|
%endif
|
||||||
|
|
||||||
|
|
||||||
%pre -p <lua>
|
%pre -p <lua>
|
||||||
@ -1752,28 +1744,159 @@ if rpm.vercmp(rel, required) < 0 then
|
|||||||
error("FATAL: kernel too old", 0)
|
error("FATAL: kernel too old", 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
%post -p %{_prefix}/sbin/glibc_post_upgrade.%{_target_cpu}
|
%post -p <lua>
|
||||||
|
-- We use lua's posix.exec because there may be no shell that we can
|
||||||
%posttrans all-langpacks -e -p <lua>
|
-- run during glibc upgrade.
|
||||||
-- If at the end of the transaction we are still installed
|
function post_exec (program, ...)
|
||||||
-- (have a template of non-zero size), then we rebuild the
|
local pid = posix.fork ()
|
||||||
-- locale cache (locale-archive) from the pre-populated
|
|
||||||
-- locale cache (locale-archive.tmpl) i.e. template.
|
|
||||||
if posix.stat("%{_prefix}/lib/locale/locale-archive.tmpl", "size") > 0 then
|
|
||||||
pid = posix.fork()
|
|
||||||
if pid == 0 then
|
if pid == 0 then
|
||||||
posix.exec("%{_prefix}/sbin/build-locale-archive", "--install-langs", "%%{_install_langs}")
|
assert (posix.exec (program, ...))
|
||||||
elseif pid > 0 then
|
elseif pid > 0 then
|
||||||
posix.wait (pid)
|
posix.wait (pid)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
%postun all-langpacks -p <lua>
|
-- (1) Remove multilib libraries from previous installs.
|
||||||
-- In the postun we always remove the locale cache.
|
-- In order to support in-place upgrades, we must immediately remove
|
||||||
-- We are being uninstalled and if this is an upgrade
|
-- obsolete platform directories after installing a new glibc
|
||||||
-- then the new packages template will be used to
|
-- version. RPM only deletes files removed by updates near the end
|
||||||
-- recreate a new copy of the cache.
|
-- of the transaction. If we did not remove the obsolete platform
|
||||||
os.remove("%{_prefix}/lib/locale/locale-archive")
|
-- directories here, they may be preferred by the dynamic linker
|
||||||
|
-- during the execution of subsequent RPM scriptlets, likely
|
||||||
|
-- resulting in process startup failures.
|
||||||
|
|
||||||
|
-- Full set of libraries glibc may install.
|
||||||
|
install_libs = { "anl", "BrokenLocale", "c", "dl", "m", "mvec",
|
||||||
|
"nss_compat", "nss_db", "nss_dns", "nss_files",
|
||||||
|
"nss_hesiod", "pthread", "resolv", "rt", "SegFault",
|
||||||
|
"thread_db", "util" }
|
||||||
|
|
||||||
|
-- We are going to remove these libraries. Generally speaking we remove
|
||||||
|
-- all core libraries in the multilib directory.
|
||||||
|
-- We employ a tight match where X.Y is in [2.0,9.9*], so we would
|
||||||
|
-- match "libc-2.0.so" and so on up to "libc-9.9*".
|
||||||
|
remove_regexps = {}
|
||||||
|
for i = 1, #install_libs do
|
||||||
|
remove_regexps[i] = ("lib" .. install_libs[i]
|
||||||
|
.. "%%-[2-9]%%.[0-9]+%%.so$")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Two exceptions:
|
||||||
|
remove_regexps[#install_libs + 1] = "libthread_db%%-1%%.0%%.so"
|
||||||
|
remove_regexps[#install_libs + 2] = "libSegFault%%.so"
|
||||||
|
|
||||||
|
-- We are going to search these directories.
|
||||||
|
local remove_dirs = { "%{_libdir}/i686",
|
||||||
|
"%{_libdir}/i686/nosegneg",
|
||||||
|
"%{_libdir}/power6",
|
||||||
|
"%{_libdir}/power7",
|
||||||
|
"%{_libdir}/power8" }
|
||||||
|
|
||||||
|
-- Walk all the directories with files we need to remove...
|
||||||
|
for _, rdir in ipairs (remove_dirs) do
|
||||||
|
if posix.access (rdir) then
|
||||||
|
-- If the directory exists we look at all the files...
|
||||||
|
local remove_files = posix.files (rdir)
|
||||||
|
for rfile in remove_files do
|
||||||
|
for _, rregexp in ipairs (remove_regexps) do
|
||||||
|
-- Does it match the regexp?
|
||||||
|
local dso = string.match (rfile, rregexp)
|
||||||
|
if (dso ~= nil) then
|
||||||
|
-- Removing file...
|
||||||
|
os.remove (rdir .. '/' .. rfile)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- (2) Update /etc/ld.so.conf
|
||||||
|
-- Next we update /etc/ld.so.conf to ensure that it starts with
|
||||||
|
-- a literal "include ld.so.conf.d/*.conf".
|
||||||
|
|
||||||
|
local ldsoconf = "/etc/ld.so.conf"
|
||||||
|
local ldsoconf_tmp = "/etc/glibc_post_upgrade.ld.so.conf"
|
||||||
|
|
||||||
|
if posix.access (ldsoconf) then
|
||||||
|
|
||||||
|
-- We must have a "include ld.so.conf.d/*.conf" line.
|
||||||
|
local have_include = false
|
||||||
|
for line in io.lines (ldsoconf) do
|
||||||
|
-- This must match, and we don't ignore whitespace.
|
||||||
|
if string.match (line, "^include ld.so.conf.d/%%*%%.conf$") ~= nil then
|
||||||
|
have_include = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not have_include then
|
||||||
|
-- Insert "include ld.so.conf.d/*.conf" line at the start of the
|
||||||
|
-- file. We only support one of these post upgrades running at
|
||||||
|
-- a time (temporary file name is fixed).
|
||||||
|
local tmp_fd = io.open (ldsoconf_tmp, "w")
|
||||||
|
if tmp_fd ~= nil then
|
||||||
|
tmp_fd:write ("include ld.so.conf.d/*.conf\n")
|
||||||
|
for line in io.lines (ldsoconf) do
|
||||||
|
tmp_fd:write (line .. "\n")
|
||||||
|
end
|
||||||
|
tmp_fd:close ()
|
||||||
|
local res = os.rename (ldsoconf_tmp, ldsoconf)
|
||||||
|
if res == nil then
|
||||||
|
io.stdout:write ("Error: Unable to update configuration file (rename).\n")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
io.stdout:write ("Error: Unable to update configuration file (open).\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- (3) Rebuild ld.so.cache early.
|
||||||
|
-- If the format of the cache changes then we need to rebuild
|
||||||
|
-- the cache early to avoid any problems running binaries with
|
||||||
|
-- the new glibc.
|
||||||
|
|
||||||
|
-- Note: We use _prefix because Fedora's UsrMove says so.
|
||||||
|
post_exec ("%{_prefix}/sbin/ldconfig")
|
||||||
|
|
||||||
|
-- (4) Update gconv modules cache.
|
||||||
|
-- If the /usr/lib/gconv/gconv-modules.cache exists, then update it
|
||||||
|
-- with the latest set of modules that were just installed.
|
||||||
|
-- We assume that the cache is in _libdir/gconv and called
|
||||||
|
-- "gconv-modules.cache".
|
||||||
|
|
||||||
|
local iconv_dir = "%{_libdir}/gconv"
|
||||||
|
local iconv_cache = iconv_dir .. "/gconv-modules.cache"
|
||||||
|
if (posix.utime (iconv_cache) == 0) then
|
||||||
|
post_exec ("%{_prefix}/sbin/iconvconfig",
|
||||||
|
"-o", iconv_cache,
|
||||||
|
"--nostdlib",
|
||||||
|
iconv_dir)
|
||||||
|
else
|
||||||
|
io.stdout:write ("Error: Missing " .. iconv_cache .. " file.\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
%posttrans all-langpacks -e -p <lua>
|
||||||
|
-- The old glibc-all-langpacks postun scriptlet deleted the locale-archive
|
||||||
|
-- file, so we may have to resurrect it on upgrades.
|
||||||
|
local archive_path = "%{_prefix}/lib/locale/locale-archive"
|
||||||
|
local real_path = "%{_prefix}/lib/locale/locale-archive.real"
|
||||||
|
local stat_archive = posix.stat(archive_path)
|
||||||
|
local stat_real = posix.stat(real_path)
|
||||||
|
-- If the hard link was removed, restore it.
|
||||||
|
if stat_archive ~= nil and stat_real ~= nil
|
||||||
|
and (stat_archive.ino ~= stat_real.ino
|
||||||
|
or stat_archive.dev ~= stat_real.dev) then
|
||||||
|
posix.unlink(archive_path)
|
||||||
|
stat_archive = nil
|
||||||
|
end
|
||||||
|
-- If the file is gone, restore it.
|
||||||
|
if stat_archive == nil then
|
||||||
|
posix.link(real_path, archive_path)
|
||||||
|
end
|
||||||
|
-- Remove .rpmsave file potentially created due to config file change.
|
||||||
|
local save_path = archive_path .. ".rpmsave"
|
||||||
|
if posix.access(save_path) then
|
||||||
|
posix.unlink(save_path)
|
||||||
|
end
|
||||||
|
|
||||||
%pre headers
|
%pre headers
|
||||||
# this used to be a link and it is causing nightmares now
|
# this used to be a link and it is causing nightmares now
|
||||||
@ -1831,8 +1954,8 @@ fi
|
|||||||
%doc documentation/gai.conf
|
%doc documentation/gai.conf
|
||||||
|
|
||||||
%files all-langpacks
|
%files all-langpacks
|
||||||
%attr(0644,root,root) %verify(not md5 size mtime) %{_prefix}/lib/locale/locale-archive.tmpl
|
%{_prefix}/lib/locale/locale-archive
|
||||||
%attr(0644,root,root) %verify(not md5 size mtime mode) %ghost %config(missingok,noreplace) %{_prefix}/lib/locale/locale-archive
|
%{_prefix}/lib/locale/locale-archive.real
|
||||||
|
|
||||||
%files locale-source
|
%files locale-source
|
||||||
%dir %{_prefix}/share/i18n/locales
|
%dir %{_prefix}/share/i18n/locales
|
||||||
@ -1893,6 +2016,436 @@ fi
|
|||||||
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Aug 02 2019 Florian Weimer <fweimer@redhat.com> - 2.30-1
|
||||||
|
- Drop glibc-rh1734680.patch, applied upstream.
|
||||||
|
- Auto-sync with upstream branch release/2.30/master,
|
||||||
|
commit be9a328c93834648e0bec106a1f86357d1a8c7e1:
|
||||||
|
- malloc: Remove unwanted leading whitespace in malloc_info (swbz#24867)
|
||||||
|
- glibc 2.30 release
|
||||||
|
- iconv: Revert steps array reference counting changes (#1734680)
|
||||||
|
- Restore r31 setting in powerpc32 swapcontext
|
||||||
|
|
||||||
|
* Wed Jul 31 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-37
|
||||||
|
- Fix memory leak in iconv_open (#1734680)
|
||||||
|
|
||||||
|
* Tue Jul 30 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-36
|
||||||
|
- Drop glibc-rh1732406.patch, fix for the regression applied upstream.
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 8a814e20d443adc460a1030fa1a66aa9ae817483:
|
||||||
|
- nptl: Use uintptr_t for address diagnostic in nptl/tst-pthread-getattr
|
||||||
|
- Linux: Move getdents64 to <dirent.h>
|
||||||
|
- test-container: Install with $(sorted-subdirs) (swbz#24794)
|
||||||
|
- gconv: Check reference count in __gconv_release_cache (#1732406)
|
||||||
|
- x86-64: Compile branred.c with -mprefer-vector-width=128 (swbz#24603)
|
||||||
|
- build-many-glibcs.py: Use Linux 5.2 by default
|
||||||
|
- Linux: Use in-tree copy of SO_ constants for !__USE_MISC (swbz#24532)
|
||||||
|
- test-container: Avoid copying unintended system libraries
|
||||||
|
|
||||||
|
* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org>
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Jul 23 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-34
|
||||||
|
- Revert libio change that causes crashes (#1732406)
|
||||||
|
|
||||||
|
* Mon Jul 22 2019 DJ Delorie <dj@redhat.com> - 2.29.9000-33
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit dcf36bcad3f283f77893d3b157ef7bb2c99419f2.
|
||||||
|
- Add NEWS entry about the new AArch64 IFUNC resolver call ABI
|
||||||
|
- locale/C-translit.h.in: Cyrillic -> ASCII transliteration [BZ #2872]
|
||||||
|
- Linux: Update syscall-names.list to Linux 5.2
|
||||||
|
|
||||||
|
|
||||||
|
* Thu Jul 18 2019 DJ Delorie <dj@redhat.com> - 2.29.9000-32
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 3556658c5b8765480711b265abc901c67d5fc060.
|
||||||
|
- Regenerate po/libc.pot for 2.30 release.
|
||||||
|
- nptl: Add POSIX-proposed _clock functions to hppa pthread.h
|
||||||
|
- nptl: Remove unnecessary forwarding of pthread_cond_clockwait from libc
|
||||||
|
- Afar locales: Months and days updated from CLDR (bug 21897).
|
||||||
|
- nl_BE locale: Use "copy "nl_NL"" in LC_NAME (bug 23996).
|
||||||
|
- nl_BE and nl_NL locales: Dutch salutations (bug 23996).
|
||||||
|
- ga_IE and en_IE locales: Revert first_weekday removal (bug 24200).
|
||||||
|
- nptl: Remove futex_supports_exact_relative_timeouts
|
||||||
|
- Update NEWS for new _clockwait and _clocklock functions
|
||||||
|
- nptl: Add POSIX-proposed pthread_mutex_clocklock
|
||||||
|
- nptl: Rename lll_timedlock to lll_clocklock and add clockid parameter
|
||||||
|
- nptl: Add POSIX-proposed pthread_rwlock_clockrdlock & pthread_rwlock_clockwrlock
|
||||||
|
- nptl: pthread_rwlock: Move timeout validation into _full functions
|
||||||
|
- nptl: Add POSIX-proposed pthread_cond_clockwait
|
||||||
|
- nptl: Add POSIX-proposed sem_clockwait
|
||||||
|
- nptl: Add clockid parameter to futex timed wait calls
|
||||||
|
- posix: Fix large mmap64 offset for mips64n32 (BZ#24699)
|
||||||
|
- nss_db: fix endent wrt NULL mappings [BZ #24695] [BZ #24696]
|
||||||
|
|
||||||
|
* Wed Jul 10 2019 Carlos O'Donell <carlos@redhat.com> - 2.29.9000-31
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 30ba0375464f34e4bf8129f3d3dc14d0c09add17.
|
||||||
|
- Don't declare __malloc_check_init in <malloc.h> (bug 23352)
|
||||||
|
- nftw: fill in stat buf for dangling links [BZ #23501]
|
||||||
|
- dl-vdso: Add LINUX_4 HASH CODE to support nds32 vdso mechanism
|
||||||
|
- riscv: restore ABI compatibility (bug 24484)
|
||||||
|
- aarch64: new ifunc resolver ABI
|
||||||
|
- nptl: Remove vfork IFUNC-based forwarder from libpthread [BZ #20188]
|
||||||
|
- malloc: Add nptl, htl dependency for the subdirectory [BZ #24757]
|
||||||
|
- Call _dl_open_check after relocation [BZ #24259]
|
||||||
|
- Linux: Use mmap instead of malloc in dirent/tst-getdents64
|
||||||
|
- ld.so: Support moving versioned symbols between sonames [BZ #24741]
|
||||||
|
- io: Remove copy_file_range emulation [BZ #24744]
|
||||||
|
- Linux: Adjust gedents64 buffer size to int range [BZ #24740]
|
||||||
|
- powerpc: Use generic e_expf
|
||||||
|
- Linux: Add nds32 specific syscalls to syscall-names.list
|
||||||
|
- szl_PL locale: Fix a typo in the previous commit (bug 24652).
|
||||||
|
|
||||||
|
* Mon Jun 24 2019 DJ Delorie <dj@redhat.com> - 2.29.9000-30
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 2bd81b60d6ffdf7e0d22006d69f4b812b1c80513.
|
||||||
|
- szl_PL locale: Spelling corrections (swbz 24652).
|
||||||
|
- nl_{AW,NL}: Correct the thousands separator and grouping (swbz 23831).
|
||||||
|
- Add missing VDSO_{NAME,HASH}_* macros and use them for PREPARE_VERSION_KNOWN
|
||||||
|
- nptl: Convert various tests to use libsupport
|
||||||
|
- support: Invent verbose_printf macro
|
||||||
|
- support: Add xclock_now helper function.
|
||||||
|
|
||||||
|
* Fri Jun 21 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-29
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 21cc130b78a4db9113fb6695e2b951e697662440:
|
||||||
|
- During exit, skip wide buffer handling for legacy stdio handles (#1722216)
|
||||||
|
- powerpc: add 'volatile' to asm
|
||||||
|
- powerpc: Fix static-linked version of __ppc_get_timebase_freq (swbz#24640)
|
||||||
|
- nl_AW locale: Correct the negative monetary format (swb#z24614)
|
||||||
|
- Fix gcc 9 build errors for make xcheck. (swbz#24556)
|
||||||
|
- dlfcn: Avoid one-element flexible array in Dl_serinfo (swbz#24166)
|
||||||
|
- elf: Refuse to dlopen PIE objects (swbz#24323)
|
||||||
|
- nl_NL locale: Correct the negative monetary format (swbz#24614)
|
||||||
|
- powerpc: Refactor powerpc64 lround/lroundf/llround/llroundf
|
||||||
|
- powerpc: refactor powerpc64 lrint/lrintf/llrint/llrintf
|
||||||
|
|
||||||
|
* Mon Jun 17 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-28
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 48c3c1238925410b4e777dc94e2fde4cc9132d44.
|
||||||
|
- Linux: Fix __glibc_has_include use for <sys/stat.h> and statx (#1721129)
|
||||||
|
- <sys/cdefs.h>: Inhibit macro expansion for __glibc_has_include
|
||||||
|
- Add IPV6_ROUTER_ALERT_ISOLATE from Linux 5.1 to bits/in.h
|
||||||
|
- aarch64: handle STO_AARCH64_VARIANT_PCS
|
||||||
|
- aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
|
||||||
|
- powerpc: Remove optimized finite
|
||||||
|
- math: Use wordsize-64 version for finite
|
||||||
|
- powerpc: Remove optimized isinf
|
||||||
|
- math: Use wordsize-64 version for isinf
|
||||||
|
- powerpc: Remove optimized isnan
|
||||||
|
- math: Use wordsize-64 version for isnan
|
||||||
|
- benchtests: Add isnan/isinf/isfinite benchmark
|
||||||
|
- powerpc: copysign cleanup
|
||||||
|
- powerpc: consolidate rint
|
||||||
|
- libio: freopen of default streams crashes in old programs (swbz#24632)
|
||||||
|
- Linux: Deprecate <sys/sysctl.h> and sysctl
|
||||||
|
- <sys/stat.h>: Use Linux UAPI header for statx if available and useful
|
||||||
|
(#1721129)
|
||||||
|
- <sys/cdefs.h>: Add __glibc_has_include macro
|
||||||
|
- Improve performance of memmem
|
||||||
|
- Improve performance of strstr
|
||||||
|
- Benchmark strstr hard needles
|
||||||
|
- Fix malloc tests build with GCC 10
|
||||||
|
|
||||||
|
* Mon Jun 10 2019 Patsy Franklin <patsy@redhat.com> - 2.29.9000-27
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 51ea67d54882318c4fa5394c386f4816ddc22408.
|
||||||
|
- powerpc: get_rounding_mode: utilize faster method to get rounding mode
|
||||||
|
- riscv: Do not use __has_include__
|
||||||
|
- powerpc: fegetexcept: utilize function instead of duplicating code
|
||||||
|
- iconv: Use __twalk_r in __gconv_release_shlib
|
||||||
|
- Fix iconv buffer handling with IGNORE error handler (swbz#18830)
|
||||||
|
|
||||||
|
* Wed Jun 5 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-26
|
||||||
|
- Restore /usr/lib/locale/locale-archive under its original name (#1716710)
|
||||||
|
|
||||||
|
* Tue Jun 4 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-25
|
||||||
|
- Add glibc version to locale-archive name (#1716710)
|
||||||
|
|
||||||
|
* Mon Jun 03 2019 Carlos O'Donell <carlos@redhat.com> - 2.29.9000-24
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit dc91a19e6f71e1523f4ac179191a29b2131d74bb:
|
||||||
|
- Linux: Add oddly-named arm syscalls to syscall-names.list.
|
||||||
|
- arm: Remove ioperm/iopl/inb/inw/inl/outb/outw/outl support.
|
||||||
|
- Add INADDR_ALLSNOOPERS_GROUP from Linux 5.1 to netinet/in.h.
|
||||||
|
|
||||||
|
* Sat Jun 01 2019 Carlos O'Donell <carlos@redhat.com> - 2.29.9000-23
|
||||||
|
- Convert glibc_post_upgrade to lua.
|
||||||
|
|
||||||
|
* Sat Jun 01 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-22
|
||||||
|
- Remove support for filtering glibc-all-langpacks (#1715891)
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 9250e6610fdb0f3a6f238d2813e319a41fb7a810:
|
||||||
|
- powerpc: Fix build failures with current GCC
|
||||||
|
- Remove unused get_clockfreq files
|
||||||
|
- powerpc: generic nearbyint/nearbyintf
|
||||||
|
- tt_RU: Add lang_name (swbz#24370)
|
||||||
|
- tt_RU: Fix orthographic mistakes in mon and abmon sections (swbz#24369)
|
||||||
|
- Add IGMP_MRDISC_ADV from Linux 5.1 to netinet/igmp.h.
|
||||||
|
|
||||||
|
* Mon May 27 2019 Arjun Shankar <arjun@redhat.com> - 2.29.9000-21
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 85188d8211698d1a255f0aec6529546db5c56de3:
|
||||||
|
- Remove support for PowerPC SPE extension
|
||||||
|
- elf: Add tst-ldconfig-bad-aux-cache test
|
||||||
|
- Add F_SEAL_FUTURE_WRITE from Linux 5.1 to bits/fcntl-linux.h
|
||||||
|
- nss_dns: Check for proper A/AAAA address alignment
|
||||||
|
|
||||||
|
* Tue May 21 2019 DJ Delorie <dj@redhat.com> - 2.29.9000-20
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 46ae07324b1cd50fbf8f37a076d6babcfca7c510.
|
||||||
|
- Improve string benchtest timing
|
||||||
|
- sysvipc: Add missing bit of semtimedop s390 consolidation
|
||||||
|
- wcsmbs: Fix data race in __wcsmbs_clone_conv [swbz #24584]
|
||||||
|
- libio: Fix gconv-related memory leak [swbz #24583]
|
||||||
|
- libio: Remove codecvt vtable [swbz #24588]
|
||||||
|
- support: Expose sbindir as support_sbindir_prefix
|
||||||
|
- support: Add missing EOL terminators on timespec
|
||||||
|
- support: Correct confusing comment
|
||||||
|
- sysvipc: Consolidate semtimedop s390
|
||||||
|
- sysvipc: Fix compat msgctl (swbz#24570)
|
||||||
|
- Add NT_ARM_PACA_KEYS and NT_ARM_PACG_KEYS from Linux 5.1 to elf.h.
|
||||||
|
- Small tcache improvements
|
||||||
|
- manual: Document O_DIRECTORY
|
||||||
|
- Update kernel-features.h files for Linux 5.1.
|
||||||
|
- nss_nis, nss_nisplus: Remove RES_USE_INET6 handling
|
||||||
|
- nss_files: Remove RES_USE_INET6 from hosts processing
|
||||||
|
- support: Report NULL blobs explicitly in TEST_COMPARE
|
||||||
|
- dlfcn: Guard __dlerror_main_freeres with __libc_once_get (once) [swbz# 24476]
|
||||||
|
- Add missing Changelog entry
|
||||||
|
|
||||||
|
|
||||||
|
* Wed May 15 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-19
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 32ff397533715988c19cbf3675dcbd727ec13e18:
|
||||||
|
- Fix crash in _IO_wfile_sync (#1710460)
|
||||||
|
- nss: Turn __nss_database_lookup into a compatibility symbol
|
||||||
|
- support: Add support_install_rootsbindir
|
||||||
|
- iconv: Remove public declaration of __gconv_transliterate
|
||||||
|
- Linux: Add the tgkill function
|
||||||
|
- manual: Adjust twalk_r documentation.
|
||||||
|
- elf: Fix tst-pldd for non-default --prefix and/or --bindir (swbz#24544)
|
||||||
|
- support: Export bindir path on support_path
|
||||||
|
- configure: Make --bindir effective
|
||||||
|
- x86: Remove arch-specific low level lock implementation
|
||||||
|
- nptl: Assume LLL_LOCK_INITIALIZER is 0
|
||||||
|
- nptl: Small optimization for lowlevellock
|
||||||
|
- Add single-thread.h header
|
||||||
|
- locale: Update to Unicode 12.1.0 (swbz#24535)
|
||||||
|
- malloc: Fix tcache count maximum (swbz#24531)
|
||||||
|
- sem_close: Use __twalk_r
|
||||||
|
- support: Fix timespec printf
|
||||||
|
- nptl/tst-abstime: Use libsupport
|
||||||
|
- nptl: Convert some rwlock tests to use libsupport
|
||||||
|
- nptl: Use recent additions to libsupport in tst-sem5
|
||||||
|
- nptl: Convert tst-cond11.c to use libsupport
|
||||||
|
- support: Add timespec.h
|
||||||
|
- Move nptl/tst-eintr1 to xtests (swbz#24537)
|
||||||
|
- powerpc: trunc/truncf refactor
|
||||||
|
- powerpc: round/roundf refactor
|
||||||
|
- powerpc: floor/floorf refactor
|
||||||
|
- support: Add xclock_gettime
|
||||||
|
- malloc/tst-mallocfork2: Use process-shared barriers
|
||||||
|
- Update syscall-names.list for Linux 5.1
|
||||||
|
- Use GCC 9 in build-many-glibcs.py
|
||||||
|
- aarch64: thunderx2 memmove performance improvements
|
||||||
|
- misc/tst-tsearch: Additional explicit error checking
|
||||||
|
- elf: Fix elf/tst-pldd with --enable-hardcoded-path-in-tests (swbz#24506)
|
||||||
|
- misc: Add twalk_r function
|
||||||
|
|
||||||
|
* Thu May 02 2019 Arjun Shankar <arjun@redhat.com> - 2.29.9000-18
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 20aa5819586ac7ad11f711bab64feda307965191:
|
||||||
|
- semaphore.h: Add nonnull attributes
|
||||||
|
- powerpc: Remove power4 mpa optimization
|
||||||
|
- powerpc: Refactor ceil/ceilf
|
||||||
|
- Fix -O1 compilation errors with `__ddivl' and `__fdivl' [BZ #19444]
|
||||||
|
- Make mktime etc. compatible with __time64_t
|
||||||
|
|
||||||
|
* Fri Apr 26 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-17
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit c57afec0a9b318bb691e0f5fa4e9681cf30df7a4:
|
||||||
|
- Increase BIND_NOW coverage (#1702671)
|
||||||
|
- Fix pldd hang (#1361689)
|
||||||
|
- riscv: remove DL_RO_DYN_SECTION (swbz#24484)
|
||||||
|
- locale: Add LOCPATH diagnostics to the locale program
|
||||||
|
- Reduce benchtests time
|
||||||
|
|
||||||
|
* Mon Apr 22 2019 DJ Delorie <dj@redhat.com> - 2.29.9000-16
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 25f7a3c96116a9102df8bf7b04ef160faa32416d.
|
||||||
|
- malloc: make malloc fail with requests larger than PTRDIFF_MAX (BZ#23741)
|
||||||
|
- powerpc: Fix format issue from 3a16dd780eeba602
|
||||||
|
- powerpc: fma using builtins
|
||||||
|
- powerpc: Use generic fabs{f} implementations
|
||||||
|
- mips: Remove rt_sigreturn usage on context function
|
||||||
|
- powerpc: Remove rt_sigreturn usage on context function
|
||||||
|
- support: Add support_capture_subprogram
|
||||||
|
- stdlib/tst-secure-getenv: handle >64 groups
|
||||||
|
|
||||||
|
* Mon Apr 15 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-15
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit e3f454bac0f968216699ca405c127c858f0657c7:
|
||||||
|
- nss_dns: Do not replace root domain with empty string
|
||||||
|
- alloc_buffer: Return unqualified pointer type in alloc_buffer_next
|
||||||
|
- malloc: Set and reset all hooks for tracing (swbz#16573)
|
||||||
|
|
||||||
|
* Thu Apr 11 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-14
|
||||||
|
- Run valgrind smoke test against the install tree
|
||||||
|
|
||||||
|
* Thu Apr 11 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-13
|
||||||
|
- Do not use --g-libs with find-debuginfo.sh; it breaks valgrind (#1698824)
|
||||||
|
|
||||||
|
* Wed Apr 10 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-12
|
||||||
|
- Strip debugging information from installed programs again (#1661510)
|
||||||
|
|
||||||
|
* Tue Apr 09 2019 Carlos O'Donell <carlos@redhat.com> - 2.29.9000-11
|
||||||
|
- Drop glibc-warning-fix.patch. Microbenchmark code fixed upstream.
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 648279f4af423c4783ec1dfa63cb7b46a7640217:
|
||||||
|
- powerpc: Use generic wcscpy optimization
|
||||||
|
- powerpc: Use generic wcschr optimization
|
||||||
|
- powerpc: Use generic wcsrchr optimization
|
||||||
|
- aarch64: thunderx2 memcpy implementation cleanup and streamlining
|
||||||
|
- resolv: Remove support for RES_USE_INET6 and the inet6 option
|
||||||
|
- resolv: Remove RES_INSECURE1, RES_INSECURE2
|
||||||
|
|
||||||
|
* Thu Apr 04 2019 Arjun Shankar <arjun@redhat.com> - 2.29.9000-10
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 8260f23616c1a2a4e609f989a195fba7690a42ca:
|
||||||
|
- Fix strptime era handling, add more strftime tests [BZ #24394]
|
||||||
|
- time/tst-strftime2.c: Make the file easier to maintain
|
||||||
|
- time: Add tests for Minguo calendar [BZ #24293]
|
||||||
|
- ja_JP locale: Add entry for the new Japanese era [BZ #22964]
|
||||||
|
- Add Reiwa era tests to time/tst-strftime3.c
|
||||||
|
|
||||||
|
* Mon Apr 01 2019 Arjun Shankar <arjun@redhat.com> - 2.29.9000-9
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 993e3107af67edefcfc79a62ae55f7b98aa5151e:
|
||||||
|
- Add AArch64 HWCAPs from Linux 5.0
|
||||||
|
- tt_RU: Fix orthographic mistakes in day and abday sections [BZ #24296]
|
||||||
|
- iconv, localedef: avoid floating point rounding differences [BZ #24372]
|
||||||
|
- Fix parentheses error in iconvconfig.c and ld-collate.c [BZ #24372]
|
||||||
|
- S390: New configure check and hwcap values for new CPU architecture arch13
|
||||||
|
- S390: Add memmove, strstr, and memmem ifunc variants for arch13
|
||||||
|
- nptl: Remove pthread_clock_gettime pthread_clock_settime
|
||||||
|
- linux: Assume clock_getres CLOCK_{PROCESS,THREAD}_CPUTIME_ID
|
||||||
|
- Remove __get_clockfreq
|
||||||
|
- Do not use HP_TIMING_NOW for random bits
|
||||||
|
- hp-timing: Refactor rtld usage, add generic support
|
||||||
|
- Add NT_ARM_PAC_MASK and NT_MIPS_MSA from Linux 5.0 to elf.h
|
||||||
|
- Add UDP_GRO from Linux 5.0 to netinet/udp.h
|
||||||
|
- nptl: Convert tst-sem5 & tst-sem13 to use libsupport
|
||||||
|
- nptl/tst-rwlock14: Test pthread_rwlock_timedwrlock correctly
|
||||||
|
- nss/tst-nss-files-alias-leak: add missing opening quote in printf
|
||||||
|
- math: Enable some math builtins for clang
|
||||||
|
- powerpc: Use __builtin_{mffs,mtfsf}
|
||||||
|
- RISC-V: Fix `test' operand error with soft-float ABI being configured
|
||||||
|
|
||||||
|
* Wed Mar 20 2019 Carlos O'Donell <carlos@redhat.com> - 2.29.9000-8
|
||||||
|
- Add warnings and notes to /etc/nsswitch.conf and /etc/nscd.conf.
|
||||||
|
|
||||||
|
* Mon Mar 18 2019 DJ Delorie <dj@redhat.com> - 2.29.9000-7
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 78919d3886c9543279ec755a701e279c62b44164.
|
||||||
|
|
||||||
|
* Thu Mar 14 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-6
|
||||||
|
- Drop glibc-fedora-streams-rh436349.patch. STREAMS was removed upstream.
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit a0a0dc83173ce11ff45105fd32e5d14356cdfb9c:
|
||||||
|
- Remove obsolete, never-implemented XSI STREAMS declarations
|
||||||
|
- nss: Fix tst-nss-files-alias-truncated for default --as-needed linking
|
||||||
|
- scripts/check-obsolete-constructs.py: Process all headers as UTF-8.
|
||||||
|
- Use Linux 5.0 in build-many-glibcs.py.
|
||||||
|
- hurd: Add no-op version of __res_enable_icmp [BZ #24047]
|
||||||
|
- Move inttypes.h and stdint.h to stdlib.
|
||||||
|
- Use a proper C tokenizer to implement the obsolete typedefs test.
|
||||||
|
- Fix output of LD_SHOW_AUXV=1.
|
||||||
|
|
||||||
|
* Wed Mar 13 2019 Florian Weimer <fweimer@redhat.com> - 2.29.9000-5
|
||||||
|
- Drop glibc-rh1670028.patch, applied upstream
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 38b52865d4ccfee3647f27e969e539a4396a73b1:
|
||||||
|
- elf: Add DF_1_KMOD, DF_1_WEAKFILTER, DF_1_NOCOMMON to <elf.h>
|
||||||
|
- resolv: Enable full ICMP errors for UDP DNS sockets [BZ #24047]
|
||||||
|
- C-SKY: add elf header definition for elfutils
|
||||||
|
- C-SKY: mark lr as undefined to stop unwinding
|
||||||
|
- C-SKY: remove user_regs definition
|
||||||
|
- C-SKY: fix sigcontext miss match
|
||||||
|
- Bug 24307: Update to Unicode 12.0.0
|
||||||
|
- Break lines before not after operators, batch 4.
|
||||||
|
- check-wrapper-headers test: Adjust Fortran include file directory
|
||||||
|
- Fix location where math-vector-fortran.h is installed.
|
||||||
|
|
||||||
|
* Wed Mar 06 2019 DJ Delorie <dj@redhat.com> - 2.29.9000-4
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit 0ddb7ea842abf63516b74d4b057c052afc6ba863.
|
||||||
|
- nptl: Assume __ASSUME_FUTEX_CLOCK_REALTIME support
|
||||||
|
- powerpc: Fix build of wcscpy with --disable-multi-arch
|
||||||
|
- elf: Remove remnants of MAP_ANON emulation
|
||||||
|
- S390: Increase function alignment to 16 bytes.
|
||||||
|
- ja_JP: Change the offset for Taisho gan-nen from 2 to 1 [BZ #24162]
|
||||||
|
- ldbl-opt: Reuse test cases from misc/ that check long double
|
||||||
|
- ldbl-opt: Add error and error_at_line (bug 23984)
|
||||||
|
- ldbl-opt: Add err, errx, verr, verrx, warn, warnx, vwarn, and vwarnx (bug 23984)
|
||||||
|
- ldbl-opt: Reuse argp tests that print long double
|
||||||
|
- ldbl-opt: Add argp_error and argp_failure (bug 23983)
|
||||||
|
- elf/tst-big-note: Improve accuracy of test [BZ #20419]
|
||||||
|
- S390: Fix introduction of __wcscpy and weak wcscpy symbols.
|
||||||
|
- __netlink_assert_response: Add more __libc_fatal newlines [BZ #20271]
|
||||||
|
- Add more spaces before '('.
|
||||||
|
- elf: Add tests with a local IFUNC resolver [BZ #23937]
|
||||||
|
- elf/Makefile: Run IFUNC tests if binutils supports IFUNC
|
||||||
|
- powerpc: Fix linknamespace introduced by 4d8015639a75
|
||||||
|
- hurd: Add renameat2 support for RENAME_NOREPLACE
|
||||||
|
- Fix -Wempty-body warnings in Hurd-specific code.
|
||||||
|
- Add some spaces before '('.
|
||||||
|
- wcsmbs: optimize wcsnlen
|
||||||
|
- wcsmbs: optimize wcsncpy
|
||||||
|
- wcsmbs: optimize wcsncat
|
||||||
|
- wcsmbs: optimize wcscpy
|
||||||
|
- wcsmbs: optimize wcscat
|
||||||
|
- wcsmbs: optimize wcpncpy
|
||||||
|
- wcsmbs: optimize wcpcpy
|
||||||
|
- Break further lines before not after operators.
|
||||||
|
- Add and move fall-through comments in system-specific code.
|
||||||
|
|
||||||
|
* Fri Mar 1 2019 DJ Delorie <dj@redhat.com> - 2.29.9000-3
|
||||||
|
- Add .gdb_index to debug information (rhbz#1680765)
|
||||||
|
|
||||||
|
* Wed Feb 27 2019 Carlos O'Donell <carlos@redhat.com> - 2.29.9000-2
|
||||||
|
- Fix build failure related to microbenchmarks.
|
||||||
|
|
||||||
|
* Tue Feb 26 2019 Carlos O'Donell <carlos@redhat.com> - 2.29.9000-1
|
||||||
|
- Auto-sync with upstream branch master,
|
||||||
|
commit e0cb7b6131ee5f2dca2938069b8b9590304e6f6b:
|
||||||
|
- nss_files: Fix /etc/aliases null pointer dereference (swbz#24059)
|
||||||
|
- regex: fix read overrun (swbz#24114)
|
||||||
|
- libio: use stdout in puts and putchar, etc (swbz#24051)
|
||||||
|
- aarch64: Add AmpereComputing emag to tunable cpu list
|
||||||
|
- aarch64: Optimized memset specific to AmpereComputing emag
|
||||||
|
- aarch64: Optimized memchr specific to AmpereComputing emag
|
||||||
|
- Require GCC 6.2 or later to build glibc
|
||||||
|
- manual: Document lack of conformance of sched_* functions (swbz#14829)
|
||||||
|
- libio: Use stdin consistently for input functions (swbz#24153)
|
||||||
|
- x86-64 memcmp: Use unsigned Jcc instructions on size (swbz#24155)
|
||||||
|
- Fix handling of collating elements in fnmatch (swbz#17396,swbz#16976)
|
||||||
|
- arm: Use "nr" constraint for Systemtap probes (swbz#24164)
|
||||||
|
- Fix alignment of TLS variables for tls variant TLS_TCB_AT_TP (swbz#23403)
|
||||||
|
- Add compiler barriers for pthread_mutex_trylock (swbz#24180)
|
||||||
|
- rt: Turn forwards from librt to libc into compat symbols (swbz#24194)
|
||||||
|
- Linux: Add gettid system call wrapper (swbz#6399)
|
||||||
|
- nptl: Avoid fork handler lock for async-signal-safe fork (swbz#24161)
|
||||||
|
- elf: Ignore LD_AUDIT interfaces if la_version returns 0 (swbz#24122)
|
||||||
|
- nptl: Reinstate pthread_timedjoin_np as a cancellation point (swbz#24215)
|
||||||
|
- nptl: Fix invalid Systemtap probe in pthread_join (swbz#24211)
|
||||||
|
|
||||||
|
* Tue Feb 19 2019 Florian Weimer <fweimer@redhat.com> - 2.29-8
|
||||||
|
- Drop glibc-rh1674280.patch. Different fix applied upstream. (#1674280)
|
||||||
|
- Auto-sync with upstream branch release/2.29/master,
|
||||||
|
commit 067fc32968b601493f4b247a3ac00caeea3f3d61:
|
||||||
|
- nptl: Fix invalid Systemtap probe in pthread_join (#1674280)
|
||||||
|
|
||||||
* Mon Feb 11 2019 Florian Weimer <fweimer@redhat.com> - 2.29-7
|
* Mon Feb 11 2019 Florian Weimer <fweimer@redhat.com> - 2.29-7
|
||||||
- Hotfix for invalid Systemtap probe in pthread_join (#1674280)
|
- Hotfix for invalid Systemtap probe in pthread_join (#1674280)
|
||||||
|
|
||||||
|
@ -1,274 +0,0 @@
|
|||||||
#include <sys/types.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <elf.h>
|
|
||||||
|
|
||||||
#define LD_SO_CONF "/etc/ld.so.conf"
|
|
||||||
#define ICONVCONFIG "/usr/sbin/iconvconfig"
|
|
||||||
|
|
||||||
#define verbose_exec(failcode, path...) \
|
|
||||||
do \
|
|
||||||
{ \
|
|
||||||
char *const arr[] = { path, NULL }; \
|
|
||||||
vexec (failcode, arr); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
__attribute__((noinline)) void vexec (int failcode, char *const path[]);
|
|
||||||
__attribute__((noinline)) void says (const char *str);
|
|
||||||
__attribute__((noinline)) void sayn (long num);
|
|
||||||
__attribute__((noinline)) void message (char *const path[]);
|
|
||||||
__attribute__((noinline)) int check_elf (const char *name);
|
|
||||||
|
|
||||||
int
|
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
struct stat statbuf;
|
|
||||||
char initpath[256];
|
|
||||||
|
|
||||||
char buffer[4096];
|
|
||||||
struct pref {
|
|
||||||
char *p;
|
|
||||||
int len;
|
|
||||||
} prefix[] = { { "libc-", 5 }, { "libm-", 5 },
|
|
||||||
{ "librt-", 6 }, { "libpthread-", 11 },
|
|
||||||
{ "librtkaio-", 10 }, { "libthread_db-", 13 } };
|
|
||||||
int i, j, fd;
|
|
||||||
off_t base;
|
|
||||||
ssize_t ret;
|
|
||||||
|
|
||||||
/* In order to support in-place upgrades, we must immediately remove
|
|
||||||
obsolete platform directories after installing a new glibc
|
|
||||||
version. RPM only deletes files removed by updates near the end
|
|
||||||
of the transaction. If we did not remove the obsolete platform
|
|
||||||
directories here, they would be preferred by the dynamic linker
|
|
||||||
during the execution of subsequent RPM scriptlets, likely
|
|
||||||
resulting in process startup failures. */
|
|
||||||
const char *remove_dirs[] =
|
|
||||||
{
|
|
||||||
#if defined (__i386__)
|
|
||||||
"/lib/i686",
|
|
||||||
"/lib/i686/nosegneg",
|
|
||||||
#elif defined (__powerpc64__) && _CALL_ELF != 2
|
|
||||||
"/lib64/power6",
|
|
||||||
"/lib64/power7",
|
|
||||||
"/lib64/power8",
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
for (j = 0; j < sizeof (remove_dirs) / sizeof (remove_dirs[0]); ++j)
|
|
||||||
{
|
|
||||||
size_t rmlen = strlen (remove_dirs[j]);
|
|
||||||
fd = open (remove_dirs[j], O_RDONLY);
|
|
||||||
if (fd >= 0
|
|
||||||
&& (ret = getdirentries (fd, buffer, sizeof (buffer), &base))
|
|
||||||
>= (ssize_t) offsetof (struct dirent, d_name))
|
|
||||||
{
|
|
||||||
for (base = 0; base + offsetof (struct dirent, d_name) < ret; )
|
|
||||||
{
|
|
||||||
struct dirent *d = (struct dirent *) (buffer + base);
|
|
||||||
|
|
||||||
for (i = 0; i < sizeof (prefix) / sizeof (prefix[0]); i++)
|
|
||||||
if (! strncmp (d->d_name, prefix[i].p, prefix[i].len))
|
|
||||||
{
|
|
||||||
char *p = d->d_name + prefix[i].len;
|
|
||||||
|
|
||||||
while (*p == '.' || (*p >= '0' && *p <= '9')) p++;
|
|
||||||
if (p[0] == 's' && p[1] == 'o' && p[2] == '\0'
|
|
||||||
&& p + 3 - d->d_name
|
|
||||||
< sizeof (initpath) - rmlen - 1)
|
|
||||||
{
|
|
||||||
memcpy (initpath, remove_dirs[j], rmlen);
|
|
||||||
initpath[rmlen] = '/';
|
|
||||||
strcpy (initpath + rmlen + 1, d->d_name);
|
|
||||||
unlink (initpath);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
base += d->d_reclen;
|
|
||||||
}
|
|
||||||
close (fd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int ldsocfd = open (LD_SO_CONF, O_RDONLY);
|
|
||||||
struct stat ldsocst;
|
|
||||||
if (ldsocfd >= 0 && fstat (ldsocfd, &ldsocst) >= 0)
|
|
||||||
{
|
|
||||||
char p[ldsocst.st_size + 1];
|
|
||||||
if (read (ldsocfd, p, ldsocst.st_size) == ldsocst.st_size)
|
|
||||||
{
|
|
||||||
p[ldsocst.st_size] = '\0';
|
|
||||||
if (strstr (p, "include ld.so.conf.d/*.conf") == NULL)
|
|
||||||
{
|
|
||||||
close (ldsocfd);
|
|
||||||
ldsocfd = open (LD_SO_CONF, O_WRONLY | O_TRUNC);
|
|
||||||
if (ldsocfd >= 0)
|
|
||||||
{
|
|
||||||
size_t slen = strlen ("include ld.so.conf.d/*.conf\n");
|
|
||||||
if (write (ldsocfd, "include ld.so.conf.d/*.conf\n", slen)
|
|
||||||
!= slen
|
|
||||||
|| write (ldsocfd, p, ldsocst.st_size) != ldsocst.st_size)
|
|
||||||
_exit (109);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ldsocfd >= 0)
|
|
||||||
close (ldsocfd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If installing bi-arch glibc, rpm sometimes doesn't unpack all files
|
|
||||||
before running one of the lib's %post scriptlet. /sbin/ldconfig will
|
|
||||||
then be run by the other arch's %post. */
|
|
||||||
if (! access ("/sbin/ldconfig", X_OK))
|
|
||||||
verbose_exec (110, "/sbin/ldconfig", "/sbin/ldconfig");
|
|
||||||
|
|
||||||
if (! utimes (GCONV_MODULES_DIR "/gconv-modules.cache", NULL))
|
|
||||||
{
|
|
||||||
char *iconv_cache = GCONV_MODULES_DIR"/gconv-modules.cache";
|
|
||||||
char *iconv_dir = GCONV_MODULES_DIR;
|
|
||||||
verbose_exec (113, ICONVCONFIG, "/usr/sbin/iconvconfig",
|
|
||||||
"-o", iconv_cache,
|
|
||||||
"--nostdlib", iconv_dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
_exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
vexec (int failcode, char *const path[])
|
|
||||||
{
|
|
||||||
pid_t pid;
|
|
||||||
int status, save_errno;
|
|
||||||
int devnull = 0;
|
|
||||||
|
|
||||||
if (failcode < 0)
|
|
||||||
{
|
|
||||||
devnull = 1;
|
|
||||||
failcode = -failcode;
|
|
||||||
}
|
|
||||||
pid = vfork ();
|
|
||||||
if (pid == 0)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
if (devnull && (fd = open ("/dev/null", O_WRONLY)) >= 0)
|
|
||||||
{
|
|
||||||
dup2 (fd, 1);
|
|
||||||
dup2 (fd, 2);
|
|
||||||
close (fd);
|
|
||||||
}
|
|
||||||
execv (path[0], path + 1);
|
|
||||||
save_errno = errno;
|
|
||||||
message (path);
|
|
||||||
says (" exec failed with errno ");
|
|
||||||
sayn (save_errno);
|
|
||||||
says ("\n");
|
|
||||||
_exit (failcode);
|
|
||||||
}
|
|
||||||
else if (pid < 0)
|
|
||||||
{
|
|
||||||
save_errno = errno;
|
|
||||||
message (path);
|
|
||||||
says (" fork failed with errno ");
|
|
||||||
sayn (save_errno);
|
|
||||||
says ("\n");
|
|
||||||
_exit (failcode + 1);
|
|
||||||
}
|
|
||||||
if (waitpid (0, &status, 0) != pid || !WIFEXITED (status))
|
|
||||||
{
|
|
||||||
message (path);
|
|
||||||
says (" child terminated abnormally\n");
|
|
||||||
_exit (failcode + 2);
|
|
||||||
}
|
|
||||||
if (WEXITSTATUS (status))
|
|
||||||
{
|
|
||||||
message (path);
|
|
||||||
says (" child exited with exit code ");
|
|
||||||
sayn (WEXITSTATUS (status));
|
|
||||||
says ("\n");
|
|
||||||
_exit (WEXITSTATUS (status));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
says (const char *str)
|
|
||||||
{
|
|
||||||
write (1, str, strlen (str));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
sayn (long num)
|
|
||||||
{
|
|
||||||
char string[sizeof (long) * 3 + 1];
|
|
||||||
char *p = string + sizeof (string) - 1;
|
|
||||||
|
|
||||||
*p = '\0';
|
|
||||||
if (num == 0)
|
|
||||||
*--p = '0';
|
|
||||||
else
|
|
||||||
while (num)
|
|
||||||
{
|
|
||||||
*--p = '0' + num % 10;
|
|
||||||
num = num / 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
says (p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
message (char *const path[])
|
|
||||||
{
|
|
||||||
says ("/usr/sbin/glibc_post_upgrade: While trying to execute ");
|
|
||||||
says (path[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
check_elf (const char *name)
|
|
||||||
{
|
|
||||||
/* Play safe, if we can't open or read, assume it might be
|
|
||||||
ELF for the current arch. */
|
|
||||||
int ret = 1;
|
|
||||||
int fd = open (name, O_RDONLY);
|
|
||||||
if (fd >= 0)
|
|
||||||
{
|
|
||||||
Elf32_Ehdr ehdr;
|
|
||||||
if (read (fd, &ehdr, offsetof (Elf32_Ehdr, e_version))
|
|
||||||
== offsetof (Elf32_Ehdr, e_version))
|
|
||||||
{
|
|
||||||
ret = 0;
|
|
||||||
if (ehdr.e_ident[EI_CLASS]
|
|
||||||
== (sizeof (long) == 8 ? ELFCLASS64 : ELFCLASS32))
|
|
||||||
{
|
|
||||||
#if defined __i386__
|
|
||||||
ret = ehdr.e_machine == EM_386;
|
|
||||||
#elif defined __x86_64__
|
|
||||||
ret = ehdr.e_machine == EM_X86_64;
|
|
||||||
#elif defined __powerpc64__
|
|
||||||
ret = ehdr.e_machine == EM_PPC64;
|
|
||||||
#elif defined __powerpc__
|
|
||||||
ret = ehdr.e_machine == EM_PPC;
|
|
||||||
#elif defined __s390__ || defined __s390x__
|
|
||||||
ret = ehdr.e_machine == EM_S390;
|
|
||||||
#elif defined __x86_64__
|
|
||||||
ret = ehdr.e_machine == EM_X86_64;
|
|
||||||
#elif defined __sparc__
|
|
||||||
if (sizeof (long) == 8)
|
|
||||||
ret = ehdr.e_machine == EM_SPARCV9;
|
|
||||||
else
|
|
||||||
ret = (ehdr.e_machine == EM_SPARC
|
|
||||||
|| ehdr.e_machine == EM_SPARC32PLUS);
|
|
||||||
#else
|
|
||||||
ret = 1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close (fd);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
@ -24,6 +24,9 @@
|
|||||||
#
|
#
|
||||||
# 'sssd' performs its own 'files'-based caching, so it should
|
# 'sssd' performs its own 'files'-based caching, so it should
|
||||||
# generally come before 'files'.
|
# generally come before 'files'.
|
||||||
|
#
|
||||||
|
# WARNING: Running nscd with a secondary caching service like sssd may lead to
|
||||||
|
# unexpected behaviour, especially with how long entries are cached.
|
||||||
|
|
||||||
# To use 'db', install the nss_db package, and put the 'db' in front
|
# To use 'db', install the nss_db package, and put the 'db' in front
|
||||||
# of 'files' for entries you want to be looked up first in the
|
# of 'files' for entries you want to be looked up first in the
|
||||||
|
2
sources
2
sources
@ -1 +1 @@
|
|||||||
SHA512 (glibc-2.29-5-gc096b008d2.tar.xz) = b2caff098709183f3c02dabbb75926d067006f442ab15531c14a33f2a4b04e064fce2e4bdfb27dd9f148122de057e4884f8fdc426bd7aa9315d4e67d60c6b4c5
|
SHA512 (glibc-2.30-1-gbe9a328c93.tar.xz) = ad471d2b9d81a12e36e100a18685fe1de3461a372151506b8021f52aeb7180727f807044b9cbdbda61911f2ed48192c906f743c46677fc55e608530b8bb856d0
|
||||||
|
Loading…
Reference in New Issue
Block a user