]> CyberLeo.Net >> Repos - SourceForge/eyefi-config.git/blob - eyefi-unix.c
prefix the network types with NET_
[SourceForge/eyefi-config.git] / eyefi-unix.c
1 /*
2  * eyefi-unix.c
3  *
4  * Copyright (C) 2008 Dave Hansen <dave@sr71.net>
5  *
6  * This software may be redistributed and/or modified under the terms of
7  * the GNU General Public License ("GPL") version 2 as published by the
8  * Free Software Foundation.
9  */
10
11 #include "eyefi-config.h"
12
13 void print_pascal_string(struct pascal_string *str)
14 {
15         int i;
16         for (i = 0; i < str->length; i++)
17                 printf("%c", str->value[i]);
18 }
19
20 void print_mac(struct mac_address *mac)
21 {
22         int i;
23         for (i=0; i < MAC_BYTES-1; i++) {
24                 printf("%02x:", mac->mac[i]);
25         }
26         printf("%02x\n", mac->mac[i]);
27 }
28
29
30 void print_card_mac(void)
31 {
32         debug_printf(2, "%s()\n", __func__);
33         struct mac_address *mac;
34
35         card_info_cmd(MAC_ADDRESS);
36         mac = eyefi_response();
37         assert(mac->length == MAC_BYTES);
38         printf("card mac address: ");
39         print_mac(mac);
40 }
41
42 void print_card_firmware_info(void)
43 {
44         struct card_firmware_info *info = fetch_card_firmware_info();
45         printf("card firmware (len: %d): '", info->info.length);
46         print_pascal_string(&info->info);
47         printf("'\n");
48 }
49
50 void print_card_key(void)
51 {
52         debug_printf(2, "%s()\n", __func__);
53         struct card_info_rsp_key *foo = fetch_card_key();
54         printf("card key (len: %d): '", foo->key.length);
55         print_pascal_string(&foo->key);
56         printf("'\n");
57 }
58
59 void scan_print_nets(void)
60 {
61         int i;
62
63         debug_printf(2, "%s()\n", __func__);
64         struct scanned_net_list *scanned = scan_nets();
65         if (scanned->nr == 0) {
66                 printf("unable to detect any wireless networks\n");
67                 return;
68         }
69         printf("Scanned wireless networks:\n");
70         for (i=0; i < scanned->nr; i++) {
71                 struct scanned_net *net = &scanned->nets[i];
72                 printf("'%s' type(%d): %s, strength: %d\n", net->essid,
73                                 net->type,
74                                 net_type_name(net->type),
75                                 net->strength);
76         }
77 }
78
79 void print_configured_nets(void)
80 {
81         int ret;
82         int i;
83         struct configured_net_list *configured = fetch_configured_nets();
84
85         debug_printf(2, "%s()\n", __func__);
86         ret = issue_noarg_command('l');
87         if (ret) {
88                 printf("error issuing print networks command: %d\n", ret);
89                 return;
90         }
91         configured = eyefi_response();
92         if (configured->nr == 0) {
93                 printf("No wireless networks configured on card\n");
94                 return;
95         }
96         printf("configured wireless networks:\n");
97         for (i=0; i < configured->nr; i++) {
98                 struct configured_net *net = &configured->nets[i];
99                 printf("'%s'\n", net->essid);
100         }
101 }
102
103 int try_connection_to(char *essid, char *wpa_ascii)
104 {
105         int i;
106         int ret = -1;
107         const char *type;
108
109         type = net_type_name(NET_WPA);
110         if (!wpa_ascii)
111                 type = net_type_name(NET_UNSECURED);
112
113         eyefi_printf("trying to connect to network: '%s'", essid);
114         eyefi_printf("of type: '%s'\n", type);
115         if (wpa_ascii)
116                 eyefi_printf(" with passphrase: '%s'", wpa_ascii);
117         fflush(NULL);
118
119         // test network
120         network_action('t', essid, wpa_ascii);
121         u8 last_rsp = -1;
122
123         char rsp = '\0';
124         for (i=0; i < 200; i++) {
125                 struct byte_response *r;
126                 issue_noarg_command('s');
127                 r = eyefi_response();
128                 rsp = r->response;
129                 char *state = net_test_state_name(rsp);
130                 if (rsp == last_rsp) {
131                         eyefi_printf(".");
132                         fflush(NULL);;
133                 } else {
134                         if (rsp)
135                                 eyefi_printf("\nTesting connecion to '%s' (%d): %s", essid, rsp, state);
136                         last_rsp = rsp;
137                 }
138                 
139                 if (!strcmp("success", state)) {
140                         ret = 0;
141                         break;
142                 }
143                 if (!strcmp("not scanning", state))
144                         break;
145                 if (!strcmp("unknown", state))
146                         break;
147         }
148         eyefi_printf("\n");
149         if (!ret) {
150                 eyefi_printf("Succeeded connecting to: '%s'\n", essid);
151         } else {
152                 eyefi_printf("Unable to connect to: '%s' (final state: %d/'%s')\n", essid,
153                                 rsp, net_test_state_name(rsp));
154         }
155         return ret;
156 }
157
158 int print_log(void)
159 {
160         int i;
161         u8 *resbuf = malloc(EYEFI_BUF_SIZE*4);
162         int total_bytes;
163
164         total_bytes = get_log_into(resbuf);
165         if (total_bytes < 0) {
166                 debug_printf(1, "%s() error: %d\n", __func__, total_bytes);
167                 return total_bytes;
168         }
169         // The last byte *should* be a null, and the 
170         // official software does not print it.
171         for (i = 0; i < total_bytes-1; i++) {
172                 char c = resbuf[i];
173                 // the official software converts UNIX to DOS-style
174                 // line breaks, so we'll do the same
175                 if (c == '\n')
176                         printf("%c", '\r');
177                 printf("%c", c);
178         }
179         printf("\n");
180         // just some simple sanity checking to make sure what
181         // we are fetching looks valid
182         /* needs to be rethought for the new aligned logs
183         int null_bytes_left = 20;
184         if (resbuf[log_end] != 0) {
185                 debug_printf(2, "error: unexpected last byte (%ld/0x%lx) of log: %02x\n",
186                                 log_end, log_end, resbuf[log_end]);
187                 for (i=0; i<log_size; i++) {
188                         if (resbuf[i])
189                                 continue;
190                         if (null_bytes_left <= 0)
191                                 continue;
192                         null_bytes_left--;
193                         debug_printf(2, "null byte %d\n", i);
194                 }
195         }
196         */
197         return 0;
198 }
199
200 void open_error(char *file, int ret)
201 {
202         fprintf(stderr, "unable to open '%s' (%d)\n", file, ret);
203         fprintf(stderr, "Is the Eye-Fi card inserted and mounted at: %s ?\n", locate_eyefi_mount());
204         fprintf(stderr, "Do you have write permissions to it?\n");
205         fprintf(stderr, "debug information:\n");
206         if (eyefi_debug_level > 0)
207                 system("cat /proc/mounts >&2");
208         if (eyefi_debug_level > 1)
209                 perror("bad open");
210         exit(1);
211 }
212
213 void usage(void)
214 {
215         printf("Usage:\n");
216         printf("  eyefitest [OPTIONS]\n");
217         printf("  -a ESSID      add network (implies test unless --force)\n");
218         printf("  -t ESSID      test network\n");
219         printf("  -p KEY        set WPA key for add/test\n");
220         printf("  -r ESSID      remove network\n");
221         printf("  -s            scan for networks\n");
222         printf("  -c            list configured networks\n");
223         printf("  -b            reboot card\n");
224         printf("  -f            print information about card firmware\n");
225         printf("  -d level      set debugging level (default: 1)\n");
226         printf("  -k            print card unique key\n");
227         printf("  -l            dump card log\n");
228         printf("  -m            print card mac\n");
229         exit(4);
230 }
231
232 int main(int argc, char **argv)
233 {
234         int option_index;
235         char c;
236         int magic0 = 19790111;
237         char *essid = NULL;
238         char *passwd = NULL;
239         int magic1 = 1111979;
240         char network_action = 0;
241         static int force = 0;
242         static struct option long_options[] = {
243                 //{"wep", 'x', &passed_wep, 1},
244                 //{"wpa", 'y', &passed_wpa, 1},
245                 {"force", 0, &force, 1},
246                 {"help", 'h', NULL, 1},
247         };
248
249         if (argc == 1)
250                 usage();
251
252         debug_printf(3, "%s starting...\n", argv[0]);
253
254         debug_printf(3, "about to parse arguments\n");
255         while ((c = getopt_long_only(argc, argv, "a:bcd:kflmp:r:st:z",
256                         &long_options[0], &option_index)) != -1) {
257                 debug_printf(3, "argument: '%c' %d optarg: '%s'\n", c, c, optarg);
258                 switch (c) {
259                 case 0:
260                         // was a long argument
261                         break;
262                 case 'a':
263                 case 't':
264                 case 'r':
265                         essid = strdup(optarg);
266                         network_action = c;
267                         break;
268                 case 'b':
269                         reboot_card();
270                         break;
271                 case 'c':
272                         print_configured_nets();
273                         break;
274                 case 'd':
275                         eyefi_debug_level = atoi(optarg);
276                         fprintf(stderr, "set debug level to: %d\n", eyefi_debug_level);
277                         break;
278                 case 'f':
279                         print_card_firmware_info();
280                         break;
281                 case 'k':
282                         print_card_key();
283                         break;
284                 case 'l':
285                         print_log();
286                         break;
287                 case 'm':
288                         print_card_mac();
289                         break;
290                 case 'p':
291                         passwd = strdup(optarg);
292                         break;
293                 case 's':
294                         scan_print_nets();
295                         break;
296                 case 'z': {
297                         extern void testit0(void);
298                         testit0();
299                         break;
300                 }
301                 case 'h':
302                 default:
303                         usage();
304                         break;
305                 }
306         }
307
308         debug_printf(3, "after arguments1 essid: '%s' passwd: '%s'\n", essid, passwd);
309         if (network_action && essid) {
310                 int ret = 0;
311                 init_card();
312                 switch (network_action) {
313                 case 't':
314                         ret = try_connection_to(essid, passwd);
315                         break;
316                 case 'a':
317                         if (!force) {
318                                 ret = try_connection_to(essid, passwd);
319                         } else {
320                                 debug_printf(1, "forced: skipping network test\n");
321                         }
322                         if (ret) {
323                                 printf("Error connecting to network '%s', not adding.\n", essid);
324                                 printf("use --force to override\n");
325                                 break;
326                         }
327                         add_network(essid, passwd);
328                         break;
329                 case 'r':
330                         remove_network(essid);
331                         break;
332                 }
333         }
334
335         free(essid);
336         free(passwd);
337         return 0;
338 }
339
340