2009年12月16日 星期三

wifi command - Wireless Tools (WT)

  • 下載: wireless tools for linux Wireless Tools (WT)
  • 編譯: make make install (default: /usr/local/sbin)
  • 指令:
        iwconfig
        
    iwlist
        
    iwspy
        
    iwpriv
        
    ifrename
  • 使用:
iwlist wlan0 scanning | grep -e ESSID -e Quality -e Encryption -e IE

有時候不知為什麼會出現不少沒名字的
ex: ESSID:""
iwlist wlan0 scan | grep -E 'ESSID:".+"'
or
iwlist wlan0 scan | grep 'ESSID:"..*"'
ref: Here

為了方便分析,把原本iwlist的印出方法改了一下
...
...
...
void iw_print_stats(char * buffer,
        int  buflen,
        const iwqual * qual,
        const iwrange * range,
        int  has_range)
{
  int        len;

  ...
  ...
  ...

  if(has_range && ((qual->level != 0)
     || (qual->updated & (IW_QUAL_DBM | IW_QUAL_RCPI))))
    {
      /* Deal with quality : always a relative value */
      if(!(qual->updated & IW_QUAL_QUAL_INVALID))
 {
   len = snprintf(buffer, buflen, "Quality%c%d/%d  ",
    qual->updated & IW_QUAL_QUAL_UPDATED ? '=' : ':',
    qual->qual, range->max_qual.qual);
   buffer += len;
   buflen -= len;
 }

      /* Check if the statistics are in RCPI (IEEE 802.11k) */
      if(qual->updated & IW_QUAL_RCPI)
 {
   /* Deal with signal level in RCPI */
   /* RCPI = int{(Power in dBm +110)*2} for 0dbm > Power > -110dBm */
   if(!(qual->updated & IW_QUAL_LEVEL_INVALID))
     {
       double rcpilevel = (qual->level / 2.0) - 110.0;
       len = snprintf(buffer, buflen, "Signal level%c%g dBm  ",
        qual->updated & IW_QUAL_LEVEL_UPDATED ? '=' : ':',
        rcpilevel);
       buffer += len;
       buflen -= len;
     }

   /* Deal with noise level in dBm (absolute power measurement) */
   if(!(qual->updated & IW_QUAL_NOISE_INVALID))
     {
       double rcpinoise = (qual->noise / 2.0) - 110.0;
       len = snprintf(buffer, buflen, "Noise level%c%g dBm",
        qual->updated & IW_QUAL_NOISE_UPDATED ? '=' : ':',
        rcpinoise);
     }
 }
      else
 {
   /* Check if the statistics are in dBm */
   if((qual->updated & IW_QUAL_DBM)
      || (qual->level > range->max_qual.level))
     {
       /* Deal with signal level in dBm  (absolute power measurement) */
       if(!(qual->updated & IW_QUAL_LEVEL_INVALID))
  {
    int dblevel = qual->level;
    /* Implement a range for dBm [-192; 63] */
    if(qual->level >= 64)
      dblevel -= 0x100;
    len = snprintf(buffer, buflen, "Signal level%c%d dBm  ",
     qual->updated & IW_QUAL_LEVEL_UPDATED ? '=' : ':',
     dblevel);
    buffer += len;
    buflen -= len;
  }

       /* Deal with noise level in dBm (absolute power measurement) */
       if(!(qual->updated & IW_QUAL_NOISE_INVALID))
  {
    int dbnoise = qual->noise;
    /* Implement a range for dBm [-192; 63] */
    if(qual->noise >= 64)
      dbnoise -= 0x100;
    len = snprintf(buffer, buflen, "Noise level%c%d dBm",
     qual->updated & IW_QUAL_NOISE_UPDATED ? '=' : ':',
     dbnoise);
  }
     }
   else
     {
       /* Deal with signal level as relative value (0 -> max) */
       if(!(qual->updated & IW_QUAL_LEVEL_INVALID))
  {
    len = snprintf(buffer, buflen, "Signal level%c%d/%d  ",
     qual->updated & IW_QUAL_LEVEL_UPDATED ? '=' : ':',
     qual->level, range->max_qual.level);
    buffer += len;
    buflen -= len;
  }

       /* Deal with noise level as relative value (0 -> max) */
       if(!(qual->updated & IW_QUAL_NOISE_INVALID))
  {
    len = snprintf(buffer, buflen, "Noise level%c%d/%d",
     qual->updated & IW_QUAL_NOISE_UPDATED ? '=' : ':',
     qual->noise, range->max_qual.noise);
  }
     }
 }
    }
  else
    {
      /* We can't read the range, so we don't know... */
      snprintf(buffer, buflen,
        "Quality:%d  Signal level:%d  Noise level:%d",
        qual->qual, qual->level, qual->noise);
    }
}
...
...
...

