Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel
authorArt Cancro <ajc@uncensored.citadel.org>
Wed, 31 Dec 2014 15:26:45 +0000 (10:26 -0500)
committerArt Cancro <ajc@uncensored.citadel.org>
Wed, 31 Dec 2014 15:26:45 +0000 (10:26 -0500)
Conflicts:
citadel/modules/xmpp/serv_xmpp.c
citadel/modules/xmpp/xmpp_presence.c
citadel/modules/xmpp/xmpp_query_namespace.c

citadel/include/citadel_dirs.h
citadel/modules/imap/imap_misc.c
citadel/modules/network/netspool.h
citadel/modules/network/serv_netmail.c
citadel/modules/network/serv_netspool.c
citadel/modules/xmpp/serv_xmpp.c
citadel/modules/xmpp/xmpp_presence.c
citadel/modules/xmpp/xmpp_query_namespace.c
citadel/utillib/citadel_dirs.c

index 3a0b6d86e38573f630970387cd37c7c2d6417281..407c1dee0145ef54ef22c549ef52b9a610b1fce5 100644 (file)
@@ -26,6 +26,7 @@ extern char ctdl_run_dir[PATH_MAX];
 extern char ctdl_spool_dir[PATH_MAX];
 extern char ctdl_netout_dir[PATH_MAX];
 extern char ctdl_netin_dir[PATH_MAX];
+extern char ctdl_netdigest_dir[PATH_MAX];
 extern char ctdl_nettmp_dir[PATH_MAX];
 extern char ctdl_netcfg_dir[PATH_MAX];
 extern char ctdl_bbsbase_dir[PATH_MAX];
@@ -68,4 +69,6 @@ extern size_t assoc_file_name(char *buf,
                            struct ctdlroom *qrbuf, 
                            const char *prefix);
 
+extern FILE *create_digest_file(struct ctdlroom *room);
+extern void remove_digest_file(struct ctdlroom *room);
 #endif /* __CITADEL_DIRS_H */
index 5b501e4e7aba575f2018fef4b04715115a1e0306..f4d501c9d3853dd56c8895e804ac0c5d943755ea 100644 (file)
@@ -306,7 +306,7 @@ void imap_append(int num_parms, ConstStr *Params) {
                return;
        }
 
