Программирование на Cgi на C, вызов системы () из моей программы на CGI. - PullRequest
0 голосов
/ 27 декабря 2018

У меня была CGI-программа, которую я написал на C и использовал около 20 лет, и впервые за долгое время я работаю в Windows, особенно в Windows 10, и не могу получитьсистемный вызов () для выполнения из программы CGI.Похоже, системный вызов просто игнорируется и не создает ожидаемый мной вывод на стороне сервера.
Программа CGI вызывается из формы, а использование sprintf превращает ответ html-страницы в гигантский буфер (szbuffer), а затем печатает на стандартный вывод, который в мире apache возвращается к клиенту.Вот процедура, которая выводит созданную HTML-страницу пользователю:

    /** Print the CGI response header, required for all HTML output. **/
    /** Note the extra \n, to send the blank line.                  **/
    printf("Content-type: text/html\n\n") ;

    printf("%s\n<!--JL 7/12/01 11:00am -->\n",szBuffer); 
    free ( szBuffer); 

Теперь это работало отлично в течение многих лет, но в этой версии я хотел выполнить некоторые системные вызовы для поиска файла CSV и созданиянабор ответов для чтения с помощью fopen ().То, как я это сделал в Linux, - это просто запускать команды с помощью команды system ():

         getvaluecgivar(szcustomer_chain, "cust_field3", globals); 
         getvaluecgivar(szcustomer_id, "cust_field4", globals); 

         //sprintf(szdoscommand,"./awklookup_customer_id.bat %s %s "
         sprintf(szdoscommand,"awklookup_customer_id.bat %s %s"
    ,szcustomer_chain
    ,szcustomer_id
    ); 

          system(szdoscommand);
          system("cat lunch.trace >hw.lis");
          system("cat lunch.trace >/temp/hwt.lis");

          sprintf(szTempstring,"system command:%s: return code=%d\n"
      ,szdoscommand
      ,return_from_system_call
              );
        strcat(szBuffer, szTempstring); 

         } // then lookup by customer id

