-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhatexmpp.c
159 lines (140 loc) · 3.62 KB
/
hatexmpp.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include "common.h"
GMainLoop *main_loop;
GMainContext *context;
GHashTable *config;
GHashTable *roster;
GArray *LogBuf;
int fd_events;
gchar *events_file;
time_t last_activity_time;
enum connection_state_e connection_state;
gchar *eventstr(gchar *str) /* TODO const */
{
#ifdef EVENTS
if (g_hash_table_lookup(config, "events")) {
if (fd_events <= 0) {
fd_events = open(events_file, O_WRONLY | O_NONBLOCK);
#ifdef DEBUG
logf("open fd_events = %d errno = %d", fd_events, errno);
#endif
}
#ifdef DEBUG
logf("Event: fd_events = %d, str = %s", fd_events, str);
#endif
if (fd_events != -1) {
write(fd_events, str, strlen(str) + 1);
#ifdef DEBUG
logf("write to fd_events = %d errno = %d", fd_events, errno);
#endif
}
}
#endif
return str;
}
inline void logs(const char *msg, size_t len)
{
g_array_append_vals(LogBuf, msg, len);
}
gchar * logstr(gchar *msg) /* TODO const */
{
size_t len;
g_printf("LOGF: %s", msg);
len = strlen(msg);
logs(msg, len);
return msg;
}
void destroy_resource(resourceitem *resi)
{
if (resi) {
if (resi->name) g_free(resi->name);
g_free(resi);
}
}
rosteritem *addri(const gchar *jid, GHashTable *resources, unsigned type)
{
rosteritem *ri;
logf("Adding %s to roster\n", jid);
eventf("add_ri %s %s", jid, (type == MUC) ? "MUC" : "BUDDY");
ri = g_new(rosteritem, 1);
if (ri) {
ri->jid = g_strdup(jid);
if (resources)
ri->resources = resources; /* TODO */
else
ri->resources = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify) destroy_resource);
ri->log = g_array_new(FALSE, FALSE, 1);
ri->type = type;
g_hash_table_insert(roster, g_strdup(jid), ri);
ri->self_resource = g_new(resourceitem, 1);
}
return ri;
}
void destroy_ri(rosteritem *RI)
{
if (!RI) return;
eventf("del_ri %s", RI->jid);
if (RI->jid) g_free(RI->jid);
if (RI->resources) g_hash_table_destroy(RI->resources);
if (RI->log) g_array_free(RI->log, TRUE);
if (RI->self_resource) g_free(RI->self_resource);
g_free(RI);
}
void free_all() // trying to make a general cleanup
{
g_hash_table_destroy(roster);
g_array_free(LogBuf, TRUE);
g_hash_table_destroy(config);
}
void init_config()
{
config = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
const struct cfg_s {
char *name;
char *value;
} cfg[] = {
{ "username", NULL },
{ "password", NULL },
{ "register", NULL },
{ "resource", "hatexmpp" },
{ "priority", "0" },
{ "show", NULL },
{ "status", NULL },
{ "muc_default_nick", "hatexmpp" },
{ "jiv_name", NULL },
{ "jiv_os", NULL },
{ "jiv_version", NULL },
{ "send_receipts", "1" },
#ifdef PROXY
{ "proxy_server", NULL },
{ "proxy_port", NULL },
{ "proxy_username", NULL },
{ "proxy_password", NULL },
#endif
{ NULL, NULL },
};
const struct cfg_s *cfgp = cfg;
do {
void *v = cfgp->value ? g_strdup(cfgp->value) : NULL;
g_hash_table_insert(config, cfgp->name, v);
} while ((++cfgp)->name);
}
int main(int argc, char **argv)
{
if (!lm_ssl_is_supported()) {
fprintf(stderr, "Your loudmouth distribution doesn't support SSL. hatexmpp won't work properly. Poke the author if you'd like to be able to run it in plaintext-only mode. Exiting.\n");
exit(1);
}
LogBuf = g_array_sized_new(FALSE, FALSE, 1, 512);
logf("hatexmpp v%s is going up\n", HateXMPP_ver);
roster = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify) destroy_ri);
context = g_main_context_new();
main_loop = g_main_loop_new(context, FALSE);
init_config();
xmpp_init();
// Do something with this!!!!!
if (argc) {
events_file = g_strdup_printf("%sevents", argv[1]);
}
logf("Events FIFO: %s\n", events_file);
return fuseinit(argc, argv);
}