author | Tero Marttila <terom@fixme.fi> |
Sat, 28 Feb 2009 20:23:37 +0200 | |
changeset 16 | 20ce0029e4a0 |
parent 15 | 9bbeace56269 |
child 17 | 5001564ac5fc |
permissions | -rw-r--r-- |
0 | 1 |
|
2 |
#include <stdlib.h> |
|
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
3 |
#include <stdbool.h> |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
4 |
#include <err.h> |
0 | 5 |
#include <stdio.h> |
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
6 |
#include <getopt.h> |
0 | 7 |
|
9
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
8 |
#include <event2/event.h> |
0 | 9 |
|
1
cf0e1bb6bcab
a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
10 |
#include "sock.h" |
8
be88e543c8ff
split off line_proto, and make sock_stream_error return a const error_info
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
11 |
#include "line_proto.h" |
1
cf0e1bb6bcab
a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
12 |
|
14
3a70e5901f17
fix sock_gnutls_read/write EAGAIN
Tero Marttila <terom@fixme.fi>
parents:
13
diff
changeset
|
13 |
#define CONNECT_HOST "irc.fixme.fi" |
3a70e5901f17
fix sock_gnutls_read/write EAGAIN
Tero Marttila <terom@fixme.fi>
parents:
13
diff
changeset
|
14 |
#define CONNECT_SERV "6697" |
0 | 15 |
#define LINE_LENGTH 512 |
16 |
||
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
17 |
static struct option options[] = { |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
18 |
{"help", 0, NULL, 'h' }, |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
19 |
{"hostname", 1, NULL, 'H' }, |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
20 |
{"port", 1, NULL, 'P' }, |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
21 |
{"ssl", 0, NULL, 'S' }, |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
22 |
{0, 0, 0, 0 }, |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
23 |
}; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
24 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
25 |
void usage (const char *exe) |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
26 |
{ |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
27 |
printf("Usage: %s [OPTIONS]\n", exe); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
28 |
printf("\n"); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
29 |
printf(" --help / -h display this message\n"); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
30 |
printf(" --hostname / -H HOST set hostname to connect to\n"); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
31 |
printf(" --port / -P PORT set service port to connect to\n"); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
32 |
printf(" --ssl / -S use SSL\n"); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
33 |
} |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
34 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
35 |
void on_line (const char *line, void *arg) |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
36 |
{ |
11
14e79683c48c
working event-based operation for sock_tcp
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
37 |
printf("<<< %s\n", line); |
14e79683c48c
working event-based operation for sock_tcp
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
38 |
} |
14e79683c48c
working event-based operation for sock_tcp
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
39 |
|
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
40 |
int main (int argc, char **argv) |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
41 |
{ |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
42 |
int opt, option_index; |
9
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
43 |
struct event_base *ev_base; |
1
cf0e1bb6bcab
a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
44 |
struct sock_stream *sock; |
8
be88e543c8ff
split off line_proto, and make sock_stream_error return a const error_info
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
45 |
struct line_proto *lp; |
9
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
46 |
struct error_info _err; |
0 | 47 |
|
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
48 |
const char *hostname = CONNECT_HOST, *portname = CONNECT_SERV; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
49 |
bool ssl = 0; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
50 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
51 |
// parse options |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
52 |
while ((opt = getopt_long(argc, argv, "hH:P:S", options, &option_index)) != -1) { |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
53 |
switch (opt) { |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
54 |
case 'h': |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
55 |
usage(argv[0]); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
56 |
return EXIT_SUCCESS; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
57 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
58 |
case 'H': |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
59 |
hostname = optarg; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
60 |
break; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
61 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
62 |
case 'P': |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
63 |
portname = optarg; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
64 |
break; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
65 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
66 |
case 'S': |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
67 |
ssl = true; |
16 | 68 |
break; |
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
69 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
70 |
case '?': |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
71 |
usage(argv[0]); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
72 |
return EXIT_FAILURE; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
73 |
} |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
74 |
} |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
75 |
|
9
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
76 |
// initialize libevent |
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
77 |
if ((ev_base = event_base_new()) == NULL) |
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
78 |
err(1, "event_base_new"); |
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
79 |
|
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
80 |
// initialize sock module |
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
81 |
if (sock_init(ev_base, &_err)) |
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
82 |
errx(1, "sock_init: %s", error_msg(&_err)); |
4
a3ca0f97a075
change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents:
2
diff
changeset
|
83 |
|
0 | 84 |
// over-simplified connect |
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
85 |
if (ssl) { |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
86 |
if (sock_ssl_connect(&sock, hostname, portname, &_err)) |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
87 |
errx(1, "sock_ssl_connect: %s", error_msg(&_err)); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
88 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
89 |
} else { |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
90 |
if (sock_tcp_connect(&sock, hostname, portname, &_err)) |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
91 |
errx(1, "sock_tcp_connect: %s", error_msg(&_err)); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
92 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
93 |
} |
0 | 94 |
|
13
ca16f3a8f3b7
add support for \n line endings as well
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
95 |
// line protocol, with safety margin for buffer |
ca16f3a8f3b7
add support for \n line endings as well
Tero Marttila <terom@fixme.fi>
parents:
12
diff
changeset
|
96 |
if (line_proto_create(&lp, sock, LINE_LENGTH * 2, on_line, NULL, &_err)) |
9
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
97 |
errx(1, "line_proto_create: %s", error_msg(&_err)); |
8
be88e543c8ff
split off line_proto, and make sock_stream_error return a const error_info
Tero Marttila <terom@fixme.fi>
parents:
7
diff
changeset
|
98 |
|
11
14e79683c48c
working event-based operation for sock_tcp
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
99 |
// run event loop |
14e79683c48c
working event-based operation for sock_tcp
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
100 |
if (event_base_dispatch(ev_base)) |
14e79683c48c
working event-based operation for sock_tcp
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
101 |
errx(1, "event_base_dispatch"); |
0 | 102 |
|
11
14e79683c48c
working event-based operation for sock_tcp
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
103 |
// ok, no cleanup |
0 | 104 |
return 0; |
105 |
} |
|
106 |