/*----------------------------------------------------------------------------* | File.............: impianti.c | *----------------------------------------------------------------------------* | Descrizione......: programma CGI didattico | | prende una stringa in input; cerca in un file le 5 | | stringhe che la seguono. | | | | accetta input come 1) command line | | 2) variabile ambiente | | 3) standard input | | | | manda sullo standard output A) Non Parsed Header | | B) Parsed Header | | Linguaggio.......: C | | Copyright........: Universita' degli studi di Roma Tre | | Facolta' di Ingegneria | | Dipartimento di Informatica e Automazione | | Corso di Impianti di Elaborazione | | | | Data.............: 30 Ottobre 1997 | *----------------------------------------------------------------------------*/ #include #include #include #define COPPIA_NOME_VALORE 0 #define PARAMETRO_COMMAND_LINE 1 #define NOME_FILE "/afs/vn.uniroma3.it/group/gc/gdb/public/public_html/impianti/results.101097" char *cursore_file, *valore_input; char *val_1, *val_2, *val_3, *val_4, *val_5; int end_of_file_met; void estrai_input(int formato,char* parametro); void manda_fuori_header(char* nome_cgi); void cerca_nel_file(void); void manda_fuori_codice_html(void); /*----------------------------------------------------------------------------* | Funzione: main() | | Input: int argc - arg counter | | char** argv - arg vector | | Output: nessuno | *----------------------------------------------------------------------------*/ main(int argc, char** argv) { if(argc == 2) estrai_input(PARAMETRO_COMMAND_LINE, argv[1]); else estrai_input(COPPIA_NOME_VALORE , NULL); cerca_nel_file(); manda_fuori_header(argv[0]); manda_fuori_codice_html(); } /*----------------------------------------------------------------------------* | Funzione: estrai_input() | | Input: int formato - comunica alla funzione se il parametro e' | | stato passato come una COPPIA_NOME_VALORE o | | come un PARAMETRO_COMMAND_LINE. | | char* parametro - e' diverso da NULL solo nel caso in cui | | formato = PARAMETRO_COMMAND_LINE. | | Output: nessuno | *----------------------------------------------------------------------------* | Descrizione: Assegna un valore alla variabile globale "valore_input" | *----------------------------------------------------------------------------*/ void estrai_input(int formato, char* parametro) { valore_input = (char*)calloc(10, sizeof("char")); if( formato == PARAMETRO_COMMAND_LINE ) { strcpy(valore_input, parametro); } else if( formato == COPPIA_NOME_VALORE ) { parametro = (char*)calloc(256, sizeof("char")); if ( strcmp(getenv("REQUEST_METHOD"),"GET") == 0 ) { strncpy( parametro, getenv("QUERY_STRING"), 255); } else { scanf("%s", parametro); } while( *parametro != '=' ) parametro++; parametro++; strncpy(valore_input, parametro, 9); } else exit(1); } /*----------------------------------------------------------------------------* | Funzione: cerca_nel_file() | | Input: nessuno | | Output: nessuno | *----------------------------------------------------------------------------* | Descrizione: Estrae dal file NOME_FILE i cinque valori che seguono la | | stringa in input. Cioe': cerca la stringa contenuta nella | | variabile globale "valore_input" nel file NOME_FILE; | | se non la trova pone "end_of_file_met" uguale a 1, | | altrimenti pone "end_of_file_met" uguale a 0 e assegna alle| | variabili stringa val_1, val_2, val_3, val_4, val_5 le | | cinque stringhe che seguono. | *----------------------------------------------------------------------------*/ void cerca_nel_file(void) { FILE* punt_file = fopen(NOME_FILE,"r"); cursore_file = (char*)calloc(10, sizeof("char")); val_1 = (char*)calloc(5, sizeof("char")); val_2 = (char*)calloc(5, sizeof("char")); val_3 = (char*)calloc(5, sizeof("char")); val_4 = (char*)calloc(5, sizeof("char")); val_5 = (char*)calloc(5, sizeof("char")); end_of_file_met = 0; do { if( fscanf(punt_file, "%s %s %s %s %s %s", cursore_file, val_1, val_2, val_3, val_4, val_5) == EOF) { end_of_file_met = 1; } } while( strcmp(cursore_file, valore_input) != 0 && end_of_file_met == 0); } /*----------------------------------------------------------------------------* | Funzione: manda_fuori_header() | | Input: char* nome_cgi - il nome del programma | | Output: nessuno | *----------------------------------------------------------------------------* | Descrizione: controlla che il nome del programma in esecuzione cominci | | per "nph" o meno. Se comincia per "nph" manda nello | | standard output tutto l'header, altrimenti solo la linea | | "Content-TYPE: ...". | *----------------------------------------------------------------------------*/ void manda_fuori_header(char* nome_cgi) { if( strncmp("nph", nome_cgi, 3) == 0 ) { printf("HTTP/1.0 200 OK\n"); printf("Date: Wednesday 20-Oct-97 17:55:48 GMT\n"); printf("Server: NCSA/1.3\n"); printf("MIME-version: 1.0\n"); printf("Content-TYPE: text/html\n"); } else { printf("Content-TYPE: text/html\n\n"); } } /*----------------------------------------------------------------------------* | Funzione: manda_fuori_codice_html() | | Input: nessuno | | Output: nessuno | *----------------------------------------------------------------------------* | Descrizione: Utilizza i valori delle variabili globali "end_of_file_met"| | "cursore_file", "val_1", "val_2", "val_3", "val_4", e | | "val_5" per costruire la pagina html per il client. | *----------------------------------------------------------------------------*/ void manda_fuori_codice_html(void) { printf(""); printf(""); printf(""); printf(""); printf("

Risultato della ricerca nel file

"); if( end_of_file_met ) { printf("

"); printf("Il parametro %s non è stato trovato nel file", valore_input); printf("

"); } else { printf("

"); printf("%s è seguito da %s %s %s %s %s ", cursore_file, val_1, val_2, val_3, val_4, val_5); printf("

"); } printf(""); printf(""); }