]> code.citadel.org Git - citadel.git/blobdiff - citadel/config.c
fix type for sizeof; it shouldn't be the pointer.
[citadel.git] / citadel / config.c
index cc48c8d11c7f3a586e5650d178e0a01e04a2595c..7ac1a748bbd478e8ece0e5c6c5b566e62f690e40 100644 (file)
  */
 
 #include "sysdep.h"
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <unistd.h>
 #include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <limits.h>
 #include <sys/utsname.h>
 #include <libcitadel.h>
-#include "citadel.h"
-#include "server.h"
 #include "config.h"
 #include "ctdl_module.h"
 
@@ -42,9 +34,7 @@ void brand_new_installation_set_defaults(void) {
        uname(&my_utsname);
 
        /* set some sample/default values in place of blanks... */
-       char c_nodename[256];
-       safestrncpy(c_nodename, my_utsname.nodename, sizeof c_nodename);
-       strtok(config.c_nodename, ".");
+       extract_token(config.c_nodename, my_utsname.nodename, 0, '.', sizeof config.c_nodename);
        if (IsEmptyStr(config.c_fqdn) ) {
                if ((he = gethostbyname(my_utsname.nodename)) != NULL) {
                        safestrncpy(config.c_fqdn, he->h_name, sizeof config.c_fqdn);
@@ -63,7 +53,6 @@ void brand_new_installation_set_defaults(void) {
        safestrncpy(config.c_aideroom, "Aide", sizeof config.c_aideroom);
        config.c_port_number = 504;
        config.c_sleeping = 900;
-       config.c_instant_expunge = 1;
 
        if (config.c_ctdluid == 0) {
                pw = getpwnam("citadel");
@@ -130,7 +119,8 @@ void get_config(void) {
                {
                        fprintf(stderr, 
                                "Warning: The config file %s has unexpected size. \n",
-                               file_citadel_config);
+                               file_citadel_config
+                       );
                }
                fclose(cfp);
        }
@@ -198,6 +188,7 @@ void get_config(void) {
        }
 }
 
+long config_msgnum = 0;
 
 /*
  * Occasionally, we will need to write the config file, because some operations
@@ -206,15 +197,75 @@ void get_config(void) {
 void put_config(void)
 {
        FILE *cfp;
-       int rv;
+       int blocks_written = 0;
+
+       if ((cfp = fopen(file_citadel_config, "w")) != NULL) {
+               blocks_written = fwrite((char *) &config, sizeof(struct config), 1, cfp);
+               if (blocks_written == 1) {
+                       fclose(cfp);
+                       chown(file_citadel_config, CTDLUID, (-1));
+                       chmod(file_citadel_config, 0600);
+                       return;
+               }
+       }
+       syslog(LOG_EMERG, "%s: %s", file_citadel_config, strerror(errno));
+}
+
+
+
+void CtdlGetSysConfigBackend(long msgnum, void *userdata) {
+       config_msgnum = msgnum;
+}
+
+
+char *CtdlGetSysConfig(char *sysconfname) {
+       char hold_rm[ROOMNAMELEN];
+       long msgnum;
+       char *conf;
+       struct CtdlMessage *msg;
+       char buf[SIZ];
+       
+       strcpy(hold_rm, CC->room.QRname);
+       if (CtdlGetRoom(&CC->room, SYSCONFIGROOM) != 0) {
+               CtdlGetRoom(&CC->room, hold_rm);
+               return NULL;
+       }
+
 
-       if ((cfp = fopen(file_citadel_config, "rb+")) == NULL)
-               perror(file_citadel_config);
+       /* We want the last (and probably only) config in this room */
+       begin_critical_section(S_CONFIG);
+       config_msgnum = (-1L);
+       CtdlForEachMessage(MSGS_LAST, 1, NULL, sysconfname, NULL,
+                          CtdlGetSysConfigBackend, NULL);
+       msgnum = config_msgnum;
+       end_critical_section(S_CONFIG);
+
+       if (msgnum < 0L) {
+               conf = NULL;
+       }
        else {
-               rv = fwrite((char *) &config, sizeof(struct config), 1, cfp);
-               if (rv == -1)
-                       syslog(LOG_EMERG, "Failed to write: %s [%s]\n", 
-                              file_citadel_config, strerror(errno));
-               fclose(cfp);
+               msg = CtdlFetchMessage(msgnum, 1);
+               if (msg != NULL) {
+                       conf = strdup(msg->cm_fields[eMesageText]);
+                       CM_Free(msg);
+               }
+               else {
+                       conf = NULL;
+               }
        }
+
+       CtdlGetRoom(&CC->room, hold_rm);
+
+       if (conf != NULL) do {
+                       extract_token(buf, conf, 0, '\n', sizeof buf);
+                       strcpy(conf, &conf[strlen(buf)+1]);
+               } while ( (!IsEmptyStr(conf)) && (!IsEmptyStr(buf)) );
+
+       return(conf);
+}
+
+
+void CtdlPutSysConfig(char *sysconfname, char *sysconfdata) {
+       CtdlWriteObject(SYSCONFIGROOM, sysconfname, sysconfdata, (strlen(sysconfdata)+1), NULL, 0, 1, 0);
 }
+