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

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

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

  • По-видимому, 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: недопустимый аргумент

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

  • Как передать высокое разрешение от GRUB2 во FreeBSD?
  • FreeBSD «Неустранимая двойная ошибка» при вводе пароля шифрования ZFS
  • FreeBSD 11.0: подключение через IPv6 потеряно через некоторое время
  • Ошибка обновления MySQL 5.5
  • Как ограничить создание имени каталога шаблоном?
  • Недопустимое приветствие с сервера
  • Использование сжатых RAM-дисков для свопинга в FreeBSD на ранней доске Raspberry Pi
  • Не удается заставить startX / Xorg работать во FreeBSD 8.1
  • 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 - лучшая ОС в мире.