@@ -403,20 +403,58 @@ HRESULT CModuleConfiguration::GetConfigSection(IHttpContext* context, IAppHostEl
403
403
return hr;
404
404
}
405
405
406
+ HRESULT CModuleConfiguration::GetEnvVariable (LPCWSTR propertyName, LPWSTR buffer, DWORD bufferSize, LPWSTR* result)
407
+ {
408
+ HRESULT hr;
409
+ WCHAR variableName[124 ];
410
+
411
+ CheckNull (result);
412
+ ErrorIf (124 < (wcslen (propertyName) + 9 ), IISNODE_ERROR_UNABLE_TO_READ_CONFIGURATION_FROM_ENVIRONMENT);
413
+ wcscpy (variableName, L" IISNODE_" );
414
+ wcscat (variableName, propertyName);
415
+ DWORD size = GetEnvironmentVariableW (variableName, buffer, bufferSize);
416
+ ErrorIf (size > bufferSize, IISNODE_ERROR_UNABLE_TO_READ_CONFIGURATION_FROM_ENVIRONMENT);
417
+ if (size == 0 )
418
+ {
419
+ *result = NULL ;
420
+ ErrorIf (ERROR_ENVVAR_NOT_FOUND != (hr = GetLastError ()), hr);
421
+ }
422
+ else
423
+ {
424
+ *result = buffer;
425
+ }
426
+
427
+ return S_OK;
428
+ Error:
429
+ return hr;
430
+ }
431
+
406
432
HRESULT CModuleConfiguration::GetString (IAppHostElement* section, LPCWSTR propertyName, LPWSTR* value)
407
433
{
408
434
HRESULT hr = S_OK;
409
435
BSTR sysPropertyName = NULL ;
410
436
BSTR sysPropertyValue = NULL ;
411
437
IAppHostProperty* prop = NULL ;
438
+ WCHAR variableValueBuffer[1024 ];
439
+ WCHAR* variableValue = NULL ;
412
440
413
441
CheckNull (value);
414
442
*value = NULL ;
415
- ErrorIf (NULL == (sysPropertyName = SysAllocString (propertyName)), ERROR_NOT_ENOUGH_MEMORY);
416
- CheckError (section->GetPropertyByName (sysPropertyName, &prop));
417
- CheckError (prop->get_StringValue (&sysPropertyValue));
418
- ErrorIf (NULL == (*value = new WCHAR[wcslen (sysPropertyValue) + 1 ]), ERROR_NOT_ENOUGH_MEMORY);
419
- wcscpy (*value, sysPropertyValue);
443
+
444
+ CheckError (CModuleConfiguration::GetEnvVariable (propertyName, variableValueBuffer, 1024 , &variableValue));
445
+ if (variableValue)
446
+ {
447
+ ErrorIf (NULL == (*value = new WCHAR[wcslen (variableValue) + 1 ]), ERROR_NOT_ENOUGH_MEMORY);
448
+ wcscpy (*value, variableValue);
449
+ }
450
+ else
451
+ {
452
+ ErrorIf (NULL == (sysPropertyName = SysAllocString (propertyName)), ERROR_NOT_ENOUGH_MEMORY);
453
+ CheckError (section->GetPropertyByName (sysPropertyName, &prop));
454
+ CheckError (prop->get_StringValue (&sysPropertyValue));
455
+ ErrorIf (NULL == (*value = new WCHAR[wcslen (sysPropertyValue) + 1 ]), ERROR_NOT_ENOUGH_MEMORY);
456
+ wcscpy (*value, sysPropertyValue);
457
+ }
420
458
421
459
Error:
422
460
@@ -447,20 +485,42 @@ HRESULT CModuleConfiguration::GetBOOL(IAppHostElement* section, LPCWSTR property
447
485
BSTR sysPropertyName = NULL ;
448
486
IAppHostProperty* prop = NULL ;
449
487
VARIANT var;
488
+ WCHAR variableValueBuffer[8 ];
489
+ WCHAR* variableValue = NULL ;
450
490
451
491
CheckNull (value);
452
492
*value = FALSE ;
453
493
VariantInit (&var);
454
- ErrorIf (NULL == (sysPropertyName = SysAllocString (propertyName)), ERROR_NOT_ENOUGH_MEMORY);
455
- if (S_OK != section->GetPropertyByName (sysPropertyName, &prop))
494
+
495
+ CheckError (CModuleConfiguration::GetEnvVariable (propertyName, variableValueBuffer, 8 , &variableValue));
496
+ if (variableValue)
456
497
{
457
- *value = defaultValue;
498
+ if (0 == _wcsicmp (variableValue, L" true" ) || 0 == _wcsicmp (variableValue, L" 1" ))
499
+ {
500
+ *value = TRUE ;
501
+ }
502
+ else if (0 == _wcsicmp (variableValue, L" false" ) || 0 == _wcsicmp (variableValue, L" 0" ))
503
+ {
504
+ *value = FALSE ;
505
+ }
506
+ else
507
+ {
508
+ CheckError (IISNODE_ERROR_UNABLE_TO_READ_CONFIGURATION_FROM_ENVIRONMENT);
509
+ }
458
510
}
459
- else
511
+ else
460
512
{
461
- CheckError (prop->get_Value (&var));
462
- CheckError (VariantChangeType (&var, &var, 0 , VT_BOOL));
463
- *value = (V_BOOL (&var) == VARIANT_TRUE);
513
+ ErrorIf (NULL == (sysPropertyName = SysAllocString (propertyName)), ERROR_NOT_ENOUGH_MEMORY);
514
+ if (S_OK != section->GetPropertyByName (sysPropertyName, &prop))
515
+ {
516
+ *value = defaultValue;
517
+ }
518
+ else
519
+ {
520
+ CheckError (prop->get_Value (&var));
521
+ CheckError (VariantChangeType (&var, &var, 0 , VT_BOOL));
522
+ *value = (V_BOOL (&var) == VARIANT_TRUE);
523
+ }
464
524
}
465
525
466
526
Error:
@@ -488,15 +548,29 @@ HRESULT CModuleConfiguration::GetDWORD(IAppHostElement* section, LPCWSTR propert
488
548
BSTR sysPropertyName = NULL ;
489
549
IAppHostProperty* prop = NULL ;
490
550
VARIANT var;
551
+ WCHAR variableValueBuffer[64 ];
552
+ WCHAR* variableValue = NULL ;
553
+ WCHAR* endValue = NULL ;
491
554
492
555
CheckNull (value);
493
- *value = 0 ;
556
+ *value = NULL ;
494
557
VariantInit (&var);
495
- ErrorIf (NULL == (sysPropertyName = SysAllocString (propertyName)), ERROR_NOT_ENOUGH_MEMORY);
496
- CheckError (section->GetPropertyByName (sysPropertyName, &prop));
497
- CheckError (prop->get_Value (&var));
498
- CheckError (VariantChangeType (&var, &var, 0 , VT_UI4));
499
- *value = var.ulVal ;
558
+
559
+ CheckError (CModuleConfiguration::GetEnvVariable (propertyName, variableValueBuffer, 64 , &variableValue));
560
+ if (variableValue)
561
+ {
562
+ long parsed = wcstol (variableValue, &endValue, 10 );
563
+ ErrorIf (ERANGE == errno || parsed < 0 || variableValue == endValue, IISNODE_ERROR_UNABLE_TO_READ_CONFIGURATION_FROM_ENVIRONMENT);
564
+ *value = parsed;
565
+ }
566
+ else
567
+ {
568
+ ErrorIf (NULL == (sysPropertyName = SysAllocString (propertyName)), ERROR_NOT_ENOUGH_MEMORY);
569
+ CheckError (section->GetPropertyByName (sysPropertyName, &prop));
570
+ CheckError (prop->get_Value (&var));
571
+ CheckError (VariantChangeType (&var, &var, 0 , VT_UI4));
572
+ *value = var.ulVal ;
573
+ }
500
574
501
575
Error:
502
576
0 commit comments