Что делает недокументированный аргумент командной строки «proto» в auditdistd для FreeBSD?

Как вы знаете, на FreeBSD имеется демон auditdistd(8) . Он имеет некоторые документированные аргументы командной строки, такие как -c , -d и т. Д. (См. Подробнее здесь (ссылка) ).

Я пытался узнать, как это работает, когда я наткнулся на код, обрабатывающий недокументированный аргумент командной строки, proto :

  • Базовые пакеты FreeBSD
  • Логротат на FreeBSD 8
  • Как установить FreeBSD на Thinkpad?
  • FreeBSD: смешивание пакетов и портов?
  • Как использовать публичный IP-адрес в случае двух ISP, которые отличаются друг от друга Pfsense
  • grub PCBSD-GENTOO
    • По-видимому, proto_exec вызывается, когда вы выполняете /usr/sbin/auditdistd proto foo bar baz и foo bar baz передаются функции как свои аргументы.

       /* * We are executed from proto to create sandbox. */ if (argc > 1 && strcmp(argv[1], "proto") == 0) { argc -= 2; argv += 2; if (proto_exec(argc, argv) == -1) err(EX_USAGE, "Unable to execute proto"); } 

      (Подробнее см. /contrib/openbsm/bin/auditdistd/auditdistd.c:main() (ссылка) .)

    • Вот функция proto_exec :

       int proto_exec(int argc, char *argv[]) { struct proto *proto; int error; if (argc == 0) { errno = EINVAL; return (-1); } TAILQ_FOREACH(proto, &protos, prt_next) { if (strcmp(proto->prt_name, argv[0]) == 0) break; } if (proto == NULL) { errno = EINVAL; return (-1); } if (proto->prt_exec == NULL) { errno = EOPNOTSUPP; return (-1); } error = proto->prt_exec(argc, argv); if (error != 0) { errno = error; return (-1); } /* NOTREACHED */ return (0); } 

      (Подробнее см. /contrib/openbsm/bin/auditdistd/proto.c:proto_exec() (ссылка) .)

      Честно говоря, я не могу понять, что здесь происходит.

    • Переменная protos инициализируется следующим образом:

       static TAILQ_HEAD(, proto) protos = TAILQ_HEAD_INITIALIZER(protos); 

      (Подробнее см. /contrib/openbsm/bin/auditdistd/proto.c (ссылка) .)

    • Когда /usr/sbin/auditdistd proto foo называется, он просто говорит:

      auditdistd: невозможно выполнить proto: недопустимый аргумент

    Кто-нибудь знает, что это за вариант и как его использовать?

  • Как перечислить atime для файлов?
  • Является ли (бесплатно) BSD Codebase ANSI совместимым?
  • Как установить FreeBSD на Thinkpad?
  • Предотвращение hashdeep от пересечения точек крепления?
  • Восстановление sendmail на сервере приложений FreeBSD после добавления нового контроллера домена activedirectory в сеть
  • Дополнительные дополнения для Debian / kfreebsd VirtualBox
  • 2 Solutions collect form web for “Что делает недокументированный аргумент командной строки «proto» в auditdistd для FreeBSD?”

    Auditdistd использует песочницу. Чтобы убедиться, что утечка памяти из родительского дочернего процесса, а не только fork (2) ing, она также выполняет двоичный файл auditdistd. Аргумент 'proto' передается, чтобы новопринятая команда знала, что он является дочерним процессом.

    Из того, что я понимаю, auditdistd использует __attribute__((constructor)) для инициализации определенных структур (см. Как работает __attribute__((constructor)) для более подробной информации).

    В результате protos представляет собой TAILQ proto структур tls, uds и tcp .

    Теперь загадка решена – protos сделан из тех proto структур, инициализированных функцией __attribute__((constructor)) .

    Linux и Unix - лучшая ОС в мире.