2012-03-02 16:35:02 +04:00
|
|
|
/*
|
|
|
|
* libcsync -- a library to sync a directory with another
|
|
|
|
*
|
2013-07-23 19:31:55 +04:00
|
|
|
* Copyright (c) 2008-2013 by Andreas Schneider <asn@cryptomilk.org>
|
2013-12-11 17:54:34 +04:00
|
|
|
* Copyright (c) 2012-2013 by Klaas Freitag <freitag@owncloud.com>
|
2012-03-02 16:35:02 +04:00
|
|
|
*
|
2013-07-23 19:31:55 +04:00
|
|
|
* 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.
|
2012-03-02 16:35:02 +04:00
|
|
|
*
|
2013-07-23 19:31:55 +04:00
|
|
|
* This library is distributed in the hope that it will be useful,
|
2012-03-02 16:35:02 +04:00
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2013-07-23 19:31:55 +04:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
2012-03-02 16:35:02 +04:00
|
|
|
*
|
2013-07-23 19:31:55 +04:00
|
|
|
* 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
|
2012-03-02 16:35:02 +04:00
|
|
|
*/
|
|
|
|
|
2014-01-15 15:20:03 +04:00
|
|
|
#include "config_csync.h"
|
2012-03-02 19:47:34 +04:00
|
|
|
|
2012-03-02 16:35:02 +04:00
|
|
|
#ifndef _GNU_SOURCE
|
|
|
|
#define _GNU_SOURCE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <limits.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdlib.h>
|
2013-03-05 13:45:33 +04:00
|
|
|
#include <stdio.h>
|
2012-03-02 16:35:02 +04:00
|
|
|
#include <sys/types.h>
|
2012-12-17 20:22:24 +04:00
|
|
|
#include <errno.h>
|
2012-03-02 16:35:02 +04:00
|
|
|
|
|
|
|
#if _WIN32
|
|
|
|
# ifndef _WIN32_IE
|
|
|
|
# define _WIN32_IE 0x0501 // SHGetSpecialFolderPath
|
|
|
|
# endif
|
|
|
|
# include <shlobj.h>
|
|
|
|
#else /* _WIN32 */
|
|
|
|
# include <pwd.h>
|
|
|
|
# include <unistd.h>
|
|
|
|
#endif /* _WIN32 */
|
|
|
|
|
|
|
|
#include "c_lib.h"
|
|
|
|
#include "csync_misc.h"
|
2012-12-17 20:22:24 +04:00
|
|
|
#include "csync_macros.h"
|
2013-11-25 19:19:59 +04:00
|
|
|
#include "csync_log.h"
|
2012-03-02 16:35:02 +04:00
|
|
|
|
2012-03-02 17:54:53 +04:00
|
|
|
#ifdef HAVE_FNMATCH
|
|
|
|
#include <fnmatch.h>
|
|
|
|
|
|
|
|
int csync_fnmatch(__const char *__pattern, __const char *__name, int __flags) {
|
|
|
|
return fnmatch(__pattern, __name, __flags);
|
|
|
|
}
|
|
|
|
|
2012-03-02 19:47:34 +04:00
|
|
|
#else /* HAVE_FNMATCH */
|
2012-03-02 17:54:53 +04:00
|
|
|
|
|
|
|
#include <shlwapi.h>
|
|
|
|
int csync_fnmatch(__const char *__pattern, __const char *__name, int __flags) {
|
2014-01-23 18:19:27 +04:00
|
|
|
wchar_t *pat = NULL;
|
|
|
|
wchar_t *name = NULL;
|
|
|
|
BOOL match;
|
|
|
|
|
2013-07-31 15:12:10 +04:00
|
|
|
(void) __flags;
|
2014-01-23 18:19:27 +04:00
|
|
|
|
|
|
|
name = c_utf8_to_locale(__name);
|
|
|
|
pat = c_utf8_to_locale(__pattern);
|
|
|
|
|
|
|
|
match = PathMatchSpec(name, pat);
|
|
|
|
|
|
|
|
c_free_locale_string(pat);
|
|
|
|
c_free_locale_string(name);
|
|
|
|
if(match)
|
2012-03-02 17:54:53 +04:00
|
|
|
return 0;
|
|
|
|
else
|
|
|
|
return 1;
|
|
|
|
}
|
2012-03-02 19:47:34 +04:00
|
|
|
#endif /* HAVE_FNMATCH */
|
2012-12-17 20:22:24 +04:00
|
|
|
|
2013-04-06 20:45:06 +04:00
|
|
|
CSYNC_STATUS csync_errno_to_status(int error, CSYNC_STATUS default_status)
|
2012-12-17 20:22:24 +04:00
|
|
|
{
|
2013-04-06 20:45:06 +04:00
|
|
|
CSYNC_STATUS status = CSYNC_STATUS_OK;
|
2012-12-17 20:22:24 +04:00
|
|
|
|
2013-04-06 20:45:06 +04:00
|
|
|
switch (error) {
|
2012-12-17 20:22:24 +04:00
|
|
|
case 0:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_OK;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
/* The custom errnos first. */
|
|
|
|
case ERRNO_GENERAL_ERROR:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_UNSUCCESSFUL;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
case ERRNO_LOOKUP_ERROR: /* In Neon: Server or proxy hostname lookup failed */
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_LOOKUP_ERROR;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
case ERRNO_USER_UNKNOWN_ON_SERVER: /* Neon: User authentication on server failed. */
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_SERVER_AUTH_ERROR;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
case ERRNO_PROXY_AUTH:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_PROXY_AUTH_ERROR; /* Neon: User authentication on proxy failed */
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
case ERRNO_CONNECT:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_CONNECT_ERROR; /* Network: Connection error */
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
case ERRNO_TIMEOUT:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_TIMEOUT; /* Network: Timeout error */
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
2013-01-14 00:39:54 +04:00
|
|
|
case ERRNO_QUOTA_EXCEEDED:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_QUOTA_EXCEEDED; /* Quota exceeded */
|
2013-01-14 00:39:54 +04:00
|
|
|
break;
|
|
|
|
case ERRNO_SERVICE_UNAVAILABLE:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_SERVICE_UNAVAILABLE; /* Service temporarily down */
|
2013-01-14 00:39:54 +04:00
|
|
|
break;
|
|
|
|
case EFBIG:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_FILE_SIZE_ERROR; /* File larger than 2MB */
|
2013-01-14 00:39:54 +04:00
|
|
|
break;
|
2012-12-17 20:22:24 +04:00
|
|
|
case ERRNO_PRECONDITION:
|
|
|
|
case ERRNO_RETRY:
|
|
|
|
case ERRNO_REDIRECT:
|
|
|
|
case ERRNO_WRONG_CONTENT:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_HTTP_ERROR;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
|
|
|
|
case ERRNO_TIMEDELTA:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_TIMESKEW;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
case EPERM: /* Operation not permitted */
|
|
|
|
case EACCES: /* Permission denied */
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_PERMISSION_DENIED;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
case ENOENT: /* No such file or directory */
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_NOT_FOUND;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
case EAGAIN: /* Try again */
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_TIMEOUT;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
case EEXIST: /* File exists */
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_FILE_EXISTS;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
case EINVAL:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_PARAM_ERROR;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
case ENOSPC:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = CSYNC_STATUS_OUT_OF_SPACE;
|
2012-12-17 20:22:24 +04:00
|
|
|
break;
|
|
|
|
|
|
|
|
/* All the remaining basic errnos: */
|
|
|
|
case EIO: /* I/O error */
|
|
|
|
case ESRCH: /* No such process */
|
|
|
|
case EINTR: /* Interrupted system call */
|
|
|
|
case ENXIO: /* No such device or address */
|
|
|
|
case E2BIG: /* Argument list too long */
|
|
|
|
case ENOEXEC: /* Exec format error */
|
|
|
|
case EBADF: /* Bad file number */
|
|
|
|
case ECHILD: /* No child processes */
|
|
|
|
case ENOMEM: /* Out of memory */
|
|
|
|
case EFAULT: /* Bad address */
|
2012-12-19 23:20:26 +04:00
|
|
|
#ifndef _WIN32
|
2012-12-17 20:22:24 +04:00
|
|
|
case ENOTBLK: /* Block device required */
|
2012-12-19 23:20:26 +04:00
|
|
|
#endif
|
2012-12-17 20:22:24 +04:00
|
|
|
case EBUSY: /* Device or resource busy */
|
|
|
|
case EXDEV: /* Cross-device link */
|
|
|
|
case ENODEV: /* No such device */
|
|
|
|
case ENOTDIR: /* Not a directory */
|
|
|
|
case EISDIR: /* Is a directory */
|
|
|
|
case ENFILE: /* File table overflow */
|
|
|
|
case EMFILE: /* Too many open files */
|
|
|
|
case ENOTTY: /* Not a typewriter */
|
2012-12-19 23:20:26 +04:00
|
|
|
#ifndef _WIN32
|
2012-12-17 20:22:24 +04:00
|
|
|
case ETXTBSY: /* Text file busy */
|
2012-12-19 23:20:26 +04:00
|
|
|
#endif
|
2012-12-17 20:22:24 +04:00
|
|
|
case ESPIPE: /* Illegal seek */
|
|
|
|
case EROFS: /* Read-only file system */
|
|
|
|
case EMLINK: /* Too many links */
|
|
|
|
case EPIPE: /* Broken pipe */
|
|
|
|
|
|
|
|
case ERRNO_ERROR_STRING:
|
|
|
|
default:
|
2013-04-06 20:45:06 +04:00
|
|
|
status = default_status;
|
2012-12-17 20:22:24 +04:00
|
|
|
}
|
|
|
|
|
2013-04-06 20:45:06 +04:00
|
|
|
return status;
|
2012-12-17 20:22:24 +04:00
|
|
|
}
|
2013-11-25 19:19:59 +04:00
|
|
|
|
2013-11-26 14:55:47 +04:00
|
|
|
/* Remove possible quotes, and also the -gzip at the end
|
|
|
|
* Remove "-gzip" at the end (cf. https://github.com/owncloud/mirall/issues/1195)
|
|
|
|
* The caller must take ownership of the resulting string.
|
2013-11-25 19:19:59 +04:00
|
|
|
*/
|
2013-11-26 14:55:47 +04:00
|
|
|
char *csync_normalize_etag(const char *etag)
|
2013-11-25 19:19:59 +04:00
|
|
|
{
|
2013-11-25 21:27:37 +04:00
|
|
|
int len = 0;
|
2013-11-26 14:55:47 +04:00
|
|
|
char *buf = NULL;
|
|
|
|
if (!etag)
|
|
|
|
return NULL;
|
2013-11-25 21:27:37 +04:00
|
|
|
|
|
|
|
len = strlen(etag);
|
2013-11-26 14:55:47 +04:00
|
|
|
/* strip "XXXX-gzip" */
|
|
|
|
if(len >= 7 && etag[0] == '"' && c_streq(etag + len - 6, "-gzip\"")) {
|
|
|
|
etag++;
|
|
|
|
len -= 7;
|
|
|
|
}
|
|
|
|
/* strip leading -gzip */
|
|
|
|
if(len >= 5 && c_streq(etag + len - 5, "-gzip")) {
|
|
|
|
len -= 5;
|
2013-11-25 19:19:59 +04:00
|
|
|
}
|
2013-11-26 14:55:47 +04:00
|
|
|
/* strip normal quotes */
|
|
|
|
if (etag[0] == '"' && etag[len-1] == '"') {
|
|
|
|
etag++;
|
|
|
|
len -= 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
buf = c_malloc( len+1 );
|
|
|
|
strncpy( buf, etag, len );
|
|
|
|
buf[len] = '\0';
|
|
|
|
return buf;
|
2013-11-25 19:19:59 +04:00
|
|
|
}
|
|
|
|
|