tdosync() function to actually perform the synkro - synk - synchronize files between hosts
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 94ac24242e7b1a7d168e6c1505b71cb6a5585b99
(DIR) parent deb721c47bda91d79cc7b7d6160a8d5b644359d6
(HTM) Author: Willy <willyatmailoodotorg>
Date: Thu, 1 Sep 2016 12:06:39 +0200
dosync() function to actually perform the synkro
Diffstat:
M synk.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
---
(DIR) diff --git a/synk.c b/synk.c
t@@ -63,6 +63,7 @@ int syncfile(struct peers_t *, const char *);
int uptodate(struct peers_t *);
int flushpeers(struct peers_t *);
int syncwithmaster(struct peer_t *master, struct peers_t *plist);
+int dosync(struct peer_t *master, struct peer_t *slave);
const char *rsync_cmd[] = { "rsync", "-azEq", "--delete", NULL };
t@@ -392,6 +393,7 @@ freshestpeer(struct peers_t *plist)
int
syncwithmaster(struct peer_t *master, struct peers_t *plist)
{
+ int ret = 0;
struct peer_t *slave = NULL;
SLIST_FOREACH(slave, plist, entries) {
if (slave == master)
t@@ -400,10 +402,36 @@ syncwithmaster(struct peer_t *master, struct peers_t *plist)
continue;
/* SYNC COMMAND */
+ ret += dosync(master, slave);
}
- return 0;
+ return ret;
}
+int
+dosync(struct peer_t *master, struct peer_t *slave)
+{
+ char **cmd = NULL;
+ char *args[] = { NULL, NULL, NULL };
+ char local[_POSIX_ARG_MAX], remote[_POSIX_ARG_MAX];
+
+ snprintf(local, _POSIX_ARG_MAX, "%s", master->meta.path);
+ snprintf(remote, _POSIX_ARG_MAX, "%s:%s", inet_ntoa(slave->peer.sin_addr),
+ slave->meta.path);
+
+ args[0] = local;
+ args[1] = remote;
+
+ cmd = concat(2, rsync_cmd, args);
+
+ if (master->peer.sin_addr.s_addr != htonl(INADDR_LOOPBACK)) {
+ cmd = concat(1, (char *[]){ "ssh", inet_ntoa(master->peer.sin_addr), echo(cmd), NULL });
+ }
+
+ puts(echo(cmd));
+ free(cmd);
+
+ return 0;
+}
/*
* Check the synchronisation state of a file between mutliple peers, and