new Makefile, removed list management (-> use general ones), adapted .cvsignore file
[my-code/hdw-sniff.git] / main.c
1 /*
2  * main.c - main hdw-sniff
3  *
4  * Copyright (C) 2004 hackbard@hackdaworld.dyndns.org
5  *
6  */
7
8 #include "main.h"
9
10 /* functions */
11
12 int usage(void) {
13   puts("usage: hdw-sniff <options>");
14   puts("\toptions:\t-m <mode> \t1 monitoring, 2 managed");
15   puts("\t\t-d <device> \twlan0,eth0");
16   puts("\t\t-l <logfile>");
17   puts("\t\t-k <key> \t(string)");
18   puts("\t\t-h \tdisplay this help message");
19   puts("");
20 }
21
22 int hop_channel(t_info *info) {
23  
24   struct iwreq iwreq;
25
26   if(info->current_channel>=CHANNEL_MAX) info->current_channel=1;
27   memset(&iwreq,0,sizeof(iwreq));
28   strcpy(iwreq.ifr_name,info->device);
29   iwreq.u.freq.e=0;
30   iwreq.u.freq.m=info->current_channel;
31   if(ioctl(info->channel_hop_fd,SIOCSIWFREQ,&iwreq)<0) {
32     puts("unable to hop channel");
33     perror("ioctl");
34     return -23;
35   }
36  ++(info->current_channel);
37  return 23;
38 }
39
40 int main(int argc, char **argv) {
41
42   t_info info;
43
44   memset(&info,0,sizeof(t_info));
45  
46  /* parse arguments */
47  for(i=1;i<argc;i++)
48  {
49   if(argv[i][0]=='-')
50   {
51    switch(argv[i][1])
52    {
53     case 'h':
54      usage();
55     case 'm':
56      info.caps=((1<<atoi(argv[i+1]))&CAP_MODE_MASK)|info.caps;
57      ++i;
58      break;
59     case 'l':
60      if ((info.logfile_fd=open(argv[i+1],O_RDWR|O_CREAT))!=0)
61       printf("logfile -> %s\n",argv[i+1]);
62      else
63       puts("warning: can't write to logfile.");
64      ++i;
65      break;
66     case 'd':
67      strncpy(info.device,argv[i+1],MAX_DEV_CHARS);
68      ++i;
69      break;
70    }
71   } else usage();
72  }
73
74  /* setting up device */
75  if((info.caps&CAP_MODE_MASK)==MONITORING_MODE)
76  {
77   sprintf(sys_call,"iwpriv %s monitor %d",info.device,IWPRIV_M_MODE);
78   system(sys_call);
79   puts("set monitoring mode ...");
80  }
81  sprintf(sys_call,"ifconfig %s up",info.device);
82  system(sys_call);
83  puts("device up ...");
84
85  /* pcap */
86  if((info.pcap_handle=pcap_open_live(info.device,BUFSIZ,1,-1,pcap_error))==NULL)
87  {
88   printf("%s: %s\n",argv[0],pcap_error);
89   return -23;
90  }
91  pcap_fd=pcap_fileno(pcap_handle);
92  /* -> non blocking? */
93
94  info.channel_hop_fd=socket(AF_INET,SOCK_DGRAM,0);
95  /* socket fd for channel hopping */
96  
97  /* watch pcap_fd for reading */
98  FD_ZERO(&pcap_fd);
99  FD_SET(pcap_fd,&pcap_fd_set);
100  fd_set_tv.tv_sec=PCAP_SELECT_SEC;
101  pcap_fd_set_tv.tv_usec=PCAP_SELECT_USEC;
102
103  /* parse packages until user breaks */
104  while(!(info.caps&CAP_QUIT_MASK))
105  {
106   if(select(pcap_fd+1,&pcap_fd_set,NULL,NULL,&pcap_fd_set_tv))
107    pcap_dispatch(pcap_handle,-1,parse_package,(unsigned char *)&info);
108   else
109    hop_channel(&info);
110  }
111
112  puts("bugreports: hackbard@hackdaworld.dyndns.org");
113  return 23;
114 }