]> code.citadel.org Git - citadel.git/blobdiff - citadel/control.c
* Changed a lot of strncpy() calls to safestrncpy() and replaced most of their
[citadel.git] / citadel / control.c
index f902bb169f9be782775d31f39cc8bb9cfbb90d70..1455c72c7ba6ef6b16b2f35b91c6849e563633ea 100644 (file)
@@ -7,6 +7,7 @@
  *
  */
 
+#include "sysdep.h"
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <ctype.h>
 #include <string.h>
 #include <errno.h>
+#include <limits.h>
+#ifdef HAVE_PTHREAD_H
 #include <pthread.h>
+#endif
 #include <syslog.h>
 #include "citadel.h"
 #include "server.h"
 #include "support.h"
 #include "config.h"
 #include "msgbase.h"
+#include "tools.h"
+#include "room_ops.h"
 
 struct CitControl CitControl;
 struct config config;
+FILE *control_fp = NULL;
 
 /*
  * get_control  -  read the control record into memory.
  */
 void get_control(void) {
-       FILE *fp;
 
        /* Zero it out.  If the control record on disk is missing or short,
         * the system functions with all control record fields initialized
         * to zero.
         */
        memset(&CitControl, 0, sizeof(struct CitControl));
-       fp = fopen("citadel.control", "rb");
-       if (fp == NULL) return;
+       if (control_fp == NULL)
+               control_fp = fopen("citadel.control", "rb+");
+       if (control_fp == NULL) {
+               control_fp = fopen("citadel.control", "wb+");
+               if (control_fp != NULL) {
+                       memset(&CitControl, 0, sizeof(struct CitControl));
+                       fwrite(&CitControl, sizeof(struct CitControl),
+                               1, control_fp);
+                       rewind(control_fp);
+               }
+       }
+       if (control_fp == NULL) {
+               lprintf(1, "ERROR opening citadel.control: %s\n",
+                       strerror(errno));
+               return;
+       }
 
-       fread(&CitControl, sizeof(struct CitControl), 1, fp);
-       fclose(fp);
+       rewind(control_fp);
+       fread(&CitControl, sizeof(struct CitControl), 1, control_fp);
        }
 
 /*
  * put_control  -  write the control record to disk.
  */
 void put_control(void) {
-       FILE *fp;
 
-       fp = fopen("citadel.control", "wb");
-       if (fp != NULL) {
-               fwrite(&CitControl, sizeof(struct CitControl), 1, fp);
-               fclose(fp);
+       if (control_fp != NULL) {
+               rewind(control_fp);
+               fwrite(&CitControl, sizeof(struct CitControl), 1, control_fp);
+               fflush(control_fp);
                }
        }
 
@@ -141,6 +160,10 @@ void cmd_conf(char *argbuf) {
                cprintf("%d\n", config.c_maxsessions);
                cprintf("%s\n", config.c_net_password);
                cprintf("%d\n", config.c_userpurge);
+               cprintf("%d\n", config.c_roompurge);
+               cprintf("%s\n", config.c_logpages);
+               cprintf("%d\n", config.c_createax);
+               cprintf("%d\n", config.c_maxmsglen);
                cprintf("000\n");
                }
 
@@ -149,13 +172,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;
@@ -173,35 +200,56 @@ 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: safestrncpy(config.c_logpages, buf,
+                                       sizeof config.c_logpages);
+                               break;
+                       case 19: config.c_createax = atoi(buf);
+                               if (config.c_createax < 1)
+                                       config.c_createax = 1;
+                               if (config.c_createax > 6)
+                                       config.c_createax = 6;
+                               break;
+                       case 20: if (atoi(buf) >= 8192)
+                                       config.c_maxmsglen = atoi(buf);
+                               break;
+                       }
                    ++a;
                    }
                put_config();
                snprintf(buf,sizeof buf,
-                        "Global system configuration edited by %s",
+                        "Global system configuration edited by %s\n",
                         CC->curr_user);
                aide_message(buf);
+
+               if (strlen(config.c_logpages) > 0)
+                       create_room(config.c_logpages, 4, "", 0);
                }
 
        else {