2011-01-27 66 views
0

我是C新手。我最终的目标是创建一个Apache模块,将Apache用户帐户的crontab作为JSON返回。从apache模块输出linux系统whoami的C代码

虽然宝宝的步骤。我已经成功地跟着从Apache模块(实际上我自己尼克邱的书)在以下两个位置输出“Hello World”的教程及其变化:

我已经修改了范例稍有输出JSON如下:

ap_rputs("{'hello': {'to': 'world', 'from': '?'}}", r); 

我想以替代“?”上面输出来自Linux系统的'whoami'命令(最终我想运行linux命令'crontab -lu username')。作为C新手,尽管我对如何去做这件事的选择感到不知所措,但我已经尝试了一些东西,而且似乎并没有接近任何事情的正确。我似乎能够捕获从WHOAMI输出,或者至少我的代码编译和运行;)

FILE *sysp = popen("whoami","r"); 

但我我甚至做以上吧?下一步是什么?我想我可能会尝试确定上面输出的长度,然后创建一个长度相同的char数组,然后倒转文件句柄并获取输出。但我似乎没有正确地获得长度,也许这是一个次优方法?当我运行下面的(我省略了几行,我知道可能是必要的,即退,FCLOSE)输出我得到的是-1:

fseek(sysp, 0L, SEEK_END); 
long len = ftell(sysp); 
char buf[2]; 
sprintf(buf, "%d", (int)len); 
ap_rputs(buf, r); 

任何指针专门就如何更好的方法输出结果从系统命令“whoami”将不胜感激。

回答

1

在这种情况下,FILE *是指管道,这可能不是真正可以找到的。理想情况下,您应该直接从系统获取您正在查找的信息,而不是调用外部程序;我认为getuid()getpwent()函数将在这里派上用场。

由于getpwent()可能会阻止(就像使用popen()你的方法,它是不是安全使用您的模块与任何MPM不按要求至少使用一个单独的线程。

+0

好点,虽然`ltrace`认为'whoami`使用`geteuid()`和`getpwuid()`。 – ephemient 2011-01-27 15:16:41