more places where we can use cm_lengths;
[citadel.git] / citadel / control.c
index b81526cf1dc855078349afb8ed70a4803bb0388d..cc3165531666dc4990ab151a8633ef3906df3e1b 100644 (file)
  *  GNU General Public License for more details.
  */
 
-#include "sysdep.h"
-#include <stdlib.h>
-#include <unistd.h>
 #include <stdio.h>
-#include <fcntl.h>
-#include <signal.h>
-
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-#include <ctype.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <sys/types.h>
 #include <sys/file.h>
-#include <sys/stat.h>
 #include <libcitadel.h>
-#include "citadel.h"
-#include "server.h"
-#include "control.h"
-#include "sysdep_decls.h"
-#include "support.h"
+
+#include "ctdl_module.h"
 #include "config.h"
-#include "msgbase.h"
 #include "citserver.h"
-#include "room_ops.h"
 #include "user_ops.h"
-#include "database.h"
-#include "threads.h"
-
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
-
-#include "ctdl_module.h"
 
 struct CitControl CitControl;
 extern struct config config;
@@ -397,7 +361,7 @@ void cmd_conf(char *argbuf)
                cprintf("%d\n", config.c_smtps_port);
                cprintf("%d\n", config.c_enable_fulltext);
                cprintf("%d\n", config.c_auto_cull);
-               cprintf("%d\n", config.c_instant_expunge);
+               cprintf("1\n");
                cprintf("%d\n", config.c_allow_spoofing);
                cprintf("%d\n", config.c_journal_email);
                cprintf("%d\n", config.c_journal_pubmsgs);
@@ -604,7 +568,7 @@ void cmd_conf(char *argbuf)
                                config.c_auto_cull = atoi(buf);
                                break;
                        case 44:
-                               config.c_instant_expunge = atoi(buf);
+                               /* niu */
                                break;
                        case 45:
                                config.c_allow_spoofing = atoi(buf);
@@ -744,16 +708,110 @@ void cmd_conf(char *argbuf)
        }
 }
 
+typedef struct __ConfType {
+       ConstStr Name;
+       long Type;
+}ConfType;
+
+ConfType CfgNames[] = {
+       { {HKEY("localhost") },    0},
+       { {HKEY("directory") },    0},
+       { {HKEY("smarthost") },    2},
+       { {HKEY("fallbackhost") }, 2},
+       { {HKEY("rbl") },          3},
+       { {HKEY("spamassassin") }, 3},
+       { {HKEY("masqdomain") },   1},
+       { {HKEY("clamav") },       3},
+       { {HKEY("notify") },       3},
+       { {NULL, 0}, 0}
+};
+
+HashList *CfgNameHash = NULL;
+void cmd_gvdn(char *argbuf)
+{
+       const ConfType *pCfg;
+       char *confptr;
+       long min = atol(argbuf);
+       const char *Pos = NULL;
+       const char *PPos = NULL;
+       const char *HKey;
+       long HKLen;
+       StrBuf *Line;
+       StrBuf *Config;
+       StrBuf *Cfg;
+       StrBuf *CfgToken;
+       HashList *List;
+       HashPos *It;
+       void *vptr;
+       
+       List = NewHash(1, NULL);
+       Cfg = NewStrBufPlain(config.c_fqdn, -1);
+       Put(List, SKEY(Cfg), Cfg, HFreeStrBuf);
+       Cfg = NULL;
+
+       confptr = CtdlGetSysConfig(INTERNETCFG);
+       Config = NewStrBufPlain(confptr, -1);
+       free(confptr);
+
+       Line = NewStrBufPlain(NULL, StrLength(Config));
+       CfgToken = NewStrBufPlain(NULL, StrLength(Config));
+       while (StrBufSipLine(Line, Config, &Pos))
+       {
+               if (Cfg == NULL)
+                       Cfg = NewStrBufPlain(NULL, StrLength(Line));
+               PPos = NULL;
+               StrBufExtract_NextToken(Cfg, Line, &PPos, '|');
+               StrBufExtract_NextToken(CfgToken, Line, &PPos, '|');
+               if (GetHash(CfgNameHash, SKEY(CfgToken), &vptr) &&
+                   (vptr != NULL))
+               {
+                       pCfg = (ConfType *) vptr;
+                       if (pCfg->Type <= min)
+                       {
+                               Put(List, SKEY(Cfg), Cfg, HFreeStrBuf);
+                               Cfg = NULL;
+                       }
+               }
+       }
+
+       cprintf("%d Valid Domains\n", LISTING_FOLLOWS);
+       It = GetNewHashPos(List, 1);
+       while (GetNextHashPos(List, It, &HKLen, &HKey, &vptr))
+       {
+               cputbuf(vptr);
+               cprintf("\n");
+       }
+       cprintf("000\n");
+
+       DeleteHashPos(&It);
+       DeleteHash(&List);
+       FreeStrBuf(&Cfg);
+       FreeStrBuf(&Line);
+       FreeStrBuf(&CfgToken);
+       FreeStrBuf(&Config);
+}
 
 /*****************************************************************************/
 /*                      MODULE INITIALIZATION STUFF                          */
 /*****************************************************************************/
 
-
+void control_cleanup(void)
+{
+       DeleteHash(&CfgNameHash);
+}
 CTDL_MODULE_INIT(control)
 {
        if (!threading) {
+               int i;
+
+               CfgNameHash = NewHash(1, NULL);
+               for (i = 0; CfgNames[i].Name.Key != NULL; i++)
+                       Put(CfgNameHash, CKEY(CfgNames[i].Name), &CfgNames[i], reference_free_handler);
+
+               CtdlRegisterProtoHook(cmd_gvdn, "GVDN", "get valid domain names");
                CtdlRegisterProtoHook(cmd_conf, "CONF", "get/set system configuration");
+               CtdlRegisterCleanupHook(control_cleanup);
+
        }
        /* return our id for the Log */
        return "control";