author | Tero Marttila <terom@fixme.fi> |
Sun, 01 Mar 2009 01:48:14 +0200 | |
changeset 21 | 0911d0b828d4 |
parent 18 | dedf137b504f |
child 22 | c339c020fd33 |
permissions | -rw-r--r-- |
21 | 1 |
|
2 |
#include "log.h" |
|
3 |
#include "sock.h" |
|
4 |
#include "irc_conn.h" |
|
0 | 5 |
|
6 |
#include <stdlib.h> |
|
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
7 |
#include <stdbool.h> |
0 | 8 |
#include <stdio.h> |
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
9 |
#include <getopt.h> |
0 | 10 |
|
9
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
11 |
#include <event2/event.h> |
0 | 12 |
|
1
cf0e1bb6bcab
a fancy socket abstraction layer, with TCP, next, SSL. Also, .hgignore
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
13 |
|
18
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
14 |
#define DEFAULT_HOST "irc.fixme.fi" |
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
15 |
#define DEFAULT_PORT "6667" |
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
16 |
#define DEFAULT_PORT_SSL "6697" |
0 | 17 |
|
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
18 |
static struct option options[] = { |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
19 |
{"help", 0, NULL, 'h' }, |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
20 |
{"hostname", 1, NULL, 'H' }, |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
21 |
{"port", 1, NULL, 'P' }, |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
22 |
{"ssl", 0, NULL, 'S' }, |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
23 |
{0, 0, 0, 0 }, |
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 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
26 |
void usage (const char *exe) |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
27 |
{ |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
28 |
printf("Usage: %s [OPTIONS]\n", exe); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
29 |
printf("\n"); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
30 |
printf(" --help / -h display this message\n"); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
31 |
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
|
32 |
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
|
33 |
printf(" --ssl / -S use SSL\n"); |
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 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
36 |
int main (int argc, char **argv) |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
37 |
{ |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
38 |
int opt, option_index; |
9
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
39 |
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
|
40 |
struct sock_stream *sock; |
18
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
41 |
struct irc_conn *conn; |
21 | 42 |
struct error_info err; |
0 | 43 |
|
18
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
44 |
const char *hostname = DEFAULT_HOST, *portname = DEFAULT_PORT; |
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
45 |
bool ssl = 0; |
18
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
46 |
struct irc_conn_config conn_config = { |
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
47 |
.nickname = "SpBotDev", |
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
48 |
.username = "spbot-dev", |
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
49 |
.realname = "SpBot (development version)", |
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
50 |
}; |
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
51 |
|
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
52 |
bool port_default = true; |
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
53 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
54 |
// parse options |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
55 |
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
|
56 |
switch (opt) { |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
57 |
case 'h': |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
58 |
usage(argv[0]); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
59 |
return EXIT_SUCCESS; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
60 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
61 |
case 'H': |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
62 |
hostname = optarg; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
63 |
break; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
64 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
65 |
case 'P': |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
66 |
portname = optarg; |
18
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
67 |
port_default = false; |
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
68 |
break; |
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 'S': |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
71 |
ssl = true; |
18
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
72 |
|
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
73 |
if (port_default) |
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
74 |
portname = DEFAULT_PORT_SSL; |
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
75 |
|
16 | 76 |
break; |
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
77 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
78 |
case '?': |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
79 |
usage(argv[0]); |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
80 |
return EXIT_FAILURE; |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
81 |
} |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
82 |
} |
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
83 |
|
9
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
84 |
// initialize libevent |
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
85 |
if ((ev_base = event_base_new()) == NULL) |
21 | 86 |
FATAL("event_base_new"); |
9
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
87 |
|
4c4c906cc649
add sock_stream_callbacks and ev_base
Tero Marttila <terom@fixme.fi>
parents:
8
diff
changeset
|
88 |
// initialize sock module |
21 | 89 |
if (sock_init(ev_base, &err)) |
90 |
FATAL_ERROR(&err, "sock_init"); |
|
4
a3ca0f97a075
change ERROR_* to use pointers again, and implement error_info for sock_init
Tero Marttila <terom@fixme.fi>
parents:
2
diff
changeset
|
91 |
|
0 | 92 |
// over-simplified connect |
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
93 |
if (ssl) { |
21 | 94 |
if (sock_ssl_connect(&sock, hostname, portname, &err)) |
95 |
FATAL_ERROR(&err, "sock_ssl_connect(%s, %s)", hostname, portname); |
|
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
96 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
97 |
} else { |
21 | 98 |
if (sock_tcp_connect(&sock, hostname, portname, &err)) |
99 |
FATAL_ERROR(&err, "sock_tcp_connect(%s, %s)", hostname, portname); |
|
15
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
100 |
|
9bbeace56269
add some simple command-line options
Tero Marttila <terom@fixme.fi>
parents:
14
diff
changeset
|
101 |
} |
0 | 102 |
|
18
dedf137b504f
add initial irc_conn code that can register
Tero Marttila <terom@fixme.fi>
parents:
17
diff
changeset
|
103 |
// create the irc connection state |
21 | 104 |
if (irc_conn_create(&conn, sock, &conn_config, &err)) |
105 |
FATAL_ERROR(&err, "irc_conn_create"); |
|
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
|
106 |
|
11
14e79683c48c
working event-based operation for sock_tcp
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
107 |
// run event loop |
14e79683c48c
working event-based operation for sock_tcp
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
108 |
if (event_base_dispatch(ev_base)) |
21 | 109 |
FATAL("event_base_dispatch"); |
0 | 110 |
|
11
14e79683c48c
working event-based operation for sock_tcp
Tero Marttila <terom@fixme.fi>
parents:
10
diff
changeset
|
111 |
// ok, no cleanup |
0 | 112 |
return 0; |
113 |
} |
|
114 |