tMake client/server send sha512 digests for comparison - synk - synchronize files between hosts
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 52315a137481905a33e482df08128ee85f90b6b5
(DIR) parent 8e9a6f6cd8321f42ac8d55456b1092ef7a61f191
(HTM) Author: Willy <willyatmailoodotorg>
Date: Mon, 22 Aug 2016 08:42:36 +0200
Make client/server send sha512 digests for comparison
Diffstat:
M synk.c | 46 +++++++++++++++++++------------
1 file changed, 28 insertions(+), 18 deletions(-)
---
(DIR) diff --git a/synk.c b/synk.c
t@@ -34,7 +34,7 @@ const char *rsync_cmd[] = { "rsync", "-azEq", "--delete", NULL };
long gettimestamp(const char *path);
int handleclient(int cfd, struct in_addr inet);
int server(in_addr_t host, in_port_t port);
-int client(in_addr_t host, in_port_t port, const char *path);
+int client(in_addr_t host, in_port_t port, FILE *f, const char *path);
int sha512(FILE *stream, unsigned char *hash);
int sha512_compare(unsigned char *h1, unsigned char *h2);
t@@ -109,8 +109,10 @@ gettimestamp(const char *path)
int
handleclient(int cfd, struct in_addr inet)
{
- char path[PATH_MAX] = "", ts[TIMESTAMP_MAX] = "";
ssize_t len = 0;
+ char path[PATH_MAX] = "";
+ FILE *f = NULL;
+ unsigned char hash[64];
if ((len = read(cfd, &path, PATH_MAX)) < 0) {
perror(inet_ntoa(inet));
t@@ -120,12 +122,14 @@ handleclient(int cfd, struct in_addr inet)
path[len] = '\0';
printf("%s: %s\n", inet_ntoa(inet), path);
- /* retrieve timestamp for received path.. */
- snprintf(ts, TIMESTAMP_MAX, "%lu", gettimestamp(path));
- len = strnlen(ts, TIMESTAMP_MAX);
+ /* compute sha512 hash for the given file... */
+ if ((f = fopen(path, "r")) != NULL) {
+ sha512(f, hash);
+ fclose(f);
+ }
/* .. and send it to the client */
- write(cfd, ts, len);
+ write(cfd, hash, 64);
close(cfd);
t@@ -185,14 +189,14 @@ server(in_addr_t host, in_port_t port)
* socket. Connection is terminated after receiving the timestamp
*/
int
-client(in_addr_t host, in_port_t port, const char *fn)
+client(in_addr_t host, in_port_t port, FILE *f, const char *fn)
{
int cfd;
- long ltim, rtim;
ssize_t len = 0;
struct sockaddr_in clt;
- char path[PATH_MAX] = "", ts[TIMESTAMP_MAX] = "";
-
+ char path[PATH_MAX] = "";
+ unsigned char hash[64] = "", rhash[64];
+
if ((cfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("socket");
return 1;
t@@ -218,10 +222,9 @@ client(in_addr_t host, in_port_t port, const char *fn)
}
/* ... which should return the timestamp of this file */
- read(cfd, ts, TIMESTAMP_MAX);
- ltim = gettimestamp(path);
- rtim = strtol(ts, NULL, 10);
- printf("%s:%s L:%lu R:%lu\n", path, ltim==rtim?"SYNKED":"TOSYNK",ltim, rtim);
+ read(cfd, rhash, 64);
+ sha512(f, hash);
+ printf("%s:%s\n", path, sha512_compare(hash, rhash)?"NOT SYNKED":"SYNKED");
close(cfd);
t@@ -231,7 +234,8 @@ client(in_addr_t host, in_port_t port, const char *fn)
int
main(int argc, char *argv[])
{
- char *argv0;
+ char *argv0, *fn;
+ FILE *f = NULL;
uint8_t mode = SYNK_CLIENT;
in_port_t port = SERVER_PORT;
in_addr_t host = INADDR_LOOPBACK;
t@@ -242,16 +246,22 @@ main(int argc, char *argv[])
case 's': mode = SYNK_SERVER; break;
}ARGEND;
- if (mode == SYNK_CLIENT && argc < 1)
+ if (mode == SYNK_CLIENT && argc == 0)
usage(argv0);
switch(mode) {
case SYNK_CLIENT:
- client(host, port, argv[0]);
+ while ((fn = *(argv++)) != NULL) {
+ f = fopen(fn, "r");
+ if (f) {
+ client(host, port, f, fn);
+ fclose(f);
+ }
+ }
break;
case SYNK_SERVER:
server(host, port);
- break; /* NOTREACHED */
+ break;
}
return 0;
}