nextcloud-desktop/csync/src/csync_util.c

183 lines
4.7 KiB
C
Raw Normal View History

2008-02-27 20:56:47 +03:00
/*
* libcsync -- a library to sync a directory with another
*
* 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>
2008-02-27 20:56:47 +03: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.
2008-02-27 20:56:47 +03:00
*
* This library is distributed in the hope that it will be useful,
2008-02-27 20:56:47 +03:00
* 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.
2008-02-27 20:56:47 +03: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
2008-02-27 20:56:47 +03:00
*/
#include "config_csync.h"
2012-03-02 19:47:34 +04:00
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
2008-07-21 16:31:34 +04:00
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include "c_jhash.h"
2008-02-27 20:56:47 +03:00
#include "csync_util.h"
#include "vio/csync_vio.h"
2008-02-27 20:56:47 +03:00
#define CSYNC_LOG_CATEGORY_NAME "csync.util"
#include "csync_log.h"
#include "csync_statedb.h"
typedef struct {
const char *instr_str;
enum csync_instructions_e instr_code;
} _instr_code_struct;
static const _instr_code_struct _instr[] =
{
{ "INSTRUCTION_NONE", CSYNC_INSTRUCTION_NONE },
{ "INSTRUCTION_EVAL", CSYNC_INSTRUCTION_EVAL },
{ "INSTRUCTION_REMOVE", CSYNC_INSTRUCTION_REMOVE },
{ "INSTRUCTION_RENAME", CSYNC_INSTRUCTION_RENAME },
{ "INSTRUCTION_EVAL_RENAME", CSYNC_INSTRUCTION_EVAL_RENAME },
{ "INSTRUCTION_NEW", CSYNC_INSTRUCTION_NEW },
{ "INSTRUCTION_CONFLICT", CSYNC_INSTRUCTION_CONFLICT },
{ "INSTRUCTION_IGNORE", CSYNC_INSTRUCTION_IGNORE },
{ "INSTRUCTION_SYNC", CSYNC_INSTRUCTION_SYNC },
{ "INSTRUCTION_STAT_ERR", CSYNC_INSTRUCTION_STAT_ERROR },
{ "INSTRUCTION_ERROR", CSYNC_INSTRUCTION_ERROR },
{ NULL, CSYNC_INSTRUCTION_ERROR }
};
struct csync_memstat_s {
int size;
int resident;
int shared;
int trs;
int drs;
int lrs;
int dt;
};
const char *csync_instruction_str(enum csync_instructions_e instr)
{
int idx = 0;
while (_instr[idx].instr_str != NULL) {
if (_instr[idx].instr_code == instr) {
return _instr[idx].instr_str;
}
idx++;
}
return "ERROR!";
}
void csync_memstat_check(void) {
2008-05-08 18:16:55 +04:00
int s = 0;
struct csync_memstat_s m;
FILE* fp;
/* get process memory stats */
fp = fopen("/proc/self/statm","r");
if (fp == NULL) {
return;
}
2008-05-08 18:16:55 +04:00
s = fscanf(fp, "%d%d%d%d%d%d%d", &m.size, &m.resident, &m.shared, &m.trs,
&m.drs, &m.lrs, &m.dt);
fclose(fp);
2008-05-08 18:16:55 +04:00
if (s == EOF) {
return;
}
CSYNC_LOG(CSYNC_LOG_PRIORITY_INFO, "Memory: %dK total size, %dK resident, %dK shared",
m.size * 4, m.resident * 4, m.shared * 4);
}
2012-12-10 21:58:46 +04:00
void csync_win32_set_file_hidden( const char *file, bool h ) {
#ifdef _WIN32
const mbchar_t *fileName;
DWORD dwAttrs;
2012-12-10 21:58:46 +04:00
if( !file ) return;
fileName = c_utf8_to_locale( file );
dwAttrs = GetFileAttributesW(fileName);
2012-12-10 21:58:46 +04:00
if (dwAttrs==INVALID_FILE_ATTRIBUTES) return;
if (h && !(dwAttrs & FILE_ATTRIBUTE_HIDDEN)) {
SetFileAttributesW(fileName, dwAttrs | FILE_ATTRIBUTE_HIDDEN );
} else if (!h && (dwAttrs & FILE_ATTRIBUTE_HIDDEN)) {
SetFileAttributesW(fileName, dwAttrs & ~FILE_ATTRIBUTE_HIDDEN );
}
c_free_locale_string(fileName);
2012-12-10 21:58:46 +04:00
#else
2012-12-14 19:48:05 +04:00
(void) h;
2012-12-10 21:58:46 +04:00
(void) file;
#endif
}
csync_vio_file_stat_t *csync_vio_convert_file_stat(csync_file_stat_t *st) {
csync_vio_file_stat_t *vfs = NULL;
if (st == NULL) {
return NULL;
}
vfs = csync_vio_file_stat_new();
if (vfs == NULL) {
return NULL;
}
vfs->acl = NULL;
if (st->pathlen > 0) {
vfs->name = c_strdup(st->path);
}
vfs->uid = st->uid;
vfs->gid = st->gid;
vfs->atime = 0;
vfs->mtime = st->modtime;
vfs->ctime = 0;
vfs->size = st->size;
vfs->blksize = 0; /* Depricated. */
vfs->blkcount = 0;
vfs->mode = st->mode;
vfs->device = 0;
vfs->inode = st->inode;
vfs->nlink = st->nlink;
/* fields. */
vfs->fields = CSYNC_VIO_FILE_STAT_FIELDS_TYPE
+ CSYNC_VIO_FILE_STAT_FIELDS_PERMISSIONS
+ CSYNC_VIO_FILE_STAT_FIELDS_INODE
+ CSYNC_VIO_FILE_STAT_FIELDS_LINK_COUNT
+ CSYNC_VIO_FILE_STAT_FIELDS_SIZE
+ CSYNC_VIO_FILE_STAT_FIELDS_MTIME
+ CSYNC_VIO_FILE_STAT_FIELDS_UID
+ CSYNC_VIO_FILE_STAT_FIELDS_GID;
if (st->type == CSYNC_FTW_TYPE_DIR)
vfs->type = CSYNC_VIO_FILE_TYPE_DIRECTORY;
else if (st->type == CSYNC_FTW_TYPE_FILE)
vfs->type = CSYNC_VIO_FILE_TYPE_REGULAR;
else if (st->type == CSYNC_FTW_TYPE_SLINK)
vfs->type = CSYNC_VIO_FILE_TYPE_SYMBOLIC_LINK;
else
vfs->type = CSYNC_VIO_FILE_TYPE_UNKNOWN;
return vfs;
}