...
...
...
int FLAG=0;  //golbal value
...
...
...
/*------------------------------------------------------------------*/
/*
 * Parse, and display the results of a WPA or WPA2 IE.
 *
 */
static inline void 
iw_print_ie_wpa(unsigned char * iebuf,
  int  buflen)
{
  int   ielen = iebuf[1] + 2;
  int   offset = 2; /* Skip the IE id, and the length. */
  unsigned char  wpa1_oui[3] = {0x00, 0x50, 0xf2};
  unsigned char  wpa2_oui[3] = {0x00, 0x0f, 0xac};
  unsigned char * wpa_oui;
  int   i;
  uint16_t  ver = 0;
  uint16_t  cnt = 0;

  if(ielen > buflen)
    ielen = buflen;

#ifdef DEBUG
  /* Debugging code. In theory useless, because it's debugged ;-) */
  printf("IE raw value %d [%02X", buflen, iebuf[0]);
  for(i = 1; i < buflen; i++)
    printf(":%02X", iebuf[i]);
  printf("]\n");
#endif

  switch(iebuf[0])
    {
    case 0x30:  /* WPA2 */
      /* Check if we have enough data */
      if(ielen < 4)
 {
   //iw_print_ie_unknown(iebuf, buflen); //LN2 co
    return;
 }

      wpa_oui = wpa2_oui;
      break;

    case 0xdd:  /* WPA or else */
      wpa_oui = wpa1_oui;
 
      /* Not all IEs that start with 0xdd are WPA. 
       * So check that the OUI is valid. Note : offset==2 */
      if((ielen < 8)
  || (memcmp(&iebuf[offset], wpa_oui, 3) != 0)
  || (iebuf[offset + 3] != 0x01))
  {
   //iw_print_ie_unknown(iebuf, buflen); //LN2 co
    return;
  }

      /* Skip the OUI type */
      offset += 4;
      break;

    default:
      return;
    }
  
  /* Pick version number (little endian) */
  ver = iebuf[offset] | (iebuf[offset + 1] << 8);
  offset += 2;

  if(iebuf[0] == 0xdd)
  {
    printf("                    IE: "); //LN2
    //printf("WPA Version %d\n", ver); //LN2 co
    printf("WPAver%d\n", ver);
  }
  if(iebuf[0] == 0x30)
  {
    printf("                    IE: "); //LN2
    //printf("IEEE 802.11i/WPA2 Version %d\n", ver); //LN2 co
    printf("WPA2ver%d\n", ver);
  }

  /* From here, everything is technically optional. */

  /* Check if we are done */
  if(ielen < (offset + 4))
    {
      /* We have a short IE.  So we should assume TKIP/TKIP. */
      printf("                        Group Cipher : TKIP\n");
      printf("                        Pairwise Cipher : TKIP\n");
      return;
    }
 
  /* Next we have our group cipher. */
  if(memcmp(&iebuf[offset], wpa_oui, 3) != 0)
    {
      printf("                        Group Cipher : Proprietary\n");
    }
  else
    {
      printf("                        Group Cipher :");
      iw_print_value_name(iebuf[offset+3],
     iw_ie_cypher_name, IW_IE_CYPHER_NUM);
      printf("\n");
    }
  offset += 4;

  /* Check if we are done */
  if(ielen < (offset + 2))
    {
      /* We don't have a pairwise cipher, or auth method. Assume TKIP. */
      printf("                        Pairwise Ciphers : TKIP\n");
      return;
    }

  /* Otherwise, we have some number of pairwise ciphers. */
  cnt = iebuf[offset] | (iebuf[offset + 1] << 8);
  offset += 2;
  printf("                        Pairwise Ciphers (%d) :", cnt);

  if(ielen < (offset + 4*cnt))
    return;

  for(i = 0; i < cnt; i++)
    {
      if(memcmp(&iebuf[offset], wpa_oui, 3) != 0)
  {
    printf(" Proprietary");
  }
      else
 {
   iw_print_value_name(iebuf[offset+3],
         iw_ie_cypher_name, IW_IE_CYPHER_NUM);
  }
      offset+=4;
    }
  printf("\n");
 
  /* Check if we are done */
  if(ielen < (offset + 2))
    return;

  /* Now, we have authentication suites. */
  cnt = iebuf[offset] | (iebuf[offset + 1] << 8);
  offset += 2;
  printf("                        Authentication Suites (%d) :", cnt);

  if(ielen < (offset + 4*cnt))
    return;

  for(i = 0; i < cnt; i++)
    {
      if(memcmp(&iebuf[offset], wpa_oui, 3) != 0)
  {
    printf(" Proprietary");
  }
      else
 {
   iw_print_value_name(iebuf[offset+3],
         iw_ie_key_mgmt_name, IW_IE_KEY_MGMT_NUM);
  }
       offset+=4;
     }
  printf("\n");
 
  /* Check if we are done */
  if(ielen < (offset + 1))
    return;

  /* Otherwise, we have capabilities bytes.
   * For now, we only care about preauth which is in bit position 1 of the
   * first byte.  (But, preauth with WPA version 1 isn't supposed to be 
   * allowed.) 8-) */
  if(iebuf[offset] & 0x01)
    {
      printf("                       Preauthentication Supported\n");
    }
}
 
