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