loopback-20040623

properly set dependencies for NSIS and wix targets to build loopback target

====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================

do not install a second loopback adapter if one is already installed.

====================

1.  Custom actions should not depend on any library that is not in the Windows distribution.  Change makefile to link
with a static runtime.

2.  Add common reporting mechanism to report ActionData messages back to the MSI process during the loopback
installation.

3.  CoInitializeSecurity can be called only once per process.  When running as a custom action DLL under the MSI process
we won't be able to successfully call this since the MSI process beats us to it.

====================



Compensate for difference in argument passing in MSI and RunDll32
This commit is contained in:
Jeffrey Altman 2004-06-24 05:51:54 +00:00 committed by Jeffrey Altman
parent d346e2ed53
commit ec3b49a1cd
6 changed files with 136 additions and 74 deletions

View File

@ -608,14 +608,14 @@ loopback:
$(NTMAKE)
$(CD) ..\..\..\..
NSIS:
NSIS: loopback
echo ***** Making NSIS Installer
$(DOCD) $(SRC)\WINNT\install\$@
$(CD) $(SRC)\WINNT\install\$@
$(NTMAKE)
$(CD) ..\..\..\..
wix:
wix: loopback
echo ***** Making Wix MSI Installer
$(DOCD) $(SRC)\WINNT\install\$@
$(CD) $(SRC)\WINNT\install\$@
@ -634,11 +634,11 @@ InstallShield5:
$(NTMAKE)
$(CD) ..\..\..\..
media: install loopback InstallShield5 NSIS wix
media: install InstallShield5 NSIS wix
install-nsis: install loopback NSIS
install-nsis: install NSIS
install-wix: install loopback wix
install-wix: install wix
install-is5: install InstallShield5

View File

@ -29,30 +29,30 @@ LINK=link
DLLSOURCEFILES = loopbackutils.cpp renameconnection.cpp wmi.cpp
DLLOBJFILES = $(OUT)\loopbackutils.obj $(OUT)\renameconnection.obj $(OUT)\wmi.obj
STATICC2OBJ=$(CC) $(cflags) $(afscflags) $(afscdefs) -ML
$(OUT)\loopbackutils.obj: loopbackutils.cpp
$(CPP2OBJ) -c -DUNICODE -D_UNICODE /Fo$@ $**
$(STATICC2OBJ) -c -DUNICODE -D_UNICODE /Fo$@ $**
$(OUT)\renameconnection.obj: renameconnection.cpp
$(CPP2OBJ) -c -DUNICODE -D_UNICODE /Fo$@ $**
$(STATICC2OBJ) -c -DUNICODE -D_UNICODE /Fo$@ $**
$(OUT)\wmi.obj: wmi.cpp
$(CPP2OBJ) -I$(NTDDKDIR) -c -DUNICODE -D_UNICODE /Fo$@ $**
$(STATICC2OBJ) -I$(NTDDKDIR) -c -DUNICODE -D_UNICODE /Fo$@ $**
$(DLLFILE): $(DLLOBJFILES)
$(LINK) -DLL $(DLLEXPORTS) -OUT:$@ $(DLLOBJFILES) $(DLLLIBFILES)
# instloop.exe
EXESOURCEFILES = instloop.c
EXEOBJFILES = $(OUT)\instloop.obj
EXELIBFILES = $(MEDIABINDIR)\afsloopback.lib
EXEOBJFILES = $(OUT)\instloop.obj $(DLLOBJFILES)
#EXELIBFILES = $(MEDIABINDIR)\afsloopback.lib
$(OUT)\instloop.obj: instloop.c
$(C2OBJ) -c -DUNICODE -D_UNICODE /Fo$@ $**
$(EXEFILE): $(EXEOBJFILES) $(EXELIBFILES)
$(LINK) /OUT:$@ $(EXEOBJFILES) $(EXELIBFILES)
$(STATICC2OBJ) -c -DUNICODE -D_UNICODE /Fo$@ $**
$(EXEFILE): $(EXEOBJFILES)
$(LINK) /OUT:$@ $(EXEOBJFILES) $(DLLLIBFILES)
install: $(DLLFILE) $(EXEFILE)