/*------------------------------------------------------------------*/
/*
 * Process a generic IE and display the info in human readable form
 * for some of the most interesting ones.
 * For now, we only decode the WPA IEs.
 */
static inline void
iw_print_gen_ie(unsigned char * buffer,
  int  buflen)
{
  int offset = 0;

  /* Loop on each IE, each IE is minimum 2 bytes */
  while(offset <= (buflen - 2))
    {
      //printf("                    IE: "); LN2 co

      /* Check IE type */
      switch(buffer[offset])
 {
 case 0xdd: /* WPA1 (and other) */
 case 0x30: /* WPA2 */
   iw_print_ie_wpa(buffer + offset, buflen);
   break;
 default:
      ;
      //LN2 co
   //iw_print_ie_unknown(buffer + offset, buflen);
 }
      /* Skip over this IE to the next one in the list. */
      offset += buffer[offset+1] + 2;
    }
    //printf("Finish\n");  //LN2
}
#endif /* WE_ESSENTIAL */
...
...
...
/**
 * buf = "Quality=17/100  Signal_level=-61 dBm"
 */
static inline char **ssplit (char *buf) //LN2
{
    int i=0;
    char *delim = " ";
    char *pch;

    char **ptr = (char **)malloc(sizeof(char*) * 4);
    for (i = 0; i < 4; i++)
        ptr[i] = (char *)malloc(sizeof(char *) * 128);

    i=0;
    pch = strtok(buf,delim);
    while (pch != NULL)
    {
        strcpy(ptr[i], pch);
        pch = strtok (NULL, delim);
        ++i;
    }
    return ptr;
}
...
...
...
/*------------------------------------------------------------------*/
/*
 * Print one element from the scanning results
 */
