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