Просто?argv [] преобразование в char * - PullRequest
0 голосов
/ 23 ноября 2011

Итак, у меня есть пример исходного кода приложения, который я пытаюсь изменить для своих собственных целей

это в основном выполняется сценарий оболочки (тестовый пример ниже), но с привилегированным использованием инфраструктуры безопасности apple (см. Ссылку ниже для оригинального источника).

#!/bin/bash
echo $@
whoami

В этом примере кода мы передаем следующее:

        myFlags = kAuthorizationFlagDefaults;                          // 8
        myStatus = AuthorizationExecuteWithPrivileges                  // 9
        (myAuthorizationRef, myToolPath, myFlags, myArguments,
         &myCommunicationsPipe);

Я изменил команду, добавив myToolPath в качестве первого аргумента следующим образом:

        // Grab the arguent length
        int size = strlen(argv[1]);

        // Grab the first argument
        char myToolPath[size];
        strcpy(myToolPath,argv[1]);

, который работает, это значит, когда я запускаю

./compiled_priv_tool /tmp/example.sh

Возвращает «root», а не пользователя, которого я использую.

Но теперь я хочу иметь возможность передавать аргументы этому помощнику и добавлять их в этот массив Это то, что делает пример в примере кода

        char *myArguments[] = { "-u", NULL };

Таким образом, мой предыдущий пример оболочки будет иметь следующий вид:

./compiled_priv_tool /tmp/example.sh

-u
root

но я бы хотел иметь возможность динамически передавать столько аргументов, сколько argv может содержать в этот скрипт, чтобы вывод выглядел следующим образом

./compiled_priv_tool /tmp/example.sh -u user -f file path -b lah 

-u user -f file path -b lah
root

Мне не нужно обрабатывать аргументы в коде C, мне просто нужно, чтобы они были переданы непосредственно в скрипт оболочки (внешняя команда).

Итак, вот мой (надеюсь) простой вопрос, если бы кто-то хотел взять argv [] и скопировать его, за исключением аргумента 0 (который является путем к ./compiled_priv), к чему-то ожидающему char * myArguments var, как бы это выглядело в коде. Я изучил цель C и никогда не начинал с C, так что это, вероятно, довольно просто, но я пробовал цикл for и копировал два индекса, но он не работает. что-то вроде:

char * myArguments [] = argv

- это то, что я хочу, но это не работает, так как в нем указано неверный инициализатор, и даже если это так, похоже, нам нужен NULL в конце массива, очень похожий на NSTask. Я бы включил цикл for, но это не стартер.

Так что мне нужно содержимое argv от 1 до конца массива и добавить NULL в конец и обернуть его в ту же форму, что и char * myArguments [] в исходном примере кода. Если бы я понял лучше, это помогло бы, но в то же время есть мысли?

Вот ссылка на источник, с которым я играю, если это поможет,

http://developer.apple.com/library/mac/documentation/security/conceptual/authorization_concepts/03authtasks/authtasks.html#//apple_ref/doc/uid/TP30000995-CH206-TPXREF33

1 Ответ

2 голосов
/ 23 ноября 2011

argv уже находится в нужном вам формате (NULL завершенный массив char * указателей), поэтому вы можете просто сделать:

char **myArguments = &argv[2];

(Предполагается, что вы уже проверили, что argc равно как минимум 2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...