X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FIPStack%2Frouting.c;h=e86f333b3f451eab2e2cea2bc40f1b90d4e7b522;hb=bf0187772ecfb475eedf5e0e9b8460b4f1a3f445;hp=3153ef269efa016715d173fd5921505ec2b5746f;hpb=9dccbc6f16485ea62caa8c4153f6f878da8cbb0d;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/IPStack/routing.c b/KernelLand/Modules/IPStack/routing.c index 3153ef26..e86f333b 100644 --- a/KernelLand/Modules/IPStack/routing.c +++ b/KernelLand/Modules/IPStack/routing.c @@ -17,9 +17,9 @@ extern tVFS_Node *IPStack_Root_FindDir(tVFS_Node *Node, const char *Filename); // === PROTOTYPES === // - Routes directory -char *IPStack_RouteDir_ReadDir(tVFS_Node *Node, int Pos); + int IPStack_RouteDir_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX]); tVFS_Node *IPStack_RouteDir_FindDir(tVFS_Node *Node, const char *Name); - int IPStack_RouteDir_MkNod(tVFS_Node *Node, const char *Name, Uint Flags); +tVFS_Node *IPStack_RouteDir_MkNod(tVFS_Node *Node, const char *Name, Uint Flags); int IPStack_RouteDir_Unlink(tVFS_Node *Node, const char *OldName); tRoute *_Route_FindExactRoute(int Type, void *Network, int Subnet, int Metric); int _Route_ParseRouteName(const char *Name, void *Addr, int *SubnetBits, int *Metric); @@ -58,22 +58,20 @@ tVFS_Node gIP_RouteNode = { /** * \brief ReadDir for the /Devices/ip/routes/ directory */ -char *IPStack_RouteDir_ReadDir(tVFS_Node *Node, int Pos) +int IPStack_RouteDir_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX]) { tRoute *rt; for(rt = gIP_Routes; rt && Pos --; rt = rt->Next); - if( !rt ) return NULL; + if( !rt ) return -EINVAL; { int addrlen = IPStack_GetAddressSize(rt->AddressType); - int len = sprintf(NULL, "%i::%i:%i", rt->AddressType, rt->SubnetBits, rt->Metric) + addrlen*2; - char buf[len+1]; int ofs; - ofs = sprintf(buf, "%i:", rt->AddressType); - ofs += Hex(buf+ofs, addrlen, rt->Network); - sprintf(buf+ofs, ":%i:%i", rt->SubnetBits, rt->Metric); - return strdup(buf); + ofs = sprintf(Dest, "%i:", rt->AddressType); + ofs += Hex(Dest+ofs, addrlen, rt->Network); + sprintf(Dest+ofs, ":%i:%i", rt->SubnetBits, rt->Metric); + return 0; } } @@ -117,12 +115,13 @@ tVFS_Node *IPStack_RouteDir_FindDir(tVFS_Node *Node, const char *Name) { LOG("Why does this route not have a node? trying to find an iface for the next hop"); - rt = _Route_FindInterfaceRoute(type, rt->NextHop); - if(!rt) { + void *nextrt = _Route_FindInterfaceRoute(type, rt->NextHop); + if(!nextrt) { Log_Notice("Cannot find route to next hop '%s'", IPStack_PrintAddress(type, rt->NextHop)); return NULL; } + rt = nextrt; } if( !rt->Interface ) { Log_Notice("Routes", "No interface for route %p, what the?", rt); @@ -169,13 +168,22 @@ tVFS_Node *IPStack_RouteDir_FindDir(tVFS_Node *Node, const char *Name) /** * \brief Create a new route node */ -int IPStack_RouteDir_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) +tVFS_Node *IPStack_RouteDir_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) { - if( Flags ) return -EINVAL; - if( Threads_GetUID() != 0 ) return -EACCES; + if( Flags ) { + errno = EINVAL; + return NULL; + } + if( Threads_GetUID() != 0 ) { + errno = EACCES; + return NULL; + } int type = _Route_ParseRouteName(Name, NULL, NULL, NULL); - if( type <= 0 ) return -EINVAL; + if( type <= 0 ) { + errno = EINVAL; + return NULL; + } int size = IPStack_GetAddressSize(type); Uint8 addrdata[size]; @@ -184,12 +192,15 @@ int IPStack_RouteDir_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) _Route_ParseRouteName(Name, addrdata, &subnet, &metric); // Check for duplicates - if( _Route_FindExactRoute(type, addrdata, subnet, metric) ) - return -EEXIST; + if( _Route_FindExactRoute(type, addrdata, subnet, metric) ) { + errno = EEXIST; + return NULL; + } - IPStack_Route_Create(type, addrdata, subnet, metric); + tRoute *rt = IPStack_Route_Create(type, addrdata, subnet, metric); + rt->Node.ReferenceCount ++; - return 0; + return &rt->Node; } /**