从apache模块输出linux系统whoami的C代码

从apache模块输出linux系统whoami的C代码,c,linux,apache,apxs2,C,Linux,Apache,Apxs2,我是C级新手。我的最终目标是创建一个Apache模块,将Apache用户帐户的crontab作为JSON返回 不过,婴儿第一步。我已经在以下两个位置成功地学习了教程,从Apache模块输出了“hello world”及其变体(我实际上拥有Nick Kew的书): 我稍微修改了示例以输出JSON,如下所示: ap_rputs("{'hello': {'to': 'world', 'from': '?'}}", r); 我想用Linux系统的“whoami”命令的输出替换上面的“?”(最终

我是C级新手。我的最终目标是创建一个Apache模块,将Apache用户帐户的crontab作为JSON返回

不过,婴儿第一步。我已经在以下两个位置成功地学习了教程,从Apache模块输出了“hello world”及其变体(我实际上拥有Nick Kew的书):

我稍微修改了示例以输出JSON,如下所示:

ap_rputs("{'hello': {'to': 'world', 'from': '?'}}", r);
我想用Linux系统的“whoami”命令的输出替换上面的“?”(最终我想运行Linux命令“crontab-luusername”)。作为一名C级新手,虽然我对如何进行这项工作的选择感到不知所措,但我已经尝试了一些事情,似乎还没有接近于做对任何事情。我似乎能够捕获whoami的输出,或者至少我的代码编译并运行;)

但我做得对吗?好的下一步是什么?我想我可以尝试从上面确定输出的长度,然后创建一个相同长度的字符数组,倒带文件句柄,然后获取输出。但我似乎没有正确获得长度,也许这是一个次优的方法?当我运行以下命令时(我遗漏了几行我知道可能需要的命令,即rewind、fclose),我得到的输出是-1:

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

任何关于如何更好地从系统命令“whoami”输出结果的具体指示都将不胜感激。

在这种情况下,
文件*
指的是一个管道,它可能实际上是不可查找的。理想情况下,您应该直接从系统中获取所需的信息,而不是调用外部程序;我认为
getuid()
getpwent()
函数将在这里派上用场


由于
getpwent()
可能会阻塞(就像您使用
popen()
的方法一样,将模块与每个请求至少不使用单个线程的MPM一起使用是不安全的。

优点,尽管
ltrace
认为
whoami
使用
geteuid()
getpwuid()
。是的,
geteuid()
用于查找当前用户的UID;然后在passwd数据库中查找用户名,该数据库可以是文件或远程数据库。数据库查找是可以阻止的位。
fseek(sysp, 0L, SEEK_END);
long len = ftell(sysp);
char buf[2];
sprintf(buf, "%d", (int)len);
ap_rputs(buf, r);