LIBSSDP
 All Classes Files Functions Variables Typedefs Macros
configuration.c
Go to the documentation of this file.
1 
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include <unistd.h>
11 
12 #include "common_definitions.h"
13 #include "configuration.h"
14 #include "log.h"
15 #include "net_utils.h"
16 #include "ssdp_message.h"
17 
19 
20  /* Default configuration */
21  memset(c->interface, '\0', IPv6_STR_MAX_SIZE);
22  memset(c->ip, '\0', IPv6_STR_MAX_SIZE);
23  c->run_as_daemon = FALSE;
24  c->run_as_server = FALSE;
27  c->forward_address = NULL;
28  c->ssdp_cache_size = 10;
29  c->fetch_info = TRUE;
30  c->json_output = FALSE;
31  c->xml_output = FALSE;
32  c->oneline_output = TRUE;
33  c->monochrome = FALSE;
34  c->ttl = 64;
35  c->filter = NULL;
37  c->use_ipv4 = FALSE;
38  c->use_ipv6 = FALSE;
39  c->quiet_mode = FALSE;
42 }
43 
44 void usage(void) {
45  printf("[A]bused is [B]anks [U]ber-[S]exy-[E]dition [D]aemon\"\n\n");
46  printf("USAGE: abused [OPTIONS]\n");
47  printf("OPTIONS:\n");
48  //printf("\t-C <file.conf> Configuration file to use\n");
49  printf("\t-i Interface to use, default is all\n");
50  printf("\t-I Interface IP address to use, default is a bind-all address\n");
51  printf("\t-t TTL value (routers to hop), default is 1\n");
52  printf("\t-f <string> Filter for capturing, 'grep'-like effect. Also works\n");
53  printf("\t for -u and -U where you can specify a list of\n");
54  printf("\t comma separated filters\n");
55  printf("\t-M Don't ignore UPnP M-SEARCH messages\n");
56  printf("\t-S Run as a server,\n");
57  printf("\t listens on port 43210 and returns a\n");
58  printf("\t UPnP scan result (formatted list) for AXIS devices\n");
59  printf("\t upon receiving the string 'abused'\n");
60  printf("\t-d Run as a UNIX daemon,\n");
61  printf("\t only works in combination with -S or -a\n");
62  printf("\t-u Listen for local UPnP (SSDP) notifications\n");
63  printf("\t-U Perform an active search for UPnP devices\n");
64  printf("\t-a <ip>:<port> Forward the events to the specified ip and port,\n");
65  printf("\t also works in combination with -u.\n");
66  printf("\t-F Do not try to parse the \"Location\" header and fetch device info\n");
67  //printf("\t-j Convert results to JSON\n");
68  printf("\t-x Convert results to XML\n");
69  printf("\t-m Monochrome mode (disable all colors)\n");
70  //printf("\t-4 Force the use of the IPv4 protocol\n");
71  //printf("\t-6 Force the use of the IPv6 protocol\n");
72  printf("\t-q Be quiet!\n");
73  printf("\t-T The time to wait for a devices answer a search query\n");
74  printf("\t-L Enable multicast loopback traffic\n");
75  printf("\t-R Print full SSDP messagesd (Rich mode)\n");
76 }
77 
78 int parse_args(const int argc, char * const *argv, configuration_s *conf) {
79  int opt;
80 
81  while ((opt = getopt(argc, argv, "C:i:I:t:f:MSduUma:RFc:jx64qT:LR")) > 0) {
82  char *pend = NULL;
83 
84  switch (opt) {
85 
86  case 'C':
87  /*if(!parse_configuration_file(conf, optarg)) {
88  printf("Parsing of '%s' failed!, optarg);
89  };*/
90  break;
91 
92  case 'i':
93  strncpy(conf->interface, optarg, IPv6_STR_MAX_SIZE);
94  break;
95 
96  case 'I':
97  strncpy(conf->ip, optarg, IPv6_STR_MAX_SIZE);
98  break;
99 
100  case 't':
101  // TODO: errorhandling
102  pend = NULL;
103  conf->ttl = (unsigned char)strtol(optarg, &pend, 10);
104  break;
105 
106  case 'f':
107  conf->filter = optarg;
108  break;
109 
110  case 'M':
111  conf->ignore_search_msgs = FALSE;
112  break;
113 
114  case 'S':
115  conf->run_as_server = TRUE;
116  break;
117 
118  case 'd':
119  conf->run_as_daemon = TRUE;
120  break;
121 
122  case 'u':
123  conf->listen_for_upnp_notif = TRUE;
124  break;
125 
126  case 'U':
127  conf->scan_for_upnp_devices = TRUE;
128  break;
129 
130  case 'a':
131  conf->forward_address = optarg;
132  break;
133 
134  case 'F':
135  conf->fetch_info = FALSE;
136  break;
137 
138  case 'c':
139  // TODO: errorhandling
140  pend = NULL;
141  conf->ssdp_cache_size = (int)strtol(optarg, &pend, 10);
142  break;
143 
144  case 'j':
145  conf->xml_output = FALSE;
146  conf->json_output = TRUE;
147  break;
148 
149  case 'x':
150  conf->json_output = FALSE;
151  conf->xml_output = TRUE;
152  break;
153 
154  case 'm':
155  conf->monochrome = TRUE;
156  break;
157 
158  case '4':
159  conf->use_ipv6 = FALSE;
160  conf->use_ipv4 = TRUE;
161  break;
162 
163  case '6':
164  conf->use_ipv4 = FALSE;
165  conf->use_ipv6 = TRUE;
166  break;
167 
168  case 'q':
169  conf->quiet_mode = TRUE;
170  break;
171 
172  case 'T':
173  pend = NULL;
174  conf->upnp_timeout = (int)strtol(optarg, &pend, 10);
175  break;
176 
177  case 'L':
178  conf->enable_loopback = TRUE;
179  break;
180 
181  case 'R':
182  conf->xml_output = FALSE;
183  conf->oneline_output = FALSE;
184  break;
185 
186  default:
187  usage();
188  return 1;
189  }
190  }
191 
192  return 0;
193 }
194 
#define IPv6_STR_MAX_SIZE
char ip[IPv6_STR_MAX_SIZE]
Definition: configuration.h:18
char interface[IPv6_STR_MAX_SIZE]
Definition: configuration.h:16
#define TRUE
#define FALSE
int parse_args(const int argc, char *const *argv, configuration_s *conf)
Definition: configuration.c:78
void set_default_configuration(configuration_s *c)
Definition: configuration.c:18
unsigned char ttl
Definition: configuration.h:50
#define MULTICAST_TIMEOUT
Definition: ssdp_message.h:20
void usage(void)
Definition: configuration.c:44
static configuration_s conf
Definition: main.c:73