Annotation of sbbs/src/smblib/smbstr.c, revision 1.1.1.2

1.1       root        1: /* smbstr.c */
                      2: 
                      3: /* Synchronet message base (SMB) library routines returning strings */
                      4: 
1.1.1.2 ! root        5: /* $Id: smbstr.c,v 1.22 2011/08/31 04:12:34 rswindell Exp $ */
1.1       root        6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
1.1.1.2 ! root       11:  * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html         *
1.1       root       12:  *                                                                                                                                                     *
                     13:  * This library is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU Lesser General Public License          *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU Lesser General Public License for more details: lgpl.txt or     *
                     18:  * http://www.fsf.org/copyleft/lesser.html                                                                     *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include <ctype.h>             /* is*() */
                     39: #include <string.h>            /* strcpy, strcat, memset, strchr */
                     40: #include <genwrap.h>           /* stricmp */
                     41: #include "smblib.h"
                     42: 
                     43: char* SMBCALL smb_hfieldtype(ushort type)
                     44: {
                     45:        static char str[8];
                     46: 
                     47:        switch(type) {
1.1.1.2 ! root       48:                case SENDER:                    return("Sender");                               /* RFC-compliant */
1.1       root       49:                case SENDERAGENT:               return("SenderAgent");
                     50:                case SENDERNETTYPE:             return("SenderNetType");
                     51:                case SENDERNETADDR:             return("SenderNetAddr");
                     52:                case SENDEREXT:                 return("SenderExt");
1.1.1.2 ! root       53:                case SENDERORG:                 return("Organization");                 /* RFC-compliant */
1.1       root       54:                case SENDERIPADDR:              return("SenderIpAddr");
                     55:                case SENDERHOSTNAME:    return("SenderHostName");
                     56:                case SENDERPROTOCOL:    return("SenderProtocol");
1.1.1.2 ! root       57:                case SENDERPORT_BIN:    return("SenderPortBin");
1.1       root       58:                case SENDERPORT:                return("SenderPort");
1.1.1.2 ! root       59:                case SENDERUSERID:              return("SenderUserID");
        !            60:                case SENDERTIME:                return("SenderTime");
        !            61:                case SENDERSERVER:              return("SenderServer");
        !            62: 
        !            63:                case REPLYTO:                   return("Reply-To");                             /* RFC-compliant */
        !            64:                case REPLYTOAGENT:              return("Reply-ToAgent");
        !            65:                case REPLYTONETTYPE:    return("Reply-ToNetType");
        !            66:                case REPLYTONETADDR:    return("Reply-ToNetAddr");
        !            67:                case REPLYTOEXT:                return("Reply-ToExt");
1.1       root       68:                                                                
1.1.1.2 ! root       69:                case RECIPIENT:                 return("To");                                   /* RFC-compliant */
        !            70:                case RECIPIENTAGENT:    return("ToAgent");
        !            71:                case RECIPIENTNETTYPE:  return("ToNetType");
        !            72:                case RECIPIENTNETADDR:  return("ToNetAddr");
        !            73:                case RECIPIENTEXT:              return("ToExt");
1.1       root       74: 
1.1.1.2 ! root       75:                case SUBJECT:                   return("Subject");                              /* RFC-compliant */
1.1       root       76:                case SMB_SUMMARY:               return("Summary");
1.1.1.2 ! root       77:                case SMB_COMMENT:               return("Comment");                              /* RFC-compliant */
        !            78:                case SMB_CARBONCOPY:    return("CC");                                   /* RFC-compliant */
1.1       root       79:                case SMB_GROUP:                 return("Group");
                     80:                case SMB_EXPIRATION:    return("Expiration");
                     81:                case SMB_PRIORITY:              return("Priority");
                     82:                case SMB_COST:                  return("Cost");
1.1.1.2 ! root       83:                case SMB_EDITOR:                return("Editor");
        !            84:                case FORWARDED:                 return("Forwarded");
1.1       root       85: 
1.1.1.2 ! root       86:                /* All X-FTN-* are RFC-compliant */
        !            87:                case FIDOCTRL:                  return("X-FTN-Kludge");
        !            88:                case FIDOAREA:                  return("X-FTN-AREA");
        !            89:                case FIDOSEENBY:                return("X-FTN-SEEN-BY");
        !            90:                case FIDOPATH:                  return("X-FTN-PATH");
        !            91:                case FIDOMSGID:                 return("X-FTN-MSGID");
        !            92:                case FIDOREPLYID:               return("X-FTN-REPLY");
        !            93:                case FIDOPID:                   return("X-FTN-PID");
        !            94:                case FIDOFLAGS:                 return("X-FTN-Flags");
        !            95:                case FIDOTID:                   return("X-FTN-TID");
        !            96: 
        !            97:                case RFC822HEADER:              return("OtherHeader");
        !            98:                case RFC822MSGID:               return("Message-ID");                   /* RFC-compliant */
        !            99:                case RFC822REPLYID:             return("In-Reply-To");                  /* RFC-compliant */
1.1       root      100:                case RFC822TO:                  return("RFC822To");
                    101:                case RFC822FROM:                return("RFC822From");
                    102:                case RFC822REPLYTO:             return("RFC822ReplyTo");
                    103: 
1.1.1.2 ! root      104:                case USENETPATH:                return("Path");                                 /* RFC-compliant */
        !           105:                case USENETNEWSGROUPS:  return("Newsgroups");                   /* RFC-compliant */
1.1       root      106: 
                    107:                case SMTPCOMMAND:               return("SMTPCommand");
1.1.1.2 ! root      108:                case SMTPREVERSEPATH:   return("Return-Path");                  /* RFC-compliant */
1.1       root      109:                case SMTPFORWARDPATH:   return("SMTPForwardPath");
1.1.1.2 ! root      110:                case SMTPRECEIVED:              return("Received");                             /* RFC-compliant */
1.1       root      111: 
                    112:                case SMTPSYSMSG:                return("SMTPSysMsg");
                    113: 
                    114:                case UNKNOWN:                   return("UNKNOWN");
                    115:                case UNKNOWNASCII:              return("UNKNOWNASCII");
                    116:                case UNUSED:                    return("UNUSED");
                    117:        }
                    118:        sprintf(str,"%02Xh",type);
                    119:        return(str);
                    120: }
                    121: 
                    122: ushort SMBCALL smb_hfieldtypelookup(const char* str)
                    123: {
                    124:        ushort type;
                    125: 
                    126:        if(isdigit(*str))
                    127:                return((ushort)strtol(str,NULL,0));
                    128: 
                    129:        for(type=0;type<=UNUSED;type++)
                    130:                if(stricmp(str,smb_hfieldtype(type))==0)
                    131:                        return(type);
                    132: 
                    133:        return(UNKNOWN);
                    134: }
                    135: 
                    136: char* SMBCALL smb_dfieldtype(ushort type)
                    137: {
                    138:        static char str[8];
                    139: 
                    140:        switch(type) {
                    141:                case TEXT_BODY: return("TEXT_BODY");
                    142:                case TEXT_TAIL: return("TEXT_TAIL");
                    143:                case UNUSED:    return("UNUSED");
                    144:        }
                    145:        sprintf(str,"%02Xh",type);
                    146:        return(str);
                    147: }
                    148: 
                    149: char* SMBCALL smb_hashsourcetype(uchar type)
                    150: {
                    151:        static char str[8];
                    152: 
                    153:        switch(type) {
                    154:                case SMB_HASH_SOURCE_BODY:              return(smb_dfieldtype(TEXT_BODY));
                    155:                case SMB_HASH_SOURCE_MSG_ID:    return(smb_hfieldtype(RFC822MSGID));
                    156:                case SMB_HASH_SOURCE_FTN_ID:    return(smb_hfieldtype(FIDOMSGID));
1.1.1.2 ! root      157:                case SMB_HASH_SOURCE_SUBJECT:   return(smb_hfieldtype(SUBJECT));
1.1       root      158:        }
                    159:        sprintf(str,"%02Xh",type);
                    160:        return(str);
                    161: }
                    162: 
                    163: char* SMBCALL smb_hashsource(smbmsg_t* msg, int source)
                    164: {
                    165:        switch(source) {
                    166:                case SMB_HASH_SOURCE_MSG_ID:
                    167:                        return(msg->id);
                    168:                case SMB_HASH_SOURCE_FTN_ID:
                    169:                        return(msg->ftn_msgid);
1.1.1.2 ! root      170:                case SMB_HASH_SOURCE_SUBJECT:
        !           171:                        return(msg->subj);
1.1       root      172:        }
                    173:        return("hash");
                    174: }
                    175: 
                    176: /****************************************************************************/
                    177: /* Converts when_t.zone into ASCII format                                   */
                    178: /****************************************************************************/
