csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) { struct _tdirent *dirent = NULL; dhandle_t *handle = NULL; csync_vio_file_stat_t *file_stat = NULL; handle = (dhandle_t *) dhandle; errno = 0; dirent = _treaddir(handle->dh); if (dirent == NULL) { if (errno) { goto err; } else { return NULL; } } file_stat = csync_vio_file_stat_new(); if (file_stat == NULL) { goto err; } file_stat->name = c_utf8_from_locale(dirent->d_name); file_stat->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; /* Check for availability of d_type, see manpage. */ #ifdef _DIRENT_HAVE_D_TYPE switch (dirent->d_type) { case DT_FIFO: case DT_SOCK: case DT_CHR: case DT_BLK: break; case DT_DIR: case DT_REG: file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; if (dirent->d_type == DT_DIR) { file_stat->type = CSYNC_VIO_FILE_TYPE_DIRECTORY; } else { file_stat->type = CSYNC_VIO_FILE_TYPE_REGULAR; } break; case DT_UNKNOWN: file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; file_stat->type = CSYNC_VIO_FILE_TYPE_UNKNOWN; default: break; } #endif return file_stat; err: SAFE_FREE(file_stat); return NULL; }
csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) { dhandle_t *handle = NULL; csync_vio_file_stat_t *file_stat = NULL; handle = (dhandle_t *) dhandle; errno = 0; file_stat = csync_vio_file_stat_new(); if (file_stat == NULL) { goto err; } file_stat->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; // the win32 functions get the first valid entry with the opendir // thus we must not jump to next entry if it was the first find. if( handle->firstFind ) { handle->firstFind = 0; } else { if( FindNextFile(handle->hFind, &(handle->ffd)) == 0 ) { // might be error, check! int dwError = GetLastError(); if (dwError != ERROR_NO_MORE_FILES) { errno = EACCES; // no more files is fine. Otherwise EACCESS } goto err; } } file_stat->name = c_utf8_from_locale(handle->ffd.cFileName); file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { file_stat->type = CSYNC_VIO_FILE_TYPE_DIRECTORY; } else { file_stat->type = CSYNC_VIO_FILE_TYPE_REGULAR; } return file_stat; err: SAFE_FREE(file_stat); return NULL; }
static int _csync_config_copy_default (const char *config) { int rc = 0; #ifdef _WIN32 /* For win32, try to copy the conf file from the directory from where the app was started. */ mbchar_t tcharbuf[MAX_PATH+1]; char *buf; int len = 0; /* Get the path from where the application was started */ len = GetModuleFileNameW(NULL, tcharbuf, MAX_PATH); if(len== 0) { rc = -1; } else { char *last_bslash; buf = c_utf8_from_locale(tcharbuf); /* cut the trailing filename off */ if ((last_bslash = strrchr(buf, '\\')) != NULL) { *last_bslash='\0'; } strncat(buf, "\\" CSYNC_CONF_FILE, MAX_PATH); if(c_copy(buf, config, 0644) < 0) { CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "Could not copy /%s to %s", buf, config ); rc = -1; } c_free_locale_string(buf); } #else CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Copy %s/config/%s to %s", SYSCONFDIR, CSYNC_CONF_FILE, config); if (c_copy(SYSCONFDIR "/ocsync/" CSYNC_CONF_FILE, config, 0644) < 0) { if (c_copy(BINARYDIR "/config/" CSYNC_CONF_FILE, config, 0644) < 0) { rc = -1; } } #endif return rc; }
static void check_iconv_ascii(void **state) { #ifdef _WIN32 const mbchar_t *in = L"abc/ABC\\123"; // UTF-8 #else #ifdef __APPLE__ const mbchar_t *in = "abc/ABC\\123"; // UTF-8-MAC #else const mbchar_t *in = "abc/ABC\\123"; // UTF-8 #endif #endif char *out = NULL; const char *exp_out = "abc/ABC\\123"; out = c_utf8_from_locale(in); assert_string_equal(out, exp_out); c_free_locale_string(out); assert_null(out); (void) state; /* unused */ }
static void check_iconv_from_native_normalization(void **state) { char *out = NULL; #ifdef _WIN32 const mbchar_t *in = L"\x48\xc3\xa4"; // UTF-8 #else #ifdef __APPLE__ const mbchar_t *in = "\x48\x61\xcc\x88"; // UTF-8-MAC #else const mbchar_t *in = "\x48\xc3\xa4"; // UTF-8 #endif #endif const char *exp_out = "\x48\xc3\xa4"; // UTF-8 out = c_utf8_from_locale(in); assert_string_equal(out, exp_out); c_free_locale_string(out); assert_null(out); (void) state; /* unused */ }
int c_rmdirs(const char *path) { _TDIR *d; struct _tdirent *dp; csync_stat_t sb; char *fname = NULL; mbchar_t *wfname = NULL; mbchar_t *wpath = c_utf8_to_locale(path); char *rd_name = NULL; if ((d = _topendir(wpath)) != NULL) { while( _tstat(wpath, &sb) == 0) { /* if we can remove the directory we're done */ if (_trmdir(wpath) == 0) { break; } switch (errno) { case ENOTEMPTY: case EEXIST: case EBADF: break; /* continue */ default: _tclosedir(d); c_free_locale_string(wpath); return 0; } while ((dp = _treaddir(d)) != NULL) { size_t len; rd_name = c_utf8_from_locale(dp->d_name); /* skip '.' and '..' */ if( c_streq( rd_name, "." ) || c_streq( rd_name, ".." ) ) { c_free_locale_string(rd_name); continue; } len = strlen(path) + strlen(rd_name) + 2; fname = c_malloc(len); if (fname == NULL) { _tclosedir(d); c_free_locale_string(rd_name); c_free_locale_string(wpath); return -1; } snprintf(fname, len, "%s/%s", path, rd_name); wfname = c_utf8_to_locale(fname); /* stat the file */ if (_tstat(wfname, &sb) != -1) { #ifdef __unix__ if (S_ISDIR(sb.st_mode) && !S_ISLNK(sb.st_mode)) { #else if (S_ISDIR(sb.st_mode)) { #endif if (_trmdir(wfname) < 0) { /* can't be deleted */ if (errno == EACCES) { _tclosedir(d); SAFE_FREE(fname); c_free_locale_string(wfname); c_free_locale_string(rd_name); c_free_locale_string(wpath); return -1; } c_rmdirs(fname); } } else { _tunlink(wfname); } } /* lstat */ SAFE_FREE(fname); c_free_locale_string(wfname); c_free_locale_string(rd_name); } /* readdir */ _trewinddir(d); } } else { c_free_locale_string(wpath); return -1; } c_free_locale_string(wpath); _tclosedir(d); return 0; }
csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) { dhandle_t *handle = NULL; csync_vio_file_stat_t *file_stat = NULL; ULARGE_INTEGER FileIndex; DWORD rem; handle = (dhandle_t *) dhandle; errno = 0; file_stat = csync_vio_file_stat_new(); if (file_stat == NULL) { errno = ENOMEM; goto err; } file_stat->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE; // the win32 functions get the first valid entry with the opendir // thus we must not jump to next entry if it was the first find. if( handle->firstFind ) { handle->firstFind = 0; } else { if( FindNextFile(handle->hFind, &(handle->ffd)) == 0 ) { // might be error, check! int dwError = GetLastError(); if (dwError != ERROR_NO_MORE_FILES) { errno = EACCES; // no more files is fine. Otherwise EACCESS } goto err; } } file_stat->name = c_utf8_from_locale(handle->ffd.cFileName); file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT && handle->ffd.dwReserved0 & IO_REPARSE_TAG_SYMLINK) { file_stat->flags = CSYNC_VIO_FILE_FLAGS_SYMLINK; file_stat->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK; } else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE || handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE || handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) { file_stat->type = CSYNC_VIO_FILE_TYPE_UNKNOWN; } else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { file_stat->type = CSYNC_VIO_FILE_TYPE_DIRECTORY; } else { file_stat->type = CSYNC_VIO_FILE_TYPE_REGULAR; } file_stat->flags = CSYNC_VIO_FILE_FLAGS_NONE; /* Check for the hidden flag */ if( handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) { file_stat->flags |= CSYNC_VIO_FILE_FLAGS_HIDDEN; } file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_FLAGS; file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE; file_stat->size = (handle->ffd.nFileSizeHigh * ((int64_t)(MAXDWORD)+1)) + handle->ffd.nFileSizeLow; file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE; file_stat->atime = FileTimeToUnixTime(&handle->ffd.ftLastAccessTime, &rem); file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_ATIME; file_stat->mtime = FileTimeToUnixTime(&handle->ffd.ftLastWriteTime, &rem); /* CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Local File MTime: %llu", (unsigned long long) buf->mtime ); */ file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME; file_stat->ctime = FileTimeToUnixTime(&handle->ffd.ftCreationTime, &rem); file_stat->fields |= CSYNC_VIO_FILE_STAT_FIELDS_CTIME; return file_stat; err: SAFE_FREE(file_stat); return NULL; }