Fossil SCM
Experimental changes to add 'setenv' support to CGI script files.
Commit
fe77afb158436ec6c7514e0e3a1bd87188cd1ac1
Parent
c97a085a0e7200b…
2 files changed
+19
+9
+19
| --- src/file.c | ||
| +++ src/file.c | ||
| @@ -1262,10 +1262,29 @@ | ||
| 1262 | 1262 | char *zValue = getenv(zName); |
| 1263 | 1263 | #endif |
| 1264 | 1264 | if( zValue ) zValue = fossil_filename_to_utf8(zValue); |
| 1265 | 1265 | return zValue; |
| 1266 | 1266 | } |
| 1267 | + | |
| 1268 | +/* | |
| 1269 | +** Sets the value of an environment variable as UTF8. | |
| 1270 | +*/ | |
| 1271 | +int fossil_setenv(const char *zName, const char *zValue){ | |
| 1272 | + int rc; | |
| 1273 | + char *zString = mprintf("%s=%s", zName, zValue); | |
| 1274 | +#ifdef _WIN32 | |
| 1275 | + wchar_t *uString = fossil_utf8_to_unicode(zString); | |
| 1276 | + rc = _wputenv(uString); | |
| 1277 | + fossil_unicode_free(uString); | |
| 1278 | + fossil_free(zString); | |
| 1279 | +#else | |
| 1280 | + rc = putenv(zString); | |
| 1281 | + /* NOTE: Cannot free the string on POSIX. */ | |
| 1282 | + /* fossil_free(zString); */ | |
| 1283 | +#endif | |
| 1284 | + return rc; | |
| 1285 | +} | |
| 1267 | 1286 | |
| 1268 | 1287 | /* |
| 1269 | 1288 | ** Like fopen() but always takes a UTF8 argument. |
| 1270 | 1289 | */ |
| 1271 | 1290 | FILE *fossil_fopen(const char *zName, const char *zMode){ |
| 1272 | 1291 |
| --- src/file.c | |
| +++ src/file.c | |
| @@ -1262,10 +1262,29 @@ | |
| 1262 | char *zValue = getenv(zName); |
| 1263 | #endif |
| 1264 | if( zValue ) zValue = fossil_filename_to_utf8(zValue); |
| 1265 | return zValue; |
| 1266 | } |
| 1267 | |
| 1268 | /* |
| 1269 | ** Like fopen() but always takes a UTF8 argument. |
| 1270 | */ |
| 1271 | FILE *fossil_fopen(const char *zName, const char *zMode){ |
| 1272 |
| --- src/file.c | |
| +++ src/file.c | |
| @@ -1262,10 +1262,29 @@ | |
| 1262 | char *zValue = getenv(zName); |
| 1263 | #endif |
| 1264 | if( zValue ) zValue = fossil_filename_to_utf8(zValue); |
| 1265 | return zValue; |
| 1266 | } |
| 1267 | |
| 1268 | /* |
| 1269 | ** Sets the value of an environment variable as UTF8. |
| 1270 | */ |
| 1271 | int fossil_setenv(const char *zName, const char *zValue){ |
| 1272 | int rc; |
| 1273 | char *zString = mprintf("%s=%s", zName, zValue); |
| 1274 | #ifdef _WIN32 |
| 1275 | wchar_t *uString = fossil_utf8_to_unicode(zString); |
| 1276 | rc = _wputenv(uString); |
| 1277 | fossil_unicode_free(uString); |
| 1278 | fossil_free(zString); |
| 1279 | #else |
| 1280 | rc = putenv(zString); |
| 1281 | /* NOTE: Cannot free the string on POSIX. */ |
| 1282 | /* fossil_free(zString); */ |
| 1283 | #endif |
| 1284 | return rc; |
| 1285 | } |
| 1286 | |
| 1287 | /* |
| 1288 | ** Like fopen() but always takes a UTF8 argument. |
| 1289 | */ |
| 1290 | FILE *fossil_fopen(const char *zName, const char *zMode){ |
| 1291 |
+9
| --- src/main.c | ||
| +++ src/main.c | ||
| @@ -1794,10 +1794,11 @@ | ||
| 1794 | 1794 | blob_reset(&value); |
| 1795 | 1795 | continue; |
| 1796 | 1796 | } |
| 1797 | 1797 | if( blob_eq(&key, "errorlog:") && blob_token(&line, &value) ){ |
| 1798 | 1798 | g.zErrlog = mprintf("%s", blob_str(&value)); |
| 1799 | + blob_reset(&value); | |
| 1799 | 1800 | continue; |
| 1800 | 1801 | } |
| 1801 | 1802 | if( blob_eq(&key, "HOME:") && blob_token(&line, &value) ){ |
| 1802 | 1803 | cgi_setenv("HOME", blob_str(&value)); |
| 1803 | 1804 | blob_reset(&value); |
| @@ -1834,10 +1835,18 @@ | ||
| 1834 | 1835 | blob_reset(&value2); |
| 1835 | 1836 | continue; |
| 1836 | 1837 | } |
| 1837 | 1838 | if( blob_eq(&key, "files:") && blob_token(&line, &value) ){ |
| 1838 | 1839 | pFileGlob = glob_create(blob_str(&value)); |
| 1840 | + blob_reset(&value); | |
| 1841 | + continue; | |
| 1842 | + } | |
| 1843 | + if( blob_eq(&key, "setenv:") && blob_token(&line, &value) | |
| 1844 | + && blob_token(&line, &value2) ){ | |
| 1845 | + fossil_setenv(blob_str(&value), blob_str(&value2)); | |
| 1846 | + blob_reset(&value); | |
| 1847 | + blob_reset(&value2); | |
| 1839 | 1848 | continue; |
| 1840 | 1849 | } |
| 1841 | 1850 | } |
| 1842 | 1851 | blob_reset(&config); |
| 1843 | 1852 | if( g.db==0 && g.zRepositoryName==0 && nRedirect==0 ){ |
| 1844 | 1853 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -1794,10 +1794,11 @@ | |
| 1794 | blob_reset(&value); |
| 1795 | continue; |
| 1796 | } |
| 1797 | if( blob_eq(&key, "errorlog:") && blob_token(&line, &value) ){ |
| 1798 | g.zErrlog = mprintf("%s", blob_str(&value)); |
| 1799 | continue; |
| 1800 | } |
| 1801 | if( blob_eq(&key, "HOME:") && blob_token(&line, &value) ){ |
| 1802 | cgi_setenv("HOME", blob_str(&value)); |
| 1803 | blob_reset(&value); |
| @@ -1834,10 +1835,18 @@ | |
| 1834 | blob_reset(&value2); |
| 1835 | continue; |
| 1836 | } |
| 1837 | if( blob_eq(&key, "files:") && blob_token(&line, &value) ){ |
| 1838 | pFileGlob = glob_create(blob_str(&value)); |
| 1839 | continue; |
| 1840 | } |
| 1841 | } |
| 1842 | blob_reset(&config); |
| 1843 | if( g.db==0 && g.zRepositoryName==0 && nRedirect==0 ){ |
| 1844 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -1794,10 +1794,11 @@ | |
| 1794 | blob_reset(&value); |
| 1795 | continue; |
| 1796 | } |
| 1797 | if( blob_eq(&key, "errorlog:") && blob_token(&line, &value) ){ |
| 1798 | g.zErrlog = mprintf("%s", blob_str(&value)); |
| 1799 | blob_reset(&value); |
| 1800 | continue; |
| 1801 | } |
| 1802 | if( blob_eq(&key, "HOME:") && blob_token(&line, &value) ){ |
| 1803 | cgi_setenv("HOME", blob_str(&value)); |
| 1804 | blob_reset(&value); |
| @@ -1834,10 +1835,18 @@ | |
| 1835 | blob_reset(&value2); |
| 1836 | continue; |
| 1837 | } |
| 1838 | if( blob_eq(&key, "files:") && blob_token(&line, &value) ){ |
| 1839 | pFileGlob = glob_create(blob_str(&value)); |
| 1840 | blob_reset(&value); |
| 1841 | continue; |
| 1842 | } |
| 1843 | if( blob_eq(&key, "setenv:") && blob_token(&line, &value) |
| 1844 | && blob_token(&line, &value2) ){ |
| 1845 | fossil_setenv(blob_str(&value), blob_str(&value2)); |
| 1846 | blob_reset(&value); |
| 1847 | blob_reset(&value2); |
| 1848 | continue; |
| 1849 | } |
| 1850 | } |
| 1851 | blob_reset(&config); |
| 1852 | if( g.db==0 && g.zRepositoryName==0 && nRedirect==0 ){ |
| 1853 |