Fossil SCM
Abstract the getcwd() system library routine into file_getcwd() with appropriate translations on windows.
Commit
4b3425401f847e57991cc980122ac37a8f1d00a3
Parent
ef04076777f27ac…
2 files changed
+1
-7
+34
-10
M
src/db.c
+1
-7
| --- src/db.c | ||
| +++ src/db.c | ||
| @@ -804,21 +804,15 @@ | ||
| 804 | 804 | ** is found, it is attached to the open database connection too. |
| 805 | 805 | */ |
| 806 | 806 | int db_open_local(void){ |
| 807 | 807 | int i, n; |
| 808 | 808 | char zPwd[2000]; |
| 809 | - char *zPwdConv; | |
| 810 | 809 | static const char *aDbName[] = { "/_FOSSIL_", "/.fos" }; |
| 811 | 810 | |
| 812 | 811 | if( g.localOpen) return 1; |
| 813 | - if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){ | |
| 814 | - db_err("pwd too big: max %d", sizeof(zPwd)-20); | |
| 815 | - } | |
| 812 | + file_getcwd(zPwd, sizeof(zPwd)-20); | |
| 816 | 813 | n = strlen(zPwd); |
| 817 | - zPwdConv = mprintf("%/", zPwd); | |
| 818 | - strncpy(zPwd, zPwdConv, 2000-20); | |
| 819 | - free(zPwdConv); | |
| 820 | 814 | while( n>0 ){ |
| 821 | 815 | if( file_access(zPwd, W_OK) ) break; |
| 822 | 816 | for(i=0; i<sizeof(aDbName)/sizeof(aDbName[0]); i++){ |
| 823 | 817 | sqlite3_snprintf(sizeof(zPwd)-n, &zPwd[n], "%s", aDbName[i]); |
| 824 | 818 | if( isValidLocalDb(zPwd) ){ |
| 825 | 819 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -804,21 +804,15 @@ | |
| 804 | ** is found, it is attached to the open database connection too. |
| 805 | */ |
| 806 | int db_open_local(void){ |
| 807 | int i, n; |
| 808 | char zPwd[2000]; |
| 809 | char *zPwdConv; |
| 810 | static const char *aDbName[] = { "/_FOSSIL_", "/.fos" }; |
| 811 | |
| 812 | if( g.localOpen) return 1; |
| 813 | if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){ |
| 814 | db_err("pwd too big: max %d", sizeof(zPwd)-20); |
| 815 | } |
| 816 | n = strlen(zPwd); |
| 817 | zPwdConv = mprintf("%/", zPwd); |
| 818 | strncpy(zPwd, zPwdConv, 2000-20); |
| 819 | free(zPwdConv); |
| 820 | while( n>0 ){ |
| 821 | if( file_access(zPwd, W_OK) ) break; |
| 822 | for(i=0; i<sizeof(aDbName)/sizeof(aDbName[0]); i++){ |
| 823 | sqlite3_snprintf(sizeof(zPwd)-n, &zPwd[n], "%s", aDbName[i]); |
| 824 | if( isValidLocalDb(zPwd) ){ |
| 825 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -804,21 +804,15 @@ | |
| 804 | ** is found, it is attached to the open database connection too. |
| 805 | */ |
| 806 | int db_open_local(void){ |
| 807 | int i, n; |
| 808 | char zPwd[2000]; |
| 809 | static const char *aDbName[] = { "/_FOSSIL_", "/.fos" }; |
| 810 | |
| 811 | if( g.localOpen) return 1; |
| 812 | file_getcwd(zPwd, sizeof(zPwd)-20); |
| 813 | n = strlen(zPwd); |
| 814 | while( n>0 ){ |
| 815 | if( file_access(zPwd, W_OK) ) break; |
| 816 | for(i=0; i<sizeof(aDbName)/sizeof(aDbName[0]); i++){ |
| 817 | sqlite3_snprintf(sizeof(zPwd)-n, &zPwd[n], "%s", aDbName[i]); |
| 818 | if( isValidLocalDb(zPwd) ){ |
| 819 |
+34
-10
| --- src/file.c | ||
| +++ src/file.c | ||
| @@ -381,10 +381,41 @@ | ||
| 381 | 381 | file_simplify_name(z, -1); |
| 382 | 382 | fossil_print("[%s]\n", z); |
| 383 | 383 | fossil_free(z); |
| 384 | 384 | } |
| 385 | 385 | } |
| 386 | + | |
| 387 | +/* | |
| 388 | +** Get the current working directory. | |
| 389 | +** | |
| 390 | +** On windows, the name is converted from MBCS to UTF8 and all '\\' | |
| 391 | +** characters are converted to '/'. No conversions are needed on | |
| 392 | +** unix. | |
| 393 | +*/ | |
| 394 | +void file_getcwd(char *zBuf, int nBuf){ | |
| 395 | +#ifdef _WIN32 | |
| 396 | + char *zPwdUtf8; | |
| 397 | + int nPwd; | |
| 398 | + int i; | |
| 399 | + char zPwd[2000]; | |
| 400 | + if( getcwd(zPwd, sizeof(zPwd)-1)==0 ){ | |
| 401 | + fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-1); | |
| 402 | + } | |
| 403 | + zPwdUtf8 = fossil_mbcs_to_utf8(zPwd); | |
| 404 | + nPwd = strlen(zPwdUtf8); | |
| 405 | + if( nPwd > nBuf-1 ){ | |
| 406 | + fossil_fatal("pwd too big: max %d\n", nBuf-1); | |
| 407 | + } | |
| 408 | + for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/'; | |
| 409 | + memcpy(zBuf, zPwdUtf8, nPwd+1); | |
| 410 | + fossil_mbcs_free(zPwdUtf8); | |
| 411 | +#else | |
| 412 | + if( getcwd(zBuf, nBuf-1)==0 ){ | |
| 413 | + fossil_fatal("pwd too big: max %d\n", nBuf-1); | |
| 414 | + } | |
| 415 | +#endif | |
| 416 | +} | |
| 386 | 417 | |
| 387 | 418 | /* |
| 388 | 419 | ** Compute a canonical pathname for a file or directory. |
| 389 | 420 | ** Make the name absolute if it is relative. |
| 390 | 421 | ** Remove redundant / characters |
| @@ -401,18 +432,13 @@ | ||
| 401 | 432 | ){ |
| 402 | 433 | blob_set(pOut, zOrigName); |
| 403 | 434 | blob_materialize(pOut); |
| 404 | 435 | }else{ |
| 405 | 436 | char zPwd[2000]; |
| 406 | - char *zPwdUtf8; | |
| 407 | - if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){ | |
| 408 | - fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-20); | |
| 409 | - } | |
| 437 | + file_getcwd(zPwd, sizeof(zPwd)-strlen(zOrigName)); | |
| 410 | 438 | blob_zero(pOut); |
| 411 | - zPwdUtf8 = fossil_mbcs_to_utf8(zPwd); | |
| 412 | - blob_appendf(pOut, "%//%/", zPwdUtf8, zOrigName); | |
| 413 | - fossil_mbcs_free(zPwdUtf8); | |
| 439 | + blob_appendf(pOut, "%//%/", zPwd, zOrigName); | |
| 414 | 440 | } |
| 415 | 441 | blob_resize(pOut, file_simplify_name(blob_buffer(pOut), blob_size(pOut))); |
| 416 | 442 | } |
| 417 | 443 | |
| 418 | 444 | /* |
| @@ -479,13 +505,11 @@ | ||
| 479 | 505 | zPath = blob_buffer(pOut); |
| 480 | 506 | if( zPath[0]=='/' ){ |
| 481 | 507 | int i, j; |
| 482 | 508 | Blob tmp; |
| 483 | 509 | char zPwd[2000]; |
| 484 | - if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){ | |
| 485 | - fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-20); | |
| 486 | - } | |
| 510 | + file_getcwd(zPwd, sizeof(zPwd)-20); | |
| 487 | 511 | for(i=1; zPath[i] && zPwd[i]==zPath[i]; i++){} |
| 488 | 512 | if( zPath[i]==0 ){ |
| 489 | 513 | blob_reset(pOut); |
| 490 | 514 | if( zPwd[i]==0 ){ |
| 491 | 515 | blob_append(pOut, ".", 1); |
| 492 | 516 |
| --- src/file.c | |
| +++ src/file.c | |
| @@ -381,10 +381,41 @@ | |
| 381 | file_simplify_name(z, -1); |
| 382 | fossil_print("[%s]\n", z); |
| 383 | fossil_free(z); |
| 384 | } |
| 385 | } |
| 386 | |
| 387 | /* |
| 388 | ** Compute a canonical pathname for a file or directory. |
| 389 | ** Make the name absolute if it is relative. |
| 390 | ** Remove redundant / characters |
| @@ -401,18 +432,13 @@ | |
| 401 | ){ |
| 402 | blob_set(pOut, zOrigName); |
| 403 | blob_materialize(pOut); |
| 404 | }else{ |
| 405 | char zPwd[2000]; |
| 406 | char *zPwdUtf8; |
| 407 | if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){ |
| 408 | fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-20); |
| 409 | } |
| 410 | blob_zero(pOut); |
| 411 | zPwdUtf8 = fossil_mbcs_to_utf8(zPwd); |
| 412 | blob_appendf(pOut, "%//%/", zPwdUtf8, zOrigName); |
| 413 | fossil_mbcs_free(zPwdUtf8); |
| 414 | } |
| 415 | blob_resize(pOut, file_simplify_name(blob_buffer(pOut), blob_size(pOut))); |
| 416 | } |
| 417 | |
| 418 | /* |
| @@ -479,13 +505,11 @@ | |
| 479 | zPath = blob_buffer(pOut); |
| 480 | if( zPath[0]=='/' ){ |
| 481 | int i, j; |
| 482 | Blob tmp; |
| 483 | char zPwd[2000]; |
| 484 | if( getcwd(zPwd, sizeof(zPwd)-20)==0 ){ |
| 485 | fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-20); |
| 486 | } |
| 487 | for(i=1; zPath[i] && zPwd[i]==zPath[i]; i++){} |
| 488 | if( zPath[i]==0 ){ |
| 489 | blob_reset(pOut); |
| 490 | if( zPwd[i]==0 ){ |
| 491 | blob_append(pOut, ".", 1); |
| 492 |
| --- src/file.c | |
| +++ src/file.c | |
| @@ -381,10 +381,41 @@ | |
| 381 | file_simplify_name(z, -1); |
| 382 | fossil_print("[%s]\n", z); |
| 383 | fossil_free(z); |
| 384 | } |
| 385 | } |
| 386 | |
| 387 | /* |
| 388 | ** Get the current working directory. |
| 389 | ** |
| 390 | ** On windows, the name is converted from MBCS to UTF8 and all '\\' |
| 391 | ** characters are converted to '/'. No conversions are needed on |
| 392 | ** unix. |
| 393 | */ |
| 394 | void file_getcwd(char *zBuf, int nBuf){ |
| 395 | #ifdef _WIN32 |
| 396 | char *zPwdUtf8; |
| 397 | int nPwd; |
| 398 | int i; |
| 399 | char zPwd[2000]; |
| 400 | if( getcwd(zPwd, sizeof(zPwd)-1)==0 ){ |
| 401 | fossil_fatal("pwd too big: max %d\n", (int)sizeof(zPwd)-1); |
| 402 | } |
| 403 | zPwdUtf8 = fossil_mbcs_to_utf8(zPwd); |
| 404 | nPwd = strlen(zPwdUtf8); |
| 405 | if( nPwd > nBuf-1 ){ |
| 406 | fossil_fatal("pwd too big: max %d\n", nBuf-1); |
| 407 | } |
| 408 | for(i=0; zPwdUtf8[i]; i++) if( zPwdUtf8[i]=='\\' ) zPwdUtf8[i] = '/'; |
| 409 | memcpy(zBuf, zPwdUtf8, nPwd+1); |
| 410 | fossil_mbcs_free(zPwdUtf8); |
| 411 | #else |
| 412 | if( getcwd(zBuf, nBuf-1)==0 ){ |
| 413 | fossil_fatal("pwd too big: max %d\n", nBuf-1); |
| 414 | } |
| 415 | #endif |
| 416 | } |
| 417 | |
| 418 | /* |
| 419 | ** Compute a canonical pathname for a file or directory. |
| 420 | ** Make the name absolute if it is relative. |
| 421 | ** Remove redundant / characters |
| @@ -401,18 +432,13 @@ | |
| 432 | ){ |
| 433 | blob_set(pOut, zOrigName); |
| 434 | blob_materialize(pOut); |
| 435 | }else{ |
| 436 | char zPwd[2000]; |
| 437 | file_getcwd(zPwd, sizeof(zPwd)-strlen(zOrigName)); |
| 438 | blob_zero(pOut); |
| 439 | blob_appendf(pOut, "%//%/", zPwd, zOrigName); |
| 440 | } |
| 441 | blob_resize(pOut, file_simplify_name(blob_buffer(pOut), blob_size(pOut))); |
| 442 | } |
| 443 | |
| 444 | /* |
| @@ -479,13 +505,11 @@ | |
| 505 | zPath = blob_buffer(pOut); |
| 506 | if( zPath[0]=='/' ){ |
| 507 | int i, j; |
| 508 | Blob tmp; |
| 509 | char zPwd[2000]; |
| 510 | file_getcwd(zPwd, sizeof(zPwd)-20); |
| 511 | for(i=1; zPath[i] && zPwd[i]==zPath[i]; i++){} |
| 512 | if( zPath[i]==0 ){ |
| 513 | blob_reset(pOut); |
| 514 | if( zPwd[i]==0 ){ |
| 515 | blob_append(pOut, ".", 1); |
| 516 |