--- sbbs/src/smblib/smbstr.c 2018/04/24 16:41:24 1.1 +++ sbbs/src/smblib/smbstr.c 2018/04/24 16:45:18 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet message base (SMB) library routines returning strings */ -/* $Id: smbstr.c,v 1.1 2018/04/24 16:41:24 root Exp $ */ +/* $Id: smbstr.c,v 1.1.1.2 2018/04/24 16:45:18 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * @@ -45,61 +45,69 @@ char* SMBCALL smb_hfieldtype(ushort type static char str[8]; switch(type) { - case SENDER: return("Sender"); + case SENDER: return("Sender"); /* RFC-compliant */ case SENDERAGENT: return("SenderAgent"); case SENDERNETTYPE: return("SenderNetType"); case SENDERNETADDR: return("SenderNetAddr"); case SENDEREXT: return("SenderExt"); - case SENDERORG: return("SenderOrg"); + case SENDERORG: return("Organization"); /* RFC-compliant */ case SENDERIPADDR: return("SenderIpAddr"); case SENDERHOSTNAME: return("SenderHostName"); case SENDERPROTOCOL: return("SenderProtocol"); + case SENDERPORT_BIN: return("SenderPortBin"); case SENDERPORT: return("SenderPort"); - - case REPLYTO: return("ReplyTo"); - case REPLYTOAGENT: return("ReplyToAgent"); - case REPLYTONETTYPE: return("ReplyToNetType"); - case REPLYTONETADDR: return("ReplyToNetAddr"); - case REPLYTOEXT: return("ReplyToExt"); + case SENDERUSERID: return("SenderUserID"); + case SENDERTIME: return("SenderTime"); + case SENDERSERVER: return("SenderServer"); + + case REPLYTO: return("Reply-To"); /* RFC-compliant */ + case REPLYTOAGENT: return("Reply-ToAgent"); + case REPLYTONETTYPE: return("Reply-ToNetType"); + case REPLYTONETADDR: return("Reply-ToNetAddr"); + case REPLYTOEXT: return("Reply-ToExt"); - case RECIPIENT: return("Recipient"); - case RECIPIENTAGENT: return("RecipientAgent"); - case RECIPIENTNETTYPE: return("RecipientNetType"); - case RECIPIENTNETADDR: return("RecipientNetAddr"); - case RECIPIENTEXT: return("RecipientExt"); + case RECIPIENT: return("To"); /* RFC-compliant */ + case RECIPIENTAGENT: return("ToAgent"); + case RECIPIENTNETTYPE: return("ToNetType"); + case RECIPIENTNETADDR: return("ToNetAddr"); + case RECIPIENTEXT: return("ToExt"); - case SUBJECT: return("Subject"); + case SUBJECT: return("Subject"); /* RFC-compliant */ case SMB_SUMMARY: return("Summary"); - case SMB_COMMENT: return("Comment"); - case SMB_CARBONCOPY: return("CarbonCopy"); + case SMB_COMMENT: return("Comment"); /* RFC-compliant */ + case SMB_CARBONCOPY: return("CC"); /* RFC-compliant */ case SMB_GROUP: return("Group"); case SMB_EXPIRATION: return("Expiration"); case SMB_PRIORITY: return("Priority"); case SMB_COST: return("Cost"); + case SMB_EDITOR: return("Editor"); + case FORWARDED: return("Forwarded"); - case FIDOCTRL: return("FidoCtrl"); - case FIDOAREA: return("FidoArea"); - case FIDOSEENBY: return("FidoSeenBy"); - case FIDOPATH: return("FidoPath"); - case FIDOMSGID: return("FidoMsgID"); - case FIDOREPLYID: return("FidoReplyID"); - case FIDOPID: return("FidoPID"); - case FIDOFLAGS: return("FidoFlags"); - case FIDOTID: return("FidoTID"); - - case RFC822HEADER: return("RFC822Header"); - case RFC822MSGID: return("RFC822MsgID"); - case RFC822REPLYID: return("RFC822ReplyID"); + /* All X-FTN-* are RFC-compliant */ + case FIDOCTRL: return("X-FTN-Kludge"); + case FIDOAREA: return("X-FTN-AREA"); + case FIDOSEENBY: return("X-FTN-SEEN-BY"); + case FIDOPATH: return("X-FTN-PATH"); + case FIDOMSGID: return("X-FTN-MSGID"); + case FIDOREPLYID: return("X-FTN-REPLY"); + case FIDOPID: return("X-FTN-PID"); + case FIDOFLAGS: return("X-FTN-Flags"); + case FIDOTID: return("X-FTN-TID"); + + case RFC822HEADER: return("OtherHeader"); + case RFC822MSGID: return("Message-ID"); /* RFC-compliant */ + case RFC822REPLYID: return("In-Reply-To"); /* RFC-compliant */ case RFC822TO: return("RFC822To"); case RFC822FROM: return("RFC822From"); case RFC822REPLYTO: return("RFC822ReplyTo"); - case USENETPATH: return("UsenetPath"); - case USENETNEWSGROUPS: return("UsenetNewsgroups"); + case USENETPATH: return("Path"); /* RFC-compliant */ + case USENETNEWSGROUPS: return("Newsgroups"); /* RFC-compliant */ case SMTPCOMMAND: return("SMTPCommand"); - case SMTPREVERSEPATH: return("SMTPReversePath"); + case SMTPREVERSEPATH: return("Return-Path"); /* RFC-compliant */ case SMTPFORWARDPATH: return("SMTPForwardPath"); + case SMTPRECEIVED: return("Received"); /* RFC-compliant */ case SMTPSYSMSG: return("SMTPSysMsg"); @@ -146,6 +154,7 @@ char* SMBCALL smb_hashsourcetype(uchar t case SMB_HASH_SOURCE_BODY: return(smb_dfieldtype(TEXT_BODY)); case SMB_HASH_SOURCE_MSG_ID: return(smb_hfieldtype(RFC822MSGID)); case SMB_HASH_SOURCE_FTN_ID: return(smb_hfieldtype(FIDOMSGID)); + case SMB_HASH_SOURCE_SUBJECT: return(smb_hfieldtype(SUBJECT)); } sprintf(str,"%02Xh",type); return(str); @@ -158,6 +167,8 @@ char* SMBCALL smb_hashsource(smbmsg_t* m return(msg->id); case SMB_HASH_SOURCE_FTN_ID: return(msg->ftn_msgid); + case SMB_HASH_SOURCE_SUBJECT: + return(msg->subj); } return("hash"); } @@ -165,11 +176,13 @@ char* SMBCALL smb_hashsource(smbmsg_t* m /****************************************************************************/ /* Converts when_t.zone into ASCII format */ /****************************************************************************/ -char* SMBCALL smb_zonestr(short zone, char* outstr) +char* SMBCALL smb_zonestr(short zone, char* str) { char* plus; - static char str[32]; + static char buf[32]; + if(str==NULL) + str=buf; switch((ushort)zone) { case 0: return("UTC"); case AST: return("AST"); @@ -228,31 +241,27 @@ char* SMBCALL smb_zonestr(short zone, ch plus=""; sprintf(str,"UTC%s%d:%02u", plus, zone/60, zone<0 ? (-zone)%60 : zone%60); - if(outstr==NULL) - return(str); - strcpy(outstr,str); - return(outstr); + return(str); } /****************************************************************************/ /* Returns an ASCII string for FidoNet address 'addr' */ /****************************************************************************/ -char* SMBCALL smb_faddrtoa(fidoaddr_t* addr, char* outstr) +char* SMBCALL smb_faddrtoa(fidoaddr_t* addr, char* str) { - static char str[64]; + static char buf[64]; char point[25]; if(addr==NULL) return("0:0/0"); + if(str==NULL) + str=buf; sprintf(str,"%hu:%hu/%hu",addr->zone,addr->net,addr->node); if(addr->point) { sprintf(point,".%hu",addr->point); strcat(str,point); } - if(outstr==NULL) - return(str); - strcpy(outstr,str); - return(outstr); + return(str); } /****************************************************************************/ @@ -291,11 +300,20 @@ fidoaddr_t SMBCALL smb_atofaddr(const fi /****************************************************************************/ /* Returns ASCIIZ representation of network address (net_t) */ +/* NOT THREAD-SAFE! */ /****************************************************************************/ char* SMBCALL smb_netaddr(net_t* net) { + return(smb_netaddrstr(net, NULL)); +} + +/****************************************************************************/ +/* Copies ASCIIZ representation of network address (net_t) into buf */ +/****************************************************************************/ +char* SMBCALL smb_netaddrstr(net_t* net, char* fidoaddr_buf) +{ if(net->type==NET_FIDO) - return(smb_faddrtoa((fidoaddr_t*)net->addr,NULL)); + return(smb_faddrtoa((fidoaddr_t*)net->addr,fidoaddr_buf)); return(net->addr); } @@ -306,6 +324,8 @@ ushort SMBCALL smb_netaddr_type(const ch { char* p; char* tp; + char* firstdot; + char* lastdot; if((p=strchr(str,'@'))==NULL) return(NET_NONE); @@ -315,14 +335,17 @@ ushort SMBCALL smb_netaddr_type(const ch if(*p==0) return(NET_UNKNOWN); - if(isalpha(*p) && strchr(p,'.')==NULL) + firstdot=strchr(p,'.'); + lastdot=strrchr(p,'.'); + + if(isalpha(*p) && firstdot==NULL) return(NET_QWK); for(tp=p;*tp;tp++) { if(!isdigit(*tp) && *tp!=':' && *tp!='/' && *tp!='.') break; } - if(isdigit(*p) && *tp) + if(isdigit(*p) && *tp==0 && firstdot==lastdot) return(NET_FIDO); if(isalnum(*p)) return(NET_INTERNET);