X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient_internal.h;h=294e003a165ce76048daabc25a3fd4920fc76ec5;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=dadf8f728b28f49560bf00954d25a42bae5a184f;hpb=c36a081adca94d3b8c68f8757a0139a495e4a54c;p=silc.git diff --git a/lib/silcclient/client_internal.h b/lib/silcclient/client_internal.h index dadf8f72..294e003a 100644 --- a/lib/silcclient/client_internal.h +++ b/lib/silcclient/client_internal.h @@ -1,16 +1,15 @@ /* - client_internal.h + client_internal.h - Author: Pekka Riikonen + Author: Pekka Riikonen Copyright (C) 1997 - 2001 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - + the Free Software Foundation; version 2 of the License. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -52,22 +51,153 @@ struct SilcClientAwayStruct { struct SilcClientAwayStruct *next; }; -/* Failure context. This is allocated when failure packet is received. - Failure packets are processed with timeout and data is saved in this - structure. */ -typedef struct { - SilcClient client; - SilcSocketConnection sock; - uint32 failure; -} SilcClientFailureContext; +/* Internal context for the client->internal pointer in the SilcClient. */ +struct SilcClientInternalStruct { + /* All client operations that are implemented by the application. */ + SilcClientOperations *ops; + + /* Client Parameters */ + SilcClientParams *params; + + /* Table of connections in client. All the connection data is saved here. */ + SilcClientConnection *conns; + SilcUInt32 conns_count; -/* Protypes */ + /* Table of listenning sockets in client. Client can have listeners + (like key agreement protocol server) and those sockets are saved here. + This table is checked always if the connection object cannot be found + from the `conns' table. */ + SilcSocketConnection *sockets; + SilcUInt32 sockets_count; + + /* Registered commands */ + SilcList commands; + + /* Generic cipher and hash objects. */ + SilcCipher none_cipher; + SilcHash md5hash; + SilcHash sha1hash; + SilcHmac md5hmac; + SilcHmac sha1hmac; + + /* Client version. Used to compare to remote host's version strings. */ + char *silc_client_version; +}; + +/* Macros */ + +/* Registers generic task for file descriptor for reading from network and + writing to network. As being generic task the actual task is allocated + only once and after that the same task applies to all registered fd's. */ +#define SILC_CLIENT_REGISTER_CONNECTION_FOR_IO(fd) \ +do { \ + silc_schedule_task_add(client->schedule, (fd), \ + silc_client_packet_process, \ + context, 0, 0, \ + SILC_TASK_GENERIC, \ + SILC_TASK_PRI_NORMAL); \ +} while(0) + +#define SILC_CLIENT_SET_CONNECTION_FOR_INPUT(s, fd) \ +do { \ + silc_schedule_set_listen_fd((s), (fd), SILC_TASK_READ); \ +} while(0) + +#define SILC_CLIENT_SET_CONNECTION_FOR_OUTPUT(s, fd) \ +do { \ + silc_schedule_set_listen_fd((s), (fd), (SILC_TASK_READ | \ + SILC_TASK_WRITE)); \ +} while(0) + +/* Finds socket connection object by file descriptor */ +#define SILC_CLIENT_GET_SOCK(__x, __fd, __sock) \ +do { \ + int __i; \ + \ + for (__i = 0; __i < (__x)->internal->conns_count; __i++) \ + if ((__x)->internal->conns[__i] && \ + (__x)->internal->conns[__i]->sock->sock == (__fd)) \ + break; \ + \ + if (__i >= (__x)->internal->conns_count) { \ + (__sock) = NULL; \ + for (__i = 0; __i < (__x)->internal->sockets_count; __i++) \ + if ((__x)->internal->sockets[__i] && \ + (__x)->internal->sockets[__i]->sock == (__fd)) \ + (__sock) = (__x)->internal->sockets[__i]; \ + } else \ + (__sock) = (__x)->internal->conns[__i]->sock; \ +} while(0) + +/* Check whether rekey protocol is active */ +#define SILC_CLIENT_IS_REKEY(sock) \ + (sock->protocol && sock->protocol->protocol && \ + sock->protocol->protocol->type == SILC_PROTOCOL_CLIENT_REKEY) + +/* Prototypes */ SILC_TASK_CALLBACK_GLOBAL(silc_client_packet_process); -SILC_TASK_CALLBACK_GLOBAL(silc_client_failure_callback); int silc_client_packet_send_real(SilcClient client, SilcSocketConnection sock, - bool force_send, - bool flush); + bool force_send); +void silc_client_ftp_free_sessions(SilcClient client, + SilcClientConnection conn); +void silc_client_ftp_session_free(SilcClientFtpSession session); +void silc_client_ftp_session_free_client(SilcClientConnection conn, + SilcClientEntry client_entry); +void silc_client_packet_send(SilcClient client, + SilcSocketConnection sock, + SilcPacketType type, + void *dst_id, + SilcIdType dst_id_type, + SilcCipher cipher, + SilcHmac hmac, + unsigned char *data, + SilcUInt32 data_len, + int force_send); +void silc_client_disconnected_by_server(SilcClient client, + SilcSocketConnection sock, + SilcBuffer message); +void silc_client_error_by_server(SilcClient client, + SilcSocketConnection sock, + SilcBuffer message); +void silc_client_receive_new_id(SilcClient client, + SilcSocketConnection sock, + SilcIDPayload idp); +void silc_client_save_channel_key(SilcClient client, + SilcClientConnection conn, + SilcBuffer key_payload, + SilcChannelEntry channel); +void silc_client_receive_channel_key(SilcClient client, + SilcSocketConnection sock, + SilcBuffer packet); +void silc_client_channel_message(SilcClient client, + SilcSocketConnection sock, + SilcPacketContext *packet); +void silc_client_remove_from_channels(SilcClient client, + SilcClientConnection conn, + SilcClientEntry client_entry); +void silc_client_replace_from_channels(SilcClient client, + SilcClientConnection conn, + SilcClientEntry old, + SilcClientEntry newclient); +void silc_client_process_failure(SilcClient client, + SilcSocketConnection sock, + SilcPacketContext *packet); +void silc_client_key_agreement(SilcClient client, + SilcSocketConnection sock, + SilcPacketContext *packet); +void silc_client_notify_by_server(SilcClient client, + SilcSocketConnection sock, + SilcPacketContext *packet); +void silc_client_private_message(SilcClient client, + SilcSocketConnection sock, + SilcPacketContext *packet); +void silc_client_connection_auth_request(SilcClient client, + SilcSocketConnection sock, + SilcPacketContext *packet); +void silc_client_ftp(SilcClient client, + SilcSocketConnection sock, + SilcPacketContext *packet); #endif