Невозможно запустить file(1) на выходе файлового дескриптора, канала, fifo, устройства и т. д.

Невозможно запустить file(1) на выходе файлового дескриптора, канала, fifo, устройства и т. д.

Я хочу выполнить file(1)команду на выходе другой команды, но все, что я получаю, это

$ file -sL <(echo \#include \<stdio.h\>)
/dev/fd/63: ERROR: (null)

Это работает, как и ожидалось, в file-5.04 (Red Hat Enterprise Linux Server версии 6.8), но не в file-5.14 (Wind River Linux 6.0.0.17).

решение1

Это ошибка в fileиспользуемой библиотеке libmagic.

Простой обходной путь — «бесполезное использование cat»:

echo '#! /bin/sh' | file -
cat /path/to/fifo-or-special | file -

Ошибка впервые была обнаружена вhttps://github.com/file/file/commit/fb6084e0f08:

commit fb6084e0f08aef8991afcb3eb74168a456601908
Author: Christos Zoulas <[email protected]>
Date:   Tue May 28 21:24:31 2013 +0000

    don't print a space if there was an error. (from Jan Kaluza)

Потом это исправили, нотолькодля блочных и символьных устройств, НЕ для FIFO вhttps://github.com/file/file/commit/a9124dcb4e. Аннеполныйисправление для <(...)Linux было вhttps://github.com/file/file/commit/adbe541c32.

Исправление для устройств может быть воспроизведено для FIFO. См. патч в конце ответа (примените вручную, потому что этот сайт искажает вкладки и имейте в виду, что это против ТОЛЬКО ЗЕРКАЛЬНОГО репозитория).

Но все равно остается:

mkfifo fifo; file -s fifo

fifo: writable, no read permission

Глупо и неправильно, потому что у FIFO есть разрешение на чтение.

Чтобы исправить это, придется либо переписать половину libmagic, либо добавить еще пару спагетти ifdef и особых случаев в этот ужасный беспорядок.

diff --git a/src/fsmagic.c b/src/fsmagic.c
index 5204f20d..20b7f438 100644
--- a/src/fsmagic.c
+++ b/src/fsmagic.c
@@ -270,8 +270,10 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
    /* TODO add code to handle V7 MUX and Blit MUX files */
 #ifdef S_IFIFO
    case S_IFIFO:
-       if((ms->flags & MAGIC_DEVICES) != 0)
+       if((ms->flags & MAGIC_DEVICES) != 0) {
+           return 0;
            break;
+       }
        if (mime) {
            if (handle_mime(ms, mime, "fifo") == -1)
                return -1;

Связанный контент