1.1.1.2 ! root      179: char* SMBCALL smb_zonestr(short zone, char* str)
1.1       root      180: {
                    181:        char*           plus;
1.1.1.2 ! root      182:     static char buf[32];
1.1       root      183: 
1.1.1.2 ! root      184:        if(str==NULL)
        !           185:                str=buf;
1.1       root      186:        switch((ushort)zone) {
                    187:                case 0:     return("UTC");
                    188:                case AST:   return("AST");
                    189:                case EST:   return("EST");
                    190:                case CST:   return("CST");
                    191:                case MST:   return("MST");
                    192:                case PST:   return("PST");
                    193:                case YST:   return("YST");
                    194:                case HST:   return("HST");
                    195:                case BST:   return("BST");
                    196:                case ADT:   return("ADT");
                    197:                case EDT:   return("EDT");
                    198:                case CDT:   return("CDT");
                    199:                case MDT:   return("MDT");
                    200:                case PDT:   return("PDT");
                    201:                case YDT:   return("YDT");
                    202:                case HDT:   return("HDT");
                    203:                case BDT:   return("BDT");
                    204:                case MID:   return("MID");
                    205:                case VAN:   return("VAN");
                    206:                case EDM:   return("EDM");
                    207:                case WIN:   return("WIN");
                    208:                case BOG:   return("BOG");
                    209:                case CAR:   return("CAR");
                    210:                case RIO:   return("RIO");
                    211:                case FER:   return("FER");
                    212:                case AZO:   return("AZO");
                    213:                case LON:   return("LON");
                    214:                case BER:   return("BER");
                    215:                case ATH:   return("ATH");
                    216:                case MOS:   return("MOS");
                    217:                case DUB:   return("DUB");
                    218:                case KAB:   return("KAB");
                    219:                case KAR:   return("KAR");
                    220:                case BOM:   return("BOM");
                    221:                case KAT:   return("KAT");
                    222:                case DHA:   return("DHA");
                    223:                case BAN:   return("BAN");
                    224:                case HON:   return("HON");
                    225:                case TOK:   return("TOK");
                    226:                case SYD:   return("SYD");
                    227:                case NOU:   return("NOU");
                    228:                case WEL:   return("WEL");
                    229:                }
                    230: 
                    231:        if(!OTHER_ZONE(zone)) {
                    232:                if(zone&(WESTERN_ZONE|US_ZONE)) /* West of UTC? */
                    233:                        zone=-(zone&0xfff);
                    234:                else
                    235:                        zone&=0xfff;
                    236:        }
                    237: 
                    238:        if(zone>0)
                    239:                plus="+";
                    240:        else
                    241:                plus="";
                    242:        sprintf(str,"UTC%s%d:%02u", plus, zone/60, zone<0 ? (-zone)%60 : zone%60);
                    243: 
1.1.1.2 ! root      244:        return(str);
1.1       root      245: }
                    246: 
                    247: /****************************************************************************/
                    248: /* Returns an ASCII string for FidoNet address 'addr'                       */
                    249: /****************************************************************************/
