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

📄 iwconfig.c

📁 wireless tools: used to manipulate the Wireless Extensions. The Wireless Extensions is an interface
💻 C
📖 第 1 页 / 共 4 页
字号:
      /* Pointer is absent in new API */      if(wrq.u.data.pointer == NULL)	wrq.u.data.flags |= IW_ENCODE_NOKEY;      /* Check if we have any invalid argument */      if(!gotone)	{	  errarg = 0;	  return(IWERR_ARG_TYPE);	}    }  if(iw_set_ext(skfd, ifname, SIOCSIWENCODE, &wrq) < 0)    return(IWERR_SET_EXT);  /* Var arg */  return(i);}/*------------------------------------------------------------------*//* * Set Power Management */static intset_power_info(int		skfd,	       char *		ifname,	       char *		args[],		/* Command line args */	       int		count)		/* Args count */{  struct iwreq		wrq;  int			i = 1;  if(!strcasecmp(args[0], "off"))    wrq.u.power.disabled = 1;	/* i.e. max size */  else    if(!strcasecmp(args[0], "on"))      {	/* Get old Power info */	wrq.u.power.flags = 0;	if(iw_get_ext(skfd, ifname, SIOCGIWPOWER, &wrq) < 0)	  return(IWERR_GET_EXT);	wrq.u.power.disabled = 0;      }    else      {	double		value;	char *		unit;	int		gotone = 0;	/* Parse modifiers */	i = parse_modifiers(args, count, &wrq.u.power.flags,			    iwmod_power, IWMOD_POWER_NUM);	if(i < 0)	  return(i);	wrq.u.power.disabled = 0;	/* Is there any value to grab ? */	value = strtod(args[0], &unit);	if(unit != args[0])	  {	    struct iw_range	range;	    int			flags;	    /* Extract range info to handle properly 'relative' */	    if(iw_get_range_info(skfd, ifname, &range) < 0)	      memset(&range, 0, sizeof(range));	    /* Get the flags to be able to do the proper conversion */	    switch(wrq.u.power.flags & IW_POWER_TYPE)	      {	      case IW_POWER_SAVING:		flags = range.pms_flags;		break;	      case IW_POWER_TIMEOUT:		flags = range.pmt_flags;		break;	      default:		flags = range.pmp_flags;		break;	      }	    /* Check if time or relative */	    if(flags & IW_POWER_RELATIVE)	      {		if(range.we_version_compiled < 21)		  value *= MEGA;		else		  wrq.u.power.flags |= IW_POWER_RELATIVE;	      }	    else	      {		value *= MEGA;	/* default = s */		if(unit[0] == 'u') value /= MEGA;		if(unit[0] == 'm') value /= KILO;	      }	    wrq.u.power.value = (long) value;	    /* Set some default type if none */	    if((wrq.u.power.flags & IW_POWER_TYPE) == 0)	      wrq.u.power.flags |= IW_POWER_PERIOD;	    ++i;	    gotone = 1;	  }	/* Now, check the mode */	if(i < count)	  {	    if(!strcasecmp(args[i], "all"))	      wrq.u.power.flags |= IW_POWER_ALL_R;	    if(!strncasecmp(args[i], "unicast", 4))	      wrq.u.power.flags |= IW_POWER_UNICAST_R;	    if(!strncasecmp(args[i], "multicast", 5))	      wrq.u.power.flags |= IW_POWER_MULTICAST_R;	    if(!strncasecmp(args[i], "force", 5))	      wrq.u.power.flags |= IW_POWER_FORCE_S;	    if(!strcasecmp(args[i], "repeat"))	      wrq.u.power.flags |= IW_POWER_REPEATER;	    if(wrq.u.power.flags & IW_POWER_MODE)	      {		++i;		gotone = 1;	      }	  }	if(!gotone)	  {	    errarg = i;	    return(IWERR_ARG_TYPE);	  }      }  if(iw_set_ext(skfd, ifname, SIOCSIWPOWER, &wrq) < 0)    return(IWERR_SET_EXT);  /* Var args */  return(i);}#ifndef WE_ESSENTIAL/*------------------------------------------------------------------*//* * Set Nickname */static intset_nick_info(int		skfd,	      char *		ifname,	      char *		args[],		/* Command line args */	      int		count)		/* Args count */{  struct iwreq		wrq;  int			we_kernel_version;  /* Avoid "Unused parameter" warning */  count = count;  if(strlen(args[0]) > IW_ESSID_MAX_SIZE)    {      errmax = IW_ESSID_MAX_SIZE;      return(IWERR_ARG_SIZE);    }  we_kernel_version = iw_get_kernel_we_version();  wrq.u.essid.pointer = (caddr_t) args[0];  wrq.u.essid.length = strlen(args[0]);  if(we_kernel_version < 21)    wrq.u.essid.length++;  if(iw_set_ext(skfd, ifname, SIOCSIWNICKN, &wrq) < 0)    return(IWERR_SET_EXT);  /* 1 args */  return(1);}/*------------------------------------------------------------------*//* * Set commit */static intset_nwid_info(int		skfd,	      char *		ifname,	      char *		args[],		/* Command line args */	      int		count)		/* Args count */{  struct iwreq		wrq;  unsigned long		temp;  /* Avoid "Unused parameter" warning */  count = count;  if((!strcasecmp(args[0], "off")) ||     (!strcasecmp(args[0], "any")))    wrq.u.nwid.disabled = 1;  else    if(!strcasecmp(args[0], "on"))      {	/* Get old nwid */	if(iw_get_ext(skfd, ifname, SIOCGIWNWID, &wrq) < 0)	  return(IWERR_GET_EXT);	wrq.u.nwid.disabled = 0;      }    else      if(sscanf(args[0], "%lX", &(temp)) != 1)	{	  errarg = 0;	  return(IWERR_ARG_TYPE);	}      else	{	  wrq.u.nwid.value = temp;	  wrq.u.nwid.disabled = 0;	}  wrq.u.nwid.fixed = 1;  /* Set new nwid */  if(iw_set_ext(skfd, ifname, SIOCSIWNWID, &wrq) < 0)    return(IWERR_SET_EXT);  /* 1 arg */  return(1);}/*------------------------------------------------------------------*//* * Set AP Address */static intset_apaddr_info(int		skfd,		char *		ifname,		char *		args[],		/* Command line args */		int		count)		/* Args count */{  struct iwreq		wrq;  /* Avoid "Unused parameter" warning */  count = count;  if((!strcasecmp(args[0], "auto")) ||     (!strcasecmp(args[0], "any")))    {      /* Send a broadcast address */      iw_broad_ether(&(wrq.u.ap_addr));    }  else    {      if(!strcasecmp(args[0], "off"))	{	  /* Send a NULL address */	  iw_null_ether(&(wrq.u.ap_addr));	}      else	{	  /* Get the address and check if the interface supports it */	  if(iw_in_addr(skfd, ifname, args[0], &(wrq.u.ap_addr)) < 0)	    {	      errarg = 0;	      return(IWERR_ARG_TYPE);	    }	}    }  if(iw_set_ext(skfd, ifname, SIOCSIWAP, &wrq) < 0)    return(IWERR_SET_EXT);  /* 1 args */  return(1);}/*------------------------------------------------------------------*//* * Set Tx Power */static intset_txpower_info(int		skfd,		char *		ifname,		char *		args[],		/* Command line args */		int		count)		/* Args count */{  struct iwreq		wrq;  int			i = 1;  /* Avoid "Unused parameter" warning */  args = args; count = count;  /* Prepare the request */  wrq.u.txpower.value = -1;  wrq.u.txpower.fixed = 1;  wrq.u.txpower.disabled = 0;  wrq.u.txpower.flags = IW_TXPOW_DBM;  if(!strcasecmp(args[0], "off"))    wrq.u.txpower.disabled = 1;	/* i.e. turn radio off */  else    if(!strcasecmp(args[0], "auto"))      wrq.u.txpower.fixed = 0;	/* i.e. use power control */    else      {	if(!strcasecmp(args[0], "on"))	  {	    /* Get old tx-power */	    if(iw_get_ext(skfd, ifname, SIOCGIWTXPOW, &wrq) < 0)	      return(IWERR_GET_EXT);	    wrq.u.txpower.disabled = 0;	  }	else	  {	    if(!strcasecmp(args[0], "fixed"))	      {		/* Get old tx-power */		if(iw_get_ext(skfd, ifname, SIOCGIWTXPOW, &wrq) < 0)		  return(IWERR_GET_EXT);		wrq.u.txpower.fixed = 1;		wrq.u.txpower.disabled = 0;	      }	    else			/* Should be a numeric value */	      {		int		power;		int		ismwatt = 0;		struct iw_range	range;		/* Extract range info to do proper conversion */		if(iw_get_range_info(skfd, ifname, &range) < 0)		  memset(&range, 0, sizeof(range));		/* Get the value */		if(sscanf(args[0], "%i", &(power)) != 1)		  {		    errarg = 0;		    return(IWERR_ARG_TYPE);		  }		/* Check if milliWatt		 * We authorise a single 'm' as a shorthand for 'mW',		 * on the other hand a 'd' probably means 'dBm'... */		ismwatt = ((strchr(args[0], 'm') != NULL)			   && (strchr(args[0], 'd') == NULL));		/* We could check 'W' alone... Another time... */		/* Convert */		if(range.txpower_capa & IW_TXPOW_RELATIVE)		  {		    /* Can't convert */		    if(ismwatt)		      {			errarg = 0;			return(IWERR_ARG_TYPE);		      }		    wrq.u.txpower.flags = IW_TXPOW_RELATIVE;		  }		else		  if(range.txpower_capa & IW_TXPOW_MWATT)		    {		      if(!ismwatt)			power = iw_dbm2mwatt(power);		      wrq.u.txpower.flags = IW_TXPOW_MWATT;		    }		  else		    {		      if(ismwatt)			power = iw_mwatt2dbm(power);		      wrq.u.txpower.flags = IW_TXPOW_DBM;		    }		wrq.u.txpower.value = power;		/* Check for an additional argument */		if((i < count) && (!strcasecmp(args[i], "auto")))		  {		    wrq.u.txpower.fixed = 0;		    ++i;		  }		if((i < count) && (!strcasecmp(args[i], "fixed")))		  {		    wrq.u.txpower.fixed = 1;		    ++i;		  }	      }	  }      }  if(iw_set_ext(skfd, ifname, SIOCSIWTXPOW, &wrq) < 0)    return(IWERR_SET_EXT);  /* Var args */  return(i);}/*------------------------------------------------------------------*//* * Set Sensitivity */static intset_sens_info(int		skfd,	      char *		ifname,	      char *		args[],		/* Command line args */	      int		count)		/* Args count */{  struct iwreq		wrq;  int			temp;  /* Avoid "Unused parameter" warning */  count = count;  if(sscanf(args[0], "%i", &(temp)) != 1)    {      errarg = 0;      return(IWERR_ARG_TYPE);    }  wrq.u.sens.value = temp;  if(iw_set_ext(skfd, ifname, SIOCSIWSENS, &wrq) < 0)    return(IWERR_SET_EXT);  /* 1 arg */  return(1);}/*------------------------------------------------------------------*//* * Set Retry Limit */static intset_retry_info(int		skfd,	       char *		ifname,	       char *		args[],		/* Command line args */	       int		count)		/* Args count */{  struct iwreq		wrq;  int			i = 0;  double		value;  char *		unit;  /* Parse modifiers */  i = parse_modifiers(args, count, &wrq.u.retry.flags,		      iwmod_retry, IWMOD_RETRY_NUM);  if(i < 0)    return(i);  /* Add default type if none */  if((wrq.u.retry.flags & IW_RETRY_TYPE) == 0)    wrq.u.retry.flags |= IW_RETRY_LIMIT;  wrq.u.retry.disabled = 0;  /* Is there any value to grab ? */  value = strtod(args[0], &unit);  if(unit == args[0])    {      errarg = i;      return(IWERR_ARG_TYPE);    }  /* Limit is absolute, on the other hand lifetime is seconds */  if(wrq.u.retry.flags & IW_RETRY_LIFETIME)    {      struct iw_range	range;      /* Extract range info to handle properly 'relative' */      if(iw_get_range_info(skfd, ifname, &range) < 0)	memset(&range, 0, sizeof(range));      if(range.r_time_flags & IW_RETRY_RELATIVE)	{	  if(range.we_version_compiled < 21)	    value *= MEGA;	  else	    wrq.u.retry.flags |= IW_RETRY_RELATIVE;	}      else	{	  /* Normalise lifetime */	  value *= MEGA;	/* default = s */	  if(unit[0] == 'u') value /= MEGA;	  if(unit[0] == 'm') value /= KILO;	}    }  wrq.u.retry.value = (long) value;  ++i;  if(iw_set_ext(skfd, ifname, SIOCSIWRETRY, &wrq) < 0)    return(IWERR_SET_EXT);  /* Var args */  return(i);}/*------------------------------------------------------------------*//* * Set RTS Threshold */static int

⌨️ 快捷键说明

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