-       strcpy(new_message_flags, "");
+       *new_message_flags = '\0';
        if (num_parms >= 5) {
                for (i=3; i<num_parms; ++i) {
                        strcat(new_message_flags, Params[i].Key);
@@ -430,7 +430,7 @@ void imap_append(int num_parms, ConstStr *Params) {
        /* We don't need this buffer anymore */
        CM_Free(msg);
 
-       if (new_message_flags != NULL) {
+       if (IsEmptyStr(new_message_flags)) {
                imap_do_append_flags(new_msgnum, new_message_flags);
        }
 }
index 8496c5c5acaafb0ba0563432aa71dcb0d28e2808..55454a7fb581206cd7d5b9073ee48b8688c6173e 100644 (file)
@@ -36,6 +36,7 @@ struct SpoolControl {
        StrBuf *RoomInfo;
        StrBuf *ListID;
        FILE *digestfp;
+       int newDigest;
        int num_msgs_spooled;
        long lastsent;
 
index fd1de7abe71aac452a024a0fa21567395c38be56..2782fbf8f23bf60a4b8a08fe98534b5fe362cac7 100644 (file)
@@ -182,7 +182,7 @@ void network_deliver_digest(SpoolControl *sc)
        recptypes *valid;
        char bounce_to[256];
 
-       if (sc->Users[listrecp] == NULL)
+       if (sc->Users[digestrecp] == NULL)
                return;
 
        if (sc->num_msgs_spooled < 1) {
@@ -219,11 +219,9 @@ void network_deliver_digest(SpoolControl *sc)
        fread(pbuf, (size_t)msglen, 1, sc->digestfp);
        pbuf[msglen] = '\0';
        CM_SetAsField(msg, eMesageText, &pbuf, msglen);
-       fclose(sc->digestfp);
-       sc->digestfp = NULL;
 
        /* Now generate the delivery instructions */
-       if (sc->Users[listrecp] == NULL)
+       if (sc->Users[digestrecp] == NULL)
                return;
 
        /* Where do we want bounces and other noise to be heard?
@@ -231,7 +229,7 @@ void network_deliver_digest(SpoolControl *sc)
        snprintf(bounce_to, sizeof bounce_to, "room_aide@%s", config.c_fqdn);
 
        /* Now submit the message */
-       valid = validate_recipients(ChrPtr(sc->Users[listrecp]), NULL, 0);
+       valid = validate_recipients(ChrPtr(sc->Users[digestrecp]), NULL, 0);
        if (valid != NULL) {
                valid->bounce_to = strdup(bounce_to);
                valid->envelope_from = strdup(bounce_to);
index 714bb0471918db577cc597c25e9b5d7e05313f45..15f309972537b2592baac01fdfb072bd4d1a5ea0 100644 (file)
@@ -332,6 +332,7 @@ void CalcListID(SpoolControl *sc)
        FreeStrBuf(&RoomName);
 }
 
+static time_t last_digest_delivery = 0;
 
 /*
  * Batch up and send all outbound traffic from the current room
@@ -354,8 +355,12 @@ void network_spoolout_room(SpoolControl *sc)
 
        /* If there are digest recipients, we have to build a digest */
        if (sc->Users[digestrecp] != NULL) {
-               sc->digestfp = tmpfile();
-               fprintf(sc->digestfp, "Content-type: text/plain\n\n");
+               
+               sc->digestfp = create_digest_file(&sc->room);
+               sc->newDigest = ftell(sc->digestfp) > 0;
+               if (sc->newDigest) {
+                       fprintf(sc->digestfp, "Content-type: text/plain\n\n");
+               }
        }
 
        CalcListID(sc);
@@ -363,11 +368,10 @@ void network_spoolout_room(SpoolControl *sc)
        /* remember where we started... */
        lastsent = sc->lastsent;
 
-       /* Do something useful */
+       /* Fetch the messages we ought to send & prepare them. */
        CtdlForEachMessage(MSGS_GT, sc->lastsent, NULL, NULL, NULL,
                network_spool_msg, sc);
 
-       /* If we wrote a digest, deliver it and then close it */
        if (StrLength(sc->Users[roommailalias]) > 0)
        {
                long len;
@@ -387,17 +391,37 @@ void network_spoolout_room(SpoolControl *sc)
                buf[i] = tolower(buf[i]);
                if (isspace(buf[i])) buf[i] = '_';
        }
+
+
+       /* If we wrote a digest, deliver it and then close it */
        if (sc->digestfp != NULL) {
-               fprintf(sc->digestfp,
-                       " -----------------------------------"
-                       "------------------------------------"
-                       "-------\n"
-                       "You are subscribed to the '%s' "
-                       "list.\n"
-                       "To post to the list: %s\n",
-                       CCC->room.QRname, buf
-               );
-               network_deliver_digest(sc);     /* deliver and close */
+               time_t now = time(NULL);
+               time_t secs_today = now % (24 * 60 * 60);
+               long delta = 0;
+
+               if (last_digest_delivery != 0) {
+                       delta = now - last_digest_delivery;
+                       delta = (24 * 60 * 60) - delta;
+               }
+
+               if ((secs_today < 300) && 
+                   (delta < 300) )
+               {
+                       last_digest_delivery = now;
+                       fprintf(sc->digestfp,
+                               " -----------------------------------"
+                               "------------------------------------"
+                               "-------\n"
+                               "You are subscribed to the '%s' "
+                               "list.\n"
+                               "To post to the list: %s\n",
+                               CCC->room.QRname, buf
+                               );
+                       network_deliver_digest(sc);     /* deliver */
+               }
+               fclose(sc->digestfp);
+               sc->digestfp = NULL;
+               remove_digest_file(&sc->room);
        }
 
        /* Now rewrite the config file */
index ea4adc48be009d30aecf3b85e65063d64f5d7226..126385129c82bdaa73faf9e20ed693a0d0c59904 100644 (file)
@@ -79,7 +79,11 @@ static void xmpp_entity_declaration(void *userData, const XML_Char *entityName,
                                const XML_Char *systemId, const XML_Char *publicId,
                                const XML_Char *notationName
 ) {
+<<<<<<< HEAD
        syslog(LOG_WARNING, "Illegal entity declaration encountered; stopping parser.");
+=======
+       XMPPM_syslog(LOG_WARNING, "Illegal entity declaration encountered; stopping parser.");
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
        XML_StopParser(XMPP->xp, XML_FALSE);
 }
 #endif
@@ -211,13 +215,21 @@ void xmpp_stream_start(void *data, const char *supplied_el, const char **attr)
 
        /*
         * TLS encryption (but only if it isn't already active)
+<<<<<<< HEAD
         */ 
+=======
+        * / 
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
 #ifdef HAVE_OPENSSL
        if (!CC->redirect_ssl) {
                cprintf("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'></starttls>");
        }
 #endif
+<<<<<<< HEAD
 
+=======
+       */
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
        if (!CC->logged_in) {
                /* If we're not logged in yet, offer SASL as our feature set */
                xmpp_output_auth_mechs();
@@ -229,13 +241,22 @@ void xmpp_stream_start(void *data, const char *supplied_el, const char **attr)
        /* Offer binding and sessions as part of our feature set */
        cprintf("<bind xmlns=\"urn:ietf:params:xml:ns:xmpp-bind\"/>");
        cprintf("<session xmlns=\"urn:ietf:params:xml:ns:xmpp-session\"/>");
+<<<<<<< HEAD
 
        cprintf("</stream:features>");
+=======
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
 
+       cprintf("</stream:features>");
+
+<<<<<<< HEAD
+
+=======
        CC->is_async = 1;               /* XMPP sessions are inherently async-capable */
 }
 
 
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
 void xmpp_xml_start(void *data, const char *supplied_el, const char **attr) {
        char el[256];
        char *sep = NULL;
@@ -247,12 +268,21 @@ void xmpp_xml_start(void *data, const char *supplied_el, const char **attr) {
                strcpy(el, ++sep);
        }
 
+<<<<<<< HEAD
 #ifdef XMPP_DEBUG
        syslog(LOG_DEBUG, "XMPP ELEMENT START: <%s>\n", el);
        for (i=0; attr[i] != NULL; i+=2) {
                syslog(LOG_DEBUG, "                    Attribute '%s' = '%s'\n", attr[i], attr[i+1]);
        }
 #endif /* XMPP_DEBUG */
+=======
+       /*
+       XMPP_syslog(LOG_DEBUG, "XMPP ELEMENT START: <%s>\n", el);
+       for (i=0; attr[i] != NULL; i+=2) {
+               XMPP_syslog(LOG_DEBUG, "                    Attribute '%s' = '%s'\n", attr[i], attr[i+1]);
+       }
+       uncomment for more verbosity */
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
 
        if (!strcasecmp(el, "stream")) {
                xmpp_stream_start(data, supplied_el, attr);
@@ -261,6 +291,46 @@ void xmpp_xml_start(void *data, const char *supplied_el, const char **attr) {
        else if (!strcasecmp(el, "query")) {
                XMPP->iq_query_xmlns[0] = 0;
                safestrncpy(XMPP->iq_query_xmlns, supplied_el, sizeof XMPP->iq_query_xmlns);
+<<<<<<< HEAD
+       }
+
+       else if (!strcasecmp(el, "bind")) {
+               XMPP->bind_requested = 1;
+       }
+
+       else if (!strcasecmp(el, "iq")) {
+               for (i=0; attr[i] != NULL; i+=2) {
+                       if (!strcasecmp(attr[i], "type")) {
+                               safestrncpy(XMPP->iq_type, attr[i+1], sizeof XMPP->iq_type);
+                       }
+                       else if (!strcasecmp(attr[i], "id")) {
+                               safestrncpy(XMPP->iq_id, attr[i+1], sizeof XMPP->iq_id);
+                       }
+                       else if (!strcasecmp(attr[i], "from")) {
+                               safestrncpy(XMPP->iq_from, attr[i+1], sizeof XMPP->iq_from);
+                       }
+                       else if (!strcasecmp(attr[i], "to")) {
+                               safestrncpy(XMPP->iq_to, attr[i+1], sizeof XMPP->iq_to);
+                       }
+               }
+       }
+
+       else if (!strcasecmp(el, "auth")) {
+               XMPP->sasl_auth_mech[0] = 0;
+               for (i=0; attr[i] != NULL; i+=2) {
+                       if (!strcasecmp(attr[i], "mechanism")) {
+                               safestrncpy(XMPP->sasl_auth_mech, attr[i+1], sizeof XMPP->sasl_auth_mech);
+                       }
+               }
+       }
+
+       else if (!strcasecmp(el, "message")) {
+               for (i=0; attr[i] != NULL; i+=2) {
+                       if (!strcasecmp(attr[i], "to")) {
+                               safestrncpy(XMPP->message_to, attr[i+1], sizeof XMPP->message_to);
+                       }
+               }
+=======
        }
 
        else if (!strcasecmp(el, "bind")) {
@@ -308,6 +378,32 @@ void xmpp_xml_start(void *data, const char *supplied_el, const char **attr) {
 
 
 
+void xmpp_xml_end(void *data, const char *supplied_el) {
+       char el[256];
+       char *sep = NULL;
+       char xmlbuf[256];
+
+       /* Axe the namespace, we don't care about it */
+       safestrncpy(el, supplied_el, sizeof el);
+       while (sep = strchr(el, ':'), sep) {
+               strcpy(el, ++sep);
+       }
+
+       /*
+       XMPP_syslog(LOG_DEBUG, "XMPP ELEMENT END  : <%s>\n", el);
+       if (XMPP->chardata_len > 0) {
+               XMPP_syslog(LOG_DEBUG, "          chardata: %s\n", XMPP->chardata);
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
+       }
+
+<<<<<<< HEAD
+       else if (!strcasecmp(el, "html")) {
+               ++XMPP->html_tag_level;
+       }
+}
+
+
+
 void xmpp_xml_end(void *data, const char *supplied_el) {
        char el[256];
        char *sep = NULL;
@@ -352,6 +448,34 @@ void xmpp_xml_end(void *data, const char *supplied_el) {
 
        else if (!strcasecmp(el, "iq")) {
 
+=======
+       if (!strcasecmp(el, "resource")) {
+               if (XMPP->chardata_len > 0) {
+                       safestrncpy(XMPP->iq_client_resource, XMPP->chardata,
+                               sizeof XMPP->iq_client_resource);
+                       striplt(XMPP->iq_client_resource);
+               }
+       }
+
+       else if (!strcasecmp(el, "username")) {         /* NON SASL ONLY */
+               if (XMPP->chardata_len > 0) {
+                       safestrncpy(XMPP->iq_client_username, XMPP->chardata,
+                               sizeof XMPP->iq_client_username);
+                       striplt(XMPP->iq_client_username);
+               }
+       }
+
+       else if (!strcasecmp(el, "password")) {         /* NON SASL ONLY */
+               if (XMPP->chardata_len > 0) {
+                       safestrncpy(XMPP->iq_client_password, XMPP->chardata,
+                               sizeof XMPP->iq_client_password);
+                       striplt(XMPP->iq_client_password);
+               }
+       }
+
+       else if (!strcasecmp(el, "iq")) {
+
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
                /*
                 * iq type="get" (handle queries)
                 */
@@ -383,7 +507,11 @@ void xmpp_xml_end(void *data, const char *supplied_el) {
                         * Unknown query ... return the XML equivalent of a blank stare
                         */
                        else {
+<<<<<<< HEAD
                                syslog(LOG_DEBUG,
+=======
+                               XMPP_syslog(LOG_DEBUG,
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
                                            "Unknown query <%s> - returning <service-unavailable/>\n",
                                            el
                                );
@@ -515,6 +643,7 @@ void xmpp_xml_end(void *data, const char *supplied_el) {
 
        else if (!strcasecmp(el, "ping")) {
                XMPP->ping_requested = 1;
+<<<<<<< HEAD
        }
 
        else if (!strcasecmp(el, "stream")) {
@@ -530,6 +659,19 @@ void xmpp_xml_end(void *data, const char *supplied_el) {
 
        else {
                syslog(LOG_DEBUG, "Ignoring unknown tag <%s>\n", el);
+=======
+       }
+
+       else if (!strcasecmp(el, "stream")) {
+               XMPPM_syslog(LOG_DEBUG, "XMPP client shut down their stream\n");
+               xmpp_massacre_roster();
+               cprintf("</stream>\n");
+               CC->kill_me = KILLME_CLIENT_LOGGED_OUT;
+       }
+
+       else {
+               XMPP_syslog(LOG_DEBUG, "Ignoring unknown tag <%s>\n", el);
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
        }
 
        XMPP->chardata_len = 0;
index ebdfd152acd0663ca3141709a3228445e3c1eda2..4c2d50ade321a9cdfe4ede9ef1d9de0bc5b5cb0f 100644 (file)
@@ -67,7 +67,10 @@ void xmpp_indicate_presence(char *presence_jid)
 {
        char xmlbuf[256];
 
+<<<<<<< HEAD
        syslog(LOG_DEBUG, "XMPP: indicating presence of <%s> to <%s>", presence_jid, XMPP->client_jid);
+=======
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
        cprintf("<presence from=\"%s\" ", xmlesc(xmlbuf, presence_jid, sizeof xmlbuf));
        cprintf("to=\"%s\"></presence>", xmlesc(xmlbuf, XMPP->client_jid, sizeof xmlbuf));
 }
index 39b3979aca92b352bfced431bb4dfb28ad8e9dbc..fb3374e9e73984a91d1584ab90007171305cd0ad 100644 (file)
@@ -98,6 +98,10 @@ void xmpp_iq_roster_query(void)
  * Client is doing a namespace query.  These are all handled differently.
  * A "rumplestiltskin lookup" is the most efficient way to handle this.  Please do not refactor this code.
  */
+<<<<<<< HEAD
+=======
+
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
 void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_xmlns)
 {
        int supported_namespace = 0;
@@ -117,7 +121,11 @@ void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_x
                supported_namespace = 1;
        }
 
+<<<<<<< HEAD
        syslog(LOG_DEBUG, "xmpp_query_namespace(id=%s, from=%s, to=%s, xmlns=%s)\n", iq_id, iq_from, iq_to, query_xmlns);
+=======
+       XMPP_syslog(LOG_DEBUG, "xmpp_query_namespace(%s, %s, %s, %s)\n", iq_id, iq_from, iq_to, query_xmlns);
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
 
        /*
         * Beginning of query result.
@@ -127,10 +135,17 @@ void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_x
        }
        else {
                cprintf("<iq type=\"error\" ");
+<<<<<<< HEAD
+       }
+       if (!IsEmptyStr(iq_from)) {
+               cprintf("to=\"%s\" ", xmlesc(xmlbuf, iq_from, sizeof xmlbuf));
+       }
+=======
        }
        if (!IsEmptyStr(iq_from)) {
                cprintf("to=\"%s\" ", xmlesc(xmlbuf, iq_from, sizeof xmlbuf));
        }
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
        cprintf("id=\"%s\">", xmlesc(xmlbuf, iq_id, sizeof xmlbuf));
 
        /*
@@ -165,7 +180,14 @@ void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_x
         */
 
        else {
+<<<<<<< HEAD
                syslog(LOG_DEBUG, "Unknown query namespace '%s' - returning <service-unavailable/>\n", query_xmlns);
+=======
+               XMPP_syslog(LOG_DEBUG,
+                           "Unknown query namespace '%s' - returning <service-unavailable/>\n",
+                           query_xmlns
+               );
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
                cprintf("<error code=\"503\" type=\"cancel\">"
                        "<service-unavailable xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>"
                        "</error>"
index 17115df40075354d2f0490b314b5d05c78256247..3b0afc1b6ca66b6dae715a5f0ac68afb20bdea96 100644 (file)
@@ -44,6 +44,7 @@ char ctdl_run_dir[PATH_MAX]="";
 char ctdl_spool_dir[PATH_MAX]="network";
 char ctdl_netout_dir[PATH_MAX]="network/spoolout";
 char ctdl_netin_dir[PATH_MAX]="network/spoolin";
+char ctdl_netdigest_dir[PATH_MAX]="network/digest";
 char ctdl_nettmp_dir[PATH_MAX]="network/spooltmp";
 char ctdl_netcfg_dir[PATH_MAX]="netconfigs";
 char ctdl_utilbin_dir[PATH_MAX]="";
@@ -194,11 +195,13 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char  *ctdldir,
        COMPUTE_DIRECTORY(ctdl_spool_dir);
        COMPUTE_DIRECTORY(ctdl_netout_dir);
        COMPUTE_DIRECTORY(ctdl_netin_dir);
+       COMPUTE_DIRECTORY(ctdl_netdigest_dir);
        COMPUTE_DIRECTORY(ctdl_nettmp_dir);
 
        StripSlashes(ctdl_spool_dir, 1);
        StripSlashes(ctdl_netout_dir, 1);
        StripSlashes(ctdl_netin_dir, 1);
+       StripSlashes(ctdl_netdigest_dir, 1);
        StripSlashes(ctdl_nettmp_dir, 1);
 
        /* ok, now we know the dirs, calc some commonly used files */
@@ -330,6 +333,7 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char  *ctdldir,
        DBG_PRINT(ctdl_spool_dir);
        DBG_PRINT(ctdl_netout_dir);
        DBG_PRINT(ctdl_netin_dir);
+       DBG_PRINT(ctdl_netdigest_dir);
        DBG_PRINT(ctdl_nettmp_dir);
        DBG_PRINT(ctdl_netcfg_dir);
        DBG_PRINT(ctdl_bbsbase_dir);
@@ -364,6 +368,36 @@ size_t assoc_file_name(char *buf, size_t n,
        return snprintf(buf, n, "%s%ld", prefix, qrbuf->QRnumber);
 }
 
+void remove_digest_file(struct ctdlroom *room)
+{
+       char buf[PATH_MAX];
+
+       snprintf(buf, PATH_MAX, "%s/%ld.eml", 
+                ctdl_netdigest_dir,
+                room->QRnumber);
+       StripSlashes(buf, 0);
+       fprintf(stderr, "----> %s \n", buf);
+       unlink(buf);
+}
+
+FILE *create_digest_file(struct ctdlroom *room)
+{
+       char buf[PATH_MAX];
+       FILE *fp;
+
+       snprintf(buf, PATH_MAX, "%s/%ld.eml", 
+                ctdl_netdigest_dir,
+                room->QRnumber);
+       StripSlashes(buf, 0);
+       fprintf(stderr, "----> %s \n", buf);
+       
+       fp = fopen(buf, "w+");
+       if (fp == NULL) {
+
+       }
+       return fp;
+}
+
 
 int create_dir(char *which, long ACCESS, long UID, long GID)
 {
@@ -384,24 +418,34 @@ int create_run_directories(long UID, long GID)
 
        rv = create_dir(ctdl_info_dir    , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
        if (rv != -1)
-               rv = create_dir(ctdl_bio_dir     , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+               rv = create_dir(ctdl_bio_dir       , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+       if (rv != -1)
+               rv = create_dir(ctdl_usrpic_dir    , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+       if (rv != -1)
+               rv = create_dir(ctdl_message_dir   , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+       if (rv != -1)
+               rv = create_dir(ctdl_hlp_dir       , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+       if (rv != -1)
+               rv = create_dir(ctdl_image_dir     , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+       if (rv != -1)
+               rv = create_dir(ctdl_bb_dir        , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
        if (rv != -1)
-               rv = create_dir(ctdl_usrpic_dir  , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+               rv = create_dir(ctdl_file_dir      , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
        if (rv != -1)
-               rv = create_dir(ctdl_message_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+               rv = create_dir(ctdl_netcfg_dir    , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
        if (rv != -1)
-               rv = create_dir(ctdl_hlp_dir     , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+               rv = create_dir(ctdl_spool_dir     , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
        if (rv != -1)
-               rv = create_dir(ctdl_image_dir   , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+               rv = create_dir(ctdl_netout_dir    , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
        if (rv != -1)
-               rv = create_dir(ctdl_bb_dir      , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+               rv = create_dir(ctdl_netin_dir     , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
        if (rv != -1)
-               rv = create_dir(ctdl_file_dir    , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+               rv = create_dir(ctdl_netdigest_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
        if (rv != -1)
-               rv = create_dir(ctdl_netcfg_dir  , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+               rv = create_dir(ctdl_nettmp_dir    , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
        if (rv != -1)
-               rv = create_dir(ctdl_key_dir     , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+               rv = create_dir(ctdl_key_dir       , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
        if (rv != -1)
-               rv = create_dir(ctdl_run_dir     , S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, UID, GID);
+               rv = create_dir(ctdl_run_dir       , S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, UID, GID);
        return rv;
 }