cad578b618f3d784d4794dfa0d4b8929fc89d01d
[citadel.git] / textclient / src / include / citadel_ipc.h
1
2 #define UDS                     "_UDS_"
3 #ifdef __CYGWIN__
4 #define DEFAULT_HOST            "localhost"
5 #else
6 #define DEFAULT_HOST            UDS
7 #endif
8 #define DEFAULT_PORT            "504"
9
10 #include <libcitadel.h>
11 #include <limits.h>
12 ////#include "sysdep.h"
13 #ifdef HAVE_PTHREAD_H
14 #include <pthread.h>
15 #endif
16 #ifdef HAVE_OPENSSL
17 #include <openssl/ssl.h>
18 #include <openssl/err.h>
19 #include <openssl/rand.h>
20 #endif
21
22 #define CLIENT_VERSION          811
23 #define CLIENT_TYPE               0
24 //copycat of: /#include "server.h"
25
26 #define ROOMNAMELEN     128     /* The size of a roomname string */
27
28 // copycat of citadel_dirs.h
29 void calc_dirs_n_files(int relh, int home, const char *relhome, char  *ctdldir, int dbg);
30
31 //copycat of: /#include "citadel.h"
32 /* commands we can send to the stty_ctdl() routine */
33 #define SB_NO_INTR      0               /* set to Citadel client mode, i/q disabled */
34 #define SB_YES_INTR     1               /* set to Citadel client mode, i/q enabled */
35 #define SB_SAVE         2               /* save settings */
36 #define SB_RESTORE      3               /* restore settings */
37 #define SB_LAST         4               /* redo the last command sent */
38
39 #define UGLISTLEN       100     /* you get a ungoto list of this size */
40
41 #define USERNAME_SIZE   64      /* The size of a username string */
42 #define MAX_EDITORS     5       /* # of external editors supported */
43                                 /* MUST be at least 1 */
44
45 #define NONCE_SIZE      128     /* Added by <bc> to allow for APOP auth 
46                                  * it is BIG becuase there is a hostname
47                                  * in the nonce, as per the APOP RFC.
48                                  */
49
50 /* 
51  * S_KEEPALIVE is a watchdog timer.  It is used to send "keep
52  * alive" messages to the server to prevent the server from assuming the
53  * client is dead and terminating the session.  30 seconds is the recommended
54  * value; I can't think of any good reason to change it.
55  */
56 #define S_KEEPALIVE     30
57
58 #define READ_HEADER     2
59 #define READ_MSGBODY    3
60
61 #define NUM_CONFIGS     72
62
63
64
65 /*
66  * This struct stores a list of rooms with new messages which the client
67  * fetches from the server.  This allows the client to "march" through
68  * relevant rooms without having to ask the server each time where to go next.
69  */
70 typedef struct ExpirePolicy ExpirePolicy;
71 struct ExpirePolicy {
72         int expire_mode;
73         int expire_value;
74 };
75
76 typedef struct march march;
77 struct march {
78         struct march *next;
79         char march_name[ROOMNAMELEN];
80         unsigned int march_flags;
81         char march_floor;
82         char march_order;
83         unsigned int march_flags2;
84         int march_access;
85 };
86 /*
87  * User records.
88  */
89 typedef struct ctdluser ctdluser;
90 struct ctdluser {                       /* User record                      */
91         int version;                    /* Cit vers. which created this rec  */
92         uid_t uid;                      /* Associate with a unix account?    */
93         char password[32];              /* password                          */
94         unsigned flags;                 /* See US_ flags below               */
95         long timescalled;               /* Total number of logins            */
96         long posted;                    /* Number of messages ever submitted */
97         uint8_t axlevel;                /* Access level                      */
98         long usernum;                   /* User number (never recycled)      */
99         time_t lastcall;                /* Date/time of most recent login    */
100         int USuserpurge;                /* Purge time (in days) for user     */
101         char fullname[64];              /* Display name (primary identifier) */
102 };
103 typedef struct ctdlroom ctdlroom;
104 struct ctdlroom {
105         char QRname[ROOMNAMELEN];       /* Name of room                     */
106         char QRpasswd[10];              /* Only valid if it's a private rm  */
107         long QRroomaide;                /* User number of room aide         */
108         long QRhighest;                 /* Highest message NUMBER in room   */
109         time_t QRgen;                   /* Generation number of room        */
110         unsigned QRflags;               /* See flag values below            */
111         char QRdirname[15];             /* Directory name, if applicable    */
112         long QRinfo;                    /* Info file update relative to msgs*/
113         char QRfloor;                   /* Which floor this room is on      */
114         time_t QRmtime;                 /* Date/time of last post           */
115         struct ExpirePolicy QRep;       /* Message expiration policy        */
116         long QRnumber;                  /* Globally unique room number      */
117         char QRorder;                   /* Sort key for room listing order  */
118         unsigned QRflags2;              /* Additional flags                 */
119         int QRdefaultview;              /* How to display the contents      */
120 };
121
122
123 /////////////
124
125 #ifdef __cplusplus
126 extern "C" {
127 #endif
128
129 /* Quick and dirty hack; we don't want to use malloc() in C++ */
130 #ifdef __cplusplus
131 #define ialloc(t)       new t()
132 #define ifree(o)        delete o
133 #else
134 #define ialloc(t)       malloc(sizeof(t))
135 #define ifree(o)        free(o);
136 #endif
137
138 struct CtdlServInfo {
139         int pid;
140         char nodename[32];
141         char humannode[64];
142         char fqdn[64];
143         char software[64];
144         int rev_level;
145         char site_location[64];
146         char sysadm[64];
147         char moreprompt[256];
148         int ok_floors;
149         int paging_level;
150         int supports_qnop;
151         int supports_ldap;
152         int newuser_disabled;
153         char default_cal_zone[256];
154         double load_avg;
155         double worker_avg;
156         int thread_count;
157         int has_sieve;
158         int fulltext_enabled;
159         char svn_revision[256];
160         int guest_logins;
161 };
162
163 /*
164  * This class is responsible for the server connection
165  */
166 typedef struct _CtdlIPC {
167         struct CtdlServInfo ServInfo;   /* The server info for this connection */
168
169 #if defined(HAVE_OPENSSL)
170         SSL *ssl;                       /* NULL if not encrypted, non-NULL otherwise */
171 #endif
172
173 #if defined(HAVE_PTHREAD_H)
174         pthread_mutex_t mutex;          /* Fast mutex, call CtdlIPC_lock() or CtdlIPC_unlock() to use */
175 #endif
176
177         int sock;                       /* Socket for connection to server, or -1 if not connected */
178         int isLocal;                    /* 1 if server is local, 0 otherwise or if not connected */
179         int downloading;                /* 1 if a download is open on the server, 0 otherwise */
180         int uploading;                  /* 1 if an upload is open on the server, 0 otherwise */
181         time_t last_command_sent;       /* Time the last command was sent to the server */
182
183         char *Buf;                      /* Our buffer for linebuffered read. */
184         size_t BufSize;
185         size_t BufUsed;
186         char *BufPtr;
187
188         void (*network_status_cb)(int state);   /* Callback for update on whether the IPC is locked */
189         char ip_hostname[256];          /* host name of server to which we are connected (if network) */
190         char ip_address[64];            /* IP address of server to which we are connected (if network) */
191
192 } CtdlIPC;
193
194 /* C constructor */
195 CtdlIPC* CtdlIPC_new(int argc, char **argv, char *hostbuf, char *portbuf);
196 /* C destructor */
197 void CtdlIPC_delete(CtdlIPC* ipc);
198 /* Convenience destructor; also nulls out caller's pointer */
199 void CtdlIPC_delete_ptr(CtdlIPC** pipc);
200 /* Read a line from server, discarding newline, for chat, will go away */
201 void CtdlIPC_chat_recv(CtdlIPC* ipc, char *buf);
202 /* Write a line to server, adding newline, for chat, will go away */
203 void CtdlIPC_chat_send(CtdlIPC* ipc, const char *buf);
204
205 struct ctdlipcroom {
206         char RRname[ROOMNAMELEN];       /* Name of room */
207         long RRunread;                  /* Number of unread messages */
208         long RRtotal;                   /* Total number of messages in room */
209         char RRinfoupdated;             /* Nonzero if info was updated */
210         unsigned RRflags;               /* Various flags (see LKRN) */
211         unsigned RRflags2;              /* Various flags (see LKRN) */
212         long RRhighest;                 /* Highest message number in room */
213         long RRlastread;                /* Highest message user has read */
214         char RRismailbox;               /* Is this room a mailbox room? */
215         char RRaide;                    /* User can do aide commands in room */
216         long RRnewmail;                 /* Number of new mail messages */
217         char RRfloor;                   /* Which floor this room is on */
218         char RRcurrentview;             /* The user's current view for this room */
219         char RRdefaultview;             /* The default view for this room */
220 };
221
222
223 struct parts {
224         struct parts *next;
225         char number[16];                /* part number */
226         char name[PATH_MAX];            /* Name */
227         char filename[PATH_MAX];        /* Suggested filename */
228         char mimetype[SIZ];             /* MIME type */
229         char disposition[SIZ];          /* Content disposition */
230         unsigned long length;           /* Content length */
231 };
232
233
234 struct ctdlipcmessage {
235         char msgid[SIZ];                /* Original message ID */
236         char path[SIZ];                 /* Return path to sender */
237         char zaps[SIZ];                 /* Message ID that this supersedes */
238         char subject[SIZ];              /* Message subject */
239         char email[SIZ];                /* Email address of sender */
240         char author[SIZ];               /* Sender of message */
241         char recipient[SIZ];            /* Recipient of message */
242         char room[SIZ];                 /* Originating room */
243         char node[SIZ];                 /* Short nodename of origin system */
244         char hnod[SIZ];                 /* Humannode of origin system */
245         struct parts *attachments;      /* Available attachments */
246         char *text;                     /* Message text */
247         int type;                       /* Message type */
248         time_t time;                    /* Time message was posted */
249         char nhdr;                      /* Suppress message header? */
250         char anonymous;                 /* An anonymous message */
251         char mime_chosen[SIZ];          /* Chosen MIME part to output */
252         char content_type[SIZ];         /* How would you like that? */
253         char references[SIZ];           /* Thread references */
254 };
255
256
257 struct ctdlipcfile {
258         char remote_name[PATH_MAX];     /* Filename on server */
259         char local_name[PATH_MAX];      /* Filename on client */
260         char description[80];           /* Description on server */
261         FILE *local_fd;                 /* Open file on client */
262         size_t size;                    /* Size of file in octets */
263         unsigned int upload:1;          /* uploading? 0 if downloading */
264         unsigned int complete:1;        /* Transfer has finished? */
265 };
266
267
268 struct ctdlipcmisc {
269         long newmail;                   /* Number of new Mail messages */
270         char needregis;                 /* Nonzero if user needs to register */
271         char needvalid;                 /* Nonzero if users need validation */
272 };
273
274 enum RoomList {
275         SubscribedRooms,
276         SubscribedRoomsWithNewMessages,
277         SubscribedRoomsWithNoNewMessages,
278         UnsubscribedRooms,
279         AllAccessibleRooms,
280         AllPublicRooms
281 };
282 #define AllFloors -1
283 enum MessageList {
284         AllMessages,
285         OldMessages,
286         NewMessages,
287         LastMessages,
288         FirstMessages,
289         MessagesGreaterThan,
290         MessagesLessThan
291 };
292 enum MessageDirection {
293         ReadReverse = -1,
294         ReadForward = 1
295 };
296 extern char file_citadel_rc[PATH_MAX];
297 extern char file_citadel_config[PATH_MAX];
298
299 /* Shared Diffie-Hellman parameters */
300 #define DH_P            "F6E33BD70D475906ABCFB368DA2D1E5611D57DFDAC6A10CD78F406D6952519C74E21FFDCC5A780B9359722AACC8036E4CD24D5F5165EAC9EF226DBD9BBCF678F8DDEE86386F1BC20E291A9854A513A2CA326B411DC92E38F2ED2FEB6A3B792F13DB6550371FDBAC5ECA373BE5050CA4905431CA86088737D52B36C8D13CE9CB4EEF4C910285035E8329DD07551A80B87775676DD1067395CCEE9040C9B8BF998C528B3772B4C590A2CF18C5E58929BFCB538A62638B7437A9C68572D15287E97692B0B1EC5444D9DAB6EB062D20B79CA005EC5035065567AFD1FEF9B251D74747C6065D8C8B6B0862D1EE03F3A244C429EADE0CCC5C3A4196F5CBF5AA01A9026EFB20AA90E462BD64620278F271905EB604F38E6CFAE412EAA6C468E3B58170909BC18662FE2053224F30BE4FDB93BF9FBF969D91A5427A0665AC7BD1C43701B991094C92F7A935063055617142164F02973EB4ED86DD74D2BBAB3CD3B28F7BBD8D9F925B0FE92F7F7D0568D783F9ECE7AF96FB5AF274B586924B64639733A73ACA8F2BD1E970DF51ADDD983F7F6361A2B0DC4F086DE26D8656EC8813DE4B74D6D57BC1E690AC2FF1682B7E16938565A41D1DC64C75ADB81DA4582613FC68C0FDD327D35E2CDF20D009465303773EF3870FBDB0985EE7002A95D7912BBCC78187C29DB046763B7FABFF44EABE820F8ED0D7230AA0AF24F428F82448345BC099B"
301 #define DH_G            "2"
302 #define DH_L            4096
303 #define CIT_CIPHERS     "ALL:RC4+RSA:+SSLv2:+TLSv1:!MD5:@STRENGTH"      /* see ciphers(1) */
304
305 int CtdlIPCNoop(CtdlIPC *ipc);
306 int CtdlIPCEcho(CtdlIPC *ipc, const char *arg, char *cret);
307 int CtdlIPCQuit(CtdlIPC *ipc);
308 int CtdlIPCLogout(CtdlIPC *ipc);
309 int CtdlIPCTryLogin(CtdlIPC *ipc, const char *username, char *cret);
310 int CtdlIPCTryPassword(CtdlIPC *ipc, const char *passwd, char *cret);
311 int CtdlIPCTryApopPassword(CtdlIPC *ipc, const char *response, char *cret);
312 int CtdlIPCCreateUser(CtdlIPC *ipc, const char *username, int selfservice,
313                 char *cret);
314 int CtdlIPCChangePassword(CtdlIPC *ipc, const char *passwd, char *cret);
315 int CtdlIPCKnownRooms(CtdlIPC *ipc, enum RoomList which, int floor,
316                 struct march **listing, char *cret);
317 int CtdlIPCGetConfig(CtdlIPC *ipc, struct ctdluser **uret, char *cret);
318 int CtdlIPCSetConfig(CtdlIPC *ipc, struct ctdluser *uret, char *cret);
319 int CtdlIPCGotoRoom(CtdlIPC *ipc, const char *room, const char *passwd,
320                 struct ctdlipcroom **rret, char *cret);
321 int CtdlIPCGetMessages(CtdlIPC *ipc, enum MessageList which, int whicharg,
322                 const char *mtemplate, unsigned long **mret, char *cret);
323 int CtdlIPCGetSingleMessage(CtdlIPC *ipc, long msgnum, int headers, int as_mime,
324                 struct ctdlipcmessage **mret, char *cret);
325 int CtdlIPCWhoKnowsRoom(CtdlIPC *ipc, char **listing, char *cret);
326 int CtdlIPCServerInfo(CtdlIPC *ipc, char *cret);
327 /* int CtdlIPCReadDirectory(CtdlIPC *ipc, struct ctdlipcfile **files, char *cret); */
328 int CtdlIPCReadDirectory(CtdlIPC *ipc, char **listing, char *cret);
329 int CtdlIPCSetLastRead(CtdlIPC *ipc, long msgnum, char *cret);
330 int CtdlIPCInviteUserToRoom(CtdlIPC *ipc, const char *username, char *cret);
331 int CtdlIPCKickoutUserFromRoom(CtdlIPC *ipc, const char *username, char *cret);
332 int CtdlIPCGetRoomAttributes(CtdlIPC *ipc, struct ctdlroom **qret, char *cret);
333 int CtdlIPCSetRoomAttributes(CtdlIPC *ipc, int forget, struct ctdlroom *qret,
334                 char *cret);
335 int CtdlIPCGetRoomAide(CtdlIPC *ipc, char *cret);
336 int CtdlIPCSetRoomAide(CtdlIPC *ipc, const char *username, char *cret);
337 int CtdlIPCPostMessage(CtdlIPC *ipc, int flag, int *subject_required, 
338                                            struct ctdlipcmessage *mr,
339                                            char *cret);
340 int CtdlIPCRoomInfo(CtdlIPC *ipc, char **iret, char *cret);
341 int CtdlIPCDeleteMessage(CtdlIPC *ipc, long msgnum, char *cret);
342 int CtdlIPCMoveMessage(CtdlIPC *ipc, int copy, long msgnum,
343                 const char *destroom, char *cret);
344 int CtdlIPCDeleteRoom(CtdlIPC *ipc, int for_real, char *cret);
345 int CtdlIPCCreateRoom(CtdlIPC *ipc, int for_real, const char *roomname,
346                 int type, const char *password, int floor, char *cret);
347 int CtdlIPCForgetRoom(CtdlIPC *ipc, char *cret);
348 int CtdlIPCSystemMessage(CtdlIPC *ipc, const char *message, char **mret,
349                 char *cret);
350 int CtdlIPCNextUnvalidatedUser(CtdlIPC *ipc, char *cret);
351 int CtdlIPCGetUserRegistration(CtdlIPC *ipc, const char *username, char **rret,
352                 char *cret);
353 int CtdlIPCValidateUser(CtdlIPC *ipc, const char *username, int axlevel,
354                 char *cret);
355 int CtdlIPCSetRoomInfo(CtdlIPC *ipc, int for_real, const char *info,
356                 char *cret);
357 int CtdlIPCUserListing(CtdlIPC *ipc, char *searchstring, char **list, char *cret);
358 int CtdlIPCSetRegistration(CtdlIPC *ipc, const char *info, char *cret);
359 int CtdlIPCMiscCheck(CtdlIPC *ipc, struct ctdlipcmisc *chek, char *cret);
360 int CtdlIPCDeleteFile(CtdlIPC *ipc, const char *filename, char *cret);
361 int CtdlIPCMoveFile(CtdlIPC *ipc, const char *filename, const char *destroom,
362                 char *cret);
363 int CtdlIPCNetSendFile(CtdlIPC *ipc, const char *filename,
364                 const char *destnode, char *cret);
365 int CtdlIPCOnlineUsers(CtdlIPC *ipc, char **listing, time_t *stamp, char *cret);
366 int CtdlIPCFileDownload(CtdlIPC *ipc, const char *filename, void **buf,
367                 size_t resume,
368                 void (*progress_gauge_callback)(CtdlIPC*, unsigned long, unsigned long),
369                 char *cret);
370 int CtdlIPCAttachmentDownload(CtdlIPC *ipc, long msgnum, const char *part,
371                 void **buf,
372                 void (*progress_gauge_callback)(CtdlIPC*, unsigned long, unsigned long),
373                 char *cret);
374 int CtdlIPCImageDownload(CtdlIPC *ipc, const char *filename, void **buf,
375                 void (*progress_gauge_callback)(CtdlIPC*, unsigned long, unsigned long),
376                 char *cret);
377 int CtdlIPCFileUpload(CtdlIPC *ipc, const char *save_as, const char *comment,
378                 const char *path, 
379                 void (*progress_gauge_callback)(CtdlIPC*, unsigned long, unsigned long),
380                 char *cret);
381 int CtdlIPCImageUpload(CtdlIPC *ipc, int for_real, const char *path,
382                 const char *save_as,
383                 void (*progress_gauge_callback)(CtdlIPC*, unsigned long, unsigned long),
384                 char *cret);
385 int CtdlIPCQueryUsername(CtdlIPC *ipc, const char *username, char *cret);
386 int CtdlIPCFloorListing(CtdlIPC *ipc, char **listing, char *cret);
387 int CtdlIPCCreateFloor(CtdlIPC *ipc, int for_real, const char *name,
388                 char *cret);
389 int CtdlIPCDeleteFloor(CtdlIPC *ipc, int for_real, int floornum, char *cret);
390 int CtdlIPCEditFloor(CtdlIPC *ipc, int floornum, const char *floorname,
391                 char *cret);
392 int CtdlIPCIdentifySoftware(CtdlIPC *ipc, int developerid, int clientid,
393                 int revision, const char *software_name, const char *hostname,
394                 char *cret);
395 int CtdlIPCSendInstantMessage(CtdlIPC *ipc, const char *username,
396                 const char *text, char *cret);
397 int CtdlIPCGetInstantMessage(CtdlIPC *ipc, char **listing, char *cret);
398 int CtdlIPCEnableInstantMessageReceipt(CtdlIPC *ipc, int mode, char *cret);
399 int CtdlIPCSetBio(CtdlIPC *ipc, char *bio, char *cret);
400 int CtdlIPCGetBio(CtdlIPC *ipc, const char *username, char **listing,
401                 char *cret);
402 int CtdlIPCListUsersWithBios(CtdlIPC *ipc, char **listing, char *cret);
403 int CtdlIPCStealthMode(CtdlIPC *ipc, int mode, char *cret);
404 int CtdlIPCTerminateSession(CtdlIPC *ipc, int sid, char *cret);
405 int CtdlIPCTerminateServerNow(CtdlIPC *ipc, char *cret);
406 int CtdlIPCTerminateServerScheduled(CtdlIPC *ipc, int mode, char *cret);
407 int CtdlIPCEnterSystemMessage(CtdlIPC *ipc, const char *filename, const char *text,
408                 char *cret);
409 int CtdlIPCChangeHostname(CtdlIPC *ipc, const char *hostname, char *cret);
410 int CtdlIPCChangeRoomname(CtdlIPC *ipc, const char *roomname, char *cret);
411 int CtdlIPCChangeUsername(CtdlIPC *ipc, const char *username, char *cret);
412 time_t CtdlIPCServerTime(CtdlIPC *ipc, char *crert);
413 int CtdlIPCAideGetUserParameters(CtdlIPC *ipc, const char *who,
414                                  struct ctdluser **uret, char *cret);
415 int CtdlIPCAideSetUserParameters(CtdlIPC *ipc, const struct ctdluser *uret, char *cret);
416 int CtdlIPCRenameUser(CtdlIPC *ipc, char *oldname, char *newname, char *cret);
417 int CtdlIPCGetMessageExpirationPolicy(CtdlIPC *ipc, GPEXWhichPolicy which,
418                 struct ExpirePolicy **policy, char *cret);
419 int CtdlIPCSetMessageExpirationPolicy(CtdlIPC *ipc, int which,
420                 struct ExpirePolicy *policy, char *cret);
421 int CtdlIPCGetSystemConfig(CtdlIPC *ipc, char **listing, char *cret);
422 int CtdlIPCSetSystemConfig(CtdlIPC *ipc, const char *listing, char *cret);
423 int CtdlIPCGetSystemConfigByType(CtdlIPC *ipc, const char *mimetype,
424                 char **listing, char *cret);
425 int CtdlIPCSetSystemConfigByType(CtdlIPC *ipc, const char *mimetype,
426                const char *listing, char *cret);
427 int CtdlIPCGetRoomNetworkConfig(CtdlIPC *ipc, char **listing, char *cret);
428 int CtdlIPCSetRoomNetworkConfig(CtdlIPC *ipc, const char *listing, char *cret);
429 int CtdlIPCRequestClientLogout(CtdlIPC *ipc, int session, char *cret);
430 int CtdlIPCSetMessageSeen(CtdlIPC *ipc, long msgnum, int seen, char *cret);
431 int CtdlIPCStartEncryption(CtdlIPC *ipc, char *cret);
432 int CtdlIPCDirectoryLookup(CtdlIPC *ipc, const char *address, char *cret);
433 int CtdlIPCSpecifyPreferredFormats(CtdlIPC *ipc, char *cret, char *formats);
434 int CtdlIPCInternalProgram(CtdlIPC *ipc, int secret, char *cret);
435
436 /* ************************************************************************** */
437 /*             Stuff below this line is not for public consumption            */
438 /* ************************************************************************** */
439
440 char *CtdlIPCReadListing(CtdlIPC *ipc, char *dest);
441 int CtdlIPCSendListing(CtdlIPC *ipc, const char *listing);
442 size_t CtdlIPCPartialRead(CtdlIPC *ipc, void **buf, size_t offset,
443                 size_t bytes, char *cret);
444 int CtdlIPCEndUpload(CtdlIPC *ipc, int discard, char *cret);
445 int CtdlIPCWriteUpload(CtdlIPC *ipc, FILE *uploadFP,
446                 void (*progress_gauge_callback)(CtdlIPC*, unsigned long, unsigned long),
447                 char *cret);
448 int CtdlIPCEndDownload(CtdlIPC *ipc, char *cret);
449 int CtdlIPCReadDownload(CtdlIPC *ipc, void **buf, size_t bytes, size_t resume,
450                 void (*progress_gauge_callback)(CtdlIPC*, unsigned long, unsigned long),
451                 char *cret);
452 int CtdlIPCHighSpeedReadDownload(CtdlIPC *ipc, void **buf, size_t bytes,
453                 size_t resume,
454                 void (*progress_gauge_callback)(CtdlIPC*, unsigned long, unsigned long),
455                 char *cret);
456 int CtdlIPCGenericCommand(CtdlIPC *ipc, const char *command,
457                 const char *to_send, size_t bytes_to_send, char **to_receive,
458                 size_t *bytes_to_receive, char *proto_response);
459
460 /* Internals */
461 int starttls(CtdlIPC *ipc);
462 void setCryptoStatusHook(void (*hook)(char *s));
463 void CtdlIPC_SetNetworkStatusCallback(CtdlIPC *ipc, void (*hook)(int state));
464 /* This is all Ford's doing.  FIXME: figure out what it's doing */
465 extern int (*error_printf)(char *s, ...);
466 void setIPCDeathHook(void (*hook)(void));
467 void setIPCErrorPrintf(int (*func)(char *s, ...));
468 void connection_died(CtdlIPC* ipc, int using_ssl);
469 int CtdlIPC_getsockfd(CtdlIPC* ipc);
470 char CtdlIPC_get(CtdlIPC* ipc);
471
472
473
474 void CtdlIPC_lock(CtdlIPC *ipc);
475
476 void CtdlIPC_unlock(CtdlIPC *ipc);
477
478 char *libcitadelclient_version_string(void);
479
480 /* commands we can send to the stty_ctdl() routine */
481 #define SB_NO_INTR      0               /* set to Citadel client mode, i/q disabled */
482 #define SB_YES_INTR     1               /* set to Citadel client mode, i/q enabled */
483 #define SB_SAVE         2               /* save settings */
484 #define SB_RESTORE      3               /* restore settings */
485 #define SB_LAST         4               /* redo the last command sent */
486
487 #define NEXT_KEY        15
488 #define STOP_KEY        3
489
490 /* citadel.rc stuff */
491 #define RC_NO           0               /* always no */
492 #define RC_YES          1               /* always yes */
493 #define RC_DEFAULT      2               /* setting depends on user config */
494
495 /* keepalives */
496 enum {
497         KA_NO,                          /* no keepalives */
498         KA_YES,                         /* full keepalives */
499         KA_HALF                         /* half keepalives */
500 };
501
502 /* for <;G>oto and <;S>kip commands */
503 #define GF_GOTO         0               /* <;G>oto floor mode */
504 #define GF_SKIP         1               /* <;S>kip floor mode */
505 #define GF_ZAP          2               /* <;Z>ap floor mode */
506
507
508 #ifndef AXDEFS
509
510 extern char *axdefs[];
511
512 extern char *viewdefs[];
513 #endif