static inline void
print_scanning_token(struct stream_descr * stream, /* Stream of events */
       struct iw_event *  event, /* Extracted token */
       struct iwscan_state * state,
       struct iw_range * iw_range, /* Range info */
       int  has_range)
{
  char  buffer[128]; /* Temporary buffer */
  char **split_buf;

  /* Now, let's decode the event */
  switch(event->cmd)
    {
    case SIOCGIWAP:
      if (FLAG)
          printf("Finish\n");  //LN2
      printf("          Cell %02d - Address: %s\n", state->ap_num,
      iw_saether_ntop(&event->u.ap_addr, buffer));
      state->ap_num++;
      break;
    case SIOCGIWNWID:
      if(event->u.nwid.disabled)
 printf("                    NWID:off/any\n");
      else
 printf("                    NWID:%X\n", event->u.nwid.value);
      break;
    case SIOCGIWFREQ:
      {
 double  freq;   /* Frequency/channel */
 int  channel = -1;  /* Converted to channel */
 freq = iw_freq2float(&(event->u.freq));
 /* Convert to channel if possible */
 if(has_range)
   channel = iw_freq_to_channel(freq, iw_range);
 iw_print_freq(buffer, sizeof(buffer),
        freq, channel, event->u.freq.flags);
 printf("                    %s\n", buffer);
      }
      break;
    case SIOCGIWMODE:
      /* Note : event->u.mode is unsigned, no need to check <= 0 */
      if(event->u.mode >= IW_NUM_OPER_MODE)
 event->u.mode = IW_NUM_OPER_MODE;
      printf("                    Mode:%s\n",
      iw_operation_mode[event->u.mode]);
      break;
    case SIOCGIWNAME:
      printf("                    Protocol:%-1.16s\n", event->u.name);
      break;
    case SIOCGIWESSID:
      {
 char essid[IW_ESSID_MAX_SIZE+1];
 memset(essid, '\0', sizeof(essid));
 if((event->u.essid.pointer) && (event->u.essid.length))
   memcpy(essid, event->u.essid.pointer, event->u.essid.length);
 if(event->u.essid.flags)
   {
     /* Does it have an ESSID index ? */
     if((event->u.essid.flags & IW_ENCODE_INDEX) > 1)
       printf("                    ESSID:\"%s\" [%d]\n", essid,
       (event->u.essid.flags & IW_ENCODE_INDEX));
     else
       printf("                    ESSID:\"%s\"\n", essid);
   }
 else
   printf("                    ESSID:off/any/hidden\n");
      }
      break;
    case SIOCGIWENCODE:
      {
 unsigned char key[IW_ENCODING_TOKEN_MAX];
 if(event->u.data.pointer)
   memcpy(key, event->u.data.pointer, event->u.data.length);
 else
   event->u.data.flags |= IW_ENCODE_NOKEY;
 printf("                    Encryption key:");
 if(event->u.data.flags & IW_ENCODE_DISABLED)
   printf("off\n");
 else
   {
     /* Display the key */
     iw_print_key(buffer, sizeof(buffer), key, event->u.data.length,
    event->u.data.flags);
     printf("%s", buffer);

     /* Other info... */
     if((event->u.data.flags & IW_ENCODE_INDEX) > 1)
       printf(" [%d]", event->u.data.flags & IW_ENCODE_INDEX);
     if(event->u.data.flags & IW_ENCODE_RESTRICTED)
       printf("   Security mode:restricted");
     if(event->u.data.flags & IW_ENCODE_OPEN)
       printf("   Security mode:open");
     printf("\n");
   }
      }
      break;
    case SIOCGIWRATE:
      if(state->val_index == 0)
 printf("                    Bit Rates:");
      else
 if((state->val_index % 5) == 0)
   printf("\n                              ");
 else
   printf("; ");
      iw_print_bitrate(buffer, sizeof(buffer), event->u.bitrate.value);
      printf("%s", buffer);
      /* Check for termination */
      if(stream->value == NULL)
 {
   printf("\n");
   state->val_index = 0;
 }
      else
 state->val_index++;
      break;
    case SIOCGIWMODUL:
      {
 unsigned int modul = event->u.param.value;
 int  i;
 int  n = 0;
 printf("                    Modulations :");
 for(i = 0; i < IW_SIZE_MODUL_LIST; i++)
   {
     if((modul & iw_modul_list[i].mask) == iw_modul_list[i].mask)
       {
  if((n++ % 8) == 7)
    printf("\n                        ");
  else
    printf(" ; ");
  printf("%s", iw_modul_list[i].cmd);
       }
   }
 printf("\n");
      }
      break;
    case IWEVQUAL:
      iw_print_stats(buffer, sizeof(buffer),
       &event->u.qual, iw_range, has_range);
      //printf("                    %s\n", buffer); //LN2 co
      split_buf=ssplit(buffer);
      printf("                    %s\n", split_buf[0]); //LN2
      printf("                    %s\n", split_buf[1]); 
      free(split_buf[0]);
      free(split_buf[1]);
      free(split_buf[2]);
      free(split_buf[3]);
      free(split_buf);
      break;
#ifndef WE_ESSENTIAL
    case IWEVGENIE:
      /* Informations Elements are complex, let's do only some of them */
      iw_print_gen_ie(event->u.data.pointer, event->u.data.length);
      break;
#endif /* WE_ESSENTIAL */
    case IWEVCUSTOM:
      {
 char custom[IW_CUSTOM_MAX+1];
 if((event->u.data.pointer) && (event->u.data.length))
   memcpy(custom, event->u.data.pointer, event->u.data.length);
 custom[event->u.data.length] = '\0';
 printf("                    Extra:%s\n", custom);
      }
      break;
    default:
      printf("                    (Unknown Wireless Token 0x%04X)\n",
      event->cmd);
   } /* switch(event->cmd) */
}
  • parse.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>


