[devel] contents_index replacement [0]

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Пн Авг 27 18:43:40 MSD 2007


On Mon, Aug 27, 2007 at 05:33:50PM +0400, Alexey Tourbin wrote:
> Я размышлял над тем, чем бы заменить поиск по contens_index,
> чтобы не было некоторых неприятных приколов с поиском зависимостей.
> 
> Я сначала хотел сделать нечто похожее на rpmdb (типа rpmbox),
> чтобы пробивать пути по голбальной базе через -qf.  Вникнув, однако,
> в суть дела, я обнаружил e.g. следующий казус:
> 
> $ cd `mktemp -d`
> $ ln -s /usr/bin/perl ...
> $ rpm -qf ...
> perl-base-5.8.8-alt14
> $ 
> 
> Думаю теперь, что rpmdb в чистом виде для замены contents_index не
> подходит.  Нужна специальная реализация алгоритма типа namei (имеется
> в виду http://www.unix.org.ua/bach/glava_28.htm ).

Поясню суть проблемы.  В путях бывают симлинки, напр.
/etc/init.d/functions -> /etc/rc.d/init.d/functions
из-за симлинка /etc/init.d -> rc.d/init.d.

Когда в скрипте встречается ". /etc/init.d/functions",
то поиск по contents_index обламывается, потому что там
нет всех возможных вариантов путей с учетом разрешения
симлинков.

Однако "rpm -qf /etc/init.d/functions" дает правильный результат.
ТЕМ НЕ МЕНЕЕ, проверка через rpm -qf в значительной степени полагается
на то, что пакет уже установлен, т.е. зависит от состояния файловой
системы.

$ hsh --init                                                                                
$ hsh-shell --rooter
[root на solemn .in]# rpm -qf /etc/init.d/functions
service-0.5.14-alt1
[root на solemn .in]# rm -rfv /etc/init.d 
removed `/etc/init.d'
[root на solemn .in]# rpm -qf /etc/init.d/functions
error: file /etc/init.d/functions: No such file or directory
[root на solemn .in]# rpm -qf /etc/rc.d/init.d/functions
service-0.5.14-alt1
[root на solemn .in]# rm -rfv /etc/rc.d/init.d/functions
removed `/etc/rc.d/init.d/functions'
[root на solemn .in]# rpm -qf /etc/rc.d/init.d/functions
service-0.5.14-alt1
[root на solemn .in]# ^D
$

Это показывает, что поиск по файлу, у которого в пути есть симлинк,
работает только если пакет установлен (и симлинк смотрит куда надо).
Если убрать симлинк, то поиск уже не работает (а если убрать сам файл,
то поиск всё же работает).

Это означает, что глобальная rpmdb с прошитыми там путями не подходит
для разрешения путей в названия пакетов.  То есть, это получается
ничем не лучше, чем поиск по contents_index.

(прочитать как это работает можно в +/doLookup rpmdb/fprint.c)
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20070827/d9b24ae2/attachment-0001.bin>


Подробная информация о списке рассылки Devel