Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37890977
en ru br
Репозитории ALT
S:0.2.3-alt1
5.1: 0.2-alt3
4.1: 0.2-alt3
4.0: 0.2-alt2
3.0: 0.2-alt1
www.altlinux.org/Changes

Группа :: Разработка/Прочее
Пакет: libtool-common

 Главная   Изменения   Спек   Патчи   Исходники   Загрузить   Gear   Bugs and FR  Repocop 

/* 
Dump dynamic linker configuration.

Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
This file is based on part of the GNU C Library.
Contributed by Andreas Jaeger <aj@suse.de>, 1999.
Modified by Dmitry V. Levin <ldv@altlinux.org>, 2004.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <error.h>
#include <ctype.h>
#include <glob.h>
#include <sys/stat.h>

void *
xmalloc (size_t size)
{
void *r = malloc (size);

if (!r)
error (EXIT_FAILURE, errno, "malloc");
return r;
}

void *
xrealloc (void *ptr, size_t size)
{
void *r = realloc (ptr, size);

if (!r)
error (EXIT_FAILURE, errno, "realloc");
return r;
}

char *
xstrdup (const char *s)
{
char *r = strdup (s);

if (!r)
error (EXIT_FAILURE, errno, "strdup");
return r;
}

/* List of directories to handle. */
struct dir_entry
{
struct dir_entry *next;
const char *name;
};

struct dir_entry *path_list_head, *path_list_tail;

static void
path_list_add (const char *path)
{
struct dir_entry *e;

#ifndef KEEP_DUPLICATES
for (e = path_list_head; e; e = e->next)
if (!strcmp (path, e->name))
return;
#endif

struct stat buf;

if (stat (path, &buf))
return;

e = xmalloc (sizeof (*e));

e->next = 0;
e->name = xstrdup (path);
if (!path_list_head)
path_list_head = e;
if (path_list_tail)
path_list_tail->next = e;
path_list_tail = e;
}

static void
parse_path_line (char *line)
{
/* Skip leading space characters */
while (isspace (*line))
++line;

/* Search for an '=' sign. */
char *equal_sign = strchr (line, '=');

if (equal_sign)
*equal_sign = '\0';

int i = strlen (line) - 1;

/* Remove trailing space characters */
for (; i >= 0 && isspace (line[i]); --i)
line[i] = '\0';

/* Remove trailing slashes */
for (; i > 0 && line[i] == '/'; --i)
line[i] = '\0';

if (line[0] != '\0')
path_list_add (line);
}

static void parse_file (const char *filename);

static void
parse_include_pattern (const char *filename, const char *pattern)
{
char *newp = NULL, *p;

if (pattern[0] != '/' && (p = strrchr (filename, '/')))
{
size_t patlen = strlen (pattern) + 1;

newp = xmalloc (p - filename + 1 + patlen);
memcpy (newp, filename, p - filename + 1);
memcpy (newp + (p - filename + 1), pattern, patlen);
pattern = newp;
}

glob_t gl;

if (glob (pattern, 0, NULL, &gl) == 0)
{
size_t i;

for (i = 0; i < gl.gl_pathc; ++i)
parse_file (gl.gl_pathv[i]);
globfree (&gl);
}

free (newp);
}

static void
parse_include_line (const char *filename, char *line)
{
char *arg;

while ((arg = strsep (&line, " \t")) != NULL)
if (arg[0] != '\0')
parse_include_pattern (filename, arg);
}

static void
parse_file (const char *filename)
{
FILE *fp = fopen (filename, "r");

if (fp == NULL)
return;

char *line = 0;
size_t linesize = 0;

while (getline (&line, &linesize, fp) > 0)
{
char *p = strchr (line, '\n');

if (p)
*p = '\0';

/* Because the file format does not know any form of quoting we
can search forward for the next '#' character and if found
make it terminating the line. */
p = strchr (line, '#');
if (p)
*p = '\0';

/* Skip leading whitespace characters. */
for (p = line; isspace (*p); ++p)
;

/* If the line is blank it is ignored. */
if (p[0] == '\0')
continue;

if (!strncmp (p, "include", 7) && isblank (p[7]))
parse_include_line (filename, p + 8);
else
parse_path_line (p);
}
free (line);
fclose (fp);
}

int
main (int ac, const char **av)
{
const char *fname = (ac > 1) ? av[1] : "/etc/ld.so.conf";

parse_file (fname);

struct dir_entry *e;

for (e = path_list_head; e; e = e->next)
puts (e->name);
return 0;
}
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin