From d445032880385662327ad47fefab8074d39db2e0 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Wed, 27 Oct 2004 09:04:05 +0000
Subject: [PATCH] Created functions: smb_atofaddr() and smb_hfield_netaddr().
 Created convenience macro: smb_hfield_bin().

---
 src/smblib/smblib.c | 20 ++++++++++++++++++++
 src/smblib/smblib.h |  5 +++++
 src/smblib/smbstr.c | 34 ++++++++++++++++++++++++++++++++++
 3 files changed, 59 insertions(+)

diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c
index b7d48c1f07..e6a4b6cced 100644
--- a/src/smblib/smblib.c
+++ b/src/smblib/smblib.c
@@ -1152,6 +1152,26 @@ int SMBCALL smb_hfield_str(smbmsg_t* msg, ushort type, const char* str)
 	return smb_hfield(msg, type, strlen(str), (void*)str);
 }
 
+/****************************************************************************/
+/* Convenience function to add an ASCIIZ string header field				*/
+/****************************************************************************/
+int	SMBCALL smb_hfield_netaddr(smbmsg_t* msg, ushort type, const char* str, ushort* nettype)
+{
+	fidoaddr_t	sys_addr = {0,0,0,0};	/* replace unspecified fields with 0 (don't assume 1:1/1) */
+	fidoaddr_t	fidoaddr;
+	ushort		tmp_nettype=NET_UNKNOWN;
+
+	if(nettype==NULL)
+		nettype=&tmp_nettype;
+	if(*nettype==NET_UNKNOWN)
+		*nettype=smb_netaddr_type(str);
+	if(*nettype==NET_FIDO) {
+		fidoaddr=smb_atofaddr(&sys_addr,str);
+		return smb_hfield_bin(msg,type,fidoaddr);
+	} else
+		return smb_hfield_str(msg,type,str);
+}
+
 /****************************************************************************/
 /* Appends data to an existing header field (in memory only)				*/
 /****************************************************************************/
diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h
index b5a66bc536..4f3eab46ee 100644
--- a/src/smblib/smblib.h
+++ b/src/smblib/smblib.h
@@ -125,11 +125,15 @@ SMBEXPORT int 		SMBCALL smb_lockmsghdr(smb_t* smb, smbmsg_t* msg);
 SMBEXPORT int 		SMBCALL smb_getmsghdr(smb_t* smb, smbmsg_t* msg);
 SMBEXPORT int 		SMBCALL smb_unlockmsghdr(smb_t* smb, smbmsg_t* msg);
 SMBEXPORT int 		SMBCALL smb_addcrc(smb_t* smb, ulong crc);
+
 SMBEXPORT int 		SMBCALL smb_hfield(smbmsg_t* msg, ushort type, size_t length, void* data);
 SMBEXPORT int		SMBCALL smb_hfield_str(smbmsg_t* msg, ushort type, const char* str);
 SMBEXPORT int		SMBCALL smb_hfield_append(smbmsg_t* msg, ushort type, size_t length, void* data);
 SMBEXPORT int		SMBCALL smb_hfield_append_str(smbmsg_t* msg, ushort type, const char* data);
 SMBEXPORT int		SMBCALL smb_hfield_addlist(smbmsg_t* msg, hfield_t** hfield_list, void** hfield_dat);
+SMBEXPORT int		SMBCALL smb_hfield_netaddr(smbmsg_t* msg, ushort type, const char* str, ushort* nettype);
+#define smb_hfield_bin(msg, type, data) smb_hfield(msg, type, sizeof(data), &(data))
+
 SMBEXPORT int 		SMBCALL smb_dfield(smbmsg_t* msg, ushort type, ulong length);
 SMBEXPORT void*		SMBCALL smb_get_hfield(smbmsg_t* msg, ushort type, hfield_t* hfield);
 SMBEXPORT int 		SMBCALL smb_addmsghdr(smb_t* smb, smbmsg_t* msg, int storage);
@@ -209,6 +213,7 @@ SMBEXPORT ushort	SMBCALL smb_netaddr_type(const char* str);
 SMBEXPORT char*		SMBCALL smb_zonestr(short zone, char* outstr);
 SMBEXPORT char*		SMBCALL smb_hashsource(smbmsg_t* msg, int source);
 SMBEXPORT char*		SMBCALL smb_hashsourcetype(uchar type);
+SMBEXPORT fidoaddr_t SMBCALL smb_atofaddr(const fidoaddr_t* sys_addr, const char *str);
 
 /* smbdump.c */
 SMBEXPORT void		SMBCALL smb_dump_msghdr(FILE* fp, smbmsg_t* msg);
diff --git a/src/smblib/smbstr.c b/src/smblib/smbstr.c
index 1abc34d42c..5af5539f05 100644
--- a/src/smblib/smbstr.c
+++ b/src/smblib/smbstr.c
@@ -252,6 +252,40 @@ char* SMBCALL smb_faddrtoa(fidoaddr_t* addr, char* outstr)
 	return(outstr);
 }
 
+/****************************************************************************/
+/* Returns the FidoNet address parsed from str.								*/
+/****************************************************************************/
+fidoaddr_t SMBCALL smb_atofaddr(const fidoaddr_t* sys_addr, const char *str)
+{
+	char *p;
+	fidoaddr_t addr;
+	fidoaddr_t tmp_addr={1,1,1,0};	/* Default system address: 1:1/1.0 */
+
+	if(sys_addr==NULL)
+		sys_addr=&tmp_addr;
+
+	ZERO_VAR(addr);
+	if((p=strchr(str,':'))!=NULL) {
+		addr.zone=atoi(str);
+		addr.net=atoi(p+1); 
+	} else {
+		addr.zone=sys_addr->zone;
+		addr.net=atoi(str);
+	}
+	if(addr.zone==0)              /* no such thing as zone 0 */
+		addr.zone=1;
+	if((p=strchr(str,'/'))!=NULL)
+		addr.node=atoi(p+1);
+	else {
+		if(addr.zone==sys_addr->zone)
+			addr.net=sys_addr->net;
+		addr.node=atoi(str); 
+	}
+	if((p=strchr(str,'.'))!=NULL)
+		addr.point=atoi(p+1);
+	return(addr);
+}
+
 /****************************************************************************/
 /* Returns ASCIIZ representation of network address (net_t)					*/
 /****************************************************************************/
-- 
GitLab