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

📄 iwevent.c

📁 This package contains the Wireless tools, used to manipulate the Wireless Extensions. The Wireless
💻 C
📖 第 1 页 / 共 2 页
字号:
	char custom[IW_CUSTOM_MAX+1];	memset(custom, '\0', sizeof(custom));	if((event->u.data.pointer) && (event->u.data.length))	  memcpy(custom, event->u.data.pointer, event->u.data.length);	printf("Custom driver event:%s\n", custom);      }      break;    case IWEVREGISTERED:      printf("Registered node:%s\n",	     iw_saether_ntop(&event->u.addr, buffer));      break;    case IWEVEXPIRED:      printf("Expired node:%s\n",	     iw_saether_ntop(&event->u.addr, buffer));      break;    case SIOCGIWTHRSPY:      {	struct iw_thrspy	threshold;	if((event->u.data.pointer) && (event->u.data.length))	  {	    memcpy(&threshold, event->u.data.pointer,		   sizeof(struct iw_thrspy));	    printf("Spy threshold crossed on address:%s\n",		   iw_saether_ntop(&threshold.addr, buffer));	    iw_print_stats(buffer, sizeof(buffer),			   &threshold.qual, iw_range, has_range);	    printf("                            Link %s\n", buffer);	  }	else	  printf("Invalid Spy Threshold event\n");      }      break;      /* ----- driver WPA events ----- */      /* Events generated by the driver, used for WPA operation */    case IWEVMICHAELMICFAILURE:      if(event->u.data.length >= sizeof(struct iw_michaelmicfailure))	{	  struct iw_michaelmicfailure mf;	  memcpy(&mf, event->u.data.pointer, sizeof(mf));	  printf("Michael MIC failure flags:0x%X src_addr:%s tsc:%s\n",		 mf.flags,		 iw_saether_ntop(&mf.src_addr, buffer2),		 iw_hexdump(buffer, sizeof(buffer),			    mf.tsc, IW_ENCODE_SEQ_MAX_SIZE));	}      break;    case IWEVASSOCREQIE:      printf("Association Request IEs:%s\n",	     iw_hexdump(buffer, sizeof(buffer),			event->u.data.pointer, event->u.data.length));      break;    case IWEVASSOCRESPIE:      printf("Association Response IEs:%s\n",	     iw_hexdump(buffer, sizeof(buffer),			event->u.data.pointer, event->u.data.length));      break;    case IWEVPMKIDCAND:      if(event->u.data.length >= sizeof(struct iw_pmkid_cand))	{	  struct iw_pmkid_cand cand;	  memcpy(&cand, event->u.data.pointer, sizeof(cand));	  printf("PMKID candidate flags:0x%X index:%d bssid:%s\n",		 cand.flags, cand.index,		 iw_saether_ntop(&cand.bssid, buffer));	}      break;      /* ----- junk ----- */      /* other junk not currently in use */    case SIOCGIWRATE:      iw_print_bitrate(buffer, sizeof(buffer), event->u.bitrate.value);      printf("New Bit Rate:%s\n", buffer);      break;    case SIOCGIWNAME:      printf("Protocol:%-1.16s\n", event->u.name);      break;    case IWEVQUAL:      {	event->u.qual.updated = 0x0;	/* Not that reliable, disable */	iw_print_stats(buffer, sizeof(buffer),		       &event->u.qual, iw_range, has_range);	printf("Link %s\n", buffer);	break;      }    default:      printf("(Unknown Wireless event 0x%04X)\n", event->cmd);    }	/* switch(event->cmd) */  return(0);}/*------------------------------------------------------------------*//* * Print out all Wireless Events part of the RTNetlink message * Most often, there will be only one event per message, but * just make sure we read everything... */static inline intprint_event_stream(int		ifindex,		   char *	data,		   int		len){  struct iw_event	iwe;  struct stream_descr	stream;  int			i = 0;  int			ret;  char			buffer[64];  struct timeval	recv_time;  struct timezone	tz;  struct wireless_iface *	wireless_data;  /* Get data from cache */  wireless_data = iw_get_interface_data(ifindex);  if(wireless_data == NULL)    return(-1);  /* Print received time in readable form */  gettimeofday(&recv_time, &tz);  iw_print_timeval(buffer, sizeof(buffer), &recv_time, &tz);  iw_init_event_stream(&stream, data, len);  do    {      /* Extract an event and print it */      ret = iw_extract_event_stream(&stream, &iwe,				    wireless_data->range.we_version_compiled);      if(ret != 0)	{	  if(i++ == 0)	    printf("%s   %-8.16s ", buffer, wireless_data->ifname);	  else	    printf("                           ");	  if(ret > 0)	    print_event_token(&iwe,			      &wireless_data->range, wireless_data->has_range);	  else	    printf("(Invalid event)\n");	  /* Push data out *now*, in case we are redirected to a pipe */	  fflush(stdout);	}    }  while(ret > 0);  return(0);}/*********************** RTNETLINK EVENT DUMP***********************//* * Dump the events we receive from rtnetlink * This code is mostly from Casey *//*------------------------------------------------------------------*//* * Respond to a single RTM_NEWLINK event from the rtnetlink socket. */static intLinkCatcher(struct nlmsghdr *nlh){  struct ifinfomsg* ifi;#if 0  fprintf(stderr, "nlmsg_type = %d.\n", nlh->nlmsg_type);#endif  ifi = NLMSG_DATA(nlh);  /* Code is ugly, but sort of works - Jean II */  /* If interface is getting destoyed */  if(nlh->nlmsg_type == RTM_DELLINK)    {      /* Remove from cache (if in cache) */      iw_del_interface_data(ifi->ifi_index);      return 0;    }  /* Only keep add/change events */  if(nlh->nlmsg_type != RTM_NEWLINK)    return 0;  /* Check for attributes */  if (nlh->nlmsg_len > NLMSG_ALIGN(sizeof(struct ifinfomsg)))    {      int attrlen = nlh->nlmsg_len - NLMSG_ALIGN(sizeof(struct ifinfomsg));      struct rtattr *attr = (void *) ((char *) ifi +				      NLMSG_ALIGN(sizeof(struct ifinfomsg)));      while (RTA_OK(attr, attrlen))	{	  /* Check if the Wireless kind */	  if(attr->rta_type == IFLA_WIRELESS)	    {	      /* Go to display it */	      print_event_stream(ifi->ifi_index,				 (char *) attr + RTA_ALIGN(sizeof(struct rtattr)),				 attr->rta_len - RTA_ALIGN(sizeof(struct rtattr)));	    }	  attr = RTA_NEXT(attr, attrlen);	}    }  return 0;}/* ---------------------------------------------------------------- *//* * We must watch the rtnelink socket for events. * This routine handles those events (i.e., call this when rth.fd * is ready to read). */static inline voidhandle_netlink_events(struct rtnl_handle *	rth){  while(1)    {      struct sockaddr_nl sanl;      socklen_t sanllen = sizeof(struct sockaddr_nl);      struct nlmsghdr *h;      int amt;      char buf[8192];      amt = recvfrom(rth->fd, buf, sizeof(buf), MSG_DONTWAIT, (struct sockaddr*)&sanl, &sanllen);      if(amt < 0)	{	  if(errno != EINTR && errno != EAGAIN)	    {	      fprintf(stderr, "%s: error reading netlink: %s.\n",		      __PRETTY_FUNCTION__, strerror(errno));	    }	  return;	}      if(amt == 0)	{	  fprintf(stderr, "%s: EOF on netlink??\n", __PRETTY_FUNCTION__);	  return;	}      h = (struct nlmsghdr*)buf;      while(amt >= (int)sizeof(*h))	{	  int len = h->nlmsg_len;	  int l = len - sizeof(*h);	  if(l < 0 || len > amt)	    {	      fprintf(stderr, "%s: malformed netlink message: len=%d\n", __PRETTY_FUNCTION__, len);	      break;	    }	  switch(h->nlmsg_type)	    {	    case RTM_NEWLINK:	    case RTM_DELLINK:	      LinkCatcher(h);	      break;	    default:#if 0	      fprintf(stderr, "%s: got nlmsg of type %#x.\n", __PRETTY_FUNCTION__, h->nlmsg_type);#endif	      break;	    }	  len = NLMSG_ALIGN(len);	  amt -= len;	  h = (struct nlmsghdr*)((char*)h + len);	}      if(amt > 0)	fprintf(stderr, "%s: remnant of size %d on netlink\n", __PRETTY_FUNCTION__, amt);    }}/**************************** MAIN LOOP ****************************//* ---------------------------------------------------------------- *//* * Wait until we get an event */static inline intwait_for_event(struct rtnl_handle *	rth){#if 0  struct timeval	tv;	/* Select timeout */#endif  /* Forever */  while(1)    {      fd_set		rfds;		/* File descriptors for select */      int		last_fd;	/* Last fd */      int		ret;      /* Guess what ? We must re-generate rfds each time */      FD_ZERO(&rfds);      FD_SET(rth->fd, &rfds);      last_fd = rth->fd;      /* Wait until something happens */      ret = select(last_fd + 1, &rfds, NULL, NULL, NULL);      /* Check if there was an error */      if(ret < 0)	{	  if(errno == EAGAIN || errno == EINTR)	    continue;	  fprintf(stderr, "Unhandled signal - exiting...\n");	  break;	}      /* Check if there was a timeout */      if(ret == 0)	{	  continue;	}      /* Check for interface discovery events. */      if(FD_ISSET(rth->fd, &rfds))	handle_netlink_events(rth);    }  return(0);}/******************************* MAIN *******************************//* ---------------------------------------------------------------- *//* * helper ;-) */static voidiw_usage(int status){  fputs("Usage: iwevent [OPTIONS]\n"	"   Monitors and displays Wireless Events.\n"	"   Options are:\n"	"     -h,--help     Print this message.\n"	"     -v,--version  Show version of this program.\n",	status ? stderr : stdout);  exit(status);}/* Command line options */static const struct option long_opts[] = {  { "help", no_argument, NULL, 'h' },  { "version", no_argument, NULL, 'v' },  { NULL, 0, NULL, 0 }};/* ---------------------------------------------------------------- *//* * main body of the program */intmain(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);    }  fprintf(stderr, "Waiting for Wireless Events from interfaces...\n");  /* Do what we have to do */  wait_for_event(&rth);  /* Cleanup - only if you are pedantic */  rtnl_close(&rth);  return(0);}

⌨️ 快捷键说明

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