|
|
1.1 root 1: /* smbstr.c */
2:
3: /* Synchronet message base (SMB) library routines returning strings */
4:
5: /* $Id: smbstr.c,v 1.11 2006/04/25 02:26:06 rswindell Exp $ */
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: * *
11: * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html *
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) {
48: case SENDER: return("Sender");
49: case SENDERAGENT: return("SenderAgent");
50: case SENDERNETTYPE: return("SenderNetType");
51: case SENDERNETADDR: return("SenderNetAddr");
52: case SENDEREXT: return("SenderExt");
53: case SENDERORG: return("SenderOrg");
54: case SENDERIPADDR: return("SenderIpAddr");
55: case SENDERHOSTNAME: return("SenderHostName");
56: case SENDERPROTOCOL: return("SenderProtocol");
57: case SENDERPORT: return("SenderPort");
58:
59: case REPLYTO: return("ReplyTo");
60: case REPLYTOAGENT: return("ReplyToAgent");
61: case REPLYTONETTYPE: return("ReplyToNetType");
62: case REPLYTONETADDR: return("ReplyToNetAddr");
63: case REPLYTOEXT: return("ReplyToExt");
64:
65: case RECIPIENT: return("Recipient");
66: case RECIPIENTAGENT: return("RecipientAgent");
67: case RECIPIENTNETTYPE: return("RecipientNetType");
68: case RECIPIENTNETADDR: return("RecipientNetAddr");
69: case RECIPIENTEXT: return("RecipientExt");
70:
71: case SUBJECT: return("Subject");
72: case SMB_SUMMARY: return("Summary");
73: case SMB_COMMENT: return("Comment");
74: case SMB_CARBONCOPY: return("CarbonCopy");
75: case SMB_GROUP: return("Group");
76: case SMB_EXPIRATION: return("Expiration");
77: case SMB_PRIORITY: return("Priority");
78: case SMB_COST: return("Cost");
79:
80: case FIDOCTRL: return("FidoCtrl");
81: case FIDOAREA: return("FidoArea");
82: case FIDOSEENBY: return("FidoSeenBy");
83: case FIDOPATH: return("FidoPath");
84: case FIDOMSGID: return("FidoMsgID");
85: case FIDOREPLYID: return("FidoReplyID");
86: case FIDOPID: return("FidoPID");
87: case FIDOFLAGS: return("FidoFlags");
88: case FIDOTID: return("FidoTID");
89:
90: case RFC822HEADER: return("RFC822Header");
91: case RFC822MSGID: return("RFC822MsgID");
92: case RFC822REPLYID: return("RFC822ReplyID");
93: case RFC822TO: return("RFC822To");
94: case RFC822FROM: return("RFC822From");
95: case RFC822REPLYTO: return("RFC822ReplyTo");
96:
97: case USENETPATH: return("UsenetPath");
98: case USENETNEWSGROUPS: return("UsenetNewsgroups");
99:
100: case SMTPCOMMAND: return("SMTPCommand");
101: case SMTPREVERSEPATH: return("SMTPReversePath");
102: case SMTPFORWARDPATH: return("SMTPForwardPath");
103:
104: case SMTPSYSMSG: return("SMTPSysMsg");
105:
106: case UNKNOWN: return("UNKNOWN");
107: case UNKNOWNASCII: return("UNKNOWNASCII");
108: case UNUSED: return("UNUSED");
109: }
110: sprintf(str,"%02Xh",type);
111: return(str);
112: }
113:
114: ushort SMBCALL smb_hfieldtypelookup(const char* str)
115: {
116: ushort type;
117:
118: if(isdigit(*str))
119: return((ushort)strtol(str,NULL,0));
120:
121: for(type=0;type<=UNUSED;type++)
122: if(stricmp(str,smb_hfieldtype(type))==0)
123: return(type);
124:
125: return(UNKNOWN);
126: }
127:
128: char* SMBCALL smb_dfieldtype(ushort type)
129: {
130: static char str[8];
131:
132: switch(type) {
133: case TEXT_BODY: return("TEXT_BODY");
134: case TEXT_TAIL: return("TEXT_TAIL");
135: case UNUSED: return("UNUSED");
136: }
137: sprintf(str,"%02Xh",type);
138: return(str);
139: }
140:
141: char* SMBCALL smb_hashsourcetype(uchar type)
142: {
143: static char str[8];
144:
145: switch(type) {
146: case SMB_HASH_SOURCE_BODY: return(smb_dfieldtype(TEXT_BODY));
147: case SMB_HASH_SOURCE_MSG_ID: return(smb_hfieldtype(RFC822MSGID));
148: case SMB_HASH_SOURCE_FTN_ID: return(smb_hfieldtype(FIDOMSGID));
149: }
150: sprintf(str,"%02Xh",type);
151: return(str);
152: }
153:
154: char* SMBCALL smb_hashsource(smbmsg_t* msg, int source)
155: {
156: switch(source) {
157: case SMB_HASH_SOURCE_MSG_ID:
158: return(msg->id);
159: case SMB_HASH_SOURCE_FTN_ID:
160: return(msg->ftn_msgid);
161: }
162: return("hash");
163: }
164:
165: /****************************************************************************/
166: /* Converts when_t.zone into ASCII format */
167: /****************************************************************************/
168: char* SMBCALL smb_zonestr(short zone, char* outstr)
169: {
170: char* plus;
171: static char str[32];
172:
173: switch((ushort)zone) {
174: case 0: return("UTC");
175: case AST: return("AST");
176: case EST: return("EST");
177: case CST: return("CST");
178: case MST: return("MST");
179: case PST: return("PST");
180: case YST: return("YST");
181: case HST: return("HST");
182: case BST: return("BST");
183: case ADT: return("ADT");
184: case EDT: return("EDT");
185: case CDT: return("CDT");
186: case MDT: return("MDT");
187: case PDT: return("PDT");
188: case YDT: return("YDT");
189: case HDT: return("HDT");
190: case BDT: return("BDT");
191: case MID: return("MID");
192: case VAN: return("VAN");
193: case EDM: return("EDM");
194: case WIN: return("WIN");
195: case BOG: return("BOG");
196: case CAR: return("CAR");
197: case RIO: return("RIO");
198: case FER: return("FER");
199: case AZO: return("AZO");
200: case LON: return("LON");
201: case BER: return("BER");
202: case ATH: return("ATH");
203: case MOS: return("MOS");
204: case DUB: return("DUB");
205: case KAB: return("KAB");
206: case KAR: return("KAR");
207: case BOM: return("BOM");
208: case KAT: return("KAT");
209: case DHA: return("DHA");
210: case BAN: return("BAN");
211: case HON: return("HON");
212: case TOK: return("TOK");
213: case SYD: return("SYD");
214: case NOU: return("NOU");
215: case WEL: return("WEL");
216: }
217:
218: if(!OTHER_ZONE(zone)) {
219: if(zone&(WESTERN_ZONE|US_ZONE)) /* West of UTC? */
220: zone=-(zone&0xfff);
221: else
222: zone&=0xfff;
223: }
224:
225: if(zone>0)
226: plus="+";
227: else
228: plus="";
229: sprintf(str,"UTC%s%d:%02u", plus, zone/60, zone<0 ? (-zone)%60 : zone%60);
230:
231: if(outstr==NULL)
232: return(str);
233: strcpy(outstr,str);
234: return(outstr);
235: }
236:
237: /****************************************************************************/
238: /* Returns an ASCII string for FidoNet address 'addr' */
239: /****************************************************************************/
240: char* SMBCALL smb_faddrtoa(fidoaddr_t* addr, char* outstr)
241: {
242: static char str[64];
243: char point[25];
244:
245: if(addr==NULL)
246: return("0:0/0");
247: sprintf(str,"%hu:%hu/%hu",addr->zone,addr->net,addr->node);
248: if(addr->point) {
249: sprintf(point,".%hu",addr->point);
250: strcat(str,point);
251: }
252: if(outstr==NULL)
253: return(str);
254: strcpy(outstr,str);
255: return(outstr);
256: }
257:
258: /****************************************************************************/
259: /* Returns the FidoNet address parsed from str. */
260: /****************************************************************************/
261: fidoaddr_t SMBCALL smb_atofaddr(const fidoaddr_t* sys_addr, const char *str)
262: {
263: char *p;
264: fidoaddr_t addr;
265: fidoaddr_t tmp_addr={1,1,1,0}; /* Default system address: 1:1/1.0 */
266:
267: if(sys_addr==NULL)
268: sys_addr=&tmp_addr;
269:
270: ZERO_VAR(addr);
271: if((p=strchr(str,':'))!=NULL) {
272: addr.zone=atoi(str);
273: addr.net=atoi(p+1);
274: } else {
275: addr.zone=sys_addr->zone;
276: addr.net=atoi(str);
277: }
278: if(addr.zone==0) /* no such thing as zone 0 */
279: addr.zone=1;
280: if((p=strchr(str,'/'))!=NULL)
281: addr.node=atoi(p+1);
282: else {
283: if(addr.zone==sys_addr->zone)
284: addr.net=sys_addr->net;
285: addr.node=atoi(str);
286: }
287: if((p=strchr(str,'.'))!=NULL)
288: addr.point=atoi(p+1);
289: return(addr);
290: }
291:
292: /****************************************************************************/
293: /* Returns ASCIIZ representation of network address (net_t) */
294: /****************************************************************************/
295: char* SMBCALL smb_netaddr(net_t* net)
296: {
297: if(net->type==NET_FIDO)
298: return(smb_faddrtoa((fidoaddr_t*)net->addr,NULL));
299: return(net->addr);
300: }
301:
302: /****************************************************************************/
303: /* Returns net_type for passed e-mail address (i.e. "user@addr") */
304: /****************************************************************************/
305: ushort SMBCALL smb_netaddr_type(const char* str)
306: {
307: char* p;
308: char* tp;
309:
310: if((p=strchr(str,'@'))==NULL)
311: return(NET_NONE);
312:
313: p++;
314: SKIP_WHITESPACE(p);
315: if(*p==0)
316: return(NET_UNKNOWN);
317:
318: if(isalpha(*p) && strchr(p,'.')==NULL)
319: return(NET_QWK);
320:
321: for(tp=p;*tp;tp++) {
322: if(!isdigit(*tp) && *tp!=':' && *tp!='/' && *tp!='.')
323: break;
324: }
325: if(isdigit(*p) && *tp)
326: return(NET_FIDO);
327: if(isalnum(*p))
328: return(NET_INTERNET);
329:
330: return(NET_UNKNOWN);
331: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.