1.1.1.2 ! root      250: char* SMBCALL smb_faddrtoa(fidoaddr_t* addr, char* str)
1.1       root      251: {
1.1.1.2 ! root      252:        static char buf[64];
1.1       root      253:     char point[25];
                    254: 
                    255:        if(addr==NULL)
                    256:                return("0:0/0");
1.1.1.2 ! root      257:        if(str==NULL)
        !           258:                str=buf;
1.1       root      259:        sprintf(str,"%hu:%hu/%hu",addr->zone,addr->net,addr->node);
                    260:        if(addr->point) {
                    261:                sprintf(point,".%hu",addr->point);
                    262:                strcat(str,point); 
                    263:        }
1.1.1.2 ! root      264:        return(str);
1.1       root      265: }
                    266: 
                    267: /****************************************************************************/
                    268: /* Returns the FidoNet address parsed from str.                                                                */
                    269: /****************************************************************************/
                    270: fidoaddr_t SMBCALL smb_atofaddr(const fidoaddr_t* sys_addr, const char *str)
                    271: {
                    272:        char *p;
                    273:        fidoaddr_t addr;
                    274:        fidoaddr_t tmp_addr={1,1,1,0};  /* Default system address: 1:1/1.0 */
                    275: 
                    276:        if(sys_addr==NULL)
                    277:                sys_addr=&tmp_addr;
                    278: 
                    279:        ZERO_VAR(addr);
                    280:        if((p=strchr(str,':'))!=NULL) {
                    281:                addr.zone=atoi(str);
                    282:                addr.net=atoi(p+1); 
                    283:        } else {
                    284:                addr.zone=sys_addr->zone;
                    285:                addr.net=atoi(str);
                    286:        }
                    287:        if(addr.zone==0)              /* no such thing as zone 0 */
                    288:                addr.zone=1;
                    289:        if((p=strchr(str,'/'))!=NULL)
                    290:                addr.node=atoi(p+1);
                    291:        else {
                    292:                if(addr.zone==sys_addr->zone)
                    293:                        addr.net=sys_addr->net;
                    294:                addr.node=atoi(str); 
                    295:        }
                    296:        if((p=strchr(str,'.'))!=NULL)
                    297:                addr.point=atoi(p+1);
                    298:        return(addr);
                    299: }
                    300: 
                    301: /****************************************************************************/
                    302: /* Returns ASCIIZ representation of network address (net_t)                                    */
