Fossil SCM
Implement the fossil_clearenv() function for Win32.
Commit
61fd10ecd1d1c9f31258fd85ad1edaaeab2692d0d7434c1a12877ebeb42e19b5
Parent
54e01c60e21827d…
1 file changed
+41
-1
+41
-1
| --- src/file.c | ||
| +++ src/file.c | ||
| @@ -1725,11 +1725,51 @@ | ||
| 1725 | 1725 | /* |
| 1726 | 1726 | ** Clear all environment variables |
| 1727 | 1727 | */ |
| 1728 | 1728 | int fossil_clearenv(void){ |
| 1729 | 1729 | #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; | |
| 1731 | 1771 | #else |
| 1732 | 1772 | return clearenv(); |
| 1733 | 1773 | #endif |
| 1734 | 1774 | } |
| 1735 | 1775 | |
| 1736 | 1776 |
| --- 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 |