Salve a tutti, essendo il mio primo post vorrei innanzitutto ringraziare la community di HTML.it, da sempre un punto di riferimento per me sia per le ottime guide, sia per le pronte, gentili ed utili risposte degli utenti. GRAZIE!
Venendo al problema in oggetto:
Premetto che non ne so nulla di webserver, mi sono avvicinato due giorni fa al campo per un progettino hobbystico per il quale ho necessità di controllare una porta parallela attraverso il browser.
Parto da una configurazione default di Apache2 con cgi.load abilitato, lo script CGI l'ho realizzato in C (unico linguaggio di programmazione che conosco).
Posiziono lo script in /usr/lib/cgi-bin (come di default).
Siccome il programma utilizza la funzione ioperm(), procedo nel seguente modo:
imposto come proprietario "root"
codice:
# chown root:root [programma].cgi
imposto il permesso suid
codice:
# chmod u+s [programma].cgi
Eseguendo da shell l'output è quello atteso, richiedendolo ad apache tramite browser, invece, il codice html che mi viene inviato si ferma a metà.
per maggiore chiarezza vi posto il main:
codice:
int main()
{
char* query;
unsigned int relstat[7];
printf("Content-type: text/html\n\n");
printf("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n");
printf("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n");
printf("<head>\n");
printf("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n");
printf("<title>Documento senza titolo</title>\n");
printf("</head>\n\n");
printf("<body>\n");
if (ioperm(DATA,3,1)) {
printf("
Sorry, you were not able to gain access to the ports
\n");
printf("You must be root to run this program</p>\n");
exit(0);
}
if ((query=getenv("QUERY_STRING"))!=NULL){
switch(*(query + FID_LEN))
{
case 'u' :
outb(accendi((query + FID_LEN * 2 + 4)), DATA);
break;
case 'd' :
outb(spegni((query + FID_LEN * 2 + 4)), DATA);
break;
default :
exit(1);
break;
}
}
printf("
\n
\n
\n
\n
\n
\n");
printf("<table width=\"700\" border=\"1\" align=\"center\">\n");
printf("<tr align=\"center\" valign=\"middle\">\n");
printf("<td>RELAY 1</td>\n\
<td>RELAY 2</td>\n\
<td>RELAY 3</td>\n\
<td>RELAY 4</td>\n\
<td>RELAY 5</td>\n\
<td>RELAY 6</td>\n\
<td>RELAY 7</td>\n");
printf("</tr>\n");
printf("<tr align=\"center\" valign=\"middle\">\n");
get_stat(relstat);
int i;
for(i=0; i<=6; i++){
if (relstat[i]==0) printf("<td height=\"100\" bgcolor=\"#FF0000\"><a href=\"/cgi-bin/LPTRELhttp.cgi?switch=u&nrelay=%d\">OFF</a></td>\n", (i+1));
else printf("<td height=\"100\" bgcolor=\"#00FF00\"><a href=\"/cgi-bin/LPTRELhttp.cgi?switch=d&nrelay=%d\">ON</a></td>\n", (i+1));
}
printf("</table>\n</body>\n</html>");
return(0);
}
precisamente facendo più prove ho concluso che procede senza intoppi fino al primo if (nel senso che se rimuovo il suid, ricevo anche la risposta prevista nel caso non riesca ad ottenere i permessi sulla porta).
Controllando error.log non mi segnala nessun errore (anche se impostato ad "emerg").
La domanda è, come si spiega questo comportamento ?
Scusate la prolissità, l'abilità di sintesi proprio non mi appartiene
p.s. lo script prevede che per la sola consultazione dello stato della porta, non gli venga passata nessuna veriabile, quindi dal browser vi accedo solo con
codice:
http://indirizzoip/cgi-bin/[programma].cgi
e dunque il secondo if dovrebbe essere non soddisfatto e quindi ignorato.
p.p.s. dimenticavo: il tutto su Ubuntu desktop.