1つあることがわかりますauditdistd(8)
FreeBSDで使用できるデーモン。などのいくつかの文書化されたコマンドラインパラメータがあります-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:プロトタイプを実行できません:無効な引数
このオプションが何であるか、どのように使用するのかご存知ですか?
ベストアンサー1
Auditdistdはサンドボックスを使用します。親プロセスから子プロセスへのメモリリークの発生を防ぐために、分岐(2)操作を実行するだけでなく、 auditdistd バイナリも実行します。新しく実行されたコマンドが子プロセスであることを知らせるために、「proto」パラメータが渡されます。