All pastes #390811 Raw Edit

Mine

public text v1 · immutable
·published 2007-03-11 18:08 UTC
rendered paste body
int set_monitor( char *interface, int fd_raw, int cardnum )
{
	char s[32];
    int pid, status, channel;
    struct iwreq wrq;

	channel = (G.channel[0] == 0 ) ? 10 : G.channel[0];

	if( strcmp(interface,"prism0") == 0 )
	{
		if( ( pid = fork() ) == 0 )
		{
			close( 0 ); close( 1 ); close( 2 ); chdir( "/" );
			execl( G.wl, "wl", "monitor", "1", NULL);
			exit( 1 );
		}
		waitpid( pid, &status, 0 );
		if( WIFEXITED(status) )
			return( WEXITSTATUS(status) );
		return( 1 );
	}
	else if (strncmp(interface, "rtap", 4) == 0 )
	{
		return 0;
	}
	else
	{
		if( G.is_wlanng[cardnum] )
		{
			snprintf( s,  sizeof( s ) - 1, "channel=%d", channel );
			if( ( pid = fork() ) == 0 )
			{
				close( 0 ); close( 1 ); close( 2 ); chdir( "/" );
				execl( G.wlanctlng, "wlanctl-ng", interface,
						"lnxreq_wlansniff", "enable=true",
						"prismheader=true", "wlanheader=false",
						"stripfcs=true", "keepwepflags=true",
						s, NULL );
				exit( 1 );
			}

			waitpid( pid, &status, 0 );

			if( WIFEXITED(status) )
				return( WEXITSTATUS(status) );
			return( 1 );
		}

		/* FIXME */
		if( ( pid = fork() ) == 0 )
		{
			close( 0 ); close( 1 ); close( 2 ); chdir( "/" );
			execlp("ifconfig", "ifconfig", interface, "down");
			exit( 1 );
		}
		waitpid( pid, &status, 0 );

		memset( &wrq, 0, sizeof( struct iwreq ) );
		strncpy( wrq.ifr_name, interface, IFNAMSIZ );
		wrq.u.mode = IW_MODE_MONITOR;

		if( ioctl( fd_raw, SIOCSIWMODE, &wrq ) < 0 )
		{
			perror( "ioctl(SIOCSIWMODE) failed" );
			return( 1 );
		}

		/* FIXME */
		if( ( pid = fork() ) == 0 )
		{
			close( 0 ); close( 1 ); close( 2 ); chdir( "/" );
			execlp("ifconfig", "ifconfig", interface, "up");
			exit( 1 );
		}
		waitpid( pid, &status, 0 );

	}

	/* Check later if it's really usefull to set channel here */

	set_channel( interface, fd_raw, (G.channel[cardnum] == 0 ) ? 10 : G.channel[cardnum], cardnum);

    return( 0 );
}