Подскажите, где можно найти все нужные функции libc для написания CGI-скрипта. Например в windows'е есть функция GetEnvironmentStringsA для получения переменных окружения. А для libc такое не могу найти.
#include <stdlib.h> char *getenv(const char *name); getenv просматривает список имен и значений переменных окружения, (используя глобальный указатель 'char **environ') Получается, "environ" указывает на все переменные?
Кстати, этот массив строк с переменными окружения формируется не сишной либой, а передаётся при создании процесса. Таким образом, переменные окружения можно перебирать и в статических экзешниках. Вот статический пример (без libc), который присваивает локальной переменной target_dir значение переменной окружения UF_CDIR: Код (Text): void _start(char *argv0){ int i = 0; char *arg,**argv = &argv0,*target_dir = ""; /* Iterate through command line arguments */ while(1){ arg = argv[++i]; if(!arg) break; /* No more arguments */ } /* Iterate through environment variables */ while(1){ arg = argv[++i]; if(!arg) break; /* No more env. vars */ /* Get the UF_CDIR env. var */ if(*(unsigned int*)arg == 0x435F4655 && *(unsigned int*)(arg+4) == 0x3D524944){ /* UF_CDIR=dir */ target_dir = arg+8; break; } } // ...
Quantum, объясни пожалуйста поподробнее. ... db 'ИМЯ=ЗНАЧЕНИЕ', 0 ;command line arguments ... db FFh ... db 'ИМЯ=ЗНАЧЕНИЕ', 0 ;environment variables ... db FFh Сходится?
Код (Text): var1 db 'имя=значение',0 var2 db 'имя=значение',0 ... varN db 'имя=значение',0 env1 db 'имя=значение',0 env2 db 'имя=значение',0 ... envM db 'имя=значение',0 На входе в EP стек выглядит так: Код (Text): eip <- esp var1 <- esp+4 var2 <- esp+8 ... varN 0 env1 env2 ... envM 0
А так не проще? Код (Text): #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <stdio.h> #include <stdlib.h> #include <crmms.h> int main(int argc, char *argv[]) { CGI cgi; createMainHeader("text/html"); cgi = cgibind (); printf ("Host: %s<br />\n",cgi.RemoteHostname); printf ("Method: %s<br />\n",cgi.RequestMethod); printf ("Mime: %s<br />\n",cgi.AcceptedMIME); printf ("QueryString: %s<br />\n",cgi.QueryString); return EXIT_SUCCESS; } Я так делаю