Code:
static int setRtMsgData
(
SNetlinkTransactRoute *_this,
unsigned char family,
char *dest,
char *subnet,
char *gw,
char *src
)
{
//int ifIndex;
struct in_addr ipv4dst, ipv4src, ipv4gw;
struct in6_addr ipv6dst, ipv6src, ipv6gw;
void *bdst=NULL,*bsrc=NULL,*bgw=NULL;
unsigned char dstlen,srclen, addrlen;
int (*maskfunc)(char *,void *);
unsigned int binsize;
int defgwsetup = 0;
DPRINT("Initializing RTMSG header!");
if(ENetlinkTrState_Inited!=_this->gentr.state)
{
EPRINT("Invalid state %u, shouldve been %u",_this->gentr.state,ENetlinkTrState_Inited);
return KIKKULA_ERROR;
}
if(NULL==dest)
{
/* TODO: fix - This can be NULL if we set up default GW! */
// EPRINT("Valid destination required, dst NULL!");
// goto invparam_out;
DPRINT("Handling default GW!");
defgwsetup=1;
dstlen=0;
}
if(AF_INET==family)
{
bdst=&ipv4dst;
bsrc=&ipv4src;
bgw=&ipv4gw;
maskfunc=&ipv4subnet2dstlen;
addrlen=32;
binsize=4;
DPRINT("Family AF_INET");
}
else if (AF_INET6 == family)
{
bdst=&ipv6dst;
bsrc=&ipv6src;
bgw=&ipv6gw;
addrlen=128;
maskfunc=&ipv6subnet2dstlen;
binsize=16;
DPRINT("Family AF_INET6");
}
else
{
EPRINT("Unknown family!");
return KIKKULA_ERROR;
}
if(!defgwsetup)
{
if(1!=inet_pton(family, &dest[0], bdst))
{
/* Error in dst conversion */
EPRINT
(
"Failed to convert dst %s to ipaddr",
dest
);
goto invparam_out;
}
DPRINT("dst before masking %s",dest);
/* NOTE! The maskfunc may change destination address! Thus the dst addr must not be added to request before we've called maskfunc */
dstlen=(*maskfunc)(subnet,bdst);
if((char)-1==(char)dstlen)
{
EPRINT("Failed to get dst lenght!");
goto invparam_out;
}
{
char tmp[100];
DPRINT
(
"dst now %s",
inet_ntop(family,bdst,tmp,100)
);
}
DPRINT("Adding dst attr (%d) size %u",RTA_DST,binsize);
_this->gentr.addAttr(&(_this->gentr),RTA_DST,bdst,binsize);
}
if(NULL!=src&&'\0'!=src[0])
{
if(defgwsetup)
{
EPRINT("src addr for default GW requested!");
goto invparam_out;
}
if(1!=inet_pton(family, &src[0], bsrc))
{
/* Error in conversion */
EPRINT
(
"Failed to convert src %s to ipaddr",
src
);
goto invparam_out;
}
{
char tmp[100];
DPRINT
(
"src %s",
inet_ntop(family,bsrc,tmp,100)
);
}
srclen=addrlen;
_this->gentr.addAttr(&(_this->gentr),RTA_SRC,bsrc,binsize);
}
else
{
srclen=0;
}
if(NULL!=gw && '\0'!=gw[0])
{
if(1!=inet_pton(family, gw,bgw))
{
EPRINT
(
"gateway %s is not valid gw Ip address",
gw
);
goto invparam_out;
}
{
char tmp[100];
DPRINT
(
"gw now %s",
inet_ntop(family,bgw,tmp,100)
);
}
_this->gentr.addAttr(&(_this->gentr),RTA_GATEWAY,bgw,binsize);
}
else
{
if(defgwsetup)
{
EPRINT("default GW operation requested, but no GW address given!");
goto invparam_out;
}
}
DPRINT
(
"subnet lenght (mask) set to %u bits",
dstlen
);
_this->rt_msg.rtm_family=family;
_this->rt_msg.rtm_dst_len=(unsigned char)dstlen;
_this->rt_msg.rtm_src_len=srclen;
_this->rt_msg.rtm_table=RT_TABLE_MAIN;
_this->rt_msg.rtm_protocol= RTPROT_STATIC;
_this->rt_msg.rtm_scope=RT_SCOPE_UNIVERSE;
_this->rt_msg.rtm_type=RTN_UNICAST;
_this->rt_msg.rtm_flags=0;
_this->gentr.state=ENetlinkTrState_ReqFilled;
if(0)
{
invparam_out:
_this->gentr.state=ENetlinkTrState_Unknown;
EPRINT("Invalid parameters detected!");
return USER_ERROR;
}
return 0;
}
is not rare in my files. Not rare at all