|
@@ -180,7 +180,7 @@ static void show_help(struct ts *ts) {
|
180
|
180
|
printf("CAMD server options:\n");
|
181
|
181
|
printf(" -A --camd-proto <proto> | Set CAMD network protocol.\n");
|
182
|
182
|
printf(" . Valid protocols are: CS378X (default) and NEWCAMD\n");
|
183
|
|
- printf(" -s --camd-server <addr> | Set CAMD server ip_address:port (1.2.3.4:2233).\n");
|
|
183
|
+ printf(" -s --camd-server <host> | Set CAMD server address. Default port: 2233\n");
|
184
|
184
|
printf(" -U --camd-user <user> | Set CAMD server user. Default: %s\n", ts->camd.user);
|
185
|
185
|
printf(" -P --camd-pass <pass> | Set CAMD server password. Default: %s\n", ts->camd.pass);
|
186
|
186
|
printf(" -B --camd-des-key <key> | Set DES key for newcamd protocol.\n");
|
|
@@ -250,6 +250,8 @@ static int parse_io_param(struct io *io, char *opt, int open_flags, mode_t open_
|
250
|
250
|
}
|
251
|
251
|
|
252
|
252
|
static void parse_options(struct ts *ts, int argc, char **argv) {
|
|
253
|
+ int h_err;
|
|
254
|
+ struct addrinfo hints, *addrinfo = NULL;
|
253
|
255
|
int j, i, ca_err = 0, server_err = 1, input_addr_err = 0, output_addr_err = 0, output_intf_err = 0, ident_err = 0, port_set = 0;
|
254
|
256
|
while ((j = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) {
|
255
|
257
|
char *p = NULL;
|
|
@@ -425,10 +427,25 @@ static void parse_options(struct ts *ts, int argc, char **argv) {
|
425
|
427
|
ts->camd.server_port = atoi(p + 1);
|
426
|
428
|
port_set = 1;
|
427
|
429
|
}
|
428
|
|
- if (inet_aton(optarg, &ts->camd.server_addr) == 0)
|
429
|
|
- server_err = 1;
|
430
|
|
- else
|
431
|
|
- server_err = 0;
|
|
430
|
+ server_err = 1;
|
|
431
|
+
|
|
432
|
+ memset(&hints, 0, sizeof hints);
|
|
433
|
+ hints.ai_family = AF_INET;
|
|
434
|
+ hints.ai_socktype = SOCK_STREAM;
|
|
435
|
+ h_err = getaddrinfo(optarg, NULL, &hints, &addrinfo);
|
|
436
|
+ if (h_err == 0) {
|
|
437
|
+ int num_addrs = 0;
|
|
438
|
+ struct addrinfo *addr;
|
|
439
|
+ for (addr = addrinfo; addr != NULL; addr = addr->ai_next) {
|
|
440
|
+ struct sockaddr_in *ipv4 = (struct sockaddr_in *)addr->ai_addr;
|
|
441
|
+ if (!ts->camd.server_addr.s_addr) // Get the first IP address
|
|
442
|
+ ts->camd.server_addr = ipv4->sin_addr;
|
|
443
|
+ num_addrs++;
|
|
444
|
+ }
|
|
445
|
+ freeaddrinfo(addrinfo);
|
|
446
|
+ if (num_addrs)
|
|
447
|
+ server_err = 0;
|
|
448
|
+ }
|
432
|
449
|
break;
|
433
|
450
|
case 'U': // --camd-user
|
434
|
451
|
if (strlen(optarg) < 64)
|
|
@@ -530,7 +547,7 @@ static void parse_options(struct ts *ts, int argc, char **argv) {
|
530
|
547
|
if (ca_err)
|
531
|
548
|
fprintf(stderr, "ERROR: Requested CA system is unsupported.\n");
|
532
|
549
|
if (server_err)
|
533
|
|
- fprintf(stderr, "ERROR: CAMD server IP address is not set or it is invalid.\n");
|
|
550
|
+ fprintf(stderr, "ERROR: CAMD server address is not set or it is invalid.\n");
|
534
|
551
|
if (input_addr_err)
|
535
|
552
|
fprintf(stderr, "ERROR: Input IP address is invalid.\n");
|
536
|
553
|
if (output_addr_err)
|