3 * IMAP server for the Citadel/UX system
4 * Copyright (C) 2000 by Art Cancro and others.
5 * This code is released under the terms of the GNU General Public License.
7 * Current status of standards conformance:
9 * *** ABSOLUTELY NOTHING WORKS ***
21 #include <sys/types.h>
29 #include "sysdep_decls.h"
30 #include "citserver.h"
33 #include "dynloader.h"
40 #include "internet_addressing.h"
41 #include "serv_imap.h"
48 * This cleanup function blows away the temporary memory and files used by
51 void imap_cleanup_function(void) {
53 /* Don't do this stuff if this is not a IMAP session! */
54 if (CC->h_command_function != imap_command_loop) return;
56 lprintf(9, "Performing IMAP cleanup hook\n");
59 lprintf(9, "Finished IMAP cleanup hook\n");
65 * Here's where our IMAP session begins its happy day.
67 void imap_greeting(void) {
69 strcpy(CC->cs_clientname, "IMAP session");
71 CtdlAllocUserData(SYM_IMAP, sizeof(struct citimap));
73 cprintf("* OK %s Citadel/UX IMAP4rev1 server ready\r\n",
81 * Main command loop for IMAP sessions.
83 void imap_command_loop(void) {
88 memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
89 if (client_gets(cmdbuf) < 1) {
90 lprintf(3, "IMAP socket is broken. Ending session.\r\n");
95 lprintf(5, "citserver[%3d]: %s\r\n", CC->cs_pid, cmdbuf);
96 while (strlen(cmdbuf) < 5) strcat(cmdbuf, " ");
99 /* strip off l/t whitespace and CRLF */
100 if (cmdbuf[strlen(cmdbuf)-1]=='\n') cmdbuf[strlen(cmdbuf)-1]=0;
101 if (cmdbuf[strlen(cmdbuf)-1]=='\r') cmdbuf[strlen(cmdbuf)-1]=0;
105 extract_token(tag, cmdbuf, 0, ' ');
106 remove_token(cmdbuf, 0, ' ');
107 lprintf(9, "tag=<%s> cmd=<%s>\n", tag, cmdbuf);
109 if (!strncasecmp(cmdbuf, "NOOP", 4)) {
110 cprintf("%s OK This command successfully did nothing.\r\n",
114 else if (!strncasecmp(cmdbuf, "LOGOUT", 4)) {
115 cprintf("%s OK thank you for using Citadel IMAP\r\n", tag);
120 /* FIXME ... implement login commands HERE */
122 else if (!CC->logged_in) {
123 cprintf("%s BAD Not logged in.\r\n", tag);
126 /* FIXME ... implement commands requiring login here */
129 cprintf("%s BAD command unrecognized\r\n", tag);
136 char *Dynamic_Module_Init(void)
138 SYM_IMAP = CtdlGetDynamicSymbol();
139 CtdlRegisterServiceHook(143, /* FIXME put in config setup */
143 CtdlRegisterSessionHook(imap_cleanup_function, EVT_STOP);