dccp sender: Keep polling until an entry becomes free (Gerrit Renker).
[paraslash.git] / client.h
1 /*
2 * Copyright (C) 1997-2007 Andre Noll <maan@systemlinux.org>
3 *
4 * Licensed under the GPL v2. For licencing details see COPYING.
5 */
6
7 /** \file client.h common client functions and exported symbols from client_common.c */
8
9 #include <openssl/rc4.h>
10
11 /**
12 * the different states of a connection from the view of the client
13 */
14 enum {
15 /** tcp connection is established */
16 CL_CONNECTED,
17 /** server sends the welcome message */
18 CL_RECEIVED_WELCOME,
19 /** client sends the authentification request */
20 CL_SENT_AUTH,
21 /** server sends a challenge */
22 CL_RECEIVED_CHALLENGE,
23 /** clientd solves the challenge and sends the result */
24 CL_SENT_CH_RESPONSE,
25 /** server accepts this authentication */
26 CL_RECEIVED_PROCEED,
27 /** client sends the command */
28 CL_SENT_COMMAND,
29 /** server expects data */
30 CL_SENDING,
31 /** client expects data */
32 CL_RECEIVING,
33 };
34
35 /** size of the receiving buffer */
36 #define CLIENT_BUFSIZE 8192
37
38 /**
39 * data specific to a client task
40 */
41 struct private_client_data {
42 /** the state of the connection */
43 int status;
44 /** the file descriptor */
45 int fd;
46 /** the configuration (including the command) */
47 struct client_args_info conf;
48 /** the config file for client options */
49 char *config_file;
50 /** the RSA private key */
51 char *key_file;
52 /** paraslash user name */
53 char *user;
54 /** session key for receiving data */
55 RC4_KEY rc4_recv_key;
56 /** session key for sending data */
57 RC4_KEY rc4_send_key;
58 /** the client task structure */
59 struct task task;
60 /** non-zero if task is unregistered */
61 int eof;
62 /** the buffer used for handshake and receiving */
63 char buf[CLIENT_BUFSIZE];
64 /** number of bytes loaded in \p buf */
65 size_t loaded;
66 /** non-zero if the pre_select hook added \p fd to the read fd set */
67 int check_r;
68 /** non-zero if the pre_select hook added \p fd to the write fd set */
69 int check_w;
70 /** the decrypted challenge */
71 long unsigned challenge_nr;
72 /** pointer to the data to be sent to para_server */
73 char *inbuf;
74 /** number of bytes loaded in \p inbuf */
75 size_t *in_loaded;
76 /** non-zero if input task encountered an eof or an errro condition */
77 int *in_eof;
78 };
79
80 void client_close(struct private_client_data *pcd);
81 int client_open(int argc, char *argv[], struct private_client_data **pcd_ptr);
82 void client_pre_select(struct sched *s, struct task *t);
83 void client_post_select(struct sched *s, struct task *t);