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