openwrt C cgi脚本

时间:2018-11-06 03:25:54

标签: cgi

我们正在开发openwrt。 Web服务器使用lighttpd。 cgi是用C语言开发的。 在html表单中,将动作设置为form标签中的cgi,并执行用C开发的cgi。 我将脚本放在cgi中。

CREATE OR REPLACE FUNCTION writeappend(oid, text)
RETURNS void AS $$
DECLARE
  content bytea;
  fd int;
BEGIN
  content := convert_to($2, getdatabaseencoding());
  fd := lo_open($1, 131072);
  PERFORM lo_lseek(fd, 0, 2);
  IF length(content) <> lowrite(fd, content) THEN
    RAISE EXCEPTION 'not all content was written';
  END IF;
  PERFORM lo_close(fd);
END;
$$ LANGUAGE plpgsql;

postgres=> select lo_creat(-1);
┌──────────┐
│ lo_creat │
╞══════════╡
│    20653 │
└──────────┘
(1 row)

postgres=> select writeappend(20653, e'Hello\r\n');
┌─────────────┐
│ writeappend │
╞═════════════╡
│             │
└─────────────┘
(1 row)

postgres=> select writeappend(20653, e'Hello\r\n');
...

postgres=> select convert_from(lo_get(20653),getdatabaseencoding());
┌──────────────┐
│ convert_from │
╞══════════════╡
│ Hello\r     ↵│
│ Hello\r     ↵│
│              │
└──────────────┘
(1 row)

}

在Chrome中运行cgi后,该脚本将无法运行。 这就是我在网页上看到的。     net.bridge.bridge-nf-call-custom = 0     运行命令错误     好     好     好     内容类型:文本/纯文本; charset = utf-8

int main(int argc, char *argv[]){
char *form, *inStr;
long inLen;

printf("Content-type: text/html%c%c\n\n",10,10);
printf("<HTML>\n");
printf("<head>\n");
inLen = strtol(getenv("CONTENT_LENGTH"), NULL, 10) + 1;
inStr = malloc(inLen);
memset(inStr, 0, inLen);
fgets(inStr, inLen+1, stdin);
form = web_get("page", inStr, 0);
 if (!strcmp(form, "reboot")) {
    set_reboot(inStr);




 printf("scriptype='text/javascript'>document.location.href='../index.shtml';/script>\n"); 
   }else if (!strcmp(form,"lan"))
         {
    set_lan(inStr);
   }
   free(inStr);
printf("</head>\n");
printf("</HTML>");
return 0;

我没有转到我想要的页面。

1 个答案:

答案 0 :(得分:0)

这是因为您执行此行:

printf("Content-type: text/html%c%c\n\n",10,10);

放在上一行之后的任何内容都不会执行,而是打印在屏幕上。问题出在这个脚本的流程中。仅在完成所有其他操作之后,才必须开始打印页面。