]> code.citadel.org Git - citadel.git/blobdiff - citadel/control.c
* prep for new network node infrastructure
[citadel.git] / citadel / control.c
index f21e3d88a7c2eccefc6a0bcd3d0dcabb9845e214..94c3ec8c4e1049cd471949dd432ac856d0685774 100644 (file)
@@ -1,10 +1,8 @@
 /*
- * control.c
+ * $Id$
  *
  * This module handles states which are global to the entire server.
  *
- * $Id$
- *
  */
 
 #include "sysdep.h"
 #include <stdio.h>
 #include <fcntl.h>
 #include <signal.h>
-#include <time.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>
-#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
-#endif
 #include <syslog.h>
+#include <sys/types.h>
 #include "citadel.h"
 #include "server.h"
 #include "control.h"
@@ -29,6 +36,7 @@
 #include "support.h"
 #include "config.h"
 #include "msgbase.h"
+#include "citserver.h"
 #include "tools.h"
 #include "room_ops.h"
 
@@ -46,11 +54,16 @@ void get_control(void) {
         * to zero.
         */
        memset(&CitControl, 0, sizeof(struct CitControl));
-       if (control_fp == NULL)
+       if (control_fp == NULL) {
                control_fp = fopen("citadel.control", "rb+");
+               if (control_fp != NULL) {
+                       fchown(fileno(control_fp), config.c_bbsuid, -1);
+               }
+       }
        if (control_fp == NULL) {
                control_fp = fopen("citadel.control", "wb+");
                if (control_fp != NULL) {
+                       fchown(fileno(control_fp), config.c_bbsuid, -1);
                        memset(&CitControl, 0, sizeof(struct CitControl));
                        fwrite(&CitControl, sizeof(struct CitControl),
                                1, control_fp);
@@ -125,20 +138,13 @@ long get_new_room_number(void) {
  * Get or set global configuration options
  */
 void cmd_conf(char *argbuf) {
-       char cmd[256];
-       char buf[256];
+       char cmd[SIZ];
+       char buf[SIZ];
        int a;
+       char *confptr;
+       char confname[SIZ];
 
-       if (!(CC->logged_in)) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-               }
-
-       if (CC->usersupp.axlevel < 6) {
-               cprintf("%d Higher access required.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
+       if (CtdlAccessCheck(ac_aide)) return;
 
        extract(cmd, argbuf, 0);
        if (!strcasecmp(cmd, "GET")) {
@@ -164,6 +170,13 @@ void cmd_conf(char *argbuf) {
                cprintf("%s\n", config.c_logpages);
                cprintf("%d\n", config.c_createax);
                cprintf("%d\n", config.c_maxmsglen);
+               cprintf("%d\n", config.c_min_workers);
+               cprintf("%d\n", config.c_max_workers);
+               cprintf("%d\n", config.c_pop3_port);
+               cprintf("%d\n", config.c_smtp_port);
+               cprintf("%d\n", config.c_default_filter);
+               cprintf("%d\n", config.c_aide_zap);
+               cprintf("%d\n", config.c_imap_port);
                cprintf("000\n");
                }
 
@@ -172,13 +185,17 @@ void cmd_conf(char *argbuf) {
                a = 0;
                while (client_gets(buf), strcmp(buf, "000")) {
                    switch(a) {
-                       case 0: strncpy(config.c_nodename, buf, 16);
+                       case 0: safestrncpy(config.c_nodename, buf,
+                                       sizeof config.c_nodename);
                                break;
-                       case 1: strncpy(config.c_fqdn, buf, 64);
+                       case 1: safestrncpy(config.c_fqdn, buf,
+                                       sizeof config.c_fqdn);
                                break;
-                       case 2: strncpy(config.c_humannode, buf, 21);
+                       case 2: safestrncpy(config.c_humannode, buf,
+                                       sizeof config.c_humannode);
                                break;
-                       case 3: strncpy(config.c_phonenum, buf, 16);
+                       case 3: safestrncpy(config.c_phonenum, buf,
+                                       sizeof config.c_phonenum);
                                break;
                        case 4: config.c_creataide = atoi(buf);
                                break;
@@ -196,31 +213,35 @@ void cmd_conf(char *argbuf) {
                                if (config.c_twitdetect != 0)
                                        config.c_twitdetect = 1;
                                break;
-                       case 9: strncpy(config.c_twitroom,
-                                       buf, ROOMNAMELEN);
+                       case 9: safestrncpy(config.c_twitroom, buf,
+                                       sizeof config.c_twitroom);
                                break;
-                       case 10: strncpy(config.c_moreprompt, buf, 80);
+                       case 10: safestrncpy(config.c_moreprompt, buf,
+                                       sizeof config.c_moreprompt);
                                break;
                        case 11: config.c_restrict = atoi(buf);
                                if (config.c_restrict != 0)
                                        config.c_restrict = 1;
                                break;
-                       case 12: strncpy(config.c_bbs_city, buf, 32);
+                       case 12: safestrncpy(config.c_bbs_city, buf,
+                                       sizeof config.c_bbs_city);
                                break;
-                       case 13: strncpy(config.c_sysadm, buf, 26);
+                       case 13: safestrncpy(config.c_sysadm, buf,
+                                       sizeof config.c_sysadm);
                                break;
                        case 14: config.c_maxsessions = atoi(buf);
                                if (config.c_maxsessions < 1)
                                        config.c_maxsessions = 1;
                                break;
-                       case 15: strncpy(config.c_net_password, buf, 20);
+                       case 15: safestrncpy(config.c_net_password, buf,
+                                       sizeof config.c_net_password);
                                break;
                        case 16: config.c_userpurge = atoi(buf);
                                break;
                        case 17: config.c_roompurge = atoi(buf);
                                break;
-                       case 18: strncpy(config.c_logpages,
-                                       buf, ROOMNAMELEN);
+                       case 18: safestrncpy(config.c_logpages, buf,
+                                       sizeof config.c_logpages);
                                break;
                        case 19: config.c_createax = atoi(buf);
                                if (config.c_createax < 1)
@@ -231,6 +252,22 @@ void cmd_conf(char *argbuf) {
                        case 20: if (atoi(buf) >= 8192)
                                        config.c_maxmsglen = atoi(buf);
                                break;
+                       case 21: if (atoi(buf) >= 2)
+                                       config.c_min_workers = atoi(buf);
+                       case 22: if (atoi(buf) >= config.c_min_workers)
+                                       config.c_max_workers = atoi(buf);
+                       case 23: config.c_pop3_port = atoi(buf);
+                               break;
+                       case 24: config.c_smtp_port = atoi(buf);
+                               break;
+                       case 25: config.c_default_filter = atoi(buf);
+                               break;
+                       case 26: config.c_aide_zap = atoi(buf);
+                               if (config.c_aide_zap != 0)
+                                       config.c_aide_zap = 1;
+                               break;
+                       case 27: config.c_imap_port = atoi(buf);
+                               break;
                        }
                    ++a;
                    }
@@ -241,11 +278,36 @@ void cmd_conf(char *argbuf) {
                aide_message(buf);
 
                if (strlen(config.c_logpages) > 0)
-                       create_room(config.c_logpages, 4, "", 0);
+                       create_room(config.c_logpages, 3, "", 0, 1);
                }
 
+       else if (!strcasecmp(cmd, "GETSYS")) {
+               extract(confname, argbuf, 1);
+               confptr = CtdlGetSysConfig(confname);
+               if (confptr != NULL) {
+                       cprintf("%d %s\n", LISTING_FOLLOWS, confname);
+                       client_write(confptr, strlen(confptr));
+                       if (confptr[strlen(confptr)-1] != 10)
+                               client_write("\n", 1);
+                       cprintf("000\n");
+                       phree(confptr);
+               }
+               else {
+                       cprintf("%d No such configuration.\n",
+                               ERROR+ILLEGAL_VALUE);
+               }
+       }
+
+       else if (!strcasecmp(cmd, "PUTSYS")) {
+               extract(confname, argbuf, 1);
+               cprintf("%d %s\n", SEND_LISTING, confname);
+               confptr = CtdlReadMessageBody("000", config.c_maxmsglen, NULL);
+               CtdlPutSysConfig(confname, confptr);
+               phree(confptr);
+       }
+
        else {
-               cprintf("%d The only valid options are GET and SET.\n",
+               cprintf("%d Illegal option(s) specified.\n",
                        ERROR+ILLEGAL_VALUE);
                }
        }