CGI & libc

Тема в разделе "WASM.NETWORKS", создана пользователем hypers, 21 июн 2007.

  1. hypers

    hypers New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    34
    Подскажите, где можно найти все нужные функции libc для написания CGI-скрипта.
    Например в windows'е есть функция GetEnvironmentStringsA для получения переменных окружения.
    А для libc такое не могу найти.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    бери из main'a.
     
  3. GanDJuStas

    GanDJuStas New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2003
    Сообщения:
    21
    Адрес:
    Russia
  4. hypers

    hypers New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    34
    #include <stdlib.h>
    char *getenv(const char *name);

    getenv просматривает список имен и значений переменных окружения,
    (используя глобальный указатель 'char **environ')

    Получается, "environ" указывает на все переменные?
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Именно. char** - это указатель на указатель на строку, то есть, список строк.
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Кстати, этот массив строк с переменными окружения формируется не сишной либой, а передаётся при создании процесса. Таким образом, переменные окружения можно перебирать и в статических экзешниках. Вот статический пример (без libc), который присваивает локальной переменной target_dir значение переменной окружения UF_CDIR:
    Код (Text):
    1. void _start(char *argv0){
    2. int i = 0;
    3. char *arg,**argv = &argv0,*target_dir = "";
    4.     /* Iterate through command line arguments */
    5.     while(1){
    6.         arg = argv[++i];
    7.         if(!arg) break; /* No more arguments */
    8.     }
    9.     /* Iterate through environment variables */
    10.     while(1){
    11.         arg = argv[++i];
    12.         if(!arg) break; /* No more env. vars */
    13.         /* Get the UF_CDIR env. var */
    14.         if(*(unsigned int*)arg == 0x435F4655 && *(unsigned int*)(arg+4) == 0x3D524944){
    15.             /* UF_CDIR=dir */
    16.             target_dir = arg+8;
    17.             break;
    18.         }
    19.     }
    20. // ...
     
  7. hypers

    hypers New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    34
    Quantum, объясни пожалуйста поподробнее.

    ...
    db 'ИМЯ=ЗНАЧЕНИЕ', 0 ;command line arguments
    ...
    db FFh
    ...
    db 'ИМЯ=ЗНАЧЕНИЕ', 0 ;environment variables
    ...
    db FFh

    Сходится?
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Код (Text):
    1. var1 db 'имя=значение',0
    2. var2 db 'имя=значение',0
    3. ...
    4. varN db 'имя=значение',0
    5. env1 db 'имя=значение',0
    6. env2 db 'имя=значение',0
    7. ...
    8. envM db 'имя=значение',0
    На входе в EP стек выглядит так:
    Код (Text):
    1. eip  <- esp
    2. var1 <- esp+4
    3. var2 <- esp+8
    4. ...
    5. varN
    6. 0
    7. env1
    8. env2
    9. ...
    10. envM
    11. 0
     
  9. hypers

    hypers New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    34
    Всё ясно. Спасибо.
     
  10. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    А так не проще?
    Код (Text):
    1. #ifdef HAVE_CONFIG_H
    2. #include <config.h>
    3. #endif
    4.  
    5. #include <stdio.h>
    6. #include <stdlib.h>
    7. #include <crmms.h>
    8.  
    9. int main(int argc, char *argv[])
    10. {
    11.  
    12. CGI cgi;
    13.  
    14. createMainHeader("text/html");
    15. cgi = cgibind ();
    16.  
    17. printf ("Host: %s<br />\n",cgi.RemoteHostname);
    18. printf ("Method: %s<br />\n",cgi.RequestMethod);
    19. printf ("Mime: %s<br />\n",cgi.AcceptedMIME);
    20. printf ("QueryString: %s<br />\n",cgi.QueryString);
    21.   return EXIT_SUCCESS;
    22. }
    Я так делаю