Handle non statable files gracefully.

This commit is contained in:
Klaas Freitag 2013-03-19 11:48:46 +01:00
parent 089d919be2
commit d943b2880a
4 changed files with 36 additions and 27 deletions

View file

@ -129,7 +129,8 @@ enum csync_instructions_e {
enum csync_ftw_type_e { enum csync_ftw_type_e {
CSYNC_FTW_TYPE_FILE, CSYNC_FTW_TYPE_FILE,
CSYNC_FTW_TYPE_SLINK, CSYNC_FTW_TYPE_SLINK,
CSYNC_FTW_TYPE_DIR CSYNC_FTW_TYPE_DIR,
CSYNC_FTW_TYPE_IGNORE
}; };

View file

@ -97,6 +97,12 @@ static int _csync_detect_update(CSYNC *ctx, const char *file,
goto out; goto out;
} }
/* Ignore non statable files and other strange cases. */
if (type == CSYNC_FTW_TYPE_IGNORE) {
st->instruction = CSYNC_INSTRUCTION_NONE;
goto out;
}
/* Update detection: Check if a database entry exists. /* Update detection: Check if a database entry exists.
* If not, the file is either new or has been renamed. To see if it is * If not, the file is either new or has been renamed. To see if it is
* renamed, the db gets queried by the inode of the file as that one * renamed, the db gets queried by the inode of the file as that one
@ -195,36 +201,34 @@ out:
int csync_walker(CSYNC *ctx, const char *file, const csync_vio_file_stat_t *fs, int csync_walker(CSYNC *ctx, const char *file, const csync_vio_file_stat_t *fs,
enum csync_ftw_flags_e flag) { enum csync_ftw_flags_e flag) {
int rc = -1;
int type = CSYNC_FTW_TYPE_IGNORE;
switch (flag) { switch (flag) {
case CSYNC_FTW_FLAG_FILE: case CSYNC_FTW_FLAG_FILE:
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s", file); CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s", file);
type = CSYNC_FTW_TYPE_FILE;
return _csync_detect_update(ctx, file, fs, CSYNC_FTW_TYPE_FILE);
break; break;
case CSYNC_FTW_FLAG_SLINK: case CSYNC_FTW_FLAG_DIR: /* enter directory */
/* FIXME: implement support for symlinks, see csync_propagate.c too */ CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "directory: %s", file);
#if 0 type = CSYNC_FTW_TYPE_DIR;
if (ctx->options.sync_symbolic_links) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "symlink: %s", file);
return _csync_detect_update(ctx, file, fs, CSYNC_FTW_TYPE_SLINK);
}
#endif
break;
case CSYNC_FTW_FLAG_DIR: /* enter directory */
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "directory: %s", file);
return _csync_detect_update(ctx, file, fs, CSYNC_FTW_TYPE_DIR);
case CSYNC_FTW_FLAG_NSTAT: /* not statable file */
case CSYNC_FTW_FLAG_DNR:
case CSYNC_FTW_FLAG_DP:
case CSYNC_FTW_FLAG_SLN:
break;
default:
break; break;
case CSYNC_FTW_FLAG_SLINK:
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "symlink: %s - not supported", file);
type = CSYNC_FTW_TYPE_IGNORE;
break;
case CSYNC_FTW_FLAG_NSTAT: /* not statable file */
case CSYNC_FTW_FLAG_DNR:
case CSYNC_FTW_FLAG_DP:
case CSYNC_FTW_FLAG_SLN:
default:
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "file: %s non statable!", file);
type = CSYNC_FTW_TYPE_IGNORE;
} }
return 0; rc = _csync_detect_update(ctx, file, fs, type );
return rc;
} }
/* check if the dirent entries for the directory can be read from db /* check if the dirent entries for the directory can be read from db

View file

@ -552,8 +552,13 @@ int csync_vio_stat(CSYNC *ctx, const char *uri, csync_vio_file_stat_t *buf) {
break; break;
case LOCAL_REPLICA: case LOCAL_REPLICA:
rc = csync_vio_local_stat(uri, buf); rc = csync_vio_local_stat(uri, buf);
if (rc < 0) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Local stat failed, errno %d", errno);
}
#ifdef _WIN32 #ifdef _WIN32
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Win32: STAT-inode for %s: %llu", uri, buf->inode ); else {
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Win32: STAT-inode for %s: %llu", uri, buf->inode );
}
#endif #endif
break; break;
default: default:

View file

@ -359,8 +359,7 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) {
HANDLE h = CreateFileW( wuri, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, HANDLE h = CreateFileW( wuri, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL+FILE_FLAG_BACKUP_SEMANTICS, NULL ); FILE_ATTRIBUTE_NORMAL+FILE_FLAG_BACKUP_SEMANTICS, NULL );
if( h == INVALID_HANDLE_VALUE ) { if( h == INVALID_HANDLE_VALUE ) {
DWORD err = GetLastError(); errno = GetLastError();
/* CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "ERR: Failed to create a handle for %s: %ld", uri,err ); */
csync_vio_file_stat_destroy(buf); csync_vio_file_stat_destroy(buf);
c_free_multibyte(wuri); c_free_multibyte(wuri);
return -1; return -1;