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