[Pkg-owncloud-commits] [owncloud-client] 298/498: CSync: Split csync_vio_local.c
Sandro Knauß
hefee-guest at moszumanska.debian.org
Tue Aug 11 14:49:00 UTC 2015
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository owncloud-client.
commit cd64d3ae2c9677791d139273cc1b950ffe8ec615
Author: Markus Goetz <markus at woboq.com>
Date: Mon Jul 13 15:48:53 2015 +0200
CSync: Split csync_vio_local.c
This is to make room for further improvements #880
---
csync/src/CMakeLists.txt | 12 +-
csync/src/vio/csync_vio_local_unix.c | 225 +++++++++++++++++++++
.../{csync_vio_local.c => csync_vio_local_win.c} | 153 +-------------
3 files changed, 238 insertions(+), 152 deletions(-)
diff --git a/csync/src/CMakeLists.txt b/csync/src/CMakeLists.txt
index c7d7a38..42db3d5 100644
--- a/csync/src/CMakeLists.txt
+++ b/csync/src/CMakeLists.txt
@@ -58,9 +58,19 @@ set(csync_SRCS
vio/csync_vio.c
vio/csync_vio_file_stat.c
- vio/csync_vio_local.c
)
+if (WIN32)
+ list(APPEND csync_SRCS
+ vio/csync_vio_local_win.c
+ )
+else()
+ list(APPEND csync_SRCS
+ vio/csync_vio_local_unix.c
+ )
+endif()
+
+
if(USE_NEON)
list(APPEND csync_SRCS
csync_owncloud.c
diff --git a/csync/src/vio/csync_vio_local_unix.c b/csync/src/vio/csync_vio_local_unix.c
new file mode 100644
index 0000000..a6e37b2
--- /dev/null
+++ b/csync/src/vio/csync_vio_local_unix.c
@@ -0,0 +1,225 @@
+/*
+ * libcsync -- a library to sync a directory with another
+ *
+ * Copyright (c) 2008-2013 by Andreas Schneider <asn at cryptomilk.org>
+ * Copyright (c) 2013- by Klaas Freitag <freitag at owncloud.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <stdio.h>
+
+#include "c_private.h"
+#include "c_lib.h"
+#include "c_string.h"
+#include "csync_util.h"
+#include "csync_log.h"
+#include "csync_vio.h"
+
+#include "vio/csync_vio_local.h"
+
+/*
+ * directory functions
+ */
+
+typedef struct dhandle_s {
+ DIR *dh;
+ char *path;
+} dhandle_t;
+
+csync_vio_handle_t *csync_vio_local_opendir(const char *name) {
+ dhandle_t *handle = NULL;
+ mbchar_t *dirname = NULL;
+
+ handle = c_malloc(sizeof(dhandle_t));
+
+ dirname = c_utf8_path_to_locale(name);
+
+ handle->dh = _topendir( dirname );
+ if (handle->dh == NULL) {
+ c_free_locale_string(dirname);
+ SAFE_FREE(handle);
+ return NULL;
+ }
+
+ handle->path = c_strdup(name);
+ c_free_locale_string(dirname);
+
+ return (csync_vio_handle_t *) handle;
+}
+
+int csync_vio_local_closedir(csync_vio_handle_t *dhandle) {
+ dhandle_t *handle = NULL;
+ int rc = -1;
+
+ if (dhandle == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+
+ handle = (dhandle_t *) dhandle;
+ rc = _tclosedir(handle->dh);
+
+ SAFE_FREE(handle->path);
+ SAFE_FREE(handle);
+
+ return rc;
+}
+
+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;
+
+ struct _tdirent *dirent = NULL;
+
+ dirent = _treaddir(handle->dh);
+ if (dirent == NULL) {
+ goto err;
+ }
+ file_stat->name = c_utf8_from_locale(dirent->d_name);
+
+ /* 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;
+}
+
+
+int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) {
+ csync_stat_t sb;
+
+ mbchar_t *wuri = c_utf8_path_to_locale( uri );
+
+ if( _tstat(wuri, &sb) < 0) {
+ c_free_locale_string(wuri);
+ return -1;
+ }
+
+ buf->name = c_basename(uri);
+
+ if (buf->name == NULL) {
+ csync_vio_file_stat_destroy(buf);
+ c_free_locale_string(wuri);
+ return -1;
+ }
+ buf->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE;
+
+ switch(sb.st_mode & S_IFMT) {
+ case S_IFBLK:
+ buf->type = CSYNC_VIO_FILE_TYPE_BLOCK_DEVICE;
+ break;
+ case S_IFCHR:
+ buf->type = CSYNC_VIO_FILE_TYPE_CHARACTER_DEVICE;
+ break;
+ case S_IFDIR:
+ buf->type = CSYNC_VIO_FILE_TYPE_DIRECTORY;
+ break;
+ case S_IFIFO:
+ buf->type = CSYNC_VIO_FILE_TYPE_FIFO;
+ break;
+ case S_IFREG:
+ buf->type = CSYNC_VIO_FILE_TYPE_REGULAR;
+ break;
+ case S_IFLNK:
+ buf->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
+ break;
+ case S_IFSOCK:
+ buf->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
+ break;
+ default:
+ buf->type = CSYNC_VIO_FILE_TYPE_UNKNOWN;
+ break;
+ }
+ buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE;
+
+ buf->mode = sb.st_mode;
+ buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MODE;
+
+ if (buf->type == CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK) {
+ /* FIXME: handle symlink */
+ buf->flags = CSYNC_VIO_FILE_FLAGS_SYMLINK;
+ } else {
+ buf->flags = CSYNC_VIO_FILE_FLAGS_NONE;
+ }
+#ifdef __APPLE__
+ if (sb.st_flags & UF_HIDDEN) {
+ buf->flags |= CSYNC_VIO_FILE_FLAGS_HIDDEN;
+ }
+#endif
+ buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_FLAGS;
+
+ buf->device = sb.st_dev;
+ buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_DEVICE;
+
+ buf->inode = sb.st_ino;
+ buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_INODE;
+
+ buf->atime = sb.st_atime;
+ buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_ATIME;
+
+ buf->mtime = sb.st_mtime;
+ buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME;
+
+ buf->ctime = sb.st_ctime;
+ buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_CTIME;
+
+ buf->size = sb.st_size;
+ buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE;
+
+ c_free_locale_string(wuri);
+ return 0;
+}
diff --git a/csync/src/vio/csync_vio_local.c b/csync/src/vio/csync_vio_local_win.c
similarity index 70%
rename from csync/src/vio/csync_vio_local.c
rename to csync/src/vio/csync_vio_local_win.c
index efbe6dc..de08441 100644
--- a/csync/src/vio/csync_vio_local.c
+++ b/csync/src/vio/csync_vio_local_win.c
@@ -2,6 +2,7 @@
* libcsync -- a library to sync a directory with another
*
* Copyright (c) 2008-2013 by Andreas Schneider <asn at cryptomilk.org>
+ * Copyright (c) 2013- by Klaas Freitag <freitag at owncloud.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,9 +26,7 @@
#include <dirent.h>
#include <stdio.h>
-#ifdef _WIN32
#include "windows.h"
-#endif
#include "c_private.h"
#include "c_lib.h"
@@ -44,13 +43,9 @@
*/
typedef struct dhandle_s {
-#if defined _WIN32
WIN32_FIND_DATA ffd;
HANDLE hFind;
int firstFind;
-#else
- DIR *dh;
-#endif
char *path;
} dhandle_t;
@@ -60,7 +55,6 @@ csync_vio_handle_t *csync_vio_local_opendir(const char *name) {
handle = c_malloc(sizeof(dhandle_t));
-#ifdef _WIN32
// the file wildcard has to be attached
int len_name = strlen(name);
if( len_name ) {
@@ -85,16 +79,7 @@ csync_vio_handle_t *csync_vio_local_opendir(const char *name) {
}
handle->firstFind = 1; // Set a flag that there first fileinfo is available.
-#else
- dirname = c_utf8_path_to_locale(name);
-
- handle->dh = _topendir( dirname );
- if (handle->dh == NULL) {
- c_free_locale_string(dirname);
- SAFE_FREE(handle);
- return NULL;
- }
-#endif
+
handle->path = c_strdup(name);
c_free_locale_string(dirname);
@@ -111,14 +96,10 @@ int csync_vio_local_closedir(csync_vio_handle_t *dhandle) {
}
handle = (dhandle_t *) dhandle;
-#ifdef _WIN32
// FindClose returns non-zero on success
if( FindClose(handle->hFind) != 0 ) {
rc = 0;
}
-#else
- rc = _tclosedir(handle->dh);
-#endif
SAFE_FREE(handle->path);
SAFE_FREE(handle);
@@ -140,7 +121,6 @@ csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) {
}
file_stat->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE;
-#ifdef _WIN32
// 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 ) {
@@ -163,41 +143,6 @@ csync_vio_file_stat_t *csync_vio_local_readdir(csync_vio_handle_t *dhandle) {
} else {
file_stat->type = CSYNC_VIO_FILE_TYPE_REGULAR;
}
-#else
- struct _tdirent *dirent = NULL;
-
- dirent = _treaddir(handle->dh);
- if (dirent == NULL) {
- goto err;
- }
- file_stat->name = c_utf8_from_locale(dirent->d_name);
-
- /* 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
-
-#endif // non WIN32
return file_stat;
@@ -207,8 +152,6 @@ err:
return NULL;
}
-
-#ifdef _WIN32
static time_t FileTimeToUnixTime(FILETIME *filetime, DWORD *remainder)
{
long long int t = filetime->dwHighDateTime;
@@ -320,95 +263,3 @@ int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) {
return 0;
}
-
-#else
-
-int csync_vio_local_stat(const char *uri, csync_vio_file_stat_t *buf) {
- csync_stat_t sb;
-
- mbchar_t *wuri = c_utf8_path_to_locale( uri );
-
- if( _tstat(wuri, &sb) < 0) {
- c_free_locale_string(wuri);
- return -1;
- }
-
- buf->name = c_basename(uri);
-
- if (buf->name == NULL) {
- csync_vio_file_stat_destroy(buf);
- c_free_locale_string(wuri);
- return -1;
- }
- buf->fields = CSYNC_VIO_FILE_STAT_FIELDS_NONE;
-
- switch(sb.st_mode & S_IFMT) {
- case S_IFBLK:
- buf->type = CSYNC_VIO_FILE_TYPE_BLOCK_DEVICE;
- break;
- case S_IFCHR:
- buf->type = CSYNC_VIO_FILE_TYPE_CHARACTER_DEVICE;
- break;
- case S_IFDIR:
- buf->type = CSYNC_VIO_FILE_TYPE_DIRECTORY;
- break;
- case S_IFIFO:
- buf->type = CSYNC_VIO_FILE_TYPE_FIFO;
- break;
- case S_IFREG:
- buf->type = CSYNC_VIO_FILE_TYPE_REGULAR;
- break;
- case S_IFLNK:
- buf->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
- break;
- case S_IFSOCK:
- buf->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
- break;
- default:
- buf->type = CSYNC_VIO_FILE_TYPE_UNKNOWN;
- break;
- }
- buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_TYPE;
-
- buf->mode = sb.st_mode;
- buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MODE;
-
- if (buf->type == CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK) {
- /* FIXME: handle symlink */
- buf->flags = CSYNC_VIO_FILE_FLAGS_SYMLINK;
- } else {
- buf->flags = CSYNC_VIO_FILE_FLAGS_NONE;
- }
-#ifdef __APPLE__
- if (sb.st_flags & UF_HIDDEN) {
- buf->flags |= CSYNC_VIO_FILE_FLAGS_HIDDEN;
- }
-#endif
- buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_FLAGS;
-
- buf->device = sb.st_dev;
- buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_DEVICE;
-
- buf->inode = sb.st_ino;
- buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_INODE;
-
- buf->atime = sb.st_atime;
- buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_ATIME;
-
- buf->mtime = sb.st_mtime;
- buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_MTIME;
-
- buf->ctime = sb.st_ctime;
- buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_CTIME;
-
- buf->size = sb.st_size;
- buf->fields |= CSYNC_VIO_FILE_STAT_FIELDS_SIZE;
-
- c_free_locale_string(wuri);
- return 0;
-}
-#endif
-
-
-
-
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git
More information about the Pkg-owncloud-commits
mailing list