#define SSID_SIZE 32
#define SECU_SIZE 128
#define AUTH_SIZE 16
#define SSID_NUMS 128

//print flag
int P1SFLAG=0; 
int P2FLAG=0;
int P2SFLAG=0;

typedef struct winfo
{
    char ssid[SSID_SIZE];
    int  quality;
    char secutity[SECU_SIZE];
    char auth[AUTH_SIZE];
    char key;
}winfo_t;

void print_list (winfo_t *wv, int ssflag);
void analysis (char *buf, winfo_t *wv, int *flag);
void wl_clear (winfo_t *wv);
int wifi_list (const char *cmd);
int fexists(const char* filename);
int record_ssid (char **buf, winfo_t *info);


/*******************
 * This function will limit it display to only one SSID
 *******************/
int record_ssid (char **buf, winfo_t *info)
{
    static unsigned int i=0;
    unsigned int j=0;
    if ( strlen(*(buf)) == 0)
    {
        //printf("fisrt\n");
        strcpy(*(buf), info->ssid);
        ++i;
    }   
    else
    {
        for(j=0; j<i; j++)
        {
            if (strcmp(info->ssid, *(buf+j)) == 0) //repeat ssid
                return 1;
        }
        strcpy(*(buf+i), info->ssid);
        ++i;
    }
    return 0;
}

void print_list (winfo_t *wv, int ssflag) //same_ssid_flag
{
    if (!strcmp("\"\"", wv->ssid))
 return;

    if (ssflag)
        return;

    if (P1SFLAG)
    {
        if (wv->key == 0)
            printf("%s, %d, %s, none\n", wv->ssid, wv->quality, wv->key?"ON":"OFF");
        else
            printf("%s, %d, %s, %s, %s\n", wv->ssid, wv->quality, wv->key?"ON":"OFF", wv->secutity, wv->auth);
    }
    else if (P2FLAG)
    {
        printf("%s\n", wv->ssid);
        printf("%d\n", wv->quality);
        printf("%s\n", wv->key?"ON":"OFF");
        printf("---\n");
    }
    else if (P2SFLAG)
    {
        printf("%s\n", wv->ssid);
        printf("%d\n", wv->quality);
        printf("%s\n", wv->key?"ON":"OFF");
        if (wv->key == 0)
            printf("none\n");
        else
        {
            printf("%s\n", wv->secutity);
            printf("%s\n", wv->auth);
        }
        printf("---\n");
    }
    else //P1FLAG
        printf("%s, %d, %s\n", wv->ssid, wv->quality, wv->key?"ON":"OFF");
    return;
}

