fixed some memory leaks and build it as unicode by default Modified: trunk/reactos/apps/utils/net/route/route.c Modified: trunk/reactos/apps/utils/net/route/route.xml _____
Modified: trunk/reactos/apps/utils/net/route/route.c --- trunk/reactos/apps/utils/net/route/route.c 2005-10-01 18:41:02 UTC (rev 18196) +++ trunk/reactos/apps/utils/net/route/route.c 2005-10-01 19:01:07 UTC (rev 18197) @@ -22,69 +22,120 @@
int Usage() { - fprintf( stderr, - "route usage:\n" - "route print\n" - " prints the route table\n" - "route add <target> [mask <mask>] <gw> [metric <m>]\n" - " adds a route\n" - "route delete <target> <gw>\n" - " deletes a route\n" ); + _ftprintf( stderr, + _T("route usage:\n" + "route print\n" + " prints the route table\n" + "route add <target> [mask <mask>] <gw> [metric <m>]\n" + " adds a route\n" + "route delete <target> <gw>\n" + " deletes a route\n") ); return 1; }
int PrintRoutes() { PMIB_IPFORWARDTABLE IpForwardTable = NULL; - PIP_ADAPTER_INFO pAdapterInfo = NULL; + PIP_ADAPTER_INFO pAdapterInfo; + ULONG Size = 0; DWORD Error = 0; - ULONG Size = 0; - ULONG adaptOutBufLen; + ULONG adaptOutBufLen = sizeof(IP_ADAPTER_INFO); TCHAR DefGate[16]; - char Destination[IPBUF], Gateway[IPBUF], Netmask[IPBUF]; + TCHAR Destination[IPBUF], Gateway[IPBUF], Netmask[IPBUF]; unsigned int i;
/* set required buffer size */ - pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) ); - if (GetAdaptersInfo( pAdapterInfo, &adaptOutBufLen) == ERROR_INSUFFICIENT_BUFFER) + pAdapterInfo = (IP_ADAPTER_INFO *) malloc( adaptOutBufLen ); + if (pAdapterInfo == NULL) + { + Error = ERROR_NOT_ENOUGH_MEMORY; + goto Error; + } + if (GetAdaptersInfo( pAdapterInfo, &adaptOutBufLen) == ERROR_BUFFER_OVERFLOW) + { + free (pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *) malloc (adaptOutBufLen); + if (pAdapterInfo == NULL) + { + Error = ERROR_NOT_ENOUGH_MEMORY; + goto Error; + } + }
if( (GetIpForwardTable( NULL, &Size, TRUE )) == ERROR_INSUFFICIENT_BUFFER ) - IpForwardTable = malloc( Size ); + { + if (!(IpForwardTable = malloc( Size ))) + { + free(pAdapterInfo); + Error = ERROR_NOT_ENOUGH_MEMORY; + goto Error; + } + }
- if ((Error = (GetAdaptersInfo(pAdapterInfo, &adaptOutBufLen) == NO_ERROR)) && - (Error = (GetIpForwardTable(IpForwardTable, &Size, TRUE) == NO_ERROR))) + if (((Error = GetAdaptersInfo(pAdapterInfo, &adaptOutBufLen)) == NO_ERROR) && + ((Error = GetIpForwardTable(IpForwardTable, &Size, TRUE)) == NO_ERROR)) { - _tcsncpy(DefGate, pAdapterInfo->GatewayList.IpAddress.String, 16); + _stprintf(DefGate, +#if UNICODE + _T("%hs"), +#else + _T("%s"), +#endif + pAdapterInfo->GatewayList.IpAddress.String);
_tprintf(_T("=========================================================== ================\n")); _tprintf(_T("Interface List\n")); + /* FIXME - sort by the index! */ while (pAdapterInfo) { - _tprintf(_T("0x%lu ........................... %s\n"), pAdapterInfo->Index, pAdapterInfo->Description); + _tprintf(_T("0x%lu ........................... " +#if UNICODE + "%hs\n"), +#else + "%s\n"), +#endif + pAdapterInfo->Index, pAdapterInfo->Description); pAdapterInfo = pAdapterInfo->Next; }
_tprintf(_T("=========================================================== ================\n"));
_tprintf(_T("=========================================================== ================\n")); _tprintf(_T("Active Routes:\n")); - printf( "%-27s%-17s%-14s%-11s%-10s\n", - "Network Destination", - "Netmask", - "Gateway", - "Interface", - "Metric" ); + _tprintf( _T("%-27s%-17s%-14s%-11s%-10s\n"), + _T("Network Destination"), + _T("Netmask"), + _T("Gateway"), + _T("Interface"), + _T("Metric") ); for( i = 0; i < IpForwardTable->dwNumEntries; i++ ) { - strcpy( Destination, inet_ntoa( IN_ADDR_OF(IpForwardTable->table[i].dwForwardDest) ) ); - strcpy( Netmask, inet_ntoa( IN_ADDR_OF(IpForwardTable->table[i].dwForwardMask) ) ); - strcpy( Gateway, inet_ntoa( IN_ADDR_OF(IpForwardTable->table[i].dwForwardNextHop) ) ); + _stprintf( Destination, +#if UNICODE + _T("%hs"), +#else + _T("%s"), +#endif + inet_ntoa( IN_ADDR_OF(IpForwardTable->table[i].dwForwardDest) ) ); + _stprintf( Netmask, +#if UNICODE + _T("%hs"), +#else + _T("%s"), +#endif + inet_ntoa( IN_ADDR_OF(IpForwardTable->table[i].dwForwardMask) ) ); + _stprintf( Gateway, +#if UNICODE + _T("%hs"), +#else + _T("%s"), +#endif + inet_ntoa( IN_ADDR_OF(IpForwardTable->table[i].dwForwardNextHop) ) );
- printf( "%17s%17s%17s%16ld%9ld\n", - Destination, - Netmask, - Gateway, - IpForwardTable->table[i].dwForwardIfIndex, - IpForwardTable->table[i].dwForwardMetric1 ); + _tprintf( _T("%17s%17s%17s%16ld%9ld\n"), + Destination, + Netmask, + Gateway, + IpForwardTable->table[i].dwForwardIfIndex, + IpForwardTable->table[i].dwForwardMetric1 ); } _tprintf(_T("Default Gateway:%18s\n"), DefGate);
_tprintf(_T("=========================================================== ================\n")); @@ -97,98 +148,159 @@ } else { - fprintf( stderr, "Route enumerate failed\n" ); +Error: + _ftprintf( stderr, _T("Route enumerate failed\n") ); return Error; } }
int convert_add_cmd_line( PMIB_IPFORWARDROW RowToAdd, - int argc, char **argv ) { + int argc, TCHAR **argv ) { int i; +#if UNICODE + char addr[16]; +#endif
if( argc > 1 ) + { +#if UNICODE + sprintf( addr, "%ls", argv[0] ); + RowToAdd->dwForwardDest = inet_addr( addr ); +#else RowToAdd->dwForwardDest = inet_addr( argv[0] ); +#endif + } else return FALSE; for( i = 1; i < argc; i++ ) { - if( !strcasecmp( argv[i], "mask" ) ) + if( !_tcscmp( argv[i], _T("mask") ) ) { i++; if( i >= argc ) return FALSE; +#if UNICODE + sprintf( addr, "%ls", argv[i] ); + RowToAdd->dwForwardDest = inet_addr( addr ); +#else RowToAdd->dwForwardMask = inet_addr( argv[i] ); +#endif } - else if( !strcasecmp( argv[i], "metric" ) ) + else if( !_tcscmp( argv[i], _T("metric") ) ) { i++; if( i >= argc ) return FALSE; - RowToAdd->dwForwardMetric1 = atoi( argv[i] ); + RowToAdd->dwForwardMetric1 = _ttoi( argv[i] ); } else + { +#if UNICODE + sprintf( addr, "%ls", argv[i] ); + RowToAdd->dwForwardNextHop = inet_addr( addr ); +#else RowToAdd->dwForwardNextHop = inet_addr( argv[i] ); +#endif + } }
return TRUE; }
-int add_route( int argc, char **argv ) { +int add_route( int argc, TCHAR **argv ) { MIB_IPFORWARDROW RowToAdd = { 0 }; DWORD Error;
if( argc < 2 || !convert_add_cmd_line( &RowToAdd, argc, argv ) ) { - fprintf( stderr, - "route add usage:\n" - "route add <target> [mask <mask>] <gw> [metric <m>]\n" - " Adds a route to the IP route table.\n" - " <target> is the network or host to add a route to.\n" - " <mask> is the netmask to use (autodetected if unspecified)\n" - " <gw> is the gateway to use to access the network\n" - " <m> is the metric to use (lower is preferred)\n" ); + _ftprintf( stderr, + _T("route add usage:\n" + "route add <target> [mask <mask>] <gw> [metric <m>]\n" + " Adds a route to the IP route table.\n" + " <target> is the network or host to add a route to.\n" + " <mask> is the netmask to use (autodetected if unspecified)\n" + " <gw> is the gateway to use to access the network\n" + " <m> is the metric to use (lower is preferred)\n") ); return 1; }
if( (Error = CreateIpForwardEntry( &RowToAdd )) == ERROR_SUCCESS ) return 0;
- fprintf( stderr, "Route addition failed\n" ); + _ftprintf( stderr, _T("Route addition failed\n") ); return Error; }
-int del_route( int argc, char **argv ) +int del_route( int argc, TCHAR **argv ) { MIB_IPFORWARDROW RowToDel = { 0 }; DWORD Error;
if( argc < 2 || !convert_add_cmd_line( &RowToDel, argc, argv ) ) { - fprintf( stderr, - "route delete usage:\n" - "route delete <target> <gw>\n" - " Removes a route from the IP route table.\n" - " <target> is the network or host to add a route to.\n" - " <gw> is the gateway to remove the route from.\n" ); + _ftprintf( stderr, + _T("route delete usage:\n" + "route delete <target> <gw>\n" + " Removes a route from the IP route table.\n" + " <target> is the network or host to add a route to.\n" + " <gw> is the gateway to remove the route from.\n") ); return 1; }
if( (Error = DeleteIpForwardEntry( &RowToDel )) == ERROR_SUCCESS ) return 0;
- fprintf( stderr, "Route addition failed\n" ); + _ftprintf( stderr, _T("Route addition failed\n") ); return Error; }
-int main( int argc, char **argv ) +int _tmain( int argc, TCHAR **argv ) {
if( argc < 2 ) return Usage(); - else if ( !strcasecmp( argv[1], "print" ) ) + else if ( !_tcscmp( argv[1], _T("print") ) ) return PrintRoutes(); - else if( !strcasecmp( argv[1], "add" ) ) + else if( !_tcscmp( argv[1], _T("add") ) ) return add_route( argc-2, argv+2 ); - else if( !strcasecmp( argv[1], "delete" ) ) + else if( !_tcscmp( argv[1], _T("delete") ) ) return del_route( argc-2, argv+2 ); else return Usage(); } + +#if defined(_UNICODE) && defined(__GNUC__) +/* HACK - MINGW HAS NO OFFICIAL SUPPORT FOR wmain()!!! */ +int main( int argc, char **argv ) +{ + WCHAR **argvW; + int i, j, Ret = 1; + + if ((argvW = malloc(argc * sizeof(WCHAR*)))) + { + /* convert the arguments */ + for (i = 0, j = 0; i < argc; i++) + { + if (!(argvW[i] = malloc((strlen(argv[i]) + 1) * sizeof(WCHAR)))) + { + j++; + } + swprintf(argvW[i], L"%hs", argv[i]); + } + + if (j == 0) + { + /* no error converting the parameters, call wmain() */ + Ret = wmain(argc, argvW); + } + + /* free the arguments */ + for (i = 0; i < argc; i++) + { + if (argvW[i]) + free(argvW[i]); + } + free(argvW); + } + + return Ret; +} +#endif _____
Modified: trunk/reactos/apps/utils/net/route/route.xml --- trunk/reactos/apps/utils/net/route/route.xml 2005-10-01 18:41:02 UTC (rev 18196) +++ trunk/reactos/apps/utils/net/route/route.xml 2005-10-01 19:01:07 UTC (rev 18197) @@ -1,6 +1,8 @@
-<module name="route" type="win32cui" installbase="system32" installname="route.exe" allowwarnings="true"> +<module name="route" type="win32cui" installbase="system32" installname="route.exe"> <include base="route">.</include> <define name="__USE_W32API" /> + <define name="UNICODE" /> + <define name="_UNICODE" /> <library>kernel32</library> <library>ws2_32</library> <library>iphlpapi</library>