Fossil SCM

Implement the fossil_clearenv() function for Win32.

mistachkin 2019-08-01 23:31 trunk
Commit 61fd10ecd1d1c9f31258fd85ad1edaaeab2692d0d7434c1a12877ebeb42e19b5
1 file changed +41 -1
+41 -1
--- src/file.c
+++ src/file.c
@@ -1725,11 +1725,51 @@
17251725
/*
17261726
** Clear all environment variables
17271727
*/
17281728
int fossil_clearenv(void){
17291729
#ifdef _WIN32
1730
- /* FIXME: Not yet supported */
1730
+ int rc = 0;
1731
+ LPWCH zzEnv = GetEnvironmentStringsW();
1732
+ if( zzEnv ){
1733
+ LPCWSTR zEnv = zzEnv; /* read-only */
1734
+ while( 1 ){
1735
+ LPWSTR zNewEnv = _wcsdup(zEnv); /* writable */
1736
+ if( zNewEnv ){
1737
+ LPWSTR zEquals = wcsstr(zNewEnv, L"=");
1738
+ if( zEquals ){
1739
+ zEquals[1] = 0; /* no value */
1740
+ if( zNewEnv==zEquals || _wputenv(zNewEnv)==0 ){ /* via CRT */
1741
+ /* do nothing */
1742
+ }else{
1743
+ zEquals[0] = 0; /* name only */
1744
+ if( !SetEnvironmentVariableW(zNewEnv, NULL) ){ /* via Win32 */
1745
+ rc = 1;
1746
+ }
1747
+ }
1748
+ if( rc==0 ){
1749
+ zEnv += (lstrlenW(zEnv) + 1); /* double NUL term? */
1750
+ if( zEnv[0]==0 ){
1751
+ free(zNewEnv);
1752
+ break; /* no more vars */
1753
+ }
1754
+ }
1755
+ }else{
1756
+ rc = 1;
1757
+ }
1758
+ }else{
1759
+ rc = 1;
1760
+ }
1761
+ free(zNewEnv);
1762
+ if( rc!=0 ) break;
1763
+ }
1764
+ if( !FreeEnvironmentStringsW(zzEnv) ){
1765
+ rc = 2;
1766
+ }
1767
+ }else{
1768
+ rc = 1;
1769
+ }
1770
+ return rc;
17311771
#else
17321772
return clearenv();
17331773
#endif
17341774
}
17351775
17361776
--- src/file.c
+++ src/file.c
@@ -1725,11 +1725,51 @@
1725 /*
1726 ** Clear all environment variables
1727 */
1728 int fossil_clearenv(void){
1729 #ifdef _WIN32
1730 /* FIXME: Not yet supported */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1731 #else
1732 return clearenv();
1733 #endif
1734 }
1735
1736
--- src/file.c
+++ src/file.c
@@ -1725,11 +1725,51 @@
1725 /*
1726 ** Clear all environment variables
1727 */
1728 int fossil_clearenv(void){
1729 #ifdef _WIN32
1730 int rc = 0;
1731 LPWCH zzEnv = GetEnvironmentStringsW();
1732 if( zzEnv ){
1733 LPCWSTR zEnv = zzEnv; /* read-only */
1734 while( 1 ){
1735 LPWSTR zNewEnv = _wcsdup(zEnv); /* writable */
1736 if( zNewEnv ){
1737 LPWSTR zEquals = wcsstr(zNewEnv, L"=");
1738 if( zEquals ){
1739 zEquals[1] = 0; /* no value */
1740 if( zNewEnv==zEquals || _wputenv(zNewEnv)==0 ){ /* via CRT */
1741 /* do nothing */
1742 }else{
1743 zEquals[0] = 0; /* name only */
1744 if( !SetEnvironmentVariableW(zNewEnv, NULL) ){ /* via Win32 */
1745 rc = 1;
1746 }
1747 }
1748 if( rc==0 ){
1749 zEnv += (lstrlenW(zEnv) + 1); /* double NUL term? */
1750 if( zEnv[0]==0 ){
1751 free(zNewEnv);
1752 break; /* no more vars */
1753 }
1754 }
1755 }else{
1756 rc = 1;
1757 }
1758 }else{
1759 rc = 1;
1760 }
1761 free(zNewEnv);
1762 if( rc!=0 ) break;
1763 }
1764 if( !FreeEnvironmentStringsW(zzEnv) ){
1765 rc = 2;
1766 }
1767 }else{
1768 rc = 1;
1769 }
1770 return rc;
1771 #else
1772 return clearenv();
1773 #endif
1774 }
1775
1776

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button