void analysis (char *buf, winfo_t *wv, int *flag)
{
    char *pch;
    char *delim;
    char tmp[SSID_SIZE];

    //printf("%s_buf=%s, len=%ld\n", __FUNCTION__, buf, strlen(buf));

    //Quality
    memset(tmp, '\0', sizeof(char)*SSID_SIZE);
    pch=strstr(buf, "Quality");
    if ( pch != NULL)
    {
        pch=strchr(pch, '=');
        ++pch;
        strcpy(tmp, pch);
        delim = "/";
        pch = strtok(tmp, delim);
        sscanf(pch, "%d", &wv -> quality);
        pch = strtok (NULL, delim);
        if(!strcmp("70", pch))
            wv -> quality=abs(wv->quality*1.4);
        return;
    }

    //Encryption Key
    pch=strstr(buf, "Encryption");
    if ( pch != NULL)
    {
        delim = ":";
        pch = strtok(pch, delim);
        pch = strtok (NULL, delim);
        if(!strcmp("on", pch))
            wv -> key=1;    
        else
            wv -> key=0;    
        return;
    }

    //ESSID
    pch=strstr(buf, "ESSID");
    if ( pch != NULL)
    {
        delim = ":";
        pch=strtok(pch, delim);
        pch=strtok(NULL, delim);
        if(strlen(pch)==2) //sometime, ESSID:""
        {    
            strncpy(wv->ssid, "\"\"", 2);
            return;
        }
        ++pch;
        if (strlen(pch) >= SSID_SIZE)
            strncpy(wv->ssid, pch, sizeof(char)*SSID_SIZE);
        else
            strncpy(wv->ssid, pch, strlen(pch)-1);
        return;
    }

    //MUST Protocol first
    //IE (Protocol)
    pch=strstr(buf, "Protocol");
    if( pch != NULL)
    {
     return;
    }

    //IE (security)
    pch=strstr(buf, "IE");
    if ( pch != NULL)
    {
        delim = ":";
        pch = strtok(pch, delim);
        pch = strtok (NULL, delim);
        ++pch;

        if(strlen(wv->secutity) == 0)
        {
            strncpy(wv->secutity, pch, sizeof(char)*SECU_SIZE);
        }
        else
        {
            strcat(wv->secutity, "|");
            strncat(wv->secutity, pch, SECU_SIZE-strlen(wv->secutity)-1);
        }
        return;
    }

    pch=strstr(buf, "Authentication");
    if( pch != NULL)
    {
        delim = ":";
        pch = strtok(pch, delim);
        pch = strtok (NULL, delim);
        ++pch;
        if(strlen(wv->auth) == 0)
        {
            strncpy(wv->auth, pch, sizeof(char)*AUTH_SIZE);
        }
        #if 0 // if only show at late one of auth is not enough, open 
        else
        {
            strcat(wv->auth, "|");
            strncat(wv->auth, pch, AUTH_SIZE-strlen(wv->auth)-1);
        }
        #endif
    }

    pch=strstr(buf, "Finish");
    if ( pch != NULL)
    {
        *flag=1;
        return;
    }
    return;
}

void wl_clear (winfo_t *wv)
{
    wv->key=-1;
    wv->quality=-1;
    memset(wv->ssid, '\0', sizeof(char)*SSID_SIZE);
    memset(wv->secutity, '\0', sizeof(char)*SECU_SIZE);
    memset(wv->auth, '\0', sizeof(char)*AUTH_SIZE);
    return;
}

