Convertire PHP in CGI/C

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Convertire PHP in CGI/C

Messaggio da Zoff »

Salve,
sto cercando di scrivere una piccola utility per utilizzare il WoL (Wake On Lan) coil mio router...
L'ho scritta stupidamente in PHP sperando che l'apache installato nel router avesse il modulo PHP ma non è così...
Purtroppo sono MOLTO arrugginito in C e non ho mai scritto una CGI per cui mi risulta piuttosto complicato proseguire da solo...
C'è qualcuno che molto gentilmente mi farebbe la conversione o per lo meno mi instraderebbe???

Codice:

Codice: Seleziona tutto

<?php

flush();

function WakeOnLan($addr, $mac,$socket_number) {
	$addr_byte = explode(':', $mac);
	$hw_addr = '';

	for ($a=0; $a <6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));

		$msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);

		for ($a = 1; $a <= 16; $a++) $msg .= $hw_addr;

		$s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

		if ($s == false) {
			echo "Imposibile creare il socket!\n";
			echo "Codice errore: '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
			return FALSE;
		} else {
			$opt_ret = socket_set_option($s, 1, 6, TRUE);
			if($opt_ret <0) {
			echo "setsockopt() fallita con errore: " . strerror($opt_ret) . "\n";
			return FALSE;
		}
		if(socket_sendto($s, $msg, strlen($msg), 0, $addr, $socket_number)) {
			echo "Magic Packet inviato correttamente!";
			socket_close($s);
			return TRUE;
		} else {
			echo "Invio del Magic packet fallito!";
			return FALSE;
		}
	}
}

function validateMAC($MAC){
	$MACregEx = '[0-9a-fA-F]{12}';

	$MACSize = strlen($MAC);


	if ($MACSize < 12){
		$errSize = 12-$MACSize;
		$res['MAC']['result'] = false;
		$res['MAC']['Error'] = "Indirizzo MAC(".$MAC.") troppo corto! Mancano ".$errSize." caratteri.";
	}
	elseif ($MACSize > 12){
		$errSize = $MACSize-12;
		$res['MAC']['result'] = false;
		$res['MAC']['Error'] = "Indirizzo MAC(".$MAC.") troppo lungo! ".$errSize." caratteri di troppo.";
	}else{
		if (!ereg($MACregEx, $MAC)){
			$res['MAC']['result'] = false;
			$res['MAC']['Error'] = "L'indirizzo MAC(".$MAC.") contine caratteri non validi!";
		}else{
			$res['MAC']['result'] = true;
			$res['MAC']['Error'] = "Indirizzo MAC(".$MAC.") valido!";
		}
	}
	return $res['MAC'];
}
// check an IP is valid
function validateIP($IP, $except = false){
	// except is used for Addresses that can have their 4th octate set to 255
	$pieces = explode(".", $IP);
	if (count($pieces) < 4) {// check that there is not less than 4 octates{
		$res['IP']['Error'] = "Indirizzo IP troppo corto";
		$res['IP']['result'] = false;
	}elseif (count($pieces) > 4){// check that there is not more than 4 octates
		$res['IP']['Error'] = "Indirizzo IP troppo lungo";
		$res['IP']['result'] = false;
	}
	else
	{
		for($i = 0; $i < 4; $i++){
			if (!is_numeric($pieces[$i])) // check each octate is numeric
			{
				$res['IP']['Error'] = "L'indirizzo IP contiene caratteri non numerici!";
				$res['IP']['result'] = false;
				break;
			}
			if ((($pieces[$i] > 255 ) || ($pieces[$i] == "")) && ($i < "3")){
				$res['IP']['Error'] = "Parte dell'indirizzo IP è maggiore di 255 o non è NULL";
				$res['IP']['result'] = false;
				break;
			}else{
				if ($except){
					if (($pieces[$i] > 255 ) || ($pieces[$i] == "")){
						$res['IP']['Error'] = "La parte finale dell'indirizzo IP è maggiore di 255 o non è NULL";
						$res['IP']['result'] = false;
						break;
					}else{
						$res['IP']['result'] = true;
					}
				}else{
					if (($pieces[$i] > 254 ) || ($pieces[$i] == "")){
						$res['IP']['Error'] = "La parte finale dell'indirizzo IP è maggiore di 254 o non è NULL";
						$res['IP']['result'] = false;
						break;
					} else {
						$res['IP']['result'] = true;
					}
				}
			}
		}
	}
	return $res['IP'];
}

//Porta di ascolto del WoL
$socket_number = "7";
//MAC della scheda di rete
$mac_addy = @$_REQUEST['mac'];
//IP del computer
$ip_addy = gethostbyname(@$_REQUEST['ip']);

//Controllo MAC
$confirm = validateMAC(str_replace(':','',$mac_addy));
if($confirm['result']==false){
	echo $confirm['Error'];
	exit(1);
}
//Controllo IP
$confirm = validateip($ip_addy);
if($confirm['result']==false){
	echo $confirm['Error'];
	exit(1);
}
//Invio il pacchetto!
WakeOnLan($ip_addy, $mac_addy,$socket_number);

?>
Grazie in anticipo!
Ultima modifica di Zoff il sabato 18 ottobre 2008, 20:17, modificato 1 volta in totale.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
kelev
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1766
Iscrizione: giovedì 4 settembre 2008, 0:27

Re: Convertire PHP in CGI/C

Messaggio da kelev »

"E alla fine sei da solo, dove vai, con chi brindi?"
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti