与Ada一起使用FastCGI

use*_*344 4 c fastcgi ada mod-fcgid mod-fastcgi

我找到了http://support.zeus.com/zws/examples/2005/12/16/hello_world_in_perl_and_c,这两个例子正在运行.

现在我为Ada尝试了这个,我从2天后就无法完成它.

fcgi_stdio.ads

with Interfaces.C;
with Interfaces.C.Strings;

package fcgi_stdio is
    function FCGI_Accept return Interfaces.C.int;
    pragma Import (C, FCGI_Accept, "FCGI_Accept");

    procedure FCGI_printf (str : Interfaces.C.Strings.chars_ptr);
    pragma Import (C, FCGI_printf, "FCGI_printf");
end fcgi_stdio;
Run Code Online (Sandbox Code Playgroud)

test.adb

with fcgi_stdio;
with Interfaces.C;
with Interfaces.C.Strings;

procedure Test is
begin
    while Integer (fcgi_stdio.FCGI_Accept) >= 0 loop
        fcgi_stdio.FCGI_printf (Interfaces.C.Strings.New_String ("Content-Type: text/plain" & ASCII.LF & ASCII.LF));
        fcgi_stdio.FCGI_printf (Interfaces.C.Strings.New_String ("Hello World from Ada!" & ASCII.LF));
    end loop;
end Test;
Run Code Online (Sandbox Code Playgroud)

当我在控制台中运行它时,我收到以下错误:

$ ./test
raised STORAGE_ERROR : stack overflow or erroneous memory access
Run Code Online (Sandbox Code Playgroud)

Apache error_log显示:

Premature end of script headers: test
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么能让它运作?

Sim*_*ght 7

在Mac OS X上进行试验,似乎问题在于它FCGI_printf()是一个varargs函数.它叫FCGI_fprintf(),也叫varargs:

int FCGI_fprintf(FCGI_FILE *fp, const char *format, ...)
{
    va_list ap;
    int n = 0;
    va_start(ap, format);          <------ crash here
Run Code Online (Sandbox Code Playgroud)

Ada没有指定varargs函数的标准方法,GNAT也没有实现定义的方法.

GNAT文件说,该解决方案是提供了可变参数的函数C包装:

#include <fcgi_stdio.h>
int FCGI_printf_wrapper(const char *msg)
{
  return FCGI_printf(msg);
}
Run Code Online (Sandbox Code Playgroud)

并导入包装器:

procedure FCGI_printf (str : Interfaces.C.Strings.chars_ptr);
pragma Import (C, FCGI_printf, "FCGI_printf_wrapper");
Run Code Online (Sandbox Code Playgroud)

该程序的另一个问题是,在Ada中,与C和许多其他语言不同,"\n"它不是在字符串中插入换行符的方法.尝试

fcgi_stdio.FCGI_printf
  (Interfaces.C.Strings.New_String ("Content-Type: text/plain" 
                                    & ASCII.LF & ASCII.LF));
Run Code Online (Sandbox Code Playgroud)

[编辑13.1.13]