Metropoli BBS
VIEWER: iheader.c MODE: TEXT (ASCII)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#include <lprintf.h>
#include <chanlib.h>
#include <header.h>

#include "config.h"
#include "inews.h"

/************************************************************************/
/*  validate_header                                                     */
/*                                                                      */
/*  Returns true if header is valid or false otherwise.                 */
/*                                                                      */
/************************************************************************/
int validate_header(char *buf, int bufsiz)
{
    int valid = 1;
    char *item = malloc(MAX_ITEMSIZE);
    int i;
    size_t len;

    *item = '\0';
    for(i = 0; valid && i < ID_LASTENTRY; i++) {
        switch(i) {
        /*
         * In any case we need the newsgroups line
         */
        case ID_Newsgroups:
            if(cfg.newsgroups[0])
                header[i].info = cfg.newsgroups;
            if(header[i].info == NULL) {
                lprintf("Newsgroups missing\n");
                valid = 0;
            }
            break;

        /*
         * If the article contains a path line then we
         * put our machine name in front of it.
         * If there is no such line then we'll create one.
         */
        case ID_Path:
            if(header[i].info) {
                char c;
                char *cp = header[i].info;
                while(*cp && strchr(" !:@^%", *cp) == NULL)
                    cp++;
                c = *cp;
                *cp = '\0';
                if(stricmp(header[i].info, cfg.mynode)) {
                    strcpy(item, cfg.mynode);
                    strcat(item, "!");
                }
                *cp = c;
                strcat(item, header[i].info);
            }
            else
                sprintf(item, "%s!%s", cfg.mynode, "not-for-mail");
            break;

        case ID_From:
            if(cfg.sender[0])
                header[i].info = cfg.sender;
            if(header[i].info == NULL)
                sprintf(item, "%s@%s (%s)", "unknown", cfg.mydomain, "Unknown User");
            break;

        case ID_Subject:
            if(cfg.subject[0])
                header[i].info = cfg.subject;
            else if(header[i].info == NULL) {
                strcpy(item, "<none>");
                lprintf("Created missing subject line");
            }
            break;

        case ID_Distribution:
            if(cfg.distribution[0])
                header[i].info = cfg.distribution;
            if(header[i].info == NULL)
                strcpy(item, "world");
            break;

        case ID_Date:
            if(header[i].info == NULL)
                rfc_date(item, MAX_ITEMSIZE);
            break;

        case ID_Message_ID:
            if(header[i].info == NULL) {
                char pck[MAX_PCKSTRING];
                sprintf(item, "<%s$%s@%s>", radixpack(time(NULL), pck),
                        job_id(0), cfg.mydomain);
                if(cfg.printid)
                    puts(item);
            }
            break;

        case ID_Followup_To:
            if(cfg.followup[0])
                header[i].info = cfg.followup;
            break;

        case ID_Approved:
            if(cfg.approved[0])
                header[i].info = cfg.approved;
            break;

        case ID_Organization:
            if(cfg.organization[0])
                header[i].info = cfg.organization;
            break;

        case ID_Expires:
            if(cfg.expire[0])
                header[i].info = cfg.expire;
            break;

        case ID_Reply_To:
            if(cfg.replyto[0])
                header[i].info = cfg.replyto;
            break;

        /*
         * Remove any xref leftovers
         */
        case ID_Xref:
            header[i].info = NULL;
            break;
        }

        if(*item) {
            if((len = strlen(item) + 1) > (size_t)bufsiz) {
                lprintf("Buffer overflow\n");
                valid = 0;
            }
            else {
                strcpy(buf, item);
                header[i].info = buf;
                buf += len;
                bufsiz -= len;
                *item = '\0';
            }
        }
    }

    if(valid) {
        if(strnicmp(header[ID_Newsgroups].info, "local.", 6))
            lprintf("Spooling news from %s via %s", header[ID_From].info, cfg.newsserver);
        else
            lprintf("Spooling news from %s (local)", header[ID_From].info);
    }
    free(item);
    return(valid);
}
[ RETURN TO DIRECTORY ]