/* * main body of the program */ int main(int argc, char * argv[]) { struct rtnl_handle rth; int opt; /* Check command line options */ while((opt = getopt_long(argc, argv, "hv", long_opts, NULL)) > 0) { switch(opt) { case 'h': iw_usage(0); break; case 'v': return(iw_print_version_info("iwevent")); break; default: iw_usage(1); break; } } if(optind < argc) { fputs("Too many arguments.\n", stderr); iw_usage(1); } /* Open netlink channel */ if(rtnl_open(&rth, RTMGRP_LINK) < 0) { perror("Can't initialize rtnetlink socket"); return(1); } #if WIRELESS_EXT > 13 fprintf(stderr, "Waiting for Wireless Events...\n"); #else /* WIRELESS_EXT > 13 */ fprintf(stderr, "Unsupported in Wireless Extensions <= 14 :-(\n"); return(-1); #endif /* WIRELESS_EXT > 13 */ /* Do what we have to do */ wait_for_event(&rth); /* Cleanup - only if you are pedantic */ rtnl_close(&rth); return(0); }
/* * The main ! */ int main(int argc, char ** argv) { int skfd; /* generic raw socket desc. */ int goterr = 0; /* Create a channel to the NET kernel. */ if((skfd = iw_sockets_open()) < 0) { perror("socket"); return(-1); } /* No argument : show the list of all device + info */ if(argc == 1) iw_enum_devices(skfd, &print_priv_info, NULL, 0); else /* Special cases take one... */ /* All */ if((!strncmp(argv[1], "-a", 2)) || (!strcmp(argv[1], "--all"))) iw_enum_devices(skfd, &print_priv_all, NULL, 0); else /* Help */ if((!strncmp(argv[1], "-h", 2)) || (!strcmp(argv[1], "--help"))) iw_usage(); else /* Version */ if (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version")) goterr = iw_print_version_info("iwpriv"); else /* The device name must be the first argument */ /* Name only : show for that device only */ if(argc == 2) print_priv_info(skfd, argv[1], NULL, 0); else /* Special cases take two... */ /* All */ if((!strncmp(argv[2], "-a", 2)) || (!strcmp(argv[2], "--all"))) print_priv_all(skfd, argv[1], NULL, 0); else /* Roaming */ if(!strncmp(argv[2], "roam", 4)) goterr = set_roaming(skfd, argv + 3, argc - 3, argv[1]); else /* Port type */ if(!strncmp(argv[2], "port", 4)) goterr = port_type(skfd, argv + 3, argc - 3, argv[1]); else /*-------------*/ /* Otherwise, it's a private ioctl */ goterr = set_private(skfd, argv + 2, argc - 2, argv[1]); /* Close the socket. */ close(skfd); return(goterr); }
/* * The main ! */ int main(int argc, char ** argv) { int skfd; /* generic raw socket desc. */ int goterr = 0; /* Create a channel to the NET kernel. */ if((skfd = iw_sockets_open()) < 0) { perror("socket"); exit(-1); } /* No argument : show the list of all device + info */ if(argc == 1) iw_enum_devices(skfd, &print_info, NULL, 0); else /* Special case for help... */ if((!strcmp(argv[1], "-h")) || (!strcmp(argv[1], "--help"))) iw_usage(); else /* Special case for version... */ if(!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version")) goterr = iw_print_version_info("iwconfig"); else { /* '--' escape device name */ if((argc > 2) && !strcmp(argv[1], "--")) { argv++; argc--; } /* The device name must be the first argument */ if(argc == 2) print_info(skfd, argv[1], NULL, 0); else /* The other args on the line specify options to be set... */ goterr = set_info(skfd, argv + 2, argc - 2, argv[1]); } /* Close the socket. */ iw_sockets_close(skfd); return(goterr); }
/* * The main ! */ int main(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); }
/* * Get and set the port type * Found in wavelan2_cs and wvlan_cs drivers * TODO : Add support for HostAP ? */ static int port_type(int skfd, /* Socket */ char * args[], /* Command line args */ int count, /* Args count */ char * ifname) /* Dev name */ { struct iwreq wrq; int i = 0; /* Start with first arg */ int k; iwprivargs * priv; int number; char ptype = 0; char * modes[] = { "invalid", "managed (BSS)", "reserved", "ad-hoc" }; /* Read the private ioctls */ number = iw_get_priv_info(skfd, ifname, &priv); /* Is there any ? */ if(number <= 0) { /* Should I skip this message ? */ fprintf(stderr, "%-8.16s no private ioctls.\n\n", ifname); if(priv) free(priv); return(-1); } /* Arguments ? */ if(count == 0) { /* So, we just want to see the current value... */ k = -1; while((++k < number) && strcmp(priv[k].name, "gport_type") && strcmp(priv[k].name, "get_port")); if(k == number) { fprintf(stderr, "This device doesn't support getting port type\n"); goto err; } strncpy(wrq.ifr_name, ifname, IFNAMSIZ); /* Get it */ if(ioctl(skfd, priv[k].cmd, &wrq) < 0) { fprintf(stderr, "Port type support is broken.\n"); goto err; } ptype = *wrq.u.name; /* Display it */ printf("%-8.16s Current port mode is %s <port type is %d>.\n\n", ifname, modes[(int) ptype], ptype); free(priv); return(0); } if(count != 1) { iw_usage(); goto err; } /* Read it */ /* As a string... */ k = 0; while((k < 4) && strncasecmp(args[i], modes[k], 2)) k++; if(k < 4) ptype = k; else /* ...or as an integer */ if(sscanf(args[i], "%i", (int *) &ptype) != 1) { iw_usage(); goto err; } k = -1; while((++k < number) && strcmp(priv[k].name, "sport_type") && strcmp(priv[k].name, "set_port")); if(k == number) { fprintf(stderr, "This device doesn't support setting port type\n"); goto err; } strncpy(wrq.ifr_name, ifname, IFNAMSIZ); *(wrq.u.name) = ptype; if(ioctl(skfd, priv[k].cmd, &wrq) < 0) { fprintf(stderr, "Invalid port type (or setting not allowed)\n"); goto err; } free(priv); return(0); err: free(priv); return(-1); }
/* * Set roaming mode on and off * Found in wavelan_cs driver * Note : this is obsolete, most 802.11 devices should use the * SIOCSIWAP request. */ static int set_roaming(int skfd, /* Socket */ char * args[], /* Command line args */ int count, /* Args count */ char * ifname) /* Dev name */ { u_char buffer[1024]; struct iwreq wrq; int i = 0; /* Start with first arg */ int k; iwprivargs * priv; int number; int roamcmd; char RoamState; /* buffer to hold new roam state */ char ChangeRoamState=0; /* whether or not we are going to change roam states */ /* Read the private ioctls */ number = iw_get_priv_info(skfd, ifname, &priv); /* Is there any ? */ if(number <= 0) { /* Should I skip this message ? */ fprintf(stderr, "%-8.16s no private ioctls.\n\n", ifname); if(priv) free(priv); return(-1); } /* Get the ioctl number */ k = -1; while((++k < number) && strcmp(priv[k].name, "setroam")); if(k == number) { fprintf(stderr, "This device doesn't support roaming\n"); free(priv); return(-1); } roamcmd = priv[k].cmd; /* Cleanup */ free(priv); if(count != 1) { iw_usage(); return(-1); } if(!strcasecmp(args[i], "on")) { printf("%-8.16s enable roaming\n", ifname); if(!number) { fprintf(stderr, "This device doesn't support roaming\n"); return(-1); } ChangeRoamState=1; RoamState=1; } else if(!strcasecmp(args[i], "off")) { i++; printf("%-8.16s disable roaming\n", ifname); if(!number) { fprintf(stderr, "This device doesn't support roaming\n"); return(-1); } ChangeRoamState=1; RoamState=0; } else { iw_usage(); return(-1); } if(ChangeRoamState) { strncpy(wrq.ifr_name, ifname, IFNAMSIZ); buffer[0]=RoamState; memcpy(wrq.u.name, &buffer, IFNAMSIZ); if(ioctl(skfd, roamcmd, &wrq) < 0) { fprintf(stderr, "Roaming support is broken.\n"); return(-1); } } return(0); }
/* * Set the wireless options requested on command line * This function is too long and probably should be split, * because it look like the perfect definition of spaghetti code, * but I'm way to lazy */ static int set_info(int skfd, /* The socket */ char * args[], /* Command line args */ int count, /* Args count */ char * ifname) /* Dev name */ { struct iwreq wrq; int i; /* Set dev name */ strncpy(wrq.ifr_name, ifname, IFNAMSIZ); /* if nothing after the device name */ if(count<1) iw_usage(); /* The other args on the line specify options to be set... */ for(i = 0; i < count; i++) { /* ---------- Set network ID ---------- */ if((!strcasecmp(args[i], "nwid")) || (!strcasecmp(args[i], "domain"))) { i++; if(i >= count) iw_usage(); if((!strcasecmp(args[i], "off")) || (!strcasecmp(args[i], "any"))) wrq.u.nwid.disabled = 1; else if(!strcasecmp(args[i], "on")) { /* Get old nwid */ if(ioctl(skfd, SIOCGIWNWID, &wrq) < 0) { fprintf(stderr, "SIOCGIWNWID: %s\n", strerror(errno)); return(-1); } strcpy(wrq.ifr_name, ifname); wrq.u.nwid.disabled = 0; } else if(sscanf(args[i], "%lX", (unsigned long *) &(wrq.u.nwid.value)) != 1) iw_usage(); else wrq.u.nwid.disabled = 0; wrq.u.nwid.fixed = 1; if(ioctl(skfd, SIOCSIWNWID, &wrq) < 0) { fprintf(stderr, "SIOCSIWNWID: %s\n", strerror(errno)); return(-1); } continue; } /* ---------- Set frequency / channel ---------- */ if((!strncmp(args[i], "freq", 4)) || (!strcmp(args[i], "channel"))) { double freq; if(++i >= count) iw_usage(); if(sscanf(args[i], "%lg", &(freq)) != 1) iw_usage(); if(index(args[i], 'G')) freq *= GIGA; if(index(args[i], 'M')) freq *= MEGA; if(index(args[i], 'k')) freq *= KILO; float2freq(freq, &(wrq.u.freq)); if(ioctl(skfd, SIOCSIWFREQ, &wrq) < 0) { fprintf(stderr, "SIOCSIWFREQ: %s\n", strerror(errno)); return(-1); } continue; } /* ---------- Set sensitivity ---------- */ if(!strncmp(args[i], "sens", 4)) { if(++i >= count) iw_usage(); if(sscanf(args[i], "%d", &(wrq.u.sens.value)) != 1) iw_usage(); if(ioctl(skfd, SIOCSIWSENS, &wrq) < 0) { fprintf(stderr, "SIOCSIWSENS: %s\n", strerror(errno)); return(-1); } continue; } /* ---------- Set encryption stuff ---------- */ if((!strncmp(args[i], "enc", 3)) || (!strcmp(args[i], "key"))) { unsigned char key[IW_ENCODING_TOKEN_MAX]; if(++i >= count) iw_usage(); if(!strcasecmp(args[i], "on")) { /* Get old encryption information */ wrq.u.data.pointer = (caddr_t) key; wrq.u.data.length = 0; wrq.u.data.flags = 0; if(ioctl(skfd, SIOCGIWENCODE, &wrq) < 0) { fprintf(stderr, "SIOCGIWENCODE: %s\n", strerror(errno)); return(-1); } strcpy(wrq.ifr_name, ifname); wrq.u.data.flags &= ~IW_ENCODE_DISABLED; /* Enable */ } else { char * buff; char * p; int temp; int k = 0; int gotone = 1; wrq.u.data.pointer = (caddr_t) NULL; wrq.u.data.flags = 0; wrq.u.data.length = 0; /* -- Check for the key -- */ if(!strncmp(args[i], "s:", 2)) { /* First case : as an ASCII string */ wrq.u.data.length = strlen(args[i] + 2); if(wrq.u.data.length > IW_ENCODING_TOKEN_MAX) wrq.u.data.length = IW_ENCODING_TOKEN_MAX; strncpy(key, args[i] + 2, wrq.u.data.length); wrq.u.data.pointer = (caddr_t) key; ++i; gotone = 1; } else { /* Second case : has hexadecimal digits */ p = buff = malloc(strlen(args[i]) + 1); strcpy(buff, args[i]); p = strtok(buff, "-:;.,"); while(p != (char *) NULL) { if(sscanf(p, "%2X", &temp) != 1) { gotone = 0; break; } key[k++] = (unsigned char) (temp & 0xFF); if(strlen(p) > 2) /* Token not finished yet */ p += 2; else p = strtok((char *) NULL, "-:;.,"); } free(buff); if(gotone) { ++i; wrq.u.data.length = k; wrq.u.data.pointer = (caddr_t) key; } } /* -- Check for token index -- */ if((i < count) && (sscanf(args[i], "[%d]", &temp) == 1) && (temp > 0) && (temp < IW_ENCODE_INDEX)) { wrq.u.encoding.flags |= temp; ++i; gotone = 1; } /* -- Check the various flags -- */ if(i < count) { if(!strcasecmp(args[i], "off")) wrq.u.data.flags |= IW_ENCODE_DISABLED; if(!strcasecmp(args[i], "open")) wrq.u.data.flags |= IW_ENCODE_OPEN; if(!strncasecmp(args[i], "restricted", 5)) wrq.u.data.flags |= IW_ENCODE_RESTRICTED; if(wrq.u.data.flags & IW_ENCODE_FLAGS) { ++i; gotone = 1; } } if(!gotone) iw_usage(); --i; } if(ioctl(skfd, SIOCSIWENCODE, &wrq) < 0) { fprintf(stderr, "SIOCSIWENCODE(%d): %s\n", errno, strerror(errno)); return(-1); } continue; } /* ---------- Set ESSID ---------- */ if(!strcasecmp(args[i], "essid")) { char essid[IW_ESSID_MAX_SIZE + 1]; i++; if(i >= count) iw_usage(); if((!strcasecmp(args[i], "off")) || (!strcasecmp(args[i], "any"))) { wrq.u.essid.flags = 0; essid[0] = '\0'; } else if(!strcasecmp(args[i], "on")) { /* Get old essid */ wrq.u.essid.pointer = (caddr_t) essid; wrq.u.essid.length = 0; wrq.u.essid.flags = 0; if(ioctl(skfd, SIOCGIWESSID, &wrq) < 0) { fprintf(stderr, "SIOCGIWESSID: %s\n", strerror(errno)); return(-1); } strcpy(wrq.ifr_name, ifname); wrq.u.essid.flags = 1; } else if(strlen(args[i]) > IW_ESSID_MAX_SIZE) { fprintf(stderr, "ESSID too long (max %d): ``%s''\n", IW_ESSID_MAX_SIZE, args[i]); iw_usage(); } else { int temp; wrq.u.essid.flags = 1; strcpy(essid, args[i]); /* Check for ESSID index */ if(((i+1) < count) && (sscanf(args[i+1], "[%d]", &temp) == 1) && (temp > 0) && (temp < IW_ENCODE_INDEX)) { wrq.u.essid.flags = temp; ++i; } } wrq.u.essid.pointer = (caddr_t) essid; wrq.u.essid.length = strlen(essid) + 1; if(ioctl(skfd, SIOCSIWESSID, &wrq) < 0) { fprintf(stderr, "SIOCSIWESSID: %s\n", strerror(errno)); return(-1); } continue; } /* ---------- Set AP address ---------- */ if(!strcasecmp(args[i], "ap")) { if(++i >= count) iw_usage(); /* Check if we have valid address types */ if(check_addr_type(skfd, ifname) < 0) { fprintf(stderr, "%-8.8s Interface doesn't support MAC & IP addresses\n", ifname); return(-1); } /* Get the address */ if(in_addr(skfd, ifname, args[i++], &(wrq.u.ap_addr)) < 0) iw_usage(); if(ioctl(skfd, SIOCSIWAP, &wrq) < 0) { fprintf(stderr, "SIOCSIWAP: %s\n", strerror(errno)); return(-1); } continue; } /* ---------- Set NickName ---------- */ if(!strncmp(args[i], "nick", 4)) { i++; if(i >= count) iw_usage(); if(strlen(args[i]) > IW_ESSID_MAX_SIZE) { fprintf(stderr, "Name too long (max %d) : ``%s''\n", IW_ESSID_MAX_SIZE, args[i]); iw_usage(); } wrq.u.essid.pointer = (caddr_t) args[i]; wrq.u.essid.length = strlen(args[i]) + 1; if(ioctl(skfd, SIOCSIWNICKN, &wrq) < 0) { fprintf(stderr, "SIOCSIWNICKN: %s\n", strerror(errno)); return(-1); } continue; } /* ---------- Set Bit-Rate ---------- */ if((!strncmp(args[i], "bit", 3)) || (!strcmp(args[i], "rate"))) { 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); }
int main(int argc, char *argv[]) { int opt = 0; char cmd[128] = {'\0'}; char result[16] = {'\0'}; unsigned int value = 0; unsigned int parm = 0; unsigned short rate = 0; unsigned char duplex = 0; unsigned char link = 0; system("echo 0 > /proc/sys/kernel/printk"); if((opt = getopt(argc,argv,"rlhs:d:")) != -1) { /*get the value of the reg*/ if(!PopenFile("/usr/sbin/ethreg -p 0x00 0x00 | awk -F\"= 0x\" '{print$2}'", result, sizeof(result))){ printf("/usr/sbin/ethreg -p 0x00 0x00 | awk -F\"= 0x\" '{print$2}' is error\n"); } /*form the value*/ sscanf(result , "%x", &value); switch (opt) { case 'h': iw_usage(); break; case 'r': // reset phy chip match to the 15th bit /*check parm*/ if(argc > 2){ goto FAIL; } SET_BIT(value,15); break; case 's': //set rate 00:10M/s, 01:100M/s, 10:1000M/s, 11:negotiation-0 /*check parm*/ if(argc > 3){ goto FAIL; } parm = atoi(argv[argc - 1]); if( 0 != parm && 10 != parm && 100 != parm && 1000 != parm ){ goto FAIL; } /* enable auto-negotiation process match to the 8th bit 00:10M/s, 01:100M/s, 10:1000M/s high bit match to the 6th bit, low bit match to the 13th bit */ if( 0 == parm){ SET_BIT(value, 12); CLEAR_BIT(value, 13); CLEAR_BIT(value, 6); }else if( 10 == parm ){ CLEAR_BIT(value, 12); CLEAR_BIT(value, 13); CLEAR_BIT(value, 6); }else if( 100 == parm ){ CLEAR_BIT(value, 12); SET_BIT(value, 13); CLEAR_BIT(value, 6); }else if( 1000 == parm ){ CLEAR_BIT(value, 12); CLEAR_BIT(value, 13); SET_BIT(value, 6); } break; case 'd': /*set the duplex 0:half, 1:full match to the 8th bit*/ /*check parm*/ if(argc > 3){ goto FAIL; } parm = atoi(argv[argc - 1]); if(0 != parm && 1 != parm){ goto FAIL; } if(parm){ SET_BIT(value, 8); }else{ CLEAR_BIT(value, 8); } break; case 'l': if(argc > 2){ goto FAIL; } /*read the status of the reg*/ if(!PopenFile("/usr/sbin/ethreg -p 0x00 0x11 | awk -F\"= 0x\" '{print$2}'", result, sizeof(result))){ printf("/usr/sbin/ethreg -p 0x00 0x11 | awk -F\"= 0x\" '{print$2}' is error\n"); } /*form the value*/ sscanf(result , "%x", &value); /*get the link status*/ if( BIT_IS_SET(value, 10) ){ printf("the link status is up\n"); }else{ printf("the link status is down\n"); } /*get the duplex*/ if( BIT_IS_SET(value, 13) ){ printf("the work mode is full-duplex\n"); }else{ printf("the work mode is half-duplex\n"); } /*get the rate 00:10M/s, 01:100M/s, 10:1000M/s high bit match to the 15th bit, low bit match to the 14th bit */ if(BIT_IS_CLEAR(value, 15) && BIT_IS_CLEAR(value, 14)){ //00:10M/s printf("the rate is 10M/s\n"); }else if(BIT_IS_CLEAR(value, 15) && BIT_IS_SET(value, 14)){ //01:100M/s printf("the rate is 100M/s\n"); }else if(BIT_IS_SET(value, 15) && BIT_IS_CLEAR(value, 14)){ //10:1000M/s printf("the rate is 1000M/s\n"); }else{ printf("the rate is error\n"); } break; default: goto FAIL; } /*set the value of the reg*/ if( 's' == opt || 'd' == opt || 'r' == opt){ sprintf(cmd, "/usr/sbin/ethreg -p 0x00 0x00=0x%x >> /dev/null 2>&1", value); system(cmd); } }else{ goto FAIL; } system("echo 7 > /proc/sys/kernel/printk"); return 0; FAIL: system("echo 7 > /proc/sys/kernel/printk"); iw_usage(); return -1; }
/* * The main ! */ int main(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_priv_devices(skfd); close(skfd); exit(0); } /* Special cases take one... */ /* 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 */ /* Name only : show for that device only */ if(argc == 2) { print_priv_info(skfd, argv[1]); close(skfd); exit(0); } /* Special cases take two... */ /* Roaming */ if(!strncmp(argv[2], "roam", 4)) { goterr = set_roaming(skfd, argv + 3, argc - 3, argv[1]); close(skfd); exit(0); } /* Port type */ if(!strncmp(argv[2], "port", 4)) { goterr = port_type(skfd, argv + 3, argc - 3, argv[1]); close(skfd); exit(0); } /* Otherwise, it's a private ioctl */ goterr = set_private(skfd, argv + 2, argc - 2, argv[1]); /* Close the socket. */ close(skfd); return(0); }
/* * The main ! */ int main(int argc, char ** argv) { int skfd; /* generic raw socket desc. */ int format = FORMAT_DEFAULT; int wtype = WTYPE_ESSID; int opt; int ret = -1; /* Check command line arguments */ while((opt = getopt_long(argc, argv, "acfhmprs", long_opts, NULL)) > 0) { switch(opt) { case 'a': /* User wants AP/Cell Address */ wtype = WTYPE_AP; break; case 'c': /* User wants channel only */ wtype = WTYPE_CHANNEL; break; case 'f': /* User wants frequency/channel */ wtype = WTYPE_FREQ; break; case 'm': /* User wants the mode */ wtype = WTYPE_MODE; break; case 'p': /* User wants the protocol */ wtype = WTYPE_PROTO; break; case 'h': iw_usage(0); break; case 'r': /* User wants a Raw format */ format = FORMAT_RAW; break; case 's': /* User wants a Scheme format */ format = FORMAT_SCHEME; break; default: iw_usage(1); break; } } if(optind + 1 < argc) { fputs("Too many arguments.\n", stderr); iw_usage(1); } /* Create a channel to the NET kernel. */ if((skfd = iw_sockets_open()) < 0) { perror("socket"); return(-1); } /* Check if first argument is a device name */ if(optind < argc) { /* Yes : query only this device */ ret = print_one_device(skfd, format, wtype, argv[optind]); } else { /* No : query all devices and print first found */ ret = scan_devices(skfd, format, wtype); } fflush(stdout); iw_sockets_close(skfd); return(ret); }
/* * The main ! */ int main(int argc, char ** argv) { int skfd; /* generic raw socket desc. */ char *dev; /* device name */ char *cmd; /* command */ char **args; /* Command arguments */ int count; /* Number of arguments */ const iwlist_cmd *iwcmd; if(argc == 1 || argc > 3) iw_usage(1); /* Those don't apply to all interfaces */ if((argc == 2) && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))) iw_usage(0); if((argc == 2) && (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--version"))) return(iw_print_version_info("iwlist")); if(argc == 2) { cmd = argv[1]; dev = NULL; args = NULL; count = 0; } else { cmd = argv[2]; dev = argv[1]; args = argv + 3; count = argc - 3; } /* find a command */ iwcmd = find_command(cmd); if(iwcmd == NULL) return 1; /* Check arg numbers */ if(count < iwcmd->min_count) { fprintf(stderr, "iwlist: command `%s' needs more arguments\n", cmd); return 1; } if(count > iwcmd->max_count) { fprintf(stderr, "iwlist: command `%s' needs fewer arguments\n", cmd); return 1; } /* Create a channel to the NET kernel. */ if((skfd = iw_sockets_open()) < 0) { perror("socket"); return -1; } /* do the actual work */ if (dev) (*iwcmd->fn)(skfd, dev, args, count); else iw_enum_devices(skfd, iwcmd->fn, args, count); /* Close the socket. */ iw_sockets_close(skfd); return 0; }