-
Notifications
You must be signed in to change notification settings - Fork 3
/
hajime_getpeerpubkey.c
127 lines (104 loc) · 2.81 KB
/
hajime_getpeerpubkey.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <getopt.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <rho/rho.h>
#include "hajime.h"
#define HAJIME_GETPEERPUBKEY_USAGE \
"hajime_getpeerpubkey [options] IP PORT\n" \
"-h, --help\n" \
" display this help message and exit\n\n" \
"-t, --timeout SECS\n" \
" timeout after SECS of inactivity\n\n" \
"-v, --verbose\n" \
" verbose output"
bool g_verbose = false;;
static void
usage(int exit_code)
{
fprintf(stderr, "%s\n", HAJIME_GETPEERPUBKEY_USAGE);
exit(exit_code);
}
static void
verbose_printf(const char *fmt, ...)
{
va_list ap;
if (!g_verbose)
return;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}
int
main(int argc, char *argv[])
{
int error = 0;
struct hajime_bot *bot = NULL;
uint8_t peerpubkey[HAJIME_KEY_LENGTH] = { 0 };
char keyhex[HAJIME_KEY_LENGTH * 2 + 1] = { 0 };
struct timespec timeout = { 0 };
const char *ipstr = NULL;
uint16_t port = 0;
int ch = 0;
const char *short_options = "ht:v";
static struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{"timeout", required_argument, NULL, 't'},
{"verbose", no_argument, NULL, 'v'},
{NULL, 0, NULL, 0}
};
while ((ch = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) {
switch (ch) {
case 'h':
usage(EXIT_SUCCESS);
break;
case 't':
timeout.tv_sec = rho_str_touint(optarg, 10);
break;
case 'v':
g_verbose = true;
break;
default:
usage(EXIT_FAILURE);
}
}
argc -= optind;
argv += optind;
if (argc != 2)
usage(EXIT_FAILURE);
ipstr = argv[0];
port = rho_str_touint16(argv[1], 10);
hajime_bot_libinit();
if (timeout.tv_sec == 0)
bot = hajime_bot_create_client(NULL);
else
bot = hajime_bot_create_client(&timeout);
verbose_printf("connecting...\n");
error = hajime_bot_connect(bot, ipstr, port);
if (error == -1) {
printf("%s:%"PRIu16 " error: failed to connect\n", ipstr, port);
goto fail;
}
verbose_printf("connected\n");
verbose_printf("exchanging keys...\n");
error = hajime_bot_key_exchange(bot, peerpubkey);
if (error == -1) {
printf("%s:%"PRIu16 " error: failed to exchange keys\n", ipstr, port);
goto fail;
}
verbose_printf("keys exchanged\n");
rho_binascii_hexlify(peerpubkey, HAJIME_KEY_LENGTH, keyhex);
printf("%s:%"PRIu16 " pubkey=%s\n", ipstr, port, keyhex);
if (error == 0)
hajime_bot_close(bot);
goto succeed;
fail:
error = 1;
succeed:
hajime_bot_destroy(bot);
hajime_bot_libfini();
return (error);
}