All pastes #487300 Raw Edit

Mine

public text v1 · immutable
·published 2007-05-14 11:43 UTC
rendered paste body
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>

#include <net/if.h>
#include <net/if_media.h>
#include <dev/ic/if_wi_ieee.h>
#define le16toh(x) letoh16(x)

#define IFACE_NAME "iwi0"

int
main(int argc, char **argv)
{
	struct ifreq    ifr;
	struct ifmediareq ifmr;
	struct wi_req   wr;
	char           *interface = IFACE_NAME;
	int             s, i;
	char            buf[24 * 1024];

	s = socket(AF_INET, SOCK_DGRAM, 0);

	if (s < 0) {
		perror("socket()");
		return -1;
	}
	memset(buf, 0, sizeof(buf));

	bzero((void *) &ifmr, sizeof(ifmr));
	strlcpy(ifmr.ifm_name, interface, sizeof(ifmr.ifm_name));

	if (ioctl(s, SIOCGIFMEDIA, &ifmr) < 0) {
		perror("doesn't support SIOCGIFMEDIA ?");
		return -1;
	}
	if ((ifmr.ifm_status & IFM_AVALID) == 0) {
		perror("doesn't support media-valid status ?");
		return -1;
	}
	printf("carrier:%d\n", ifmr.ifm_status & IFM_ACTIVE);


	strlcpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name));

	wr.wi_len = WI_MAX_DATALEN;
	wr.wi_type = WI_RID_STA_IDENTITY;
	ifr.ifr_data = (caddr_t) &wr;

	if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) {
		perror("ioctl()");
		return -1;
	}
	printf("vendor = %d (ID %d, version %d.%d)", wr.wi_val[1], wr.wi_val[0], wr.wi_val[2], wr.wi_val[3]);

	bzero((void *) &wr, sizeof(wr));
	wr.wi_len = WI_MAX_DATALEN;
	wr.wi_type = WI_RID_CURRENT_SSID;
	ifr.ifr_data = (caddr_t) &wr;

	if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) {
		perror("ioctl()");
		return -1;
	}
	printf("ssid = %s\n", &wr.wi_val[1]);

	bzero((void *) &wr, sizeof(wr));
	wr.wi_len = WI_MAX_DATALEN;
	wr.wi_type = WI_RID_COMMS_QUALITY;
	ifr.ifr_data = (caddr_t) &wr;

	if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) {
		perror("ioctl()");
		return -1;
	}
	printf("quality=%d\n", le16toh(wr.wi_val[0]));

	bzero((void *) &wr, sizeof(wr));
	wr.wi_len = WI_MAX_DATALEN;
	wr.wi_type = WI_RID_CUR_TX_RATE;
	ifr.ifr_data = (caddr_t) &wr;

	if (ioctl(s, SIOCGWAVELAN, &ifr) < 0) {
		perror("ioctl()");
		return -1;
	}
	printf("rate=%d\n", le16toh(wr.wi_val[0]));
	return 0;
}