void client_event_log_csv(client_event * e) { switch (e->type) { case CLIENT_EVENT_TO_AP: printf("to_ap"); break; case CLIENT_EVENT_FROM_AP: printf("from_ap"); break; case CLIENT_EVENT_INTER_HOST: printf("inter_host"); break; default: printf("unknown_type"); break; } printf(",%llu,%d,%d,", (unsigned long long)e->timestamp.tv_sec, e->rssi, (int)e->data_size); print_hardware_address(e->client); putc(',', stdout); print_hardware_address(e->accessPoint); if (e->request_info != NULL) { putc(',', stdout); print_csv_escaped(e->request_info->path); putc(',', stdout); print_csv_escaped(e->request_info->host); putc(',', stdout); print_csv_escaped(e->request_info->user_agent); } else { printf(",,,"); } if (e->response_info != NULL) { printf(",\""); int headerIdx; for (headerIdx = 0; headerIdx < e->response_info->header_count; ++headerIdx) { if (headerIdx != 0) { putc('\n', stdout); } print_quote_escaped(e->response_info->header_names[headerIdx]); printf(": "); print_quote_escaped(e->response_info->header_values[headerIdx]); } printf("\"\n"); } else { printf(",\n"); } fflush(stdout); }
/* determines hardware address on client machine */ int get_hardware_address(int sock,char *interface_name){ #if defined(__linux__) struct ifreq ifr; strncpy((char *)&ifr.ifr_name,interface_name,sizeof(ifr.ifr_name)-1); ifr.ifr_name[sizeof(ifr.ifr_name)-1]='\0'; /* try and grab hardware address of requested interface */ if(ioctl(sock,SIOCGIFHWADDR,&ifr)<0){ printf(_("Error: Could not get hardware address of interface '%s'\n"),interface_name); exit(STATE_UNKNOWN); } memcpy(&client_hardware_address[0],&ifr.ifr_hwaddr.sa_data,6); #elif defined(__bsd__) /* King 2004 see ACKNOWLEDGEMENTS */ int mib[6], len; char *buf; unsigned char *ptr; struct if_msghdr *ifm; struct sockaddr_dl *sdl; mib[0] = CTL_NET; mib[1] = AF_ROUTE; mib[2] = 0; mib[3] = AF_LINK; mib[4] = NET_RT_IFLIST; if((mib[5] = if_nametoindex(interface_name)) == 0){ printf(_("Error: if_nametoindex error - %s.\n"), strerror(errno)); exit(STATE_UNKNOWN); } if(sysctl(mib, 6, NULL, &len, NULL, 0) < 0){ printf(_("Error: Couldn't get hardware address from %s. sysctl 1 error - %s.\n"), interface_name, strerror(errno)); exit(STATE_UNKNOWN); } if((buf = malloc(len)) == NULL){ printf(_("Error: Couldn't get hardware address from interface %s. malloc error - %s.\n"), interface_name, strerror(errno)); exit(4); } if(sysctl(mib, 6, buf, &len, NULL, 0) < 0){ printf(_("Error: Couldn't get hardware address from %s. sysctl 2 error - %s.\n"), interface_name, strerror(errno)); exit(STATE_UNKNOWN); } ifm = (struct if_msghdr *)buf; sdl = (struct sockaddr_dl *)(ifm + 1); ptr = (unsigned char *)LLADDR(sdl); memcpy(&client_hardware_address[0], ptr, 6) ; /* King 2004 */ #elif defined(__sun__) || defined(__solaris__) /* Kompf 2000-2003 see ACKNOWLEDGEMENTS */ long stat; char dev[20] = "/dev/"; char *p; int unit; /* get last number from interfacename, eg lnc0, e1000g0*/ int i; p = interface_name + strlen(interface_name) -1; for(i = strlen(interface_name) -1; i > 0; p--) { if(isalpha(*p)) break; } p++; if( p != interface_name ){ unit = atoi(p) ; strncat(dev, interface_name, 6) ; } else{ printf(_("Error: can't find unit number in interface_name (%s) - expecting TypeNumber eg lnc0.\n"), interface_name); exit(STATE_UNKNOWN); } stat = mac_addr_dlpi(dev, unit, client_hardware_address); if(stat != 0){ printf(_("Error: can't read MAC address from DLPI streams interface for device %s unit %d.\n"), dev, unit); exit(STATE_UNKNOWN); } #elif defined(__hpux__) long stat; char dev[20] = "/dev/dlpi" ; int unit = 0; stat = mac_addr_dlpi(dev, unit, client_hardware_address); if(stat != 0){ printf(_("Error: can't read MAC address from DLPI streams interface for device %s unit %d.\n"), dev, unit); exit(STATE_UNKNOWN); } /* Kompf 2000-2003 */ #else printf(_("Error: can't get MAC address for this architecture. Use the --mac option.\n")); exit(STATE_UNKNOWN); #endif if(verbose) print_hardware_address(client_hardware_address); return OK; }
int call_getopt(int argc, char **argv){ int c=0; int i=0; int option_index = 0; static struct option long_options[] = { {"serverip", required_argument,0,'s'}, {"requestedip", required_argument,0,'r'}, {"timeout", required_argument,0,'t'}, {"interface", required_argument,0,'i'}, {"mac", required_argument,0,'m'}, {"unicast", no_argument, 0,'u'}, {"verbose", no_argument, 0,'v'}, {"version", no_argument, 0,'V'}, {"help", no_argument, 0,'h'}, {0,0,0,0} }; while(1){ c=getopt_long(argc,argv,"+hVvt:s:r:t:i:m:u",long_options,&option_index); i++; if(c==-1||c==EOF||c==1) break; switch(c){ case 'w': case 'r': case 't': case 'i': i++; break; default: break; } switch(c){ case 's': /* DHCP server address */ resolve_host(optarg,&dhcp_ip); add_requested_server(dhcp_ip); break; case 'r': /* address we are requested from DHCP servers */ resolve_host(optarg,&requested_address); request_specific_address=TRUE; break; case 't': /* timeout */ /* if(is_intnonneg(optarg)) */ if(atoi(optarg)>0) dhcpoffer_timeout=atoi(optarg); /* else usage("Time interval must be a nonnegative integer\n"); */ break; case 'm': /* MAC address */ if((user_specified_mac=mac_aton(optarg)) == NULL) usage("Cannot parse MAC address.\n"); if(verbose) print_hardware_address(user_specified_mac); break; case 'i': /* interface name */ strncpy(network_interface_name,optarg,sizeof(network_interface_name)-1); network_interface_name[sizeof(network_interface_name)-1]='\x0'; break; case 'u': /* unicast testing */ unicast=1; break; case 'V': /* version */ print_revision(progname, NP_VERSION); exit(STATE_OK); case 'h': /* help */ print_help(); exit(STATE_OK); case 'v': /* verbose */ verbose=1; break; case '?': /* help */ usage5 (); break; default: break; } } return i; }