⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iwlib.c

📁 This package contains the Wireless tools, used to manipulate the Wireless Extensions. The Wireless
💻 C
📖 第 1 页 / 共 5 页
字号:
char *iw_sawap_ntop(const struct sockaddr *	sap,	      char *			buf){  const struct ether_addr ether_zero = {{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }};  const struct ether_addr ether_bcast = {{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }};  const struct ether_addr ether_hack = {{ 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 }};  const struct ether_addr * ether_wap = (const struct ether_addr *) sap->sa_data;  if(!iw_ether_cmp(ether_wap, &ether_zero))    sprintf(buf, "Not-Associated");  else    if(!iw_ether_cmp(ether_wap, &ether_bcast))      sprintf(buf, "Invalid");    else      if(!iw_ether_cmp(ether_wap, &ether_hack))	sprintf(buf, "None");      else	iw_ether_ntop(ether_wap, buf);  return(buf);}/*------------------------------------------------------------------*//* * Input an arbitrary length MAC address and convert to binary. * Return address size. */intiw_mac_aton(const char *	orig,	    unsigned char *	mac,	    int			macmax){  const char *	p = orig;  int		maclen = 0;  /* Loop on all bytes of the string */  while(*p != '\0')    {      int	temph;      int	templ;      int	count;      /* Extract one byte as two chars */      count = sscanf(p, "%1X%1X", &temph, &templ);      if(count != 2)	break;			/* Error -> non-hex chars */      /* Output two chars as one byte */      templ |= temph << 4;      mac[maclen++] = (unsigned char) (templ & 0xFF);      /* Check end of string */      p += 2;      if(*p == '\0')	{#ifdef DEBUG	  char buf[20];	  iw_ether_ntop((const struct ether_addr *) mac, buf);	  fprintf(stderr, "iw_mac_aton(%s): %s\n", orig, buf);#endif	  return(maclen);		/* Normal exit */	}      /* Check overflow */      if(maclen >= macmax)	{#ifdef DEBUG	  fprintf(stderr, "iw_mac_aton(%s): trailing junk!\n", orig);#endif	  errno = E2BIG;	  return(0);			/* Error -> overflow */	}      /* Check separator */      if(*p != ':')	break;      p++;    }  /* Error... */#ifdef DEBUG  fprintf(stderr, "iw_mac_aton(%s): invalid ether address!\n", orig);#endif  errno = EINVAL;  return(0);}/*------------------------------------------------------------------*//* * Input an Ethernet address and convert to binary. */intiw_ether_aton(const char *orig, struct ether_addr *eth){  int	maclen;  maclen = iw_mac_aton(orig, (unsigned char *) eth, ETH_ALEN);  if((maclen > 0) && (maclen < ETH_ALEN))    {      errno = EINVAL;      maclen = 0;    }  return(maclen);}/*------------------------------------------------------------------*//* * Input an Internet address and convert to binary. */intiw_in_inet(char *name, struct sockaddr *sap){  struct hostent *hp;  struct netent *np;  struct sockaddr_in *sain = (struct sockaddr_in *) sap;  /* Grmpf. -FvK */  sain->sin_family = AF_INET;  sain->sin_port = 0;  /* Default is special, meaning 0.0.0.0. */  if (!strcmp(name, "default")) {	sain->sin_addr.s_addr = INADDR_ANY;	return(1);  }  /* Try the NETWORKS database to see if this is a known network. */  if ((np = getnetbyname(name)) != (struct netent *)NULL) {	sain->sin_addr.s_addr = htonl(np->n_net);	strcpy(name, np->n_name);	return(1);  }  /* Always use the resolver (DNS name + IP addresses) */  if ((hp = gethostbyname(name)) == (struct hostent *)NULL) {	errno = h_errno;	return(-1);  }  memcpy((char *) &sain->sin_addr, (char *) hp->h_addr_list[0], hp->h_length);  strcpy(name, hp->h_name);  return(0);}/*------------------------------------------------------------------*//* * Input an address and convert to binary. */intiw_in_addr(int		skfd,	   const char *	ifname,	   char *	bufp,	   struct sockaddr *sap){  /* Check if it is a hardware or IP address */  if(index(bufp, ':') == NULL)    {      struct sockaddr	if_address;      struct arpreq	arp_query;      /* Check if we have valid interface address type */      if(iw_check_if_addr_type(skfd, ifname) < 0)	{	  fprintf(stderr, "%-8.16s  Interface doesn't support IP addresses\n", ifname);	  return(-1);	}      /* Read interface address */      if(iw_in_inet(bufp, &if_address) < 0)	{	  fprintf(stderr, "Invalid interface address %s\n", bufp);	  return(-1);	}      /* Translate IP addresses to MAC addresses */      memcpy((char *) &(arp_query.arp_pa),	     (char *) &if_address,	     sizeof(struct sockaddr));      arp_query.arp_ha.sa_family = 0;      arp_query.arp_flags = 0;      /* The following restrict the search to the interface only */      /* For old kernels which complain, just comment it... */      strncpy(arp_query.arp_dev, ifname, IFNAMSIZ);      if((ioctl(skfd, SIOCGARP, &arp_query) < 0) ||	 !(arp_query.arp_flags & ATF_COM))	{	  fprintf(stderr, "Arp failed for %s on %s... (%d)\nTry to ping the address before setting it.\n",		  bufp, ifname, errno);	  return(-1);	}      /* Store new MAC address */      memcpy((char *) sap,	     (char *) &(arp_query.arp_ha),	     sizeof(struct sockaddr));#ifdef DEBUG      {	char buf[20];	printf("IP Address %s => Hw Address = %s\n",	       bufp, iw_saether_ntop(sap, buf));      }#endif    }  else	/* If it's an hardware address */    {      /* Check if we have valid mac address type */      if(iw_check_mac_addr_type(skfd, ifname) < 0)	{	  fprintf(stderr, "%-8.16s  Interface doesn't support MAC addresses\n", ifname);	  return(-1);	}      /* Get the hardware address */      if(iw_saether_aton(bufp, sap) == 0)	{	  fprintf(stderr, "Invalid hardware address %s\n", bufp);	  return(-1);	}    }#ifdef DEBUG  {    char buf[20];    printf("Hw Address = %s\n", iw_saether_ntop(sap, buf));  }#endif  return(0);}/************************* MISC SUBROUTINES **************************//* Size (in bytes) of various events */static const int priv_type_size[] = {	0,				/* IW_PRIV_TYPE_NONE */	1,				/* IW_PRIV_TYPE_BYTE */	1,				/* IW_PRIV_TYPE_CHAR */	0,				/* Not defined */	sizeof(__u32),			/* IW_PRIV_TYPE_INT */	sizeof(struct iw_freq),		/* IW_PRIV_TYPE_FLOAT */	sizeof(struct sockaddr),	/* IW_PRIV_TYPE_ADDR */	0,				/* Not defined */};/*------------------------------------------------------------------*//* * Max size in bytes of an private argument. */intiw_get_priv_size(int	args){  int	num = args & IW_PRIV_SIZE_MASK;  int	type = (args & IW_PRIV_TYPE_MASK) >> 12;  return(num * priv_type_size[type]);}/************************ EVENT SUBROUTINES ************************//* * The Wireless Extension API 14 and greater define Wireless Events, * that are used for various events and scanning. * Those functions help the decoding of events, so are needed only in * this case. *//* -------------------------- CONSTANTS -------------------------- *//* Type of headers we know about (basically union iwreq_data) */#define IW_HEADER_TYPE_NULL	0	/* Not available */#define IW_HEADER_TYPE_CHAR	2	/* char [IFNAMSIZ] */#define IW_HEADER_TYPE_UINT	4	/* __u32 */#define IW_HEADER_TYPE_FREQ	5	/* struct iw_freq */#define IW_HEADER_TYPE_ADDR	6	/* struct sockaddr */#define IW_HEADER_TYPE_POINT	8	/* struct iw_point */#define IW_HEADER_TYPE_PARAM	9	/* struct iw_param */#define IW_HEADER_TYPE_QUAL	10	/* struct iw_quality *//* Handling flags *//* Most are not implemented. I just use them as a reminder of some * cool features we might need one day ;-) */#define IW_DESCR_FLAG_NONE	0x0000	/* Obvious *//* Wrapper level flags */#define IW_DESCR_FLAG_DUMP	0x0001	/* Not part of the dump command */#define IW_DESCR_FLAG_EVENT	0x0002	/* Generate an event on SET */#define IW_DESCR_FLAG_RESTRICT	0x0004	/* GET : request is ROOT only */				/* SET : Omit payload from generated iwevent */#define IW_DESCR_FLAG_NOMAX	0x0008	/* GET : no limit on request size *//* Driver level flags */#define IW_DESCR_FLAG_WAIT	0x0100	/* Wait for driver event *//* ---------------------------- TYPES ---------------------------- *//* * Describe how a standard IOCTL looks like. */struct iw_ioctl_description{	__u8	header_type;		/* NULL, iw_point or other */	__u8	token_type;		/* Future */	__u16	token_size;		/* Granularity of payload */	__u16	min_tokens;		/* Min acceptable token number */	__u16	max_tokens;		/* Max acceptable token number */	__u32	flags;			/* Special handling of the request */};/* -------------------------- VARIABLES -------------------------- *//* * Meta-data about all the standard Wireless Extension request we * know about. */static const struct iw_ioctl_description standard_ioctl_descr[] = {	[SIOCSIWCOMMIT	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_NULL,	},	[SIOCGIWNAME	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_CHAR,		.flags		= IW_DESCR_FLAG_DUMP,	},	[SIOCSIWNWID	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,		.flags		= IW_DESCR_FLAG_EVENT,	},	[SIOCGIWNWID	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,		.flags		= IW_DESCR_FLAG_DUMP,	},	[SIOCSIWFREQ	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_FREQ,		.flags		= IW_DESCR_FLAG_EVENT,	},	[SIOCGIWFREQ	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_FREQ,		.flags		= IW_DESCR_FLAG_DUMP,	},	[SIOCSIWMODE	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_UINT,		.flags		= IW_DESCR_FLAG_EVENT,	},	[SIOCGIWMODE	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_UINT,		.flags		= IW_DESCR_FLAG_DUMP,	},	[SIOCSIWSENS	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCGIWSENS	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCSIWRANGE	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_NULL,	},	[SIOCGIWRANGE	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= 1,		.max_tokens	= sizeof(struct iw_range),		.flags		= IW_DESCR_FLAG_DUMP,	},	[SIOCSIWPRIV	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_NULL,	},	[SIOCGIWPRIV	- SIOCIWFIRST] = { /* (handled directly by us) */		.header_type	= IW_HEADER_TYPE_NULL,	},	[SIOCSIWSTATS	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_NULL,	},	[SIOCGIWSTATS	- SIOCIWFIRST] = { /* (handled directly by us) */		.header_type	= IW_HEADER_TYPE_NULL,		.flags		= IW_DESCR_FLAG_DUMP,	},	[SIOCSIWSPY	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= sizeof(struct sockaddr),		.max_tokens	= IW_MAX_SPY,	},	[SIOCGIWSPY	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= sizeof(struct sockaddr) +				  sizeof(struct iw_quality),		.max_tokens	= IW_MAX_SPY,	},	[SIOCSIWTHRSPY	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= sizeof(struct iw_thrspy),		.min_tokens	= 1,		.max_tokens	= 1,	},	[SIOCGIWTHRSPY	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= sizeof(struct iw_thrspy),		.min_tokens	= 1,		.max_tokens	= 1,	},	[SIOCSIWAP	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_ADDR,	},	[SIOCGIWAP	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_ADDR,		.flags		= IW_DESCR_FLAG_DUMP,	},	[SIOCSIWMLME	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= 1,		.min_tokens	= sizeof(struct iw_mlme),		.max_tokens	= sizeof(struct iw_mlme),	},	[SIOCGIWAPLIST	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= sizeof(struct sockaddr) +				  sizeof(struct iw_quality),		.max_tokens	= IW_MAX_AP,		.flags		= IW_DESCR_FLAG_NOMAX,	},	[SIOCSIWSCAN	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= 1,		.min_tokens	= 0,		.max_tokens	= sizeof(struct iw_scan_req),	},	[SIOCGIWSCAN	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= 1,		.max_tokens	= IW_SCAN_MAX_DATA,		.flags		= IW_DESCR_FLAG_NOMAX,	},	[SIOCSIWESSID	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= 1,		.max_tokens	= IW_ESSID_MAX_SIZE + 1,		.flags		= IW_DESCR_FLAG_EVENT,	},	[SIOCGIWESSID	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= 1,		.max_tokens	= IW_ESSID_MAX_SIZE + 1,		.flags		= IW_DESCR_FLAG_DUMP,	},	[SIOCSIWNICKN	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= 1,		.max_tokens	= IW_ESSID_MAX_SIZE + 1,	},	[SIOCGIWNICKN	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= 1,		.max_tokens	= IW_ESSID_MAX_SIZE + 1,	},	[SIOCSIWRATE	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCGIWRATE	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCSIWRTS	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCGIWRTS	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCSIWFRAG	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCGIWFRAG	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCSIWTXPOW	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCGIWTXPOW	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCSIWRETRY	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCGIWRETRY	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCSIWENCODE	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= 1,		.max_tokens	= IW_ENCODING_TOKEN_MAX,		.flags		= IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT,	},	[SIOCGIWENCODE	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_POINT,		.token_size	= 1,		.max_tokens	= IW_ENCODING_TOKEN_MAX,		.flags		= IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT,	},	[SIOCSIWPOWER	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCGIWPOWER	- SIOCIWFIRST] = {		.header_type	= IW_HEADER_TYPE_PARAM,	},	[SIOCSIWGENIE	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -