C-код для вывода linux системы Linux из модуля Apache
Я новичок в C Моя конечная цель - создать модуль Apache, который возвращает crontab учетной записи Apache как JSON.
Ребенок шагает первым, хотя. Я успешно следовал учебным пособиям в двух следующих местах, чтобы вывести "hello world" и их варианты из модуля Apache (и на самом деле мне принадлежит книга Ника Кью):
- http://www.cb1inc.com/2007/12/24/creating-a-hello-world-apache-module-with-kdevelop-on-ubuntu/
- http://www.theregister.co.uk/2006/10/03/apache_modules/
Я немного изменил примеры для вывода JSON следующим образом:
ap_rputs("{'hello': {'to': 'world', 'from': '?'}}", r);
Я хотел бы заменить '?' выше с выводом команды whoami системы Linux (в конце концов я хочу запустить команду linux 'crontab -lu username'). Как новичок в C, хотя я ошеломлен выбором того, как это сделать, я попробовал несколько вещей, и, похоже, не был близок к тому, чтобы что-то сделать правильно. Кажется, я могу перехватить вывод whoami, или, по крайней мере, мой код компилируется и запускается;)
FILE *sysp = popen("whoami","r");
Но я даже делаю выше, правильно? И что является хорошим следующим шагом? Я подумал, что мог бы попытаться определить длину вывода сверху, затем создать массив символов той же длины, перемотать дескриптор файла и захватить вывод. Но я, кажется, не получаю длину правильно, и, возможно, это неоптимальный подход? Когда я запускаю следующее (я пропустил пару строк, которые, как я знаю, могут понадобиться, например, перемотка назад, 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, который не использует по крайней мере один поток на запрос.