C-код для вывода linux системы Linux из модуля Apache

Я новичок в C Моя конечная цель - создать модуль Apache, который возвращает crontab учетной записи Apache как JSON.

Ребенок шагает первым, хотя. Я успешно следовал учебным пособиям в двух следующих местах, чтобы вывести "hello world" и их варианты из модуля Apache (и на самом деле мне принадлежит книга Ника Кью):

Я немного изменил примеры для вывода 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, который не использует по крайней мере один поток на запрос.

Другие вопросы по тегам