diff --git a/examples/server_example_goose/server_example_goose.c b/examples/server_example_goose/server_example_goose.c index cc95890c..7f0681d9 100644 --- a/examples/server_example_goose/server_example_goose.c +++ b/examples/server_example_goose/server_example_goose.c @@ -55,6 +55,13 @@ int main(int argc, char** argv) { iedServer = IedServer_create(&iedModel); + if (argc > 1) { + char* ethernetIfcID = argv[1]; + + printf("Using GOOSE interface: %s\n", ethernetIfcID); + IedServer_setGooseInterfaceId(iedServer, ethernetIfcID); + } + /* MMS server will be instructed to start listening to client connections. */ IedServer_start(iedServer, 102); diff --git a/src/hal/filesystem/win32/file_provider_win32.c b/src/hal/filesystem/win32/file_provider_win32.c index 8df94e58..9f25d233 100644 --- a/src/hal/filesystem/win32/file_provider_win32.c +++ b/src/hal/filesystem/win32/file_provider_win32.c @@ -1,7 +1,7 @@ /* * file_provider_win32.c * - * Copyright 2014 Michael Zillgith + * Copyright 2014, 2015 Michael Zillgith * * This file is part of libIEC61850. * @@ -45,7 +45,8 @@ static char* fileBasePath = CONFIG_VIRTUAL_FILESTORE_BASEPATH; struct sDirectoryHandle { HANDLE handle; - WIN32_FIND_DATA findData; + WIN32_FIND_DATAW findData; + char utf8Filename[MAX_PATH * 3 + 1]; bool available; }; @@ -134,10 +135,18 @@ FileSystem_openDirectory(char* directoryName) strcat(fullPath, "\\*"); - dirHandle->handle = FindFirstFile(fullPath, &(dirHandle->findData)); + /* convert UTF-8 path name to WCHAR */ + WCHAR unicodeFullPath[MAX_PATH + 1]; + MultiByteToWideChar(CP_UTF8, 0, fullPath, -1, unicodeFullPath, MAX_PATH); - if (dirHandle->handle != NULL) - dirHandle->available = true; + dirHandle->handle = FindFirstFileW(unicodeFullPath, &(dirHandle->findData)); + + if (dirHandle->handle != NULL) { + dirHandle->available = true; + + /* convert WCHAR to UTF-8 */ + WideCharToMultiByte(CP_UTF8, 0, dirHandle->findData.cFileName, -1, dirHandle->utf8Filename, (MAX_PATH * 3) + 1, NULL, NULL); + } if (dirHandle->handle == INVALID_HANDLE_VALUE) { GLOBAL_FREEMEM(dirHandle); @@ -158,18 +167,21 @@ getNextDirectoryEntry(DirectoryHandle directory, bool* isDirectory) else *isDirectory = false; - return directory->findData.cFileName; + return directory->utf8Filename; } else { - if (FindNextFile(directory->handle, &(directory->findData)) != 0) { + if (FindNextFileW(directory->handle, &(directory->findData)) != 0) { if (directory->findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) *isDirectory = true; else *isDirectory = false; - return directory->findData.cFileName; + /* convert WCHAR to UTF-8 */ + WideCharToMultiByte(CP_UTF8, 0, directory->findData.cFileName, -1, directory->utf8Filename, (MAX_PATH * 3) + 1, NULL, NULL); + + return directory->utf8Filename; } else return NULL; diff --git a/src/iec61850/server/mms_mapping/mms_goose.c b/src/iec61850/server/mms_mapping/mms_goose.c index bb4963fe..175da405 100644 --- a/src/iec61850/server/mms_mapping/mms_goose.c +++ b/src/iec61850/server/mms_mapping/mms_goose.c @@ -504,6 +504,8 @@ GOOSE_createGOOSEControlBlocks(MmsMapping* self, MmsDomain* domain, MmsValue* goID = MmsValue_getElement(gseValues, 1); MmsValue_setVisibleString(goID, gooseControlBlock->appId); + + mmsGCB->goId = copyString(gooseControlBlock->appId); } if (gooseControlBlock->dataSetName != NULL) diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 57cbc572..959d24ca 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -1797,7 +1797,7 @@ mmsWriteHandler(void* parameter, MmsDomain* domain, if (fc == IEC61850_FC_SE) { SettingGroup* sg = getSettingGroupByMmsDomain(self, domain); - if (sg->editingClient != connection) + if (sg->editingClient != (ClientConnection) connection) return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; } #endif /* (CONFIG_IEC61850_SETTING_GROUPS == 1) */