// kleines wlan-an-aus programm
// http://felix.salfelder.org/misc/acer1wlan.c
// abgeschrieben von 
// http://www.derkeiler.com/Mailing-Lists/securityfocus/focus-linux/2005-08/0055.html
// 2009, GPL und so.

#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

#include <linux/input.h>
#include <fcntl.h>
#include <signal.h>

#define EVDEV "/dev/keyboard"
#define KEY_WLAN_OFF 214
#define KEY_WLAN_ON 213
#define IFUP "/sbin/ifup"
#define IFDN "/sbin/ifdown"
#define IFACE "wlan0"

void handler (int sig)
{
	printf ("\nexiting...(%d)\n", sig);
	exit (0);
}

int main( )
{
	struct input_event ev[64];

	int fd;
  	if ( ( fd = open( "/dev/keyboard" , O_RDONLY ) ) == -1 )
	{
		fprintf( stderr, "error opening keyboard\n" );
		exit(4);
	}

	char name[256] = "Unknown";
	ioctl( fd, EVIOCGNAME (sizeof (name)), name);
	fprintf( stderr, "Reading From : %s\n" ,  name);
	int i=11;
	while (i--)
 		signal (i, &handler);

	int rd;
	int size = sizeof (struct input_event);

	while( 1 ) {  
 		if( ( rd = read( fd, ev, size * 64) ) < size )
		{
			fprintf( stderr, "error reading event\n" );
		 	exit( 1 );
		}

      if ( ev[1].value != 1 || ev[1].type != 1) continue;

		switch( ev[0].value ){
			case KEY_WLAN_ON:
				if( fork() == 0 )
				{
					execl( IFUP, IFUP, IFACE, (const char *) NULL);
				}
				break;
			case KEY_WLAN_OFF:
				if( fork() == 0 )
				{
					execl( IFDN, IFDN, IFACE, (const char *) NULL);
				}
				break;
			default:
				break;
		}
	}
	exit(1);
}