int wifi_list (const char *cmd)
{
    int i=0, j=0;
    FILE *pp=NULL;
    char buf[256];
    int flag=0;
    int ret=0;

    char **ptr =(char **)malloc(sizeof(char*) * SSID_NUMS);
        for (i = 0; i <SSID_NUMS; i++)
            ptr[i] =(char *)malloc(sizeof(char *) * SSID_NUMS);

    for (i = 0; i <SSID_NUMS; i++)
        for(j=0; j< SSID_NUMS; j++)
            ptr[i][j]=0;

    winfo_t *pwvalue, wv;
    pwvalue=&wv;
    wl_clear(pwvalue);

    pp=popen(cmd, "r");
    while (fgets(buf, 255, pp) != NULL)
    {
        buf[strlen(buf)-1]='\0';
        //printf("buf=%s", buf);
        analysis(buf, pwvalue, &flag);
        //printf("i=%d, flag=%d, buf=%s\n", i, flag, buf);
        if ((i > 0 && flag))
        {
            ret=record_ssid(ptr, pwvalue);
            print_list(pwvalue, ret);
            wl_clear(pwvalue);
            flag=0;
            i=0;
        }
        ++i;
    }
    if(flag==0) //if only one data; only one SSID info
    {
        ret=record_ssid(ptr, pwvalue);
        print_list(pwvalue, ret);
    }

    for(j=0; j< SSID_NUMS; j++)
        free(ptr[j]);
    free(ptr);

    pclose(pp);
    return 0;
}

/*
 * Check if a file exist using stat() function
 * return 0 if the file exist otherwise return 1
 */
int fexists(const char* filename){
    struct stat buffer;
    int exist = stat(filename,&buffer);
    if(exist == 0)
        return 0;
    else 
        return 1;
}

int main (int argc, char *argv[])
{
    int i=0;
    char wiface[8]={0};
    char wcmd1[128]={0};
    char *wcmd2="scanning | grep -e ESSID -e Quality -e Encryption -e IE -e Authentication -e Finish";

    for(i=1; i<argc; i++)
    {
        if(argv[i] != NULL)
        {
            if ( !(strcmp(argv[i], "-i")) || !(strcmp(argv[i], "--interface")) )
            {
                if (argv[i+1] == NULL)
                {
                    printf("enter an interface name, ex:wlan0\n");
                    return 1;
                }
                strcpy(wiface, argv[i+1]);
                ++i;
                continue;
            }
            else if ( !(strcmp(argv[i], "-p1s")) )
                P1SFLAG=1;
            else if ( !(strcmp(argv[i], "-p2")) )
                P2FLAG=1;
            else if ( !(strcmp(argv[i], "-p2s")) )
                P2SFLAG=1;
            else if (!(strcmp(argv[i], "-h")) || !(strcmp(argv[i], "--help")) )
            {
                printf("Useage:\n");
                printf("    -i or --interface, wifi interface, default:wlan0\n");
                printf("    -p1s,            , print security\n");
                printf("    -p2,             , \n");
                printf("    -p2s,            , print security\n");
                printf("    -h or --help     , help\n");
                printf("[Note]: The number of SSIDs can't not more than 128\n");
                return 0;
            }
            else
         {
                printf("???, argv[%d]=%s\n", i, argv[i]);
                return 0;
            }
        }
    }
    //wifi_list("/home/ubuntu/Open_Source/wireless-tools/wireless-tools_modify/iwlist_era wlp3s0 scanning | grep -e ESSID -e Quality -e Encryption -e IE -e Finish");
    //wifi_list("/home/ubuntu/Open_Source/wireless-tools/wireless-tools_modify/iwlist_era wlp3s0 scanning | grep -e ESSID -e Quality -e Encryption -e IE -e Authentication -e Finish");

    if (fexists("/usr/local/sbin/iwlist_era"))
    {
        printf("iwlist_era, command_not_found\n");
        return 1;
    }

    if (strlen(wiface) > 0)
    {
        strcpy(wcmd1, "iwlist_era ");
        strcat(wcmd1, wiface);
        strcat(wcmd1, " ");
        strcat(wcmd1, wcmd2);
    }
    else
    {
        strcpy(wcmd1, "iwlist_era ");
        strcat(wcmd1, "wlan0");
        strcat(wcmd1, " ");
        strcat(wcmd1, wcmd2);
    }
    wifi_list(wcmd1);

    return 0;
}

沒有留言:

張貼留言