pfoldersync API, start chipping away at the psynclib monster

This commit is contained in:
Levi Neely 2025-03-01 20:14:04 +01:00
parent fef0033fb9
commit 97c10b3870
21 changed files with 286 additions and 340 deletions

View File

@ -27,7 +27,7 @@
#include "pbusinessaccount.h"
#include "papi.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "plibs.h"
#include "pnetlibs.h"
#include "psys.h"
@ -745,7 +745,7 @@ static psync_folderid_t create_index_folder(const char *path) {
snprintf(buff, bufflen - 1, "%s (%d)", path, ind);
if (psync_create_remote_folder_by_path(buff, &err) != 0)
debug(D_NOTICE, "Unable to create folder %s error is %s.", buff, err);
folderid = psync_get_folderid_by_path(buff);
folderid = pfolder_id(buff);
if ((folderid != PSYNC_INVALID_FOLDERID) &&
check_write_permissions(folderid)) {
psync_free(buff);
@ -759,7 +759,7 @@ static psync_folderid_t create_index_folder(const char *path) {
return folderid;
}
psync_folderid_t psync_check_and_create_folder(const char *path) {
psync_folderid_t folderid = psync_get_folderid_by_path(path);
psync_folderid_t folderid = pfolder_id(path);
char *err;
if (folderid == PSYNC_INVALID_FOLDERID) {

View File

@ -43,7 +43,7 @@
#include "pcryptofolder.h"
#include "pcrypto.h"
#include "pfileops.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "pfs.h"
#include "plibs.h"
#include "pmemlock.h"

View File

@ -49,7 +49,7 @@
#include "pdiff.h"
#include "pdownload.h"
#include "pfileops.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "pfs.h"
#include "pfsxattr.h"
#include "plibs.h"
@ -60,7 +60,7 @@
#include "psettings.h"
#include "pstatus.h"
#include "psynclib.h"
#include "psyncer.h"
#include "pfoldersync.h"
#include "psys.h"
#include "ptask.h"
#include "ptimer.h"
@ -923,9 +923,9 @@ static void process_createfolder(const binresult *entry) {
psync_sql_bind_uint(st2, 1, mtime);
psync_sql_bind_uint(st2, 2, parentfolderid);
psync_sql_run(st2);
if (psync_is_folder_in_downloadlist(parentfolderid) &&
if (psyncer_dl_has_folder(parentfolderid) &&
!psync_is_name_to_ignore(name->str)) {
psync_add_folder_to_downloadlist(folderid);
psyncer_dl_queue_add(folderid);
res = psync_sql_query(
"SELECT syncid, localfolderid, synctype FROM syncedfolder WHERE "
"folderid=? AND " PSYNC_SQL_DOWNLOAD);
@ -940,7 +940,7 @@ static void process_createfolder(const binresult *entry) {
(unsigned long)row[1], name->str, (unsigned long)folderid,
(unsigned long)parentfolderid);
localfolderid =
psync_create_local_folder_in_db(syncid, folderid, row[1], name->str);
psyncer_db_folder_create(syncid, folderid, row[1], name->str);
psync_sql_bind_uint(stmt, 1, syncid);
psync_sql_bind_uint(stmt, 2, folderid);
psync_sql_bind_uint(stmt, 3, localfolderid);
@ -1107,23 +1107,23 @@ static void process_modifyfolder(const binresult *entry) {
* parentfolderid is not in and folderid is in, it means that folder that is a
* "root" of a syncid is modified, we do not care about that.
*/
oldsync = psync_is_folder_in_downloadlist(oldparentfolderid);
oldsync = psyncer_dl_has_folder(oldparentfolderid);
if (oldparentfolderid == parentfolderid)
newsync = oldsync;
else {
newsync = psync_is_folder_in_downloadlist(parentfolderid);
newsync = psyncer_dl_has_folder(parentfolderid);
psync_diff_refresh_fs_add_folder(oldparentfolderid);
}
if ((oldsync || newsync) &&
(oldparentfolderid != parentfolderid || strcmp(name->str, oldname))) {
if (!oldsync)
psync_add_folder_to_downloadlist(folderid);
psyncer_dl_queue_add(folderid);
else if (!newsync) {
res = psync_sql_query(
"SELECT id FROM syncfolder WHERE folderid=? AND " PSYNC_SQL_DOWNLOAD);
psync_sql_bind_uint(res, 1, folderid);
if (!psync_sql_fetch_rowint(res))
psync_del_folder_from_downloadlist(folderid);
psyncer_dl_queue_del(folderid);
psync_sql_free_result(res);
}
res = psync_sql_query(
@ -1195,10 +1195,10 @@ static void process_modifyfolder(const binresult *entry) {
"creating local folder %lu/%s for folderid %lu, parentfolderid %lu",
(unsigned long)psync_get_result_cell(fres2, i, 1), name->str,
(unsigned long)folderid, (unsigned long)parentfolderid);
localfolderid = psync_create_local_folder_in_db(
localfolderid = psyncer_db_folder_create(
syncid, folderid, psync_get_result_cell(fres2, i, 1), name->str);
ptask_ldir_mk(syncid, folderid, localfolderid);
psync_add_folder_for_downloadsync(
psyncer_dl_folder_add(
syncid, psync_get_result_cell(fres2, i, 2), folderid, localfolderid);
needdownload = 1;
}
@ -1238,8 +1238,8 @@ static void process_deletefolder(const binresult *entry) {
meta = papi_find_result2(entry, "metadata", PARAM_HASH);
folderid = papi_find_result2(meta, "folderid", PARAM_NUM)->num;
psync_path_status_folder_deleted(folderid);
if (psync_is_folder_in_downloadlist(folderid)) {
psync_del_folder_from_downloadlist(folderid);
if (psyncer_dl_has_folder(folderid)) {
psyncer_dl_queue_del(folderid);
res = psync_sql_query(
"SELECT syncid, localfolderid FROM syncedfolder WHERE folderid=?");
psync_sql_bind_uint(res, 1, folderid);
@ -1250,7 +1250,7 @@ static void process_deletefolder(const binresult *entry) {
psync_sql_bind_uint(stmt, 2, folderid);
psync_sql_run_free(stmt);
if (psync_sql_affected_rows() == 1) {
path = psync_get_path_by_folderid(folderid, NULL);
path = pfolder_path(folderid, NULL);
ptask_ldir_rm(row[0], folderid, row[1], path);
psync_free(path);
needdownload = 1;
@ -1395,7 +1395,7 @@ static void process_createfile(const binresult *entry) {
}
insert_revision(fileid, hash,
papi_find_result2(meta, "modified", PARAM_NUM)->num, size);
if (psync_is_folder_in_downloadlist(parentfolderid) &&
if (psyncer_dl_has_folder(parentfolderid) &&
!psync_is_name_to_ignore(name->str)) {
res = psync_sql_query("SELECT syncid, localfolderid FROM syncedfolder "
"WHERE folderid=? AND " PSYNC_SQL_DOWNLOAD);
@ -1506,18 +1506,18 @@ static void process_modifyfile(const binresult *entry) {
insert_revision(fileid, hash,
papi_find_result2(meta, "modified", PARAM_NUM)->num, size);
oldparentfolderid = psync_get_number(row[0]);
oldsync = psync_is_folder_in_downloadlist(oldparentfolderid);
oldsync = psyncer_dl_has_folder(oldparentfolderid);
if (oldparentfolderid == parentfolderid)
newsync = oldsync;
else {
newsync = psync_is_folder_in_downloadlist(parentfolderid);
newsync = psyncer_dl_has_folder(parentfolderid);
psync_diff_refresh_fs_add_folder(oldparentfolderid);
}
if (oldsync || newsync) {
if (psync_is_name_to_ignore(name->str)) {
char *path;
pdownload_tasks_delete(fileid, 0, 1);
path = psync_get_path_by_fileid(fileid, NULL);
path = pfolder_file_path(fileid, NULL);
ptask_lfile_rm(fileid, path);
psync_free(path);
needdownload = 1;
@ -1583,7 +1583,7 @@ static void process_modifyfile(const binresult *entry) {
needdownload = 1;
}
for (/*i is already=cnt*/; i < fres1->rows; i++) {
char *path = psync_get_path_by_fileid(fileid, NULL);
char *path = pfolder_file_path(fileid, NULL);
ptask_lfile_rm_id(psync_get_result_cell(fres1, i, 0),
fileid, path);
pdownload_tasks_delete(
@ -1615,10 +1615,10 @@ static void process_deletefile(const binresult *entry) {
}
meta = papi_find_result2(entry, "metadata", PARAM_HASH);
fileid = papi_find_result2(meta, "fileid", PARAM_NUM)->num;
if (psync_is_folder_in_downloadlist(
if (psyncer_dl_has_folder(
papi_find_result2(meta, "parentfolderid", PARAM_NUM)->num)) {
pdownload_tasks_delete(fileid, 0, 1);
path = psync_get_path_by_fileid(fileid, NULL);
path = pfolder_file_path(fileid, NULL);
if (likely(path)) {
ptask_lfile_rm(fileid, path);
psync_free(path);
@ -2641,7 +2641,7 @@ static void handle_exception(psock_t **sock, subscribed_ids *ids,
*sock = get_connected_socket();
debug(D_NOTICE, "got new socket");
pstatus_set(PSTATUS_TYPE_ONLINE, PSTATUS_ONLINE_ONLINE);
psync_syncer_check_delayed_syncs();
psyncer_check_delayed();
ids->diffid =
psync_sql_cellint("SELECT value FROM setting WHERE id='diffid'", 0);
send_diff_command(*sock, *ids);
@ -2659,7 +2659,7 @@ static void handle_exception(psock_t **sock, subscribed_ids *ids,
*sock = get_connected_socket();
debug(D_NOTICE, "got new socket");
pstatus_set(PSTATUS_TYPE_ONLINE, PSTATUS_ONLINE_ONLINE);
psync_syncer_check_delayed_syncs();
psyncer_check_delayed();
ids->diffid =
psync_sql_cellint("SELECT value FROM setting WHERE id='diffid'", 0);
send_diff_command(*sock, *ids);
@ -2674,7 +2674,7 @@ static void handle_exception(psock_t **sock, subscribed_ids *ids,
pcache_clean_oneof(prefixes, ARRAY_SIZE(prefixes));
*sock = get_connected_socket();
pstatus_set(PSTATUS_TYPE_ONLINE, PSTATUS_ONLINE_ONLINE);
psync_syncer_check_delayed_syncs();
psyncer_check_delayed();
send_diff_command(*sock, *ids);
} else {
debug(D_NOTICE, "diff socket seems to be alive");
@ -2940,7 +2940,7 @@ restart:
pstatus_set(PSTATUS_TYPE_ONLINE, PSTATUS_ONLINE_ONLINE);
initialdownload = 0;
psync_run_analyze_if_needed();
psync_syncer_check_delayed_syncs();
psyncer_check_delayed();
exceptionsock = setup_exeptions();
if (unlikely(exceptionsock == INVALID_SOCKET)) {
debug(D_ERROR, "could not create pipe");

View File

@ -34,7 +34,7 @@
#include "pqevent.h"
#include "pdownload.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "plibs.h"
#include "plocalscan.h"
#include "pnetlibs.h"
@ -43,7 +43,7 @@
#include "prun.h"
#include "psys.h"
#include "pstatus.h"
#include "psyncer.h"
#include "pfoldersync.h"
#include "ptask.h"
#include "ptimer.h"
#include "pupload.h"
@ -229,14 +229,14 @@ static int call_func_for_folder(psync_folderid_t localfolderid,
const char *debug) {
char *localpath;
int res;
localpath = psync_local_path_for_local_folder(localfolderid, syncid, NULL);
localpath = pfolder_lpath_lfldr(localfolderid, syncid, NULL);
if (likely(localpath)) {
res = func(localpath);
if (!res) {
pqevent_queue_sync_event_id(event, syncid, localpath, folderid);
if (updatemtime)
update_local_folder_mtime(localpath, localfolderid);
psync_decrease_local_folder_taskcnt(localfolderid);
psyncer_folder_dec_tasks(localfolderid);
debug(D_NOTICE, "%s %s", debug, localpath);
}
psync_free(localpath);
@ -256,14 +256,14 @@ static int call_func_for_folder_name(psync_folderid_t localfolderid,
const char *debug) {
char *localpath;
int res;
localpath = psync_local_path_for_local_folder(localfolderid, syncid, NULL);
localpath = pfolder_lpath_lfldr(localfolderid, syncid, NULL);
if (likely(localpath)) {
res = func(localpath);
if (!res) {
pqevent_queue_sync_event_path(event, syncid, localpath, folderid, name);
if (updatemtime)
update_local_folder_mtime(localpath, localfolderid);
psync_decrease_local_folder_taskcnt(localfolderid);
psyncer_folder_dec_tasks(localfolderid);
debug(D_NOTICE, "%s %s", debug, localpath);
}
psync_free(localpath);
@ -342,7 +342,7 @@ static int task_renamefolder(psync_syncid_t newsyncid,
return 0;
}
psync_sql_free_result(res);
oldpath = psync_local_path_for_local_folder(localfolderid, oldsyncid, NULL);
oldpath = pfolder_lpath_lfldr(localfolderid, oldsyncid, NULL);
if (unlikely(!oldpath)) {
debug(D_ERROR, "could not get local path for folder id %lu",
(unsigned long)localfolderid);
@ -369,7 +369,7 @@ static int task_renamefolder(psync_syncid_t newsyncid,
psync_sql_bind_string(res, 3, newname);
psync_sql_bind_uint(res, 4, localfolderid);
psync_sql_run_free(res);
newpath = psync_local_path_for_local_folder(localfolderid, newsyncid, NULL);
newpath = pfolder_lpath_lfldr(localfolderid, newsyncid, NULL);
if (unlikely(!newpath)) {
psync_sql_rollback_transaction();
psync_free(oldpath);
@ -381,7 +381,7 @@ static int task_renamefolder(psync_syncid_t newsyncid,
if (ret)
psync_sql_rollback_transaction();
else {
psync_decrease_local_folder_taskcnt(localfolderid);
psyncer_folder_dec_tasks(localfolderid);
psync_sql_commit_transaction();
pqevent_queue_sync_event_id(PEVENT_LOCAL_FOLDER_RENAMED, newsyncid, newpath,
folderid);
@ -466,7 +466,7 @@ static int stat_and_create_local(psync_syncid_t syncid, psync_fileid_t fileid,
sql = psync_sql_query_nolock("SELECT parentfolderid FROM file WHERE id=?");
psync_sql_bind_uint(sql, 1, fileid);
row = psync_sql_fetch_rowint(sql);
if (!row || !psync_is_folder_in_downloadlist(row[0])) {
if (!row || !psyncer_dl_has_folder(row[0])) {
psync_sql_free_result(sql);
if (localfileid) {
sql = psync_sql_prep_statement("DELETE FROM localfile WHERE id=?");
@ -650,7 +650,7 @@ static int task_download_file(download_task_t *dt) {
psync_sql_bind_lstring(sql, 2, (char *)serverhashhex,
PSYNC_HASH_DIGEST_HEXLEN);
while ((row = psync_sql_fetch_rowint(sql))) {
tmpold = psync_local_path_for_local_file(row[0], NULL);
tmpold = pfolder_lpath_lfile(row[0], NULL);
if (unlikely_log(!tmpold))
continue;
psync_sql_free_result(sql);
@ -900,7 +900,7 @@ static int task_delete_file(psync_syncid_t syncid, psync_fileid_t fileid,
psync_sql_bind_uint(res, 1, fileid);
psync_restart_localscan();
while ((row = psync_sql_fetch_rowint(res))) {
name = psync_local_path_for_local_file(row[0], NULL);
name = pfolder_lpath_lfile(row[0], NULL);
if (likely_log(name)) {
if (unlikely(pfile_delete(name))) {
debug(D_WARNING, "error deleting local file %s error %d", name,
@ -964,10 +964,10 @@ static int task_rename_file(psync_syncid_t oldsyncid, psync_syncid_t newsyncid,
return 0;
}
newfolder =
psync_local_path_for_local_folder(newlocalfolderid, newsyncid, NULL);
pfolder_lpath_lfldr(newlocalfolderid, newsyncid, NULL);
if (unlikely_log(!newfolder))
return 0;
oldpath = psync_local_path_for_local_file(lfileid, NULL);
oldpath = pfolder_lpath_lfile(lfileid, NULL);
if (unlikely_log(!oldpath)) {
psync_free(newfolder);
return 0;
@ -1191,7 +1191,7 @@ static int task_run_download_file(uint64_t taskid, psync_syncid_t syncid,
} else
hastargetchecksum = 0;
psync_sql_free_result(res);
localpath = psync_local_path_for_local_folder(localfolderid, syncid, NULL);
localpath = pfolder_lpath_lfldr(localfolderid, syncid, NULL);
if (unlikely_log(!localpath))
return 0;
localname =
@ -1378,7 +1378,7 @@ static int task_del_folder_rec(psync_folderid_t localfolderid,
psync_sql_res *res;
task_wait_no_downloads();
psync_stop_localscan();
localpath = psync_local_path_for_local_folder(localfolderid, syncid, NULL);
localpath = pfolder_lpath_lfldr(localfolderid, syncid, NULL);
if (unlikely_log(!localpath)) {
psync_resume_localscan();
return 0;

View File

@ -31,7 +31,7 @@
#include "pfileops.h"
#include "pdiff.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "plibs.h"
void pfileops_create_fldr(const binresult *meta) {

View File

@ -29,18 +29,13 @@
DAMAGE.
*/
#include <mbedtls/ctr_drbg.h>
#include <mbedtls/debug.h>
#include <mbedtls/entropy.h>
#include <mbedtls/pkcs5.h>
#include <mbedtls/ssl.h>
#include <pthread.h>
#include <stddef.h>
#include "papi.h"
#include "pcryptofolder.h"
#include "pdiff.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "pfsfolder.h"
#include "plibs.h"
#include "plist.h"
@ -50,23 +45,10 @@
#include <stddef.h>
#include <string.h>
#define INITIAL_NAME_BUFF 2000
#define INITIAL_ENTRY_CNT 128
typedef struct {
pentry_t *entries;
char *namebuff;
size_t nameoff;
size_t namealloc;
uint32_t entriescnt;
uint32_t entriesalloc;
} folder_list;
typedef struct {
folder_list *folderlist;
psync_listtype_t listtype;
} flist_ltype;
typedef struct _string_list {
psync_list list;
char *str;
@ -81,7 +63,7 @@ static inline int psync_crypto_to_error(const void *ptr) {
return -((int)(uintptr_t)ptr);
}
psync_folderid_t psync_get_folderid_by_path(const char *path) {
psync_folderid_t pfolder_id(const char *path) {
psync_folderid_t cfolderid;
const char *sl;
psync_sql_res *res;
@ -146,11 +128,11 @@ static psync_folderid_t wait_folder_id_in_db(psync_folderid_t folderid) {
return PSYNC_INVALID_FOLDERID;
}
psync_folderid_t psync_wait_folder_in_local_db(psync_folderid_t folderid) {
psync_folderid_t pfolder_db_wait(psync_folderid_t folderid) {
return wait_folder_id_in_db(folderid);
}
psync_folderid_t psync_get_folderid_by_path_or_create(const char *path) {
psync_folderid_t pfolder_id_create(const char *path) {
psync_folderid_t cfolderid;
const char *sl;
psync_sql_res *res;
@ -374,7 +356,7 @@ char *psync_join_string_list(const char *sep, psync_list *lst, size_t *retlen) {
return ret;
}
char *psync_get_path_by_folderid(psync_folderid_t folderid, size_t *retlen) {
char *pfolder_path(psync_folderid_t folderid, size_t *retlen) {
psync_list folderlist;
char *ret;
int res;
@ -397,7 +379,7 @@ char *psync_get_path_by_folderid(psync_folderid_t folderid, size_t *retlen) {
return ret;
}
char *psync_get_path_by_folderid_sep(psync_folderid_t folderid, const char *sep,
char *pfolder_path_sep(psync_folderid_t folderid, const char *sep,
size_t *retlen) {
psync_list folderlist;
char *ret;
@ -419,7 +401,7 @@ char *psync_get_path_by_folderid_sep(psync_folderid_t folderid, const char *sep,
return ret;
}
char *psync_get_path_by_fileid(psync_fileid_t fileid, size_t *retlen) {
char *pfolder_file_path(psync_fileid_t fileid, size_t *retlen) {
psync_list folderlist;
char *ret;
psync_sql_res *res;
@ -497,7 +479,7 @@ static int psync_add_local_path_to_list_by_localfolderid(
return -1;
}
char *psync_local_path_for_local_folder(psync_folderid_t localfolderid,
char *pfolder_lpath_lfldr(psync_folderid_t localfolderid,
psync_syncid_t syncid, size_t *retlen) {
psync_list folderlist;
char *ret;
@ -516,7 +498,7 @@ char *psync_local_path_for_local_folder(psync_folderid_t localfolderid,
return ret;
}
char *psync_local_path_for_local_file(psync_fileid_t localfileid,
char *pfolder_lpath_lfile(psync_fileid_t localfileid,
size_t *retlen) {
psync_list folderlist;
char *ret;
@ -616,7 +598,7 @@ static pfolder_list_t *folder_list_finalize(folder_list *list) {
return ret;
}
pfolder_list_t *psync_list_remote_folder(psync_folderid_t folderid,
pfolder_list_t *pfolder_remote_folders(psync_folderid_t folderid,
psync_listtype_t listtype) {
folder_list *list;
psync_sql_res *res;
@ -724,7 +706,7 @@ static void add_to_folderlist(void *ptr, ppath_stat *stat) {
}
}
pfolder_list_t *psync_list_local_folder(const char *path,
pfolder_list_t *pfolder_local_folders(const char *path,
psync_listtype_t listtype) {
flist_ltype ft;
ft.folderlist = folder_list_init();
@ -736,7 +718,7 @@ pfolder_list_t *psync_list_local_folder(const char *path,
return folder_list_finalize(ft.folderlist);
}
pentry_t *psync_folder_stat_path(const char *remotepath) {
pentry_t *pfolder_stat(const char *remotepath) {
psync_folderid_t folderid;
psync_sql_res *res;
psync_uint_row row;
@ -764,7 +746,7 @@ pentry_t *psync_folder_stat_path(const char *remotepath) {
cremotepath = psync_new_cnt(char, len + 1);
memcpy(cremotepath, remotepath, len + 1);
cremotepath[len] = 0;
folderid = psync_get_folderid_by_path(cremotepath);
folderid = pfolder_id(cremotepath);
psync_free(cremotepath);
if (folderid == PSYNC_INVALID_FOLDERID)
return NULL;
@ -819,7 +801,7 @@ typedef struct {
psync_synctype_t synctype;
} psync_tmp_folder_t;
psync_folder_list_t *psync_list_get_list(char *syncTypes) {
psync_folder_list_t *pfolder_sync_folders(char *syncTypes) {
psync_sql_res *res;
psync_variant_row row;
psync_tmp_folder_t *folders;
@ -864,7 +846,7 @@ psync_folder_list_t *psync_list_get_list(char *syncTypes) {
folders[lastfolder].localpath = str;
folders[lastfolder].locallen = l;
folderid = psync_get_number(row[1]);
str = psync_get_path_by_folderid(folderid, &l);
str = pfolder_path(folderid, &l);
if (unlikely(!str)) {
str = psync_strdup("/Invalid/Path");
l = strlen(str);

View File

@ -1,78 +0,0 @@
/*
Copyright (c) 2013-2014 Anton Titov.
Copyright (c) 2013-2014 pCloud Ltd. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met: Redistributions of source code must retain the above
copyright notice, this list of conditions and the following
disclaimer. Redistributions in binary form must reproduce the
above copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution. Neither the name of pCloud Ltd nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL pCloud
Ltd BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
*/
#ifndef _PSYNC_FOLDER_H
#define _PSYNC_FOLDER_H
#include "pcompiler.h"
#include "psynclib.h"
#define PSYNC_INVALID_FOLDERID ((psync_folderid_t) - 1)
#define PSYNC_INVALID_PATH NULL
#define PSYNC_FOLDER_FLAG_ENCRYPTED 1
#define PSYNC_FOLDER_FLAG_INVISIBLE 2
#define PSYNC_FOLDER_FLAG_PUBLIC_ROOT 4
#define PSYNC_FOLDER_FLAG_BACKUP_DEVICE_LIST 8
#define PSYNC_FOLDER_FLAG_BACKUP_DEVICE 16
#define PSYNC_FOLDER_FLAG_BACKUP_ROOT 32
#define PSYNC_FOLDER_FLAG_BACKUP 64
psync_folderid_t psync_get_folderid_by_path(const char *path)
PSYNC_NONNULL(1) PSYNC_PURE;
psync_folderid_t psync_get_folderid_by_path_or_create(const char *path)
PSYNC_NONNULL(1);
char *psync_get_path_by_folderid(psync_folderid_t folderid, size_t *retlen);
char *psync_get_path_by_folderid_sep(psync_folderid_t folderid, const char *sep,
size_t *retlen);
char *psync_get_path_by_fileid(psync_fileid_t fileid, size_t *retlen);
char *psync_local_path_for_local_folder(psync_folderid_t localfolderid,
psync_syncid_t syncid, size_t *retlen);
char *psync_local_path_for_local_file(psync_fileid_t localfileid,
size_t *retlen);
// char *psync_local_path_for_remote_folder(psync_folderid_t folderid,
// psync_syncid_t syncid, size_t *retlen); char
// *psync_local_path_for_remote_file(psync_fileid_t fileid, psync_syncid_t
// syncid, size_t *retlen); char
// *psync_local_path_for_remote_file_or_folder_by_name(psync_folderid_t
// parentfolderid, const char *filename, psync_syncid_t syncid, size_t *retlen);
pfolder_list_t *psync_list_remote_folder(psync_folderid_t folderid,
psync_listtype_t listtype);
pfolder_list_t *psync_list_local_folder(const char *path,
psync_listtype_t listtype)
PSYNC_NONNULL(1);
pentry_t *psync_folder_stat_path(const char *remotepath);
psync_folder_list_t *psync_list_get_list(char *syncTypes);
psync_folderid_t psync_wait_folder_in_local_db(psync_folderid_t folderid);
#endif

161
pclsync/pfoldersync.h Normal file
View File

@ -0,0 +1,161 @@
/*
Copyright (c) 2013-2014 Anton Titov.
Copyright (c) 2013-2014 pCloud Ltd. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met: Redistributions of source code must retain the above
copyright notice, this list of conditions and the following
disclaimer. Redistributions in binary form must reproduce the
above copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution. Neither the name of pCloud Ltd nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL pCloud
Ltd BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
*/
// pfoldersync.h provides a unified interface for folder synchronization.
#ifndef _PSYNC_FOLDERSYNC_H
#define _PSYNC_FOLDERSYNC_H
#include "pcompiler.h"
#include "plist.h"
#include <stddef.h>
#include <stdint.h>
// folders API
#define PSYNC_INVALID_FOLDERID ((psync_folderid_t) - 1)
#define PSYNC_INVALID_PATH NULL
#define PSYNC_FOLDER_FLAG_ENCRYPTED 1
#define PSYNC_FOLDER_FLAG_INVISIBLE 2
#define PSYNC_FOLDER_FLAG_PUBLIC_ROOT 4
#define PSYNC_FOLDER_FLAG_BACKUP_DEVICE_LIST 8
#define PSYNC_FOLDER_FLAG_BACKUP_DEVICE 16
#define PSYNC_FOLDER_FLAG_BACKUP_ROOT 32
#define PSYNC_FOLDER_FLAG_BACKUP 64
// limitation: path length of 255, plus null terminator.
#define PSYNC_MAX_PATH_LENGTH 256
typedef uint64_t psync_folderid_t;
typedef uint64_t psync_fileid_t;
typedef uint64_t psync_fileorfolderid_t;
typedef uint32_t psync_synctype_t;
typedef uint32_t psync_syncid_t;
typedef struct {
psync_fileid_t fileid;
uint64_t size;
} pfile_t;
typedef struct {
psync_folderid_t folderid;
uint8_t cansyncup;
uint8_t cansyncdown;
uint8_t canshare;
uint8_t isencrypted;
} pfolder_t;
typedef struct {
const char *name;
union {
pfolder_t folder;
pfile_t file;
};
uint16_t namelen;
uint8_t isfolder;
} pentry_t;
typedef struct {
size_t entrycnt;
pentry_t entries[];
} pfolder_list_t;
typedef struct {
const char *localpath;
const char *name;
const char *description;
} psuggested_folder_t;
typedef struct {
size_t entrycnt;
psuggested_folder_t entries[];
} psuggested_folders_t;
typedef struct {
pentry_t *entries;
char *namebuff;
size_t nameoff;
size_t namealloc;
uint32_t entriescnt;
uint32_t entriesalloc;
} folder_list;
typedef struct {
folder_list *folderlist;
psync_listtype_t listtype;
} flist_ltype;
typedef struct {
char localname[PSYNC_MAX_PATH_LENGTH];
char localpath[PSYNC_MAX_PATH_LENGTH];
char remotename[PSYNC_MAX_PATH_LENGTH];
char remotepath[PSYNC_MAX_PATH_LENGTH];
psync_folderid_t folderid;
psync_syncid_t syncid;
psync_synctype_t synctype;
} psync_folder_t;
typedef struct {
size_t foldercnt;
psync_folder_t folders[];
} psync_folder_list_t;
// folder API (impl. pfolder.c)
psync_folderid_t pfolder_id(const char *path) PSYNC_NONNULL(1) PSYNC_PURE;
psync_folderid_t pfolder_id_create(const char *path) PSYNC_NONNULL(1);
char *pfolder_path(psync_folderid_t folderid, size_t *retlen);
char *pfolder_path_sep(psync_folderid_t folderid, const char *sep, size_t *retlen);
char *pfolder_file_path(psync_fileid_t fileid, size_t *retlen);
char *pfolder_lpath_lfldr(psync_folderid_t localfolderid, psync_syncid_t syncid, size_t *retlen);
char *pfolder_lpath_lfile(psync_fileid_t localfileid, size_t *retlen);
pfolder_list_t *pfolder_remote_folders(psync_folderid_t folderid, psync_listtype_t listtype);
pfolder_list_t *pfolder_local_folders(const char *path, psync_listtype_t listtype) PSYNC_NONNULL(1);
pentry_t *pfolder_stat(const char *remotepath);
psync_folder_list_t *pfolder_sync_folders(char *syncTypes);
psync_folderid_t pfolder_db_wait(psync_folderid_t folderid);
// "syncer" API (impl. psync.c)
void psyncer_check_delayed();
void psyncer_create(psync_syncid_t syncid);
psync_folderid_t psyncer_db_folder_create(psync_syncid_t syncid, psync_folderid_t folderid, psync_folderid_t localparentfolderid, const char *name);
void psyncer_dl_folder_add(psync_syncid_t syncid, psync_synctype_t synctype, psync_folderid_t folderid, psync_folderid_t lfoiderid);
int psyncer_dl_has_folder(psync_folderid_t folderid);
void psyncer_dl_queue_add(psync_folderid_t folderid);
void psyncer_dl_queue_clear();
void psyncer_dl_queue_del(psync_folderid_t folderid);
void psyncer_folder_dec_tasks(psync_folderid_t lfolderid);
void psyncer_folder_inc_tasks(psync_folderid_t lfolderid);
void psyncer_init();
int psyncer_str_has_prefix(const char *str1, const char *str2);
int psyncer_str_starts_with(const char *str1, const char *str2);
#endif

View File

@ -39,7 +39,7 @@
#include "pcompiler.h"
#include "pcryptofolder.h"
#include "pfile.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "pfs.h"
#include "pfscrypto.h"
@ -3364,7 +3364,7 @@ void psync_fs_refresh_folder(psync_folderid_t folderid) {
int fd;
path =
psync_get_path_by_folderid_sep(folderid, "/", NULL);
pfolder_path_sep(folderid, "/", NULL);
if (path == PSYNC_INVALID_PATH)
return;
psync_ssl_rand_weak(rndbuff, sizeof(rndbuff));
@ -3433,7 +3433,7 @@ char *psync_fs_get_path_by_folderid(psync_folderid_t folderid) {
if (!mp || folderid == 0)
return mp;
path =
psync_get_path_by_folderid_sep(folderid, "/", NULL);
pfolder_path_sep(folderid, "/", NULL);
if (path == PSYNC_INVALID_PATH) {
psync_free(mp);
return NULL;

View File

@ -37,7 +37,7 @@
#include <pthread.h>
#include "pcryptofolder.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "pfs.h"
#include "pfsfolder.h"
#include "pfstasks.h"

View File

@ -44,7 +44,7 @@
#include "pcache.h"
#include "pcryptofolder.h"
#include "putil.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "pfs.h"
#include "pfstasks.h"
#include "pfsupload.h"

View File

@ -34,6 +34,9 @@
#include "pcompiler.h"
#include <stddef.h>
#include <stdint.h>
typedef uint32_t psync_listtype_t;
typedef struct _psync_list {
struct _psync_list *next;

View File

@ -39,7 +39,7 @@
#include "pdevice.h"
#include "pfile.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "plibs.h"
#include "prun.h"
#include "plist.h"
@ -808,7 +808,7 @@ static void scan_created_folder(sync_folderlist *fl) {
debug(D_WARNING, "local folder %s does not have localid", fl->name);
return;
}
localpath = psync_local_path_for_local_folder(fl->localid, fl->syncid, NULL);
localpath = pfolder_lpath_lfldr(fl->localid, fl->syncid, NULL);
if (likely_log(localpath)) {
debug(D_NOTICE, "scanning just created folder %s localid %lu name %s",
localpath, (unsigned long)fl->localid, fl->name);

View File

@ -42,7 +42,7 @@
#include "pfile.h"
#include "pcrypto.h"
#include "pdownload.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "plibs.h"
#include "pnetlibs.h"
#include "pp2p.h"
@ -371,7 +371,7 @@ static void psync_p2p_tcphandler(void *ptr) {
psync_free(binpubrsa);
if (unlikely_log(pubrsa == PSYNC_INVALID_RSA))
goto err0;
localpath = psync_local_path_for_local_file(localfileid, NULL);
localpath = pfolder_lpath_lfile(localfileid, NULL);
if (unlikely_log(!localpath))
goto err0;
fd = pfile_open(localpath, O_RDONLY, 0);

View File

@ -37,7 +37,7 @@
#include <pthread.h>
#include "pcryptofolder.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "pfs.h"
#include "plibs.h"
#include "plist.h"

View File

@ -28,7 +28,7 @@
*/
#include "pqevent.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "plibs.h"
#include "plist.h"
#include "prun.h"
@ -354,9 +354,9 @@ void pqevent_queue_sync_event_id(psync_eventtype_t eventid, psync_syncid_t synci
if (eventthreadrunning) {
char *remotepath;
if (eventid & PEVENT_TYPE_FOLDER)
remotepath = psync_get_path_by_folderid(remoteid, NULL);
remotepath = pfolder_path(remoteid, NULL);
else
remotepath = psync_get_path_by_fileid(remoteid, NULL);
remotepath = pfolder_file_path(remoteid, NULL);
if (unlikely_log(!remotepath))
return;
pqevent_queue_sync_event_path(eventid, syncid, localpath, remoteid, remotepath);

View File

@ -39,14 +39,14 @@
#include "pdownload.h"
#include "pfile.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "plibs.h"
#include "plocalnotify.h"
#include "plocalscan.h"
#include "ppathstatus.h"
#include "prun.h"
#include "pstatus.h"
#include "psyncer.h"
#include "pfoldersync.h"
#include "ptask.h"
#include "ptree.h"
#include "putil.h"
@ -103,13 +103,13 @@ static void psync_add_folder_to_downloadlist_locked(psync_folderid_t folderid) {
}
}
void psync_add_folder_to_downloadlist(psync_folderid_t folderid) {
void psyncer_dl_queue_add(psync_folderid_t folderid) {
pthread_mutex_lock(&sync_down_mutex);
psync_add_folder_to_downloadlist_locked(folderid);
pthread_mutex_unlock(&sync_down_mutex);
}
void psync_del_folder_from_downloadlist(psync_folderid_t folderid) {
void psyncer_dl_queue_del(psync_folderid_t folderid) {
synced_down_folder *f;
pthread_mutex_lock(&sync_down_mutex);
f = psync_tree_element(synced_down_folders, synced_down_folder, tree);
@ -127,7 +127,7 @@ void psync_del_folder_from_downloadlist(psync_folderid_t folderid) {
pthread_mutex_unlock(&sync_down_mutex);
}
void psync_clear_downloadlist() {
void psyncer_dl_queue_clear() {
pthread_mutex_lock(&sync_down_mutex);
psync_tree_for_each_element_call_safe(synced_down_folders, synced_down_folder,
tree, psync_free);
@ -135,7 +135,7 @@ void psync_clear_downloadlist() {
pthread_mutex_unlock(&sync_down_mutex);
}
int psync_is_folder_in_downloadlist(psync_folderid_t folderid) {
int psyncer_dl_has_folder(psync_folderid_t folderid) {
synced_down_folder *f;
pthread_mutex_lock(&sync_down_mutex);
f = psync_tree_element(synced_down_folders, synced_down_folder, tree);
@ -151,7 +151,7 @@ int psync_is_folder_in_downloadlist(psync_folderid_t folderid) {
return f != NULL;
}
void psync_increase_local_folder_taskcnt(psync_folderid_t lfolderid) {
void psyncer_folder_inc_tasks(psync_folderid_t lfolderid) {
psync_sql_res *res;
res = psync_sql_prep_statement(
"UPDATE localfolder SET taskcnt=taskcnt+1 WHERE id=?");
@ -160,7 +160,7 @@ void psync_increase_local_folder_taskcnt(psync_folderid_t lfolderid) {
assertw(psync_sql_affected_rows() == 1);
}
void psync_decrease_local_folder_taskcnt(psync_folderid_t lfolderid) {
void psyncer_folder_dec_tasks(psync_folderid_t lfolderid) {
psync_sql_res *res;
res = psync_sql_prep_statement(
"UPDATE localfolder SET taskcnt=taskcnt+1 WHERE id=?");
@ -169,7 +169,7 @@ void psync_decrease_local_folder_taskcnt(psync_folderid_t lfolderid) {
assertw(psync_sql_affected_rows() == 1);
}
psync_folderid_t psync_create_local_folder_in_db(
psync_folderid_t psyncer_db_folder_create(
psync_syncid_t syncid, psync_folderid_t folderid,
psync_folderid_t localparentfolderid, const char *name) {
psync_sql_res *res;
@ -241,12 +241,12 @@ psync_folderid_t psync_create_local_folder_in_db(
psync_sql_bind_uint(res, 2, folderid);
psync_sql_run_free(res);
}
psync_increase_local_folder_taskcnt(lfolderid);
psyncer_folder_inc_tasks(lfolderid);
psync_free(vname);
return lfolderid;
}
void psync_add_folder_for_downloadsync(psync_syncid_t syncid,
void psyncer_dl_folder_add(psync_syncid_t syncid,
psync_synctype_t synctype,
psync_folderid_t folderid,
psync_folderid_t lfoiderid) {
@ -262,7 +262,7 @@ void psync_add_folder_for_downloadsync(psync_syncid_t syncid,
psync_sql_bind_uint(res, 3, lfoiderid);
psync_sql_bind_uint(res, 4, synctype);
psync_sql_run_free(res);
psync_add_folder_to_downloadlist(folderid);
psyncer_dl_queue_add(folderid);
res = psync_sql_query(
"SELECT id, permissions, name FROM folder WHERE parentfolderid=?");
psync_sql_bind_uint(res, 1, folderid);
@ -273,9 +273,9 @@ void psync_add_folder_for_downloadsync(psync_syncid_t syncid,
continue;
cfolderid = psync_get_number(row[0]);
clfolderid =
psync_create_local_folder_in_db(syncid, cfolderid, lfoiderid, name);
psyncer_db_folder_create(syncid, cfolderid, lfoiderid, name);
ptask_ldir_mk(syncid, cfolderid, clfolderid);
psync_add_folder_for_downloadsync(syncid, synctype, cfolderid,
psyncer_dl_folder_add(syncid, synctype, cfolderid,
clfolderid /*, path*/);
}
}
@ -314,7 +314,7 @@ static void psync_sync_newsyncedfolder(psync_syncid_t syncid) {
psync_strndup(psync_get_string(row[2]), strlen(psync_get_string(row[2])));
psync_sql_free_result(res);
if (synctype & PSYNC_DOWNLOAD_ONLY) {
psync_add_folder_for_downloadsync(syncid, synctype, folderid, 0);
psyncer_dl_folder_add(syncid, synctype, folderid, 0);
} else {
res = psync_sql_prep_statement(
"REPLACE INTO syncedfolder (syncid, folderid, localfolderid, synctype) "
@ -350,7 +350,7 @@ static void psync_do_sync_thread(void *ptr) {
psync_free(ptr);
}
void psync_syncer_new(psync_syncid_t syncid) {
void psyncer_create(psync_syncid_t syncid) {
psync_syncid_t *psid = psync_new(psync_syncid_t);
*psid = syncid;
prun_thread1("syncer", psync_do_sync_thread, psid);
@ -374,7 +374,7 @@ static void delete_delayed_sync(uint64_t id) {
psync_sql_run_free(res);
}
int psync_str_is_prefix(const char *str1, const char *str2) {
int psyncer_str_has_prefix(const char *str1, const char *str2) {
size_t len1, len2;
len1 = strlen(str1);
len2 = strlen(str2);
@ -394,7 +394,7 @@ int psync_str_is_prefix(const char *str1, const char *str2) {
return !memcmp(str1, str2, len1);
}
int psync_left_str_is_prefix(const char *str1, const char *str2) {
int psyncer_str_starts_with(const char *str1, const char *str2) {
size_t len1, len2;
len1 = strlen(str1);
len2 = strlen(str2);
@ -414,7 +414,7 @@ int psync_left_str_is_prefix(const char *str1, const char *str2) {
return !memcmp(str1, str2, len1);
}
void psync_syncer_check_delayed_syncs() {
void psyncer_check_delayed() {
struct stat st;
psync_sql_res *res, *res2, *stmt;
psync_variant_row row;
@ -449,7 +449,7 @@ re:
mbedtls_md = 0;
res2 = psync_sql_query("SELECT localpath FROM syncfolder");
while ((srow = psync_sql_fetch_rowstr(res2)))
if (psync_str_is_prefix(srow[0], localpath)) {
if (psyncer_str_has_prefix(srow[0], localpath)) {
debug(
D_WARNING,
"skipping localfolder %s, remote %s, because of same parent to %s",
@ -471,7 +471,7 @@ re:
remotepath = psync_strdup(remotepath);
psync_sql_free_result(res);
folderid = psync_get_folderid_by_path_or_create(remotepath);
folderid = pfolder_id_create(remotepath);
if (unlikely(folderid == PSYNC_INVALID_FOLDERID)) {
debug(D_WARNING, "could not get folderid/create folder %s", remotepath);
psync_free(localpath);
@ -512,7 +512,7 @@ re:
psync_free(remotepath);
if (!psync_sql_commit_transaction() && syncid != -1) {
psync_path_status_reload_syncs();
psync_syncer_new(syncid);
psyncer_create(syncid);
goto re;
}
return;
@ -520,7 +520,7 @@ re:
psync_sql_free_result(res);
}
void psync_syncer_init() {
void psyncer_init() {
psync_sql_res *res;
psync_uint_row row;
res = psync_sql_query(

View File

@ -1,60 +0,0 @@
/*
Copyright (c) 2013-2014 Anton Titov.
Copyright (c) 2013-2014 pCloud Ltd. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met: Redistributions of source code must retain the above
copyright notice, this list of conditions and the following
disclaimer. Redistributions in binary form must reproduce the
above copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution. Neither the name of pCloud Ltd nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL pCloud
Ltd BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
*/
#ifndef _PSYNC_SYNCER_H
#define _PSYNC_SYNCER_H
#include "psynclib.h"
void psync_syncer_init();
void psync_syncer_new(psync_syncid_t syncid);
void psync_increase_local_folder_taskcnt(psync_folderid_t lfolderid);
void psync_decrease_local_folder_taskcnt(psync_folderid_t lfolderid);
psync_folderid_t psync_create_local_folder_in_db(
psync_syncid_t syncid, psync_folderid_t folderid,
psync_folderid_t localparentfolderid, const char *name);
void psync_add_folder_for_downloadsync(psync_syncid_t syncid,
psync_synctype_t synctype,
psync_folderid_t folderid,
psync_folderid_t lfoiderid);
void psync_add_folder_to_downloadlist(psync_folderid_t folderid);
void psync_del_folder_from_downloadlist(psync_folderid_t folderid);
void psync_clear_downloadlist();
int psync_is_folder_in_downloadlist(psync_folderid_t folderid);
int psync_str_is_prefix(const char *str1, const char *str2);
void psync_syncer_check_delayed_syncs();
int psync_left_str_is_prefix(const char *str1, const char *str2);
#endif

View File

@ -54,7 +54,7 @@
#include "pdownload.h"
#include "pfile.h"
#include "pfileops.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "pfsfolder.h"
#include "plibs.h"
#include "plist.h"
@ -75,7 +75,7 @@
#include "pshm.h"
#include "pssl.h"
#include "pstatus.h"
#include "psyncer.h"
#include "pfoldersync.h"
#include "psynclib.h"
#include "psys.h"
#include "ptask.h"
@ -329,7 +329,7 @@ void psync_start_sync(pstatus_change_callback_t status_callback,
pstatus_set_cb(status_callback);
if (event_callback)
pqevent_process(event_callback);
psync_syncer_init();
psyncer_init();
pdiff_init();
psync_upload_init();
pdownload_init();
@ -594,7 +594,7 @@ void psync_unlink() {
psync_fs_pause_until_login();
psync_fs_clean_tasks();
psync_path_status_init();
psync_clear_downloadlist();
psyncer_dl_queue_clear();
psync_sql_unlock();
psync_sql_checkpoint_unlock();
psync_settings_reset();
@ -739,7 +739,7 @@ void psync_tfa_set_code(const char *code, int trusted, int is_recovery) {
psync_syncid_t psync_add_sync_by_path(const char *localpath,
const char *remotepath,
psync_synctype_t synctype) {
psync_folderid_t folderid = psync_get_folderid_by_path(remotepath);
psync_folderid_t folderid = pfolder_id(remotepath);
if (likely_log(folderid != PSYNC_INVALID_FOLDERID))
return psync_add_sync_by_folderid(localpath, folderid, synctype);
else
@ -787,7 +787,7 @@ psync_syncid_t psync_add_sync_by_folderid(const char *localpath,
if (unlikely_log(!res))
return_isyncid(PERROR_DATABASE_ERROR);
while ((srow = psync_sql_fetch_rowstr(res)))
if (psync_str_is_prefix(srow[0], localpath)) {
if (psyncer_str_has_prefix(srow[0], localpath)) {
psync_sql_free_result(res);
return_isyncid(PERROR_PARENT_OR_SUBFOLDER_ALREADY_SYNCING);
} else if (!strcmp(srow[0], localpath)) {
@ -834,7 +834,7 @@ psync_syncid_t psync_add_sync_by_folderid(const char *localpath,
return_isyncid(PERROR_FOLDER_ALREADY_SYNCING);
psync_sql_sync();
psync_path_status_reload_syncs();
psync_syncer_new(ret);
psyncer_create(ret);
return ret;
}
@ -864,7 +864,7 @@ int psync_add_sync_by_path_delayed(const char *localpath,
psync_sql_run_free(res);
psync_sql_sync();
if (pstatus_get(PSTATUS_TYPE_ONLINE) == PSTATUS_ONLINE_ONLINE)
prun_thread("check delayed syncs", psync_syncer_check_delayed_syncs);
prun_thread("check delayed syncs", psyncer_check_delayed);
return 0;
}
@ -942,7 +942,7 @@ int psync_change_synctype(psync_syncid_t syncid, psync_synctype_t synctype) {
res = psync_sql_query("SELECT folderid FROM syncedfolder WHERE syncid=?");
psync_sql_bind_uint(res, 1, syncid);
while ((urow = psync_sql_fetch_rowint(res)))
psync_del_folder_from_downloadlist(urow[0]);
psyncer_dl_queue_del(urow[0]);
psync_sql_free_result(res);
res = psync_sql_prep_statement("DELETE FROM syncedfolder WHERE syncid=?");
psync_sql_bind_uint(res, 1, syncid);
@ -961,7 +961,7 @@ int psync_change_synctype(psync_syncid_t syncid, psync_synctype_t synctype) {
psync_stop_sync_upload(syncid);
psync_sql_sync();
psync_path_status_reload_syncs();
psync_syncer_new(syncid);
psyncer_create(syncid);
return 0;
}
@ -1020,7 +1020,7 @@ int psync_delete_sync(psync_syncid_t syncid) {
}
psync_folder_list_t *psync_get_sync_list() {
return psync_list_get_list(PSYNC_STR_ALLSYNCS);
return pfolder_sync_folders(PSYNC_STR_ALLSYNCS);
}
psuggested_folders_t *psync_get_sync_suggestions() {
@ -1039,14 +1039,14 @@ psuggested_folders_t *psync_get_sync_suggestions() {
pfolder_list_t *psync_list_local_folder_by_path(const char *localpath,
psync_listtype_t listtype) {
return psync_list_local_folder(localpath, listtype);
return pfolder_local_folders(localpath, listtype);
}
pfolder_list_t *psync_list_remote_folder_by_path(const char *remotepath,
psync_listtype_t listtype) {
psync_folderid_t folderid = psync_get_folderid_by_path(remotepath);
psync_folderid_t folderid = pfolder_id(remotepath);
if (folderid != PSYNC_INVALID_FOLDERID)
return psync_list_remote_folder(folderid, listtype);
return pfolder_remote_folders(folderid, listtype);
else
return NULL;
}
@ -1054,11 +1054,11 @@ pfolder_list_t *psync_list_remote_folder_by_path(const char *remotepath,
pfolder_list_t *
psync_list_remote_folder_by_folderid(psync_folderid_t folderid,
psync_listtype_t listtype) {
return psync_list_remote_folder(folderid, listtype);
return pfolder_remote_folders(folderid, listtype);
}
pentry_t *psync_stat_path(const char *remotepath) {
return psync_folder_stat_path(remotepath);
return pfolder_stat(remotepath);
}
int psync_is_lname_to_ignore(const char *name, size_t namelen) {
@ -2766,7 +2766,7 @@ int psync_is_folder_syncable(char *localPath, char **errMsg) {
}
while ((srow = psync_sql_fetch_rowstr(sql))) {
if (psync_str_is_prefix(srow[0], localPath)) {
if (psyncer_str_has_prefix(srow[0], localPath)) {
psync_sql_free_result(sql);
*errMsg = psync_strdup("There is already an active sync or backup for a "
@ -2810,7 +2810,7 @@ int psync_is_folder_syncable(char *localPath, char **errMsg) {
debug(D_NOTICE, "Check ignored folder: [%s]=[%s]", folders.folders[i],
localPath);
if (psync_left_str_is_prefix(folders.folders[i], localPath)) {
if (psyncer_str_starts_with(folders.folders[i], localPath)) {
*errMsg = psync_strdup(
"This folder is a child of a folder in your ignore folders list.");
return PERROR_PARENT_IS_IGNORED;
@ -2823,7 +2823,7 @@ int psync_is_folder_syncable(char *localPath, char **errMsg) {
psync_folder_list_t *psync_get_syncs_bytype(const char *syncType) {
debug(D_NOTICE, "Get syncs type: [%s]", syncType);
return psync_list_get_list((char *)syncType);
return pfolder_sync_folders((char *)syncType);
}
psync_folderid_t create_bup_mach_folder(char **msgErr) {

View File

@ -44,57 +44,13 @@
#include "paccountevents.h"
#include "ptools.h"
#include "pstatus.h"
#include "pfoldersync.h"
typedef uint64_t psync_folderid_t;
typedef uint64_t psync_fileid_t;
typedef uint64_t psync_fileorfolderid_t;
typedef uint64_t psync_userid_t;
typedef uint64_t psync_shareid_t;
typedef uint64_t psync_sharerequestid_t;
typedef uint64_t psync_teamid_t;
typedef uint32_t psync_syncid_t;
typedef uint32_t psync_eventtype_t;
typedef uint32_t psync_synctype_t;
typedef uint32_t psync_listtype_t;
typedef struct {
psync_fileid_t fileid;
uint64_t size;
} pfile_t;
typedef struct {
psync_folderid_t folderid;
uint8_t cansyncup;
uint8_t cansyncdown;
uint8_t canshare;
uint8_t isencrypted;
} pfolder_t;
typedef struct {
const char *name;
union {
pfolder_t folder;
pfile_t file;
};
uint16_t namelen;
uint8_t isfolder;
} pentry_t;
typedef struct {
size_t entrycnt;
pentry_t entries[];
} pfolder_list_t;
typedef struct {
const char *localpath;
const char *name;
const char *description;
} psuggested_folder_t;
typedef struct {
size_t entrycnt;
psuggested_folder_t entries[];
} psuggested_folders_t;
typedef struct {
const char *label;
@ -329,9 +285,6 @@ typedef struct {
#define PSYNC_CRYPTO_STATUS_ACTIVE 4
#define PSYNC_CRYPTO_STATUS_SETUP 5
// limitation: path length of 255, plus null terminator.
#define PSYNC_MAX_PATH_LENGTH 256
#define PSYNC_CRYPTO_INVALID_FOLDERID ((psync_folderid_t) - 1)
#define PSYNC_CRYPTO_FLAG_TEMP_PASS 1
@ -352,20 +305,6 @@ typedef struct {
// Backup errors end
// Lib error codes end
typedef struct {
char localname[PSYNC_MAX_PATH_LENGTH];
char localpath[PSYNC_MAX_PATH_LENGTH];
char remotename[PSYNC_MAX_PATH_LENGTH];
char remotepath[PSYNC_MAX_PATH_LENGTH];
psync_folderid_t folderid;
psync_syncid_t syncid;
psync_synctype_t synctype;
} psync_folder_t;
typedef struct {
size_t foldercnt;
psync_folder_t folders[];
} psync_folder_list_t;
typedef struct {
psync_fileid_t fileid;
@ -1312,7 +1251,7 @@ int psync_upload_file_as(const char *remote_path, const char *remote_filename,
* full path (including mountpoint) of a given folderid on the filesystem or
* NULL if it is not mounted or folder could not be
* found. You are supposed to free the returned pointer.
* psync_get_path_by_fileid() - returns path (without mountpoint) of a given
* pfolder_file_path() - returns path (without mountpoint) of a given
* fileid on the filesystem or NULL if it is not mounted or parent folder could
* not be found. You are supposed to free the returned pointer.
*
@ -1342,7 +1281,6 @@ void psync_fs_stop();
char *psync_fs_getmountpoint();
void psync_fs_register_start_callback(psync_generic_callback_t callback);
char *psync_fs_get_path_by_folderid(psync_folderid_t folderid);
char *psync_get_path_by_fileid(psync_fileid_t fileid, size_t *retlen);
void psync_fs_clean_read_cache();
int psync_fs_move_cache(const char *path);

View File

@ -43,7 +43,7 @@
#include "pcompiler.h"
#include "pdiff.h"
#include "pfileops.h"
#include "pfolder.h"
#include "pfoldersync.h"
#include "plibs.h"
#include "plist.h"
#include "pnetlibs.h"
@ -500,7 +500,7 @@ static void set_local_file_conflicted(psync_fileid_t localfileid,
psync_sql_bind_string(res, 1, newname);
psync_sql_bind_uint(res, 2, taskid);
psync_sql_run_free(res);
newpath = psync_local_path_for_local_file(localfileid, NULL);
newpath = pfolder_lpath_lfile(localfileid, NULL);
if (unlikely_log(pfile_rename_overwrite(localpath, newpath)))
psync_sql_rollback_transaction();
else
@ -1341,7 +1341,7 @@ static int task_uploadfile(psync_syncid_t syncid, psync_folderid_t localfileid,
pstatus_wait_statuses_arr(requiredstatuses, ARRAY_SIZE(requiredstatuses));
if (upload->stop)
return -1;
localpath = psync_local_path_for_local_file(localfileid, NULL);
localpath = pfolder_lpath_lfile(localfileid, NULL);
if (unlikely(!localpath)) {
debug(D_WARNING, "could not find local file %s (id %lu)", name,
(unsigned long)localfileid);