1.1.1.2 ! root      303: /* NOT THREAD-SAFE!                                                                                                                    */
1.1       root      304: /****************************************************************************/
                    305: char* SMBCALL smb_netaddr(net_t* net)
                    306: {
1.1.1.2 ! root      307:        return(smb_netaddrstr(net, NULL));
        !           308: }
        !           309: 
        !           310: /****************************************************************************/
        !           311: /* Copies ASCIIZ representation of network address (net_t) into buf                    */
        !           312: /****************************************************************************/
        !           313: char* SMBCALL smb_netaddrstr(net_t* net, char* fidoaddr_buf)
        !           314: {
1.1       root      315:        if(net->type==NET_FIDO)
1.1.1.2 ! root      316:                return(smb_faddrtoa((fidoaddr_t*)net->addr,fidoaddr_buf));
1.1       root      317:        return(net->addr);
                    318: }
                    319: 
                    320: /****************************************************************************/
                    321: /* Returns net_type for passed e-mail address (i.e. "user@addr")                       */
                    322: /****************************************************************************/
                    323: ushort SMBCALL smb_netaddr_type(const char* str)
                    324: {
                    325:        char*   p;
                    326:        char*   tp;
1.1.1.2 ! root      327:        char*   firstdot;
        !           328:        char*   lastdot;
1.1       root      329: 
                    330:        if((p=strchr(str,'@'))==NULL)
                    331:                return(NET_NONE);
                    332: 
                    333:        p++;
                    334:        SKIP_WHITESPACE(p);
                    335:        if(*p==0)
                    336:                return(NET_UNKNOWN);
                    337: 
1.1.1.2 ! root      338:        firstdot=strchr(p,'.');
        !           339:        lastdot=strrchr(p,'.');
        !           340: 
        !           341:        if(isalpha(*p) && firstdot==NULL)
1.1       root      342:                return(NET_QWK);
                    343: 
                    344:        for(tp=p;*tp;tp++) {
                    345:                if(!isdigit(*tp) && *tp!=':' && *tp!='/' && *tp!='.')
                    346:                        break;
                    347:        }
1.1.1.2 ! root      348:        if(isdigit(*p) && *tp==0 && firstdot==lastdot)
1.1       root      349:                return(NET_FIDO);
                    350:        if(isalnum(*p))
                    351:                return(NET_INTERNET);
                    352: 
                    353:        return(NET_UNKNOWN);
                    354: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.