Bach. Engenharia Informática 1997/98 
Sistemas Gráficos
Filipe Pacheco
 
3 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"); 
 

26-3-1998