2011-01-27 3 views
0

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

Детские шаги сначала, хотя. Я успешно следовали учебники на двух следующих местах для вывода «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, который не использует по крайней мере один поток для каждого запроса.

+0

Хороших моментов, хотя 'ltrace' думает что 'whoami' использует' geteuid() 'и' getpwuid() '. – ephemient

+0

Да,' geteuid() 'используется для определения UID текущего пользователя, после чего следует поиск имени пользователя в passwd база данных, которая может быть файлом или удаленной базой данных. Поиск базы данных - это бит, который может блокироваться. –