View File

@ -116,7 +116,7 @@ extern "C" DWORD UnInstallLoopBack(void)
if (found == FALSE)
{
ret = GetLastError();
printf("The %s does not seem to be installed\n", DRIVER_DESC);
ReportMessage(0,"Driver does not seem to be installed", DRIVER_DESC, NULL, ret);
goto cleanup;
}
@ -315,7 +315,7 @@ extern "C" DWORD InstallLoopBack(LPCTSTR pConnectionName, LPCTSTR ip, LPCTSTR ma
if (!found)
{
ret = GetLastError();
printf("Could not find the %s driver to install\n", DRIVER_DESC);
ReportMessage(0,"Could not find the driver to install", DRIVER_DESC, NULL, 0);
goto cleanup;
}
@ -439,8 +439,7 @@ extern "C" DWORD InstallLoopBack(LPCTSTR pConnectionName, LPCTSTR ip, LPCTSTR ma
ret = RenameConnection(pCfgGuidString, pConnectionName);
if (ret)
{
printf("Could not set the connection name to \"%S\"\n",
pConnectionName);
ReportMessage(0,"Could not set the connection name", NULL, pConnectionName, 0);
goto cleanup;
}
@ -448,25 +447,25 @@ extern "C" DWORD InstallLoopBack(LPCTSTR pConnectionName, LPCTSTR ip, LPCTSTR ma
ret = SetIpAddress(pCfgGuidString, ip, mask);
if (ret)
{
printf("Could not set the ip address and network mask\n");
ReportMessage(0,"Could not set the ip address and network mask",NULL,NULL,0);
goto cleanup;
}
ret = LoopbackBindings(pCfgGuidString);
if (ret)
{
printf("Could not properly set the bindings\n");
ReportMessage(0,"Could not properly set the bindings",NULL,NULL,0);
goto cleanup;
}
ret = !UpdateHostsFile( pConnectionName, ip, "hosts", FALSE );
if (ret)
{
printf("Could not update hosts file\n");
ReportMessage(0,"Could not update hosts file",NULL,NULL,0);
goto cleanup;
}
ret = !UpdateHostsFile( pConnectionName, ip, "lmhosts", TRUE );
if (ret)
{
printf("Could not update lmhosts file\n");
ReportMessage(0,"Could not update lmhosts file",NULL,NULL,0);
goto cleanup;
}
@ -507,12 +506,13 @@ static void display_usage()
L"loopback_install", MB_ICONINFORMATION | MB_OK );
}
static int process_args (LPWSTR lpCmdLine, Args & args) {
static int process_args (LPWSTR lpCmdLine, int skip, Args & args) {
int i, iNumArgs;
LPWSTR * argvW;
argvW = CommandLineToArgvW (lpCmdLine, &iNumArgs);
for (i = 0; i < iNumArgs; i++)
// Skip over the command name
for (i = skip; i < iNumArgs; i++)
{
if (wcsstr (argvW[i], L"help")
|| !_wcsicmp (argvW[i], L"?")
@ -556,6 +556,7 @@ static int process_args (LPWSTR lpCmdLine, Args & args) {
wcsMallocAndCpy (&args.lpSubnetMask, DEFAULT_MASK);
GlobalFree (argvW);
return 1;
}
@ -563,7 +564,7 @@ void CALLBACK doLoopBackEntryW (HWND hwnd, HINSTANCE hinst, LPWSTR lpCmdLine, in
{
Args args;
if (!process_args(lpCmdLine, args))
if (!process_args(lpCmdLine, 0, args))
return;
InstallLoopBack(args.lpConnectionName, args.lpIPAddr, args.lpSubnetMask);
@ -601,6 +602,14 @@ UINT __stdcall installLoopbackMSI (MSIHANDLE hInstall)
Args args;
UINT rc;
SetMsiReporter("InstallLoopback", "Installing loopback adapter", hInstall);
/* check if there is already one installed. If there is, we shouldn't try to
* install another.
*/
if(IsLoopbackInstalled())
return ERROR_SUCCESS;
szValueBuf = (LPWSTR) malloc (cbValueBuf * sizeof (WCHAR));
while (rc = MsiGetPropertyW(hInstall, L"CustomActionData", szValueBuf, &cbValueBuf)) {
free (szValueBuf);
@ -612,12 +621,12 @@ UINT __stdcall installLoopbackMSI (MSIHANDLE hInstall)
return ERROR_INSTALL_FAILURE;
}
if (!process_args(szValueBuf, args))
if (!process_args(szValueBuf, 1, args))
return ERROR_INSTALL_FAILURE;
rc = InstallLoopBack (args.lpConnectionName, args.lpIPAddr, args.lpSubnetMask);
if (rc == 1)
if (rc != 2 && rc != 0)
return ERROR_INSTALL_FAILURE;
if (rc == 2) {
@ -634,6 +643,8 @@ UINT __stdcall uninstallLoopbackMSI (MSIHANDLE hInstall)
Args args;
UINT rc;
SetMsiReporter("RemoveLoopback", "Removing loopback adapter", hInstall);
szValueBuf = (LPWSTR) malloc (cbValueBuf * sizeof (WCHAR));
while (rc = MsiGetPropertyW(hInstall, L"CustomActionData", szValueBuf, &cbValueBuf)) {
free (szValueBuf);
@ -645,7 +656,7 @@ UINT __stdcall uninstallLoopbackMSI (MSIHANDLE hInstall)
return ERROR_INSTALL_FAILURE;
}
if (!process_args(szValueBuf, args))
if (!process_args(szValueBuf, 1, args))
return ERROR_INSTALL_FAILURE;
rc = UnInstallLoopBack ();
@ -660,3 +671,39 @@ UINT __stdcall uninstallLoopbackMSI (MSIHANDLE hInstall)
return ERROR_SUCCESS;
}
DWORD hMsiHandle = 0;
DWORD dwReporterType = REPORT_PRINTF;
extern "C" void ReportMessage(int level, LPCSTR msg, LPCSTR str, LPCWSTR wstr, DWORD dw) {
if(dwReporterType == REPORT_PRINTF)
printf("%s:[%s][%S][%d]\n", (msg?msg:""), (str?str:""), (wstr?wstr:L""), dw);
else if(dwReporterType == REPORT_MSI && hMsiHandle && level == 0) {
MSIHANDLE hRec = MsiCreateRecord(5);
MsiRecordClearData(hRec);
MsiRecordSetStringA(hRec,1,(msg)?msg:"");
MsiRecordSetStringA(hRec,2,(str)?str:"");
MsiRecordSetStringW(hRec,3,(wstr)?wstr:L"");
MsiRecordSetInteger(hRec,4,dw);
MsiProcessMessage(hMsiHandle,INSTALLMESSAGE_ACTIONDATA,hRec);
MsiCloseHandle(hRec);
}
}
extern "C" void SetMsiReporter(LPCSTR strAction, LPCSTR strDesc,DWORD h) {
dwReporterType = REPORT_MSI;
hMsiHandle = h;
MSIHANDLE hRec = MsiCreateRecord(4);
MsiRecordClearData(hRec);
MsiRecordSetStringA(hRec,1,strAction);
MsiRecordSetStringA(hRec,2,strDesc);
MsiRecordSetStringA(hRec,3,"[1]:([2])([3])([4])");
MsiProcessMessage(h,INSTALLMESSAGE_ACTIONSTART, hRec);
MsiCloseHandle(hRec);
}

View File

@ -33,6 +33,8 @@ int RenameConnection(PCWSTR GuidString, PCWSTR pszNewName);
DWORD SetIpAddress(LPCWSTR guid, LPCWSTR ip, LPCWSTR mask);
HRESULT LoopbackBindings (LPCWSTR loopback_guid);
BOOL UpdateHostsFile( LPCWSTR swName, LPCWSTR swIp, LPCSTR szFilename, BOOL bPre );
void ReportMessage(int level, LPCSTR msg, LPCSTR str, LPCWSTR wstr, DWORD dw);
void SetMsiReporter(LPCSTR strAction, LPCSTR strDesc, DWORD h);
#ifdef __cplusplus
}
#endif
@ -63,3 +65,10 @@ BOOL UpdateHostsFile( LPCWSTR swName, LPCWSTR swIp, LPCSTR szFilename, BOOL bPre
#define SLEEP
#endif
/* Reporting mechanisms */
#define REPORT_PRINTF 1
#define REPORT_MSI 2
#define REPORT_IGNORE 3
extern DWORD dwReporterType;
extern DWORD hMsiHandle;

View File

@ -30,6 +30,8 @@ SOFTWARE.
#include <shlobj.h>
#include <wtypes.h>
#include "loopbackutils.h"
#define NETSHELL_LIBRARY _T("netshell.dll")
// Use the IShellFolder API to rename the connection.

View File

@ -57,8 +57,10 @@ SOFTWARE.
#include <stdio.h>
//#endif
#include "loopbackutils.h"
#define CLEANUP_ON_FAILURE(hr) \
do { if (!SUCCEEDED(hr)) goto cleanup; } while (0)
do { if (!SUCCEEDED(hr)) {goto cleanup;} } while (0)
#define CLEANUP_ON_AND_SET(check, var, value) \
do { if (check) { (var) = (value); goto cleanup; } } while (0)
@ -113,7 +115,7 @@ FindNetworkAdapterConfigurationInstanceByGUID(
&pEnum);
if (!SUCCEEDED(hr))
{
printf("ExecQuery() error (0x%08X)\n", hr);
ReportMessage(0,"ExecQuery() error",NULL,NULL, hr);
goto cleanup;
}
@ -143,7 +145,7 @@ FindNetworkAdapterConfigurationInstanceByGUID(
if (bFound)
{
printf("Found adapter: %S\n", V_BSTR(&Value));
ReportMessage(1,"Found adapter", NULL,V_BSTR(&Value),0);
VariantClear(&Value);
hr = pObj->Get(L"__RELPATH", // property name
0L,
@ -262,11 +264,14 @@ WMIEnableStatic(
hr = CoInitializeEx(0, COINIT_MULTITHREADED);
CLEANUP_ON_FAILURE(hr);
/* When called from an MSI this will generally fail. This should only be called once
per process and not surprisingly MSI beats us to it. So ignore return value and
hope for the best. */
hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_CONNECT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE, 0);
CLEANUP_ON_FAILURE(hr);
/* CLEANUP_ON_FAILURE(hr); */
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLocator);
@ -276,7 +281,7 @@ WMIEnableStatic(
NULL, NULL, &pNamespace);
CLEANUP_ON_FAILURE(hr);
printf("Connected to WMI\n");
ReportMessage(0,"Connected to WMI",NULL,NULL,0);
// Set the proxy so that impersonation of the client occurs.
hr = CoSetProxyBlanket(pNamespace,
@ -297,7 +302,7 @@ WMIEnableStatic(
hr = pFindInstance(pContext, pNamespace, &InstancePath);
CLEANUP_ON_FAILURE(hr);
printf("Found Adapter Instance: %S\n", InstancePath);
ReportMessage(0,"Found Adapter Instance",NULL, InstancePath,0);
#if 0
// Use the adapter instance index to set MAXLANA in the registry.
@ -306,9 +311,9 @@ WMIEnableStatic(
if (swscanf(InstancePath, L"Win32_NetworkAdapterConfiguration.Index=%u", &dwIndex)==1)
{
DWORD ret = 0;
printf("Setting MAXLANA to at least %u\n",dwIndex+1);
ReportMessage(1,"Setting MAXLANA",NULL,NULL,dwIndex+1);
ret = AdjustMaxLana(dwIndex+1);
if (ret) printf("AdjustMaxLana returned the error code %u.\n",ret);
if (ret) ReportMessage(0,"AdjustMaxLana returned the error code ",NULL,NULL,ret);
}
}
#endif
@ -334,11 +339,11 @@ WMIEnableStatic(
CLEANUP_ON_FAILURE(hr);
// Sleep for a twenty seconds
printf("Calling ExecMethod in 20 seconds...\r");
ReportMessage(0,"Calling ExecMethod in 20 seconds...",NULL,NULL,0);
Sleep(10000);
printf("Calling ExecMethod in 10 seconds...\r");
ReportMessage(0,"Calling ExecMethod in 10 seconds...",NULL,NULL,0);
Sleep(5000);
printf("Calling ExecMethod in 5 seconds...\r");
ReportMessage(0,"Calling ExecMethod in 5 seconds...",NULL,NULL,0);
Sleep(2000);
// printf("Skipping ExecMethod\n");
@ -348,11 +353,11 @@ WMIEnableStatic(
// Try up to five times, sleeping 3 seconds between tries
for (count=0; count<5; count++)
{
if (count>0) printf("Trying again in 3 seconds...\n");
if (count>0) ReportMessage(0,"Trying again in 3 seconds...",NULL,NULL,0);
Sleep(3000);
printf("Calling ExecMethod NOW... \n");
ReportMessage(0,"Calling ExecMethod NOW... ",NULL,NULL,0);
// Call the method
@ -361,7 +366,7 @@ WMIEnableStatic(
if (!SUCCEEDED(hr))
{
printf("ExecMethod failed (0x%08X)\n", hr);
ReportMessage(0,"ExecMethod failed",NULL,NULL, hr);
continue;
}
@ -370,7 +375,7 @@ WMIEnableStatic(
if (!SUCCEEDED(hr))
{
printf("WARNING: Could not determine return value for EnableStatic (0x%08X)\n", hr);
ReportMessage(0,"WARNING: Could not determine return value for EnableStatic ",NULL,NULL, hr);
continue;
}
@ -378,10 +383,10 @@ WMIEnableStatic(
if(hr != 0)
printf("EnableStatic failed (0x%08X)\n", hr);
ReportMessage(0,"EnableStatic failed ", NULL,NULL,hr);
else
{
printf("EnableStatic succeeded\n");
ReportMessage(0,"EnableStatic succeeded",NULL,NULL,0);
break;
}
@ -431,7 +436,7 @@ extern "C" HRESULT LoopbackBindings (LPCWSTR loopback_guid)
wchar_t device_guid[100];
DWORD lenDeviceId;
printf("\nRunning LoopbackBindings()...\n");
ReportMessage(0,"Running LoopbackBindings()...",NULL,NULL,0);
hr = CoInitializeEx( NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED );
CLEANUP_ON_FAILURE(hr);
@ -467,7 +472,7 @@ extern "C" HRESULT LoopbackBindings (LPCWSTR loopback_guid)
IEnumNetCfgBindingPath *pEnumPaths;
INetCfgComponent *upper;
wprintf(L"LoopbackBindings found: %s\n", device_guid );
ReportMessage(0,"LoopbackBindings found", NULL, device_guid,0 );
hr = pAdapter->QueryInterface( IID_INetCfgComponentBindings, (void**) &pBindings);
if(hr==S_OK)
@ -484,20 +489,20 @@ extern "C" HRESULT LoopbackBindings (LPCWSTR loopback_guid)
upper->GetDisplayName( &swName );
upper->GetId( &swId );
wprintf(L"Looking at %s (%s)... \n",swName, swId);
ReportMessage(1,"Looking at ",NULL, swName, 0);
{
wprintf(L" Moving to the end of binding order...");
ReportMessage(1," Moving to the end of binding order...",NULL,NULL,0);
INetCfgComponentBindings *pBindings2;
hr = upper->QueryInterface( IID_INetCfgComponentBindings, (void**) &pBindings2);
if (hr==S_OK)
{
printf("...");
ReportMessage(1,"...",0,0,0);
hr = pBindings2->MoveAfter(pPath, NULL);
pBindings2->Release();
bConfigChanged=TRUE;
}
if (hr==S_OK) printf("success\n"); else printf("failed: 0x%0lx\n",hr);
if (hr==S_OK) ReportMessage(1,"success",0,0,0); else ReportMessage(0,"Binding change failed",0,0,hr);
}
@ -507,9 +512,9 @@ extern "C" HRESULT LoopbackBindings (LPCWSTR loopback_guid)
{
if (pPath->IsEnabled()!=S_OK)
{
wprintf(L" Enabling %s: ",swName);
ReportMessage(1," Enabling ",0,swName,0);
hr = pPath->Enable(TRUE);
if (hr==S_OK) printf("success\n"); else printf("failed: %ld\n",hr);
if (hr==S_OK) ReportMessage(1,"success",0,0,0); else ReportMessage(0,"Proto failed",0,0,hr);
bConfigChanged=TRUE;
}
@ -519,9 +524,9 @@ extern "C" HRESULT LoopbackBindings (LPCWSTR loopback_guid)
{
if (pPath->IsEnabled()==S_OK)
{
wprintf(L" Disabling %s: ",swName);
ReportMessage(1," Disabling ",0,swName,0);
hr = pPath->Enable(FALSE);
if (hr==S_OK) printf("success\n"); else printf("failed: %ld\n",hr);
if (hr==S_OK) ReportMessage(1,"success",0,0,0); else ReportMessage(0,"Proto failed",0,0,hr);
bConfigChanged=TRUE;
}
}
@ -558,7 +563,7 @@ cleanup:
if(pLock) pLock->Release();
if(pCfg) pCfg->Release();
if (hr) printf ("LoopbackBindings() is returning %u\n",hr);
if (hr) ReportMessage(0,"LoopbackBindings() is returning ",0,0,hr);
return hr;
}
@ -571,7 +576,7 @@ SetIpAddress(
LPCWSTR mask
)
{
printf("\nRunning SetIpAddress()...\n");
ReportMessage(0,"Running SetIpAddress()...",0,0,0);
HRESULT hr = 0;
hr = WMIEnableStatic(FindNetworkAdapterConfigurationInstanceByGUID,
@ -587,7 +592,7 @@ DWORD AdjustMaxLana(DWORD dwMaxLana)
HKEY hNetBiosParamKey = NULL;
DWORD dwType, dwExistingMaxLana, dwSize;
printf ("Making sure MaxLana is at least %u...\n", dwMaxLana);
ReportMessage(0,"Making sure MaxLana is large enough",0,0, dwMaxLana);
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\NetBIOS\\Parameters"),
0, KEY_ALL_ACCESS , &hNetBiosParamKey);
@ -605,11 +610,11 @@ DWORD AdjustMaxLana(DWORD dwMaxLana)
if ((dwType != REG_DWORD) || (ret)) dwExistingMaxLana = 0;
printf (" MaxLana is currently %u\n", dwExistingMaxLana);
ReportMessage (1,"MaxLana is currently",0,0, dwExistingMaxLana);
if (dwExistingMaxLana < dwMaxLana)
{
printf (" Changing to %u\n", dwMaxLana);
ReportMessage (1,"Changing MaxLana", 0,0,dwMaxLana);
ret = RegSetValueEx(hNetBiosParamKey, _T("MaxLana"), 0, REG_DWORD, (const BYTE*)&dwMaxLana, 4);
if (ret)
{
@ -640,7 +645,7 @@ BOOL UpdateHostsFile( LPCWSTR swName, LPCWSTR swIp, LPCSTR szFilename, BOOL bPre
_snprintf(szIp, 2047, "%S", swIp);
_snprintf(szName, 2047, "%S", swName);
strupr(szName);
printf("Starting UpdateHostsFile() on %s file\n",szFilename);
ReportMessage(0,"Starting UpdateHostsFile() on file",szFilename,0,0);
rv = SHGetFolderPathA( NULL, CSIDL_SYSTEM, NULL, SHGFP_TYPE_CURRENT , etcPath );
if(rv != S_OK) return FALSE;
@ -653,7 +658,7 @@ BOOL UpdateHostsFile( LPCWSTR swName, LPCWSTR swIp, LPCSTR szFilename, BOOL bPre
{
// the directory doesn't exist
// it should be there. non-existence implies more things are wrong
printf( "Path does not exist : %s\n", etcPath );
ReportMessage(0, "Path does not exist ", etcPath,0,0 );
return FALSE;
}
@ -665,12 +670,12 @@ BOOL UpdateHostsFile( LPCWSTR swName, LPCWSTR swIp, LPCSTR szFilename, BOOL bPre
if(fa == INVALID_FILE_ATTRIBUTES)
{
printf( "No %s file found. Creating...", szFilename);
ReportMessage(0, "File not found. Creating...", szFilename,0,0);
hFile = fopen( etcPath, "w" );
if(!hFile)
{
printf("FAILED : can't create %s file\nErrno is %d\n",etcPath,errno);
ReportMessage(0,"FAILED : can't create file",etcPath,0,errno);
return FALSE;
}
@ -678,17 +683,17 @@ BOOL UpdateHostsFile( LPCWSTR swName, LPCWSTR swIp, LPCSTR szFilename, BOOL bPre
fclose( hFile );
printf("done\n");
ReportMessage(1,"done",0,0,0);
}
else // the file exists. parse and update
{
printf( "Updating %s file ...",szFilename );
ReportMessage(1, "Updating file ...",szFilename,0,0 );
hFile = fopen( etcPath, "r");
if(!hFile)
{
printf("FAILED : can't open %s file\nErrno is %d\n",etcPath,errno);
ReportMessage(0,"FAILED : can't open file",etcPath,0,errno);
return FALSE;
}
@ -697,7 +702,7 @@ BOOL UpdateHostsFile( LPCWSTR swName, LPCWSTR swIp, LPCSTR szFilename, BOOL bPre
hTemp = fopen( tempPath, "w");
if(!hTemp)
{
printf("FAILED : can't create temp file %s\nErrno is %d\n",tempPath,errno);
ReportMessage(0,"FAILED : can't create temp file",tempPath,0,errno);
fclose(hFile);
return FALSE;
}
@ -738,26 +743,25 @@ BOOL UpdateHostsFile( LPCWSTR swName, LPCWSTR swIp, LPCSTR szFilename, BOOL bPre
if ((unlink( buffer ) != 0) && (errno == EACCES))
{
printf("FAILED : Can't delete %s file\nErrno is %d",buffer,errno);
ReportMessage(0,"FAILED : Can't delete file",buffer,0,errno);
return FALSE;
}
if ((errno) && (errno != ENOENT)) printf("WEIRD : errno after unlink is %d...",errno);
if ((errno) && (errno != ENOENT)) ReportMessage(0,"WEIRD : errno after unlink ",0,0,errno);
if(rename( etcPath, buffer) != 0)
{
printf("FAILED : Can't rename old %s file\nErrno is %d\n",etcPath,errno);
ReportMessage(0,"FAILED : Can't rename old file",etcPath,0,errno);
return FALSE;
}
if(rename( tempPath, etcPath ) != 0)
{
printf("FAILED : Can't rename new %s file\nErrno is %d\n",tempPath,errno);
ReportMessage(0,"FAILED : Can't rename new file",tempPath,0,errno);
return FALSE;
}
printf("done\n");
}
return TRUE;