Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | For the '--no-dir-symlinks' flag to be honored when the 'allow-symlinks' setting is disabled, the file_wd_isdir() function must force lstat() to be used. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | symlinks |
| Files: | files | file ages | folders |
| SHA1: |
6c90761bcd7e29c57bb2acf93a4c3750 |
| User & Date: | mistachkin 2017-02-13 21:01:38.856 |
Context
|
2017-02-13
| ||
| 21:03 | Oops, missed one thing in the previous check-in. check-in: b3fc0a133c user: mistachkin tags: symlinks | |
| 21:01 | For the '--no-dir-symlinks' flag to be honored when the 'allow-symlinks' setting is disabled, the file_wd_isdir() function must force lstat() to be used. check-in: 6c90761bcd user: mistachkin tags: symlinks | |
| 20:31 | Remove forced setting of the 'allow-symlinks' cached setting from the 'clean' and 'extras' commands. check-in: 957865107d user: mistachkin tags: symlinks | |
Changes
Changes to src/file.c.
| ︙ | ︙ | |||
83 84 85 86 87 88 89 | static struct fossilStat fileStat; /* ** Fill stat buf with information received from stat() or lstat(). ** lstat() is called on Unix if isWd is TRUE and allow-symlinks setting is on. ** */ | | > > > > > | 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
static struct fossilStat fileStat;
/*
** Fill stat buf with information received from stat() or lstat().
** lstat() is called on Unix if isWd is TRUE and allow-symlinks setting is on.
**
*/
static int fossil_stat(
const char *zFilename, /* name of file or directory to inspect. */
struct fossilStat *buf, /* pointer to buffer where info should go. */
int isWd, /* non-zero to consider look at symlink itself. */
int forceWd /* non-zero to force look at symlink itself. */
){
int rc;
void *zMbcs = fossil_utf8_to_path(zFilename, 0);
#if !defined(_WIN32)
if( isWd && db_allow_symlinks(0) ){
rc = lstat(zMbcs, buf);
}else{
rc = stat(zMbcs, buf);
|
| ︙ | ︙ | |||
113 114 115 116 117 118 119 |
** Return the number of errors. No error messages are generated.
*/
static int getStat(const char *zFilename, int isWd){
int rc = 0;
if( zFilename==0 ){
if( fileStatValid==0 ) rc = 1;
}else{
| | | 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
** Return the number of errors. No error messages are generated.
*/
static int getStat(const char *zFilename, int isWd){
int rc = 0;
if( zFilename==0 ){
if( fileStatValid==0 ) rc = 1;
}else{
if( fossil_stat(zFilename, &fileStat, isWd, 0)!=0 ){
fileStatValid = 0;
rc = 1;
}else{
fileStatValid = 1;
rc = 0;
}
}
|
| ︙ | ︙ | |||
299 300 301 302 303 304 305 306 307 308 |
** zFilename is a directory -OR- a symlink that points to a directory.
** Return 0 if zFilename does not exist. Return 2 if zFilename exists
** but is something other than a directory.
*/
int file_wd_isdir(const char *zFilename){
int rc;
char *zFN;
zFN = mprintf("%s", zFilename);
file_simplify_name(zFN, -1, 0);
| > > | | | | 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 |
** zFilename is a directory -OR- a symlink that points to a directory.
** Return 0 if zFilename does not exist. Return 2 if zFilename exists
** but is something other than a directory.
*/
int file_wd_isdir(const char *zFilename){
int rc;
char *zFN;
struct fossilStat dirFileStat;
zFN = mprintf("%s", zFilename);
file_simplify_name(zFN, -1, 0);
memset(&dirFileStat, 0, sizeof(struct fossilStat));
rc = fossil_stat(zFN, &dirFileStat, 1, 1);
if( rc ){
rc = 0; /* It does not exist at all. */
}else if( S_ISDIR(dirFileStat.st_mode) ){
rc = 1; /* It exists and is a real directory. */
}else if( !db_allow_symlinks(1) && S_ISLNK(dirFileStat.st_mode) ){
Blob content;
blob_read_link(&content, zFN); /* It exists and is a link. */
rc = file_wd_isdir(blob_str(&content)); /* Points to directory? */
blob_reset(&content);
}else{
rc = 2; /* It exists and is something else. */
}
|
| ︙ | ︙ | |||
478 479 480 481 482 483 484 |
** Set or clear the execute bit on a file. Return true if a change
** occurred and false if this routine is a no-op.
*/
int file_wd_setexe(const char *zFilename, int onoff){
int rc = 0;
#if !defined(_WIN32)
struct stat buf;
| | | 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 |
** Set or clear the execute bit on a file. Return true if a change
** occurred and false if this routine is a no-op.
*/
int file_wd_setexe(const char *zFilename, int onoff){
int rc = 0;
#if !defined(_WIN32)
struct stat buf;
if( fossil_stat(zFilename, &buf, 1, 0)!=0 || S_ISLNK(buf.st_mode) ) return 0;
if( onoff ){
int targetMode = (buf.st_mode & 0444)>>2;
if( (buf.st_mode & 0100)==0 ){
chmod(zFilename, buf.st_mode | targetMode);
rc = 1;
}
}else{
|
| ︙ | ︙ |