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