1 /*
2 firetalk-int.h - FireTalk wrapper declarations
3 Copyright (C) 2000 Ian Gulliver
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of version 2 of the GNU General Public License as
7 published by the Free Software Foundation.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13 
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 */
18 #ifndef _FIRETALK_INT_H
19 #define _FIRETALK_INT_H
20 
21 #ifdef HAVE_CONFIG_H
22 # include "config.h"
23 #endif
24 
25 #ifdef HAVE_INTTYPES_H
26 # include <inttypes.h>
27 #endif
28 
29 #ifdef HAVE_STDINT_H
30 # include <stdint.h>
31 #endif
32 
33 #include <sys/types.h>
34 #include <sys/socket.h>
35 #include <netinet/in.h>
36 
37 #ifndef HAVE_INET_ATON
38 # define inet_aton(x,y)	inet_pton(AF_INET,x,y)
39 #endif
40 
41 #define DEBUG
42 
43 typedef struct s_firetalk_handle *firetalk_t;
44 #define _HAVE_FIRETALK_T
45 
46 #ifndef _HAVE_CLIENT_T
47 #define _HAVE_CLIENT_T
48 typedef void *client_t;
49 #endif
50 
51 #include "firetalk.h"
52 
53 #ifndef SHUT_RDWR
54 #define SHUT_RDWR 2
55 #endif
56 
57 
58 typedef void (*ptrtofnct)(firetalk_t, void *, ...);
59 
60 typedef struct {
61 	char	**keys;
62 	void	**data;
63 	int	count;
64 } firetalk_queue_t;
65 
66 struct s_firetalk_buddy {
67 	struct s_firetalk_buddy *next;
68 	char	*nickname,
69 		*group,
70 		*friendly;
71 	long	idletime,
72 		warnval;
73 	unsigned char
74 		online:1,
75 		away:1;
76 	int	typing;
77 	char	*capabilities;
78 };
79 
80 struct s_firetalk_deny {
81 	struct s_firetalk_deny *next;
82 	char *nickname;
83 };
84 
85 struct s_firetalk_member {
86 	struct s_firetalk_member *next;
87 	char *nickname;
88 	unsigned char
89 		admin:1;
90 };
91 
92 struct s_firetalk_room {
93 	struct s_firetalk_room *next;
94 	struct s_firetalk_member *member_head;
95 	char *name;
96 	unsigned char
97 		admin:1,
98 		sentjoin:1;
99 };
100 
101 struct s_firetalk_file {
102 	struct s_firetalk_file *next;
103 	char *who;
104 	char *filename;
105 	struct in_addr inet_ip;
106 #ifdef _FC_USE_IPV6
107 	struct in6_addr inet6_ip;
108 	int tryinet6;
109 #endif
110 	uint16_t port;
111 	long size;
112 	long bytes;
113 	uint32_t acked;
114 #define FF_STATE_WAITLOCAL	0
115 #define FF_STATE_WAITREMOTE	1
116 #define FF_STATE_WAITSYNACK	2
117 #define FF_STATE_TRANSFERRING	3
118 	int state;
119 #define FF_DIRECTION_SENDING	0
120 #define FF_DIRECTION_RECEIVING	1
121 	int direction;
122 #define FF_TYPE_DCC		0
123 #define FF_TYPE_RAW		1
124 	int type;
125 	int sockfd;
126 	int filefd;
127 	void *clientfilestruct;
128 };
129 
130 struct s_firetalk_subcode_callback {
131 	struct s_firetalk_subcode_callback *next;
132 	char *command, *staticresp;
133 	ptrtofnct callback;
134 };
135 
136 struct s_firetalk_handle {
137 	void *handle;
138 	void *clientstruct;
139 	int connected;
140 	struct sockaddr_in remote_addr;
141 	struct in_addr local_addr;
142 #ifdef _FC_USE_IPV6
143 	struct sockaddr_in6 remote_addr6;
144 	struct in6_addr local_addr6;
145 #endif
146 	unsigned long localip;
147 	int protocol;
148 	char *username;
149 	int fd;
150 	ptrtofnct callbacks[FC_MAX];
151 	unsigned char *buffer;
152 	unsigned short bufferpos;
153 	struct s_firetalk_handle *next;
154 	struct s_firetalk_handle *prev;
155 	struct s_firetalk_buddy *buddy_head;
156 	struct s_firetalk_deny *deny_head;
157 	struct s_firetalk_room *room_head;
158 	struct s_firetalk_file *file_head;
159 	struct s_firetalk_subcode_callback *subcode_request_head;
160 	struct s_firetalk_subcode_callback *subcode_reply_head;
161 	struct s_firetalk_subcode_callback *subcode_request_default;
162 	struct s_firetalk_subcode_callback *subcode_reply_default;
163 	firetalk_queue_t subcode_requests;
164 	firetalk_queue_t subcode_replies;
165 	unsigned char deleted:1;
166 };
167 
168 typedef struct s_firetalk_protocol_functions {
169 	const char *strprotocol;
170 	const char *default_server;
171 	const short default_port;
172 	const unsigned short default_buffersize;
173 	fte_t	(*periodic)(struct s_firetalk_handle *const);
174 	fte_t	(*preselect)(client_t, fd_set *read, fd_set *write, fd_set *except, int *n);
175 	fte_t	(*postselect)(client_t, fd_set *read, fd_set *write, fd_set *except);
176 	fte_t	(*got_data)(client_t, unsigned char *buffer, unsigned short *bufferpos);
177 	fte_t	(*got_data_connecting)(client_t, unsigned char *buffer, unsigned short *bufferpos);
178 	fte_t	(*comparenicks)(const char *const, const char *const);
179 	fte_t	(*isprintable)(const int);
180 	fte_t	(*disconnect)(client_t);
181 	fte_t	(*signon)(client_t, const char *const);
182 	fte_t	(*get_info)(client_t, const char *const);
183 	fte_t	(*set_info)(client_t, const char *const);
184 	fte_t	(*set_away)(client_t, const char *const, const int);
185 	fte_t	(*set_nickname)(client_t, const char *const);
186 	fte_t	(*set_password)(client_t, const char *const, const char *const);
187 	fte_t	(*set_privacy)(client_t, const char *const);
188 	fte_t	(*im_add_buddy)(client_t, const char *const, const char *const, const char *const);
189 	fte_t	(*im_remove_buddy)(client_t, const char *const, const char *const);
190 	fte_t	(*im_add_deny)(client_t, const char *const);
191 	fte_t	(*im_remove_deny)(client_t, const char *const);
192 	fte_t	(*im_upload_buddies)(client_t);
193 	fte_t	(*im_upload_denies)(client_t);
194 	fte_t	(*im_send_message)(client_t, const char *const, const char *const, const int);
195 	fte_t	(*im_send_action)(client_t, const char *const, const char *const, const int);
196 	fte_t	(*im_evil)(client_t, const char *const);
197 	fte_t	(*chat_join)(client_t, const char *const);
198 	fte_t	(*chat_part)(client_t, const char *const);
199 	fte_t	(*chat_invite)(client_t, const char *const, const char *const, const char *const);
200 	fte_t	(*chat_set_topic)(client_t, const char *const, const char *const);
201 	fte_t	(*chat_op)(client_t, const char *const, const char *const);
202 	fte_t	(*chat_deop)(client_t, const char *const, const char *const);
203 	fte_t	(*chat_kick)(client_t, const char *const, const char *const, const char *const);
204         fte_t   (*chat_requestextended)(client_t, const char * const);
205 	fte_t   (*im_searchemail)(client_t, const char * const);
206 	fte_t	(*chat_send_message)(client_t, const char *const, const char *const, const int);
207 	fte_t	(*chat_send_action)(client_t, const char *const, const char *const, const int);
208 	char	*(*subcode_encode)(client_t, const char *const, const char *const);
209 	const char *(*room_normalize)(const char *const);
210 	client_t (*create_handle)();
211 	void	(*destroy_handle)(client_t);
212 } firetalk_protocol_t;
213 
214 enum firetalk_connectstate {
215 	FCS_NOTCONNECTED,
216 	FCS_WAITING_SYNACK,
217 	FCS_WAITING_SIGNON,
218 	FCS_ACTIVE
219 };
220 
221 
222 fte_t	firetalk_register_protocol(const firetalk_protocol_t *const proto);
223 
224 void firetalk_callback_im_getmessage(client_t c, const char *const sender, const int automessage, const char *const message);
225 void firetalk_callback_im_getaction(client_t c, const char *const sender, const int automessage, const char *const message);
226 void firetalk_callback_im_buddyonline(client_t c, const char *const nickname, const int online);
227 void firetalk_callback_im_buddyaway(client_t c, const char *const nickname, const int away);
228 void firetalk_callback_buddyadded(client_t c, const char *const name, const char *const group, const char *const friendly);
229 void firetalk_callback_buddyremoved(client_t c, const char *const name, const char *const group);
230 void firetalk_callback_typing(client_t c, const char *const name, const int typing);
231 void firetalk_callback_capabilities(client_t c, const char *const nickname, const char *const caps);
232 void firetalk_callback_warninfo(client_t c, const char *const nickname, const long warnval);
233 void firetalk_callback_error(client_t c, const int error, const char *const roomoruser, const char *const description);
234 void firetalk_callback_connectfailed(client_t c, const int error, const char *const description);
235 void firetalk_callback_connected(client_t c);
236 void firetalk_callback_disconnect(client_t c, const int error);
237 void firetalk_callback_gotinfo(client_t c, const char *const nickname, const char *const info, const int warning, const long online, const long idle, const int flags);
238 void firetalk_callback_idleinfo(client_t c, const char *const nickname, const long idletime);
239 void firetalk_callback_statusinfo(client_t c, const char *const nickname, const char *const message);
240 void firetalk_callback_doinit(client_t c, const char *const nickname);
241 void firetalk_callback_setidle(client_t c, long *const idle);
242 void firetalk_callback_eviled(client_t c, const int newevil, const char *const eviler);
243 void firetalk_callback_newnick(client_t c, const char *const nickname);
244 void firetalk_callback_passchanged(client_t c);
245 void firetalk_callback_user_nickchanged(client_t c, const char *const oldnick, const char *const newnick);
246 void firetalk_callback_chat_joined(client_t c, const char *const room);
247 void firetalk_callback_chat_left(client_t c, const char *const room);
248 void firetalk_callback_chat_kicked(client_t c, const char *const room, const char *const by, const char *const reason);
249 void firetalk_callback_chat_getmessage(client_t c, const char *const room, const char *const from, const int automessage, const char *const message);
250 void firetalk_callback_chat_getaction(client_t c, const char *const room, const char *const from, const int automessage, const char *const message);
251 void firetalk_callback_chat_invited(client_t c, const char *const room, const char *const from, const char *const message);
252 void firetalk_callback_chat_user_joined(client_t c, const char *const room, const char *const who, const char *const extra);
253 void firetalk_callback_chat_user_left(client_t c, const char *const room, const char *const who, const char *const reason);
254 void firetalk_callback_chat_user_quit(client_t c, const char *const who, const char *const reason);
255 void firetalk_callback_chat_gottopic(client_t c, const char *const room, const char *const topic, const char *const author);
256 #ifdef RAWIRCMODES
257 void firetalk_callback_chat_modechanged(client_t c, const char *const room, const char *const mode, const char *const by);
258 #endif
259 void firetalk_callback_chat_user_opped(client_t c, const char *const room, const char *const who, const char *const by);
260 void firetalk_callback_chat_user_deopped(client_t c, const char *const room, const char *const who, const char *const by);
261 void firetalk_callback_chat_keychanged(client_t c, const char *const room, const char *const what, const char *const by);
262 void firetalk_callback_chat_opped(client_t c, const char *const room, const char *const by);
263 void firetalk_callback_chat_deopped(client_t c, const char *const room, const char *const by);
264 void firetalk_callback_chat_user_kicked(client_t c, const char *const room, const char *const who, const char *const by, const char *const reason);
265 const char *firetalk_subcode_get_request_reply(client_t c, const char *const command);
266 void firetalk_callback_subcode_request(client_t c, const char *const from, const char *const command, char *args);
267 void firetalk_callback_subcode_reply(client_t c, const char *const from, const char *const command, const char *const args);
268 void firetalk_callback_file_offer(client_t c, const char *const from, const char *const filename, const long size, const char *const ipstring, const char *const ip6string, const uint16_t port, const int type);
269 void firetalk_callback_needpass(client_t c, char *pass, const int size);
270 
271 void firetalk_enqueue(firetalk_queue_t *queue, const char *const key, void *data);
272 const void *firetalk_peek(firetalk_queue_t *queue, const char *const key);
273 void *firetalk_dequeue(firetalk_queue_t *queue, const char *const key);
274 void firetalk_queue_append(char *buf, int buflen, firetalk_queue_t *queue, const char *const key);
275 
276 firetalk_t firetalk_find_handle(client_t c);
277 
278 fte_t	firetalk_chat_internal_add_room(firetalk_t conn, const char *const name);
279 fte_t	firetalk_chat_internal_add_member(firetalk_t conn, const char *const room, const char *const nickname);
280 fte_t	firetalk_chat_internal_remove_room(firetalk_t conn, const char *const name);
281 fte_t	firetalk_chat_internal_remove_member(firetalk_t conn, const char *const room, const char *const nickname);
282 
283 struct s_firetalk_room *firetalk_find_room(struct s_firetalk_handle *c, const char *const room);
284 fte_t	firetalk_user_visible(firetalk_t conn, const char *const nickname);
285 fte_t	firetalk_user_visible_but(firetalk_t conn, const char *const room, const char *const nickname);
286 
287 void firetalk_handle_send(struct s_firetalk_handle *c, struct s_firetalk_file *filestruct);
288 void firetalk_handle_receive(struct s_firetalk_handle *c, struct s_firetalk_file *filestruct);
289 
290 void firetalk_internal_send_data(struct s_firetalk_handle *c, const char *const data, const int length);
291 
292 int firetalk_internal_connect_host(const char *const host, const int port);
293 int firetalk_internal_connect(struct sockaddr_in *inet4_ip
294 #ifdef _FC_USE_IPV6
295 		, struct sockaddr_in6 *inet6_ip
296 #endif
297 		);
298 fte_t firetalk_internal_resolve4(const char *const host, struct in_addr *inet4_ip);
299 struct sockaddr_in *firetalk_internal_remotehost4(client_t c);
300 #ifdef _FC_USE_IPV6
301 fte_t firetalk_internal_resolve6(const char *const host, struct in6_addr *inet6_ip);
302 struct sockaddr_in6 *firetalk_internal_remotehost6(client_t c);
303 #endif
304 enum firetalk_connectstate firetalk_internal_get_connectstate(client_t c);
305 void firetalk_internal_set_connectstate(client_t c, enum firetalk_connectstate fcs);
306 
307 fte_t	firetalk_set_timeout(unsigned int seconds);
308 fte_t	firetalk_clear_timeout();
309 
310 const char *firetalk_debase64(const char *const str);
311 const char *firetalk_htmlentities(const char *str);
312 
313 #endif
314