2011-11-23 43 views
0

所以,我有我想修改我自己的目的简单吗?的argv []转换为char *

它基本上是运行shell脚本(下面的测试例子),但使用苹果的安全框架PRIVS一个示例应用程序源(见以下链接为原始来源)。

#!/bin/bash 
echo [email protected] 
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 }; 

所以我以前的shell示例可能会输出什么像这样:

./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代码中的参数,我只是需要将它们直接传递给shell脚本(外部命令)。

因此,继承我的(希望)简单的问题,如果一个人想采取argv []并将它除了参数0(这是路径到./compiled_priv)复制到期望的char * myArguments var那么看什么像在代码中一样。我学习了Objective C,并且从不用C开始,所以这可能很基本,但我尝试了一个for循环并复制这两个索引,但它不起作用。是这样的:

的char * myArguments [] =的argv

就是我想要的,但还是不行,因为它说无效的初始化,并且即使它看起来我们在年底需要一个NULL该阵列非常像NSTask。我会包括我的for循环,但它不是一个启动器。

所以我需要argv的内容从1到数组的末尾,并在末尾添加一个NULL,并在原始示例代码中以与char * myArguments []相同的形式包装它。如果我对c有更好的理解,它会有所帮助,但同时也会有所帮助?

下面是我与它是否有助于播放源链接,

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

+0

酷,所以我会继续前进,并删除这一个安全标签。 – rook

回答

2

argv已经在您需要的格式(的char *指针一个NULL终止阵列),所以你可以做:

char **myArguments = &argv[2]; 

(假设您已经测试argc至少2)。

+0

这样工作的很好,但是我在编译时警告时没有从不兼容的指针类型进行初始化。 – acidprime

+0

@acidprime:什么是'argv'的声明?如果它是'const',则可以将'myArguments'声明为'const char **'。 – caf

+0

根据引用AuthorizationExecuteWithPrivileges期望char * const *参数作为它的第4个参数,所以如果我按照所述更改该错误,则会得到一个错误 – acidprime