, по причинам, которые мне нужно объяснить и исправить, похоже, что вызов system () (все трииз них) никогда не выполнить.Два системных вызова "cat lunch.trace" были просто тестом, чтобы увидеть, смогу ли я выполнить ЛЮБОЙ системный вызов, и эти команды, похоже, тоже не работают.Теперь я знаю, что до Linux это делалось без проблем:

        FILE * tfile;

        system( "cat /tmp/relaystatus20*.txt >/tmp/rs20all.txt"); 

        tfile = fopen( "/tmp/rs20all.txt" , "r");
        if (tfile) {
            strcat(szBuffer, "<pre>"); 
                while(!feof(tfile)) {

, и это создает файл rs20all.txt в каталоге / tmp.

Есть ли что-то особенное, что я должен сделать в Windows?Я захватил код возврата из awklookup_customer_id.bat, и он был 127.

Вот awklookup_customer_id.bat, он отлично работает либо из командной строки dos cmd.exe, либо из терминала cygwin64:

  call \jon\bat\local >t.lis
  rem echo %1%, %2%
  set arg1=%1%
  set arg2=%2%

  gawk -F',' '{ if($3==%arg1%)  print $0 }' t5_clean_customer.csv >awk01.lis
  gawk -F',' '{ if($4==%arg2%)  print $0 }' awk01.lis >awk02.lis
  \jon\bat\grep.exe -nf awk02.lis t5_clean_customer.csv >awk03.lis
  cat awk03.lis|wc -l >awk03_c.lis
  set LINE_COUNT=0
  set /p LINE_COUNT=<awk03_c.lis
  cut -d: -f1 awk03.lis >awk03_ln.lis
  set LINE_NUMBER=0
  set /p LINE_NUMBER=<awk03_ln.lis
  SET /A Result = %LINE_COUNT% * 10000000 + %LINE_NUMBER%
  echo number of lines that match :%LINE_COUNT% line number: %LINE_NUMBER%
  rem pause
  exit  %Result%

Я использую Apache 2.4, вот переменные окружения, которые получает программа cgi:

  Print_environ::
  [HTTP_HOST=localhost]
  [HTTP_CONNECTION=keep-alive]
  [CONTENT_LENGTH=380]
  [HTTP_CACHE_CONTROL=max-age=0]
  [HTTP_ORIGIN=http://localhost]
  [HTTP_UPGRADE_INSECURE_REQUESTS=1]
  [CONTENT_TYPE=application/x-www-form-urlencoded]
  [HTTP_USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36]
  [HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8]
  [HTTP_REFERER=http://localhost/cgi-bin/bf_customer.cgi]
  [HTTP_ACCEPT_ENCODING=gzip, deflate, br]
  [HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.9]
  [PATH=/cygdrive/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/cygdrive/c/Program Files (x86)/Intel/iCLS Client:/cygdrive/c/Program Files/Intel/iCLS Client:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdrive/c/Windows/System32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0:/cygdrive/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/DAL:/cygdrive/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/cygdrive/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/IPT:/cygdrive/c/Program Files/Intel/Intel(R) Management Engine Components/IPT:/cygdrive/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/cygdrive/c/Windows/system32/config/systemprofile/.dnx/bin:/cygdrive/c/Program Files/Microsoft DNX/Dnvm:/cygdrive/c/Program Files (x86)/Windows Kits/8.1/Windows Performance Toolkit:/cygdrive/c/Program Files/Intel/WiFi/bin:/cygdrive/c/Program Files/Common Files/Intel/WirelessCommon:/cygdrive/c/Program Files (x86)/2Printer:/cygdrive/c/Program Files/MATLAB/MATLAB Runtime/v93/runtime/win64:/cygdrive/c/Program Files (x86)/Pico Technology/PicoScope6:/cygdrive/c/Program Files (x86)/IVI Foundation/VISA/WinNT/Bin:/cygdrive/c/Program Files/IVI Foundation/VISA/Win64/Bin:/cygdrive/c/Users/jleslie/AppData/Local/Microsoft/WindowsApps]
  [SYSTEMROOT=C:\Windows]
  [COMSPEC=C:\Windows\system32\cmd.exe]
  [PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC]
  [WINDIR=C:\Windows]
  [SERVER_SIGNATURE=]
  [SERVER_SOFTWARE=Apache/2.4.23 (Win64)]
  [SERVER_NAME=localhost]
  [SERVER_ADDR=::1]
  [SERVER_PORT=80]
  [REMOTE_ADDR=::1]
  [DOCUMENT_ROOT=C:/jon/programs/Apache24/htdocs]
  [REQUEST_SCHEME=http]
  [CONTEXT_PREFIX=/cgi-bin/]
  [CONTEXT_DOCUMENT_ROOT=c:/jon/programs/Apache24/cgi-bin/]
  [SERVER_ADMIN=admin@example.com]
  [SCRIPT_FILENAME=C:/jon/programs/Apache24/cgi-bin/bf_customer.cgi]
  [REMOTE_PORT=52945]
  [GATEWAY_INTERFACE=CGI/1.1]
  [SERVER_PROTOCOL=HTTP/1.1]
  [REQUEST_METHOD=POST]
  [QUERY_STRING=]
  [REQUEST_URI=/cgi-bin/bf_customer.cgi]
  [SCRIPT_NAME=/cgi-bin/bf_customer.cgi]
  [TERM=cygwin]
  [HOME=/home/jleslie]
  cgi vars:
  [colora] = [maroon]
  [cust_field1] = []
  [cust_field2] = []
  [cust_field3] = [0]
  [cust_field4] = [16]

1 Ответ

0 голосов
/ 27 декабря 2018

Я понял это.Ответ связан с httpd.conf.Мне нужно было сказать apache, что запускать файл .bat можно:

   # (You will also need to add "ExecCGI" to the "Options" directive.)
   #
   #AddHandler cgi-script .cgi
   AddHandler cgi-script .bat # add .exe if you wish
   Options +ExecCGI +FollowSymlinks

извините за путаницу с return_from_system_call, я добавлял и удалял его так часто, что выкладывал версию кода там, где ее не былот набор.Это последний раздел кода, который работает:

         getvaluecgivar(szcustomer_chain, "cust_field3", globals); 
         getvaluecgivar(szcustomer_id, "cust_field4", globals); 

         sprintf(szdoscommand,"awklookup_customer_id.bat %s %s"
                 ,szcustomer_chain
                 ,szcustomer_id
                 ); 

          return_from_system_call =system(szdoscommand);

          sprintf(szTempstring,"system command:%s: return code=%d\n"
                  ,szdoscommand
                  ,return_from_system_call
                  );
          strcat(szBuffer, szTempstring); 
...