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