diff -r 000000000000 -r af10295192d8 linklayerprotocols/ethernetpacketdriver/NetCards/netcards.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linklayerprotocols/ethernetpacketdriver/NetCards/netcards.c Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,413 @@ +/* +* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Implementation of the Netcards.exe adapter selection application. +* This version writes settings to an ethernet.ini file only. The perl +* script "configchange.pl" can be used to run this version of Netcards.exe +* and extract the ethernet settings from ethernet.ini and place them in the +* correct setup files for EKA1 (ethermac.dat and etherdriver.dat) or EKA2 (epoc.ini). +* there is a bug in the rpcasync.h windows header file +* where the forward declaration for type _RPC_ASYNC_STATE +* type is locally scoped inside an extern C block, rather +* than outside it, so we have turned this warning off, as +* we can;t change the header file... +* +* +*/ + + + +/** + @file NETCARDS.C + @internalTechnology + @file +*/ +#pragma warning (disable : 4115) +#include +#pragma warning (default : 4115) +#include +#include +#include + + +#define EPOC_INI_FILE "ethernet.ini" + +#define EPOC_INI_FILE_TEMP "__temp__ethernet__.ini" + +#define ETHER_NIF_ENTRY "ETHER_NIF" +#define ETHER_MAC_ENTRY "ETHER_MAC" +#define ETHER_SPEED_ENTRY "ETHER_SPEED" + +#define MAX_VALUE 80 +#define MAX_LINE 100 +#define MAX_OID_DATA 256 + +#define OID_802_3_CURRENT_ADDRESS 0x01010102 + + +char AdapterList[10][1024]; + +// replace or write new 'value' for 'entry' in epoc.ini file +// returns 0 if ok, negative value if sth wrong +int replace_in_inifile(char * entry, char* value, BOOL valUnicode ); + + +int main(int argc, char* argv[]) +{ + + // Packet.lib variables: + LPADAPTER lpAdapter = 0; + PPACKET_OID_DATA pOidData = malloc( sizeof(PACKET_OID_DATA) + MAX_OID_DATA ); + NetType *type = malloc(sizeof(NetType)); + UINT speed_Mbps = 0; + + BOOL isWinNT = FALSE; + int i; + + DWORD dwVersion; + DWORD dwWindowsMajorVersion; + + + //unicode strings (winnt) + WCHAR AdapterName[8192]; // string that contains a list of the network adapters + WCHAR *temp,*temp1; + + //ascii strings (win95) + char AdapterNamea[8192]; // string that contains a list of the network adapters + char *tempa,*temp1a; + + + int AdapterNum=0,Open; + unsigned long AdapterLength; + + + FILE * inifile; + + char speed_value[10]; + char *MAC_value = malloc( 13*sizeof(char) ); + char *temp2 = malloc( 13*sizeof(char) ); + + //interfaceArg specifies the interface # passed fron configchange.pl + //set interfaceArg to argv[1] if arguments are passed + int interfaceArg = 0; + if ( argc>1 && argv[1] ) + { + interfaceArg = atoi(argv[1]); + } + + // obtain the name of the adapters installed on this machine + //printf("Adapters installed:\n"); + i=0; + + // the data returned by PacketGetAdapterNames is different in Win95 and in WinNT. + // We have to check the os on which we are running + dwVersion=GetVersion(); + dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); + if (!(dwVersion >= 0x80000000 && dwWindowsMajorVersion >= 4)) + { // Windows NT + isWinNT = TRUE; + AdapterLength=sizeof(AdapterName); + PacketGetAdapterNames((char*)AdapterName,&AdapterLength); + temp=AdapterName; + temp1=AdapterName; + while ((*temp!='\0')||(*(temp-1)!='\0')) + { + if (*temp=='\0') + { + memcpy(AdapterList[i],temp1,(temp-temp1)*2); + temp1=temp+1; + i++; + } + + temp++; + } + + AdapterNum=i; + // we want to automate the adaptor selection process + // but if there are more than one to choose from, we can't + // so + if (AdapterNum>1) + { + for (i=0;i1) + { + printf("Adapters installed:\n"); + for (i=0;i1) + { + if ( (interfaceArg>AdapterNum)||(interfaceArg<1) ) + { + do + { + printf("Select the number of the adapter to use : ");scanf("%d",&Open); + if (Open>AdapterNum) printf("\nThe number must be smaller than %d",AdapterNum); + } while (Open>AdapterNum); + } + else + { + Open = interfaceArg; + } + } + else + { + Open = AdapterNum; + } + + lpAdapter = PacketOpenAdapter(AdapterList[Open-1]); + + + MAC_value[0] = '\0'; + temp2[0] = '\0'; + speed_value[0] = '\0'; + + if( NULL != lpAdapter) + { + + if ( TRUE == PacketGetNetType (lpAdapter, type) ) + { + speed_Mbps = type->LinkSpeed / 1000000; // LinkSpeed is in bits per second + } + else + printf("Could not read Ethernet card's speed\n"); + + if ( type->LinkType != NdisMedium802_3) + printf("NOT Ethernet802.3 card.\nNetwork Interface not supported\n"); + else + { + pOidData->Oid = OID_802_3_CURRENT_ADDRESS; + + pOidData->Length = MAX_OID_DATA; + + + if ( TRUE == PacketRequest(lpAdapter, FALSE , pOidData) ) + { + // get info obtained +// printf("Physical address read: "); + /* printf("%x %x %x %x %x %x\n", pOidData->Data[0], pOidData->Data[1], + pOidData->Data[2],pOidData->Data[3], + pOidData->Data[4],pOidData->Data[5] + );*/ + + pOidData->Data[0] += 2; // changing address from global to local + for( i=0; i<6; i++ ) + { + strcpy( temp2, MAC_value); + if( pOidData->Data[i] > 15 ) + // has 2 hex digits + sprintf( MAC_value, "%s%x", temp2, pOidData->Data[i]); + else + sprintf( MAC_value, "%s0%x", temp2, pOidData->Data[i]); + } + } + else + printf("Failed to read physical address of Ethernet card\n"); + } + + free(pOidData); + free(type); + + PacketCloseAdapter( lpAdapter ); + } + else + { + // lpAdapter NULL + printf("Problem with opening adapter (packet.lib issue)\n"); + return (1); + } + + inifile = fopen(EPOC_INI_FILE, "a"); // to create if does exist + if ( NULL != inifile ) + fclose(inifile); + else + { + printf("Can't create or access %s.\n\n", EPOC_INI_FILE); + return 0; + } + + if ( 0 == replace_in_inifile( ETHER_NIF_ENTRY, AdapterList[Open-1], isWinNT ) ) + printf( "Netcards using adapter %d\n", Open ); + else + { + return 0; + } + + + if ( 0 != replace_in_inifile( ETHER_MAC_ENTRY, MAC_value, FALSE ) ) + { + printf("Couldn't write MAC address to %s file\n", EPOC_INI_FILE); + return (1); + } + + + if( 0 != speed_Mbps ) + sprintf( speed_value, "%dMbps", speed_Mbps); + + + if ( 0 != replace_in_inifile( ETHER_SPEED_ENTRY, speed_value, FALSE ) ) + { + printf("Couldn't write speed value to %s file\n", EPOC_INI_FILE); + return (1); + } + + //printf("Netcards has written settings to %s.\n\n", EPOC_INI_FILE); + + free(MAC_value); + free(temp2); + return (0); +} + + +int replace_in_inifile(char * entry_str, char* value, BOOL valUnicode) +{ + + int err = 0; // 0 - ok, negative sth wrong + + int replaced = 0; + int len = strlen(entry_str); + + FILE * file; + FILE * tmp_file; + + char* s = malloc(MAX_LINE); + char *line = malloc(MAX_LINE); + + if ( NULL == (tmp_file = fopen(EPOC_INI_FILE_TEMP, "w")) ) + { + printf( "Could not create '%s'\n", EPOC_INI_FILE_TEMP ); + return -1; + } + + if ( NULL == (file = fopen(EPOC_INI_FILE, "r+")) ) + { + fclose( tmp_file ); + remove( EPOC_INI_FILE_TEMP ); + printf( "Could not open '%s'\n", EPOC_INI_FILE ); + return -1; + } + + rewind(file); + + + while( fgets(line, MAX_LINE, file) != NULL) + { + if (sscanf( line, "%s", s ) > 0) // to trim blank chars + { + s[len] = '\0'; + if( 0 == strcmp(entry_str, s)) + { + + fprintf(tmp_file, "%s=", entry_str); + + if( valUnicode == TRUE ) + fwprintf(tmp_file, L"%s\n", value); + else + fprintf(tmp_file, "%s\n", value); + + replaced = 1; + } + else + if( EOF == fputs(line, tmp_file) ) + { + err = -1; + break; + } + } + } + + free(line); + free(s); + + if( (0 == replaced) && (0 == err) ) + { + // no entry encountered - add new + if( 0 != fseek( tmp_file, 0, SEEK_END ) ) + err = -1; + + fprintf( tmp_file, "\n%s=", entry_str); + if ( valUnicode ) + fwprintf( tmp_file, L"%s\n", value); + else + fprintf( tmp_file, "%s\n", value); + } + + + if ( 0 != fclose(file ) ) + { + printf( "Could not close %s file\n", EPOC_INI_FILE ); + return -1; + } + + if ( 0 != fclose( tmp_file ) ) + { + printf( "Could not close %s file\n", EPOC_INI_FILE_TEMP ); + return -1; + } + + + if( remove( EPOC_INI_FILE ) == -1 ) + { + printf( "Could not overwrite %s file\n", EPOC_INI_FILE ); + return -1; + } + + if( rename( EPOC_INI_FILE_TEMP, EPOC_INI_FILE ) != 0 ) + { + printf( "\nCould not rename '%s' to '%s'\n", EPOC_INI_FILE_TEMP, EPOC_INI_FILE ); + return -1; + } + + return 0; + +} +