📄 iwconfig.c
字号:
{ if(++i >= count) iw_usage(); if(!strcasecmp(args[i], "auto")) { wrq.u.bitrate.value = -1; wrq.u.bitrate.fixed = 0; } else { if(!strcasecmp(args[i], "fixed")) { /* Get old bitrate */ if(ioctl(skfd, SIOCGIWRATE, &wrq) < 0) { fprintf(stderr, "SIOCGIWRATE: %s\n", strerror(errno)); return(-1); } strcpy(wrq.ifr_name, ifname); wrq.u.bitrate.fixed = 1; } else /* Should be a numeric value */ { double brate; if(sscanf(args[i], "%lg", &(brate)) != 1) iw_usage(); if(index(args[i], 'G')) brate *= GIGA; if(index(args[i], 'M')) brate *= MEGA; if(index(args[i], 'k')) brate *= KILO; wrq.u.bitrate.value = (long) brate; wrq.u.bitrate.fixed = 1; /* Check for an additional argument */ if(((i+1) < count) && (!strcasecmp(args[i+1], "auto"))) { wrq.u.bitrate.fixed = 0; ++i; } if(((i+1) < count) && (!strcasecmp(args[i+1], "fixed"))) { wrq.u.bitrate.fixed = 1; ++i; } } } if(ioctl(skfd, SIOCSIWRATE, &wrq) < 0) { fprintf(stderr, "SIOCSIWRATE: %s\n", strerror(errno)); return(-1); } continue; } /* ---------- Set RTS threshold ---------- */ if(!strncasecmp(args[i], "rts", 3)) { i++; if(i >= count) iw_usage(); wrq.u.rts.value = -1; wrq.u.rts.fixed = 1; wrq.u.rts.disabled = 0; if(!strcasecmp(args[i], "off")) wrq.u.rts.disabled = 1; /* i.e. max size */ else if(!strcasecmp(args[i], "auto")) wrq.u.rts.fixed = 0; else { if(!strcasecmp(args[i], "fixed")) { /* Get old RTS threshold */ if(ioctl(skfd, SIOCGIWRTS, &wrq) < 0) { fprintf(stderr, "SIOCGIWRTS: %s\n", strerror(errno)); return(-1); } strcpy(wrq.ifr_name, ifname); wrq.u.rts.fixed = 1; } else /* Should be a numeric value */ if(sscanf(args[i], "%ld", (unsigned long *) &(wrq.u.rts.value)) != 1) iw_usage(); } if(ioctl(skfd, SIOCSIWRTS, &wrq) < 0) { fprintf(stderr, "SIOCSIWRTS: %s\n", strerror(errno)); return(-1); } continue; } /* ---------- Set fragmentation threshold ---------- */ if(!strncmp(args[i], "frag", 4)) { i++; if(i >= count) iw_usage(); wrq.u.frag.value = -1; wrq.u.frag.fixed = 1; wrq.u.frag.disabled = 0; if(!strcasecmp(args[i], "off")) wrq.u.frag.disabled = 1; /* i.e. max size */ else if(!strcasecmp(args[i], "auto")) wrq.u.frag.fixed = 0; else { if(!strcasecmp(args[i], "fixed")) { /* Get old fragmentation threshold */ if(ioctl(skfd, SIOCGIWFRAG, &wrq) < 0) { fprintf(stderr, "SIOCGIWFRAG: %s\n", strerror(errno)); return(-1); } strcpy(wrq.ifr_name, ifname); wrq.u.frag.fixed = 1; } else /* Should be a numeric value */ if(sscanf(args[i], "%ld", (unsigned long *) &(wrq.u.frag.value)) != 1) iw_usage(); } if(ioctl(skfd, SIOCSIWFRAG, &wrq) < 0) { fprintf(stderr, "SIOCSIWFRAG: %s\n", strerror(errno)); return(-1); } continue; } /* ---------- Set operation mode ---------- */ if(!strcmp(args[i], "mode")) { int k; i++; if(i >= count) iw_usage(); if(sscanf(args[i], "%d", &k) != 1) { k = 0; while(k < 6 && strncasecmp(args[i], operation_mode[k], 3)) k++; } if((k > 5) || (k < 0)) iw_usage(); wrq.u.mode = k; if(ioctl(skfd, SIOCSIWMODE, &wrq) < 0) { fprintf(stderr, "SIOCSIWMODE: %s\n", strerror(errno)); return(-1); } continue; } /* ---------- Set Power Management ---------- */ if(!strncmp(args[i], "power", 3)) { if(++i >= count) iw_usage(); if(!strcasecmp(args[i], "off")) wrq.u.power.disabled = 1; /* i.e. max size */ else if(!strcasecmp(args[i], "on")) { /* Get old Power info */ if(ioctl(skfd, SIOCGIWPOWER, &wrq) < 0) { fprintf(stderr, "SIOCGIWPOWER: %s\n", strerror(errno)); return(-1); } strcpy(wrq.ifr_name, ifname); wrq.u.power.disabled = 0; } else { double temp; int gotone = 0; /* Default - nope */ wrq.u.power.flags = IW_POWER_ON; wrq.u.power.disabled = 0; /* Check value modifier */ if(!strcasecmp(args[i], "min")) { wrq.u.power.flags |= IW_POWER_MIN; if(++i >= count) iw_usage(); } else if(!strcasecmp(args[i], "max")) { wrq.u.power.flags |= IW_POWER_MAX; if(++i >= count) iw_usage(); } /* Check value type */ if(!strcasecmp(args[i], "period")) { wrq.u.power.flags |= IW_POWER_PERIOD; if(++i >= count) iw_usage(); } else if(!strcasecmp(args[i], "timeout")) { wrq.u.power.flags |= IW_POWER_TIMEOUT; if(++i >= count) iw_usage(); } /* Is there any value to grab ? */ if(sscanf(args[i], "%lg", &(temp)) == 1) { temp *= MEGA; /* default = s */ if(index(args[i], 'u')) temp /= MEGA; if(index(args[i], 'm')) temp /= KILO; wrq.u.power.value = (long) temp; 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) iw_usage(); --i; } if(ioctl(skfd, SIOCSIWPOWER, &wrq) < 0) { fprintf(stderr, "SIOCSIWPOWER(%d): %s\n", errno, strerror(errno)); return(-1); } continue; }#if WIRELESS_EXT > 9 /* ---------- Set Transmit-Power ---------- */ if(!strncmp(args[i], "txpower", 3)) { struct iw_range range; if(++i >= count) iw_usage(); /* Extract range info */ if(get_range_info(skfd, ifname, &range) < 0) memset(&range, 0, sizeof(range)); /* Prepare the request */ strncpy(wrq.ifr_name, ifname, IFNAMSIZ); wrq.u.txpower.value = -1; wrq.u.txpower.fixed = 1; wrq.u.txpower.disabled = 0; wrq.u.data.flags = IW_TXPOW_DBM; if(!strcasecmp(args[i], "off")) wrq.u.txpower.disabled = 1; /* i.e. turn radio off */ else if(!strcasecmp(args[i], "auto")) wrq.u.txpower.fixed = 0; /* i.e. use power control */ else { if(!strcasecmp(args[i], "fixed")) { /* Get old tx-power */ if(ioctl(skfd, SIOCGIWTXPOW, &wrq) < 0) { fprintf(stderr, "SIOCGIWTXPOW: %s\n", strerror(errno)); return(-1); } strcpy(wrq.ifr_name, ifname); wrq.u.txpower.fixed = 1; } else /* Should be a numeric value */ { int power; int ismwatt = 0; /* Get the value */ if(sscanf(args[i], "%ld", (unsigned long *) &(power)) != 1) iw_usage(); /* Check if milliwatt */ ismwatt = (index(args[i], 'm') != NULL); /* Convert */ if(!ismwatt && (range.txpower_capa & IW_TXPOW_MWATT)) { power = dbm2mwatt(power); wrq.u.data.flags = IW_TXPOW_MWATT; } if(ismwatt && !(range.txpower_capa & IW_TXPOW_MWATT)) power = mwatt2dbm(power); wrq.u.bitrate.value = power; /* Check for an additional argument */ if(((i+1) < count) && (!strcasecmp(args[i+1], "auto"))) { wrq.u.txpower.fixed = 0; ++i; } if(((i+1) < count) && (!strcasecmp(args[i+1], "fixed"))) { wrq.u.txpower.fixed = 1; ++i; } } } if(ioctl(skfd, SIOCSIWTXPOW, &wrq) < 0) { fprintf(stderr, "SIOCSIWTXPOW: %s\n", strerror(errno)); return(-1); } continue; }#endif#if WIRELESS_EXT > 10 /* ---------- Set Power Management ---------- */ if(!strncmp(args[i], "retry", 3)) { double temp; int gotone = 0; if(++i >= count) iw_usage(); /* Default - nope */ wrq.u.retry.flags = IW_RETRY_LIMIT; wrq.u.retry.disabled = 0; /* Check value modifier */ if(!strcasecmp(args[i], "min")) { wrq.u.retry.flags |= IW_RETRY_MIN; if(++i >= count) iw_usage(); } else if(!strcasecmp(args[i], "max")) { wrq.u.retry.flags |= IW_RETRY_MAX; if(++i >= count) iw_usage(); } /* Check value type */ if(!strcasecmp(args[i], "limit")) { wrq.u.retry.flags |= IW_RETRY_LIMIT; if(++i >= count) iw_usage(); } else if(!strncasecmp(args[i], "lifetime", 4)) { wrq.u.retry.flags |= IW_RETRY_LIFETIME; if(++i >= count) iw_usage(); } /* Is there any value to grab ? */ if(sscanf(args[i], "%lg", &(temp)) == 1) { /* Limit is absolute, on the other hand lifetime is seconds */ if(!(wrq.u.retry.flags & IW_RETRY_LIMIT)) { /* Normalise lifetime */ temp *= MEGA; /* default = s */ if(index(args[i], 'u')) temp /= MEGA; if(index(args[i], 'm')) temp /= KILO; } wrq.u.retry.value = (long) temp; ++i; gotone = 1; } if(!gotone) iw_usage(); --i; if(ioctl(skfd, SIOCSIWRETRY, &wrq) < 0) { fprintf(stderr, "SIOCSIWRETRY(%d): %s\n", errno, strerror(errno)); return(-1); } continue; }#endif /* WIRELESS_EXT > 10 */ /* ---------- Other ---------- */ /* Here we have an unrecognised arg... */ fprintf(stderr, "Invalid argument : %s\n", args[i]); iw_usage(); return(-1); } /* for(index ... */ return(0);}/******************************* MAIN ********************************//*------------------------------------------------------------------*//* * The main ! */intmain(int argc, char ** argv){ int skfd = -1; /* generic raw socket desc. */ int goterr = 0; /* Create a channel to the NET kernel. */ if((skfd = sockets_open()) < 0) { perror("socket"); exit(-1); } /* No argument : show the list of all device + info */ if(argc == 1) { print_devices(skfd); close(skfd); exit(0); } /* Special case for help... */ if((!strncmp(argv[1], "-h", 9)) || (!strcmp(argv[1], "--help"))) { iw_usage(); close(skfd); exit(0); } /* The device name must be the first argument */ if(argc == 2) { print_info(skfd, argv[1]); close(skfd); exit(0); } /* The other args on the line specify options to be set... */ goterr = set_info(skfd, argv + 2, argc - 2, argv[1]); /* Close the socket. */ close(skfd); return(goterr);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -