Utilização
das rotinas de cgi-util e notas sobre CGIs
Os ficheiros cgi-util.c e cgi-util.h definem
um conjunto básico de rotinas de suporte a CGIs
Para melhor compreender o funionamento
destas rotinas de seguida apresenta-se uma listagem comentada de um pequeno
programa:
#include <stdio.h>
#ifndef NO_STDLIB_H
#include <stdlib.h>
#endif
/* Incluir cgi-util.h */
#include "cgi-util.h"
/* Número máximo de parâmertos que podem vir
de um formulário*/
#define MAX_ENTRIES 1000
void main(int argc, char *argv[])
{
/* array onde vão ser armazenados os pares nome-valor vindos
do formulário */
entry entries[MAX_ENTRIES];
/* variável que vai conter o número de ítens
em entries */
int m;
/* outras variáveis */
int x, p;
char value[80];
/* Inicializar o modulo de CGI */
m = cgi_init(entries, sizeof(entries)/sizeof(entries[0]));
if (m < 0)
{
/* CGI: reportar erro no modulo */
/* poderíamos aqui por código para quando
se chama o CGI sem ser de um formulário */
cgi_send_error(m);
exit(1);
}
/* indicar tipo de conteudo da resposta */
/* também poderia ser HEADER_TYPE_TEXT_PLAIN, em que teríamos
texto não formatado */
cgi_send_header(HEADER_TYPE_TEXT_HTML);
/* construir documento */
printf("<H1>Query Results</H1>");
printf("You submitted the following name/value pairs:<p>%c",
10);
printf("<ul>%c", 10);
/* percorrer todo o array entries para visualizar todos os pares
entrados */
for (x = 0; x < m; x++)
{
printf("<li> <code>%s = %s</code>%c", entries[x].name,
entries[x].val, 10);
}
printf("</ul>%c", 10);
printf("<hr>%c", 10);
printf("enumerar todos os valores de menu2<br>%c", 10);
/* procurar todos os valores relativos a uma chave */
/* p vai ser a posição no array do valor prentendido
*/
p = cgi_get_value_from_key(value, sizeof(value), "menu2",
0, entries, m);
while (p != -1)
{
printf("menu2 = %s<br>%c", value, 10);
/* NOTA: usamos agora o valor de retorno anterior para o
parametro pos */
p = cgi_get_value_from_key(value, sizeof(value), "menu2",
p, entries, m);
}
/* libertar recursos do modulo */
cgi_uninit(entries, m);
}
Pontos a recordar:
Não esquecer de chamar
cgi_send_header(...); antes
de enviar o que quer que seja por stdout. Em alternativa pode-se fazer
printf("Content-type: text/html\n\n);
Cuidado com as permissões: o CGI
vai ser executado pela conta www no servidor, como tal é necessário
garantir que tenha os acessos a ficheiros utilizados. Por exemplo se têm
que escrever para um ficheiro este tem de ter permissões de escrita
para todos os utilizadores.
Para redireccionar para outro documento
utilizar apenas o código seguinte, sem chamar cgi_send_header(...);:
printf("Location: teste.html\n\n");
|