tUse structure for TCP communications - synk - synchronize files between hosts
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 8c80e23c0813a078879f506afca68141a9c060a7
(DIR) parent 8426dc6f82ed4939a3702ff9c2c0e51cfa3d76fd
(HTM) Author: Willy <willyatmailoodotorg>
Date: Tue, 23 Aug 2016 18:17:43 +0200
Use structure for TCP communications
Diffstat:
M synk.c | 71 ++++++++++++++++++-------------
1 file changed, 41 insertions(+), 30 deletions(-)
---
(DIR) diff --git a/synk.c b/synk.c
t@@ -15,7 +15,7 @@
#define SERVER_HOST "127.0.0.1"
#define SERVER_PORT 9723
-#define TIMESTAMP_MAX 32
+#define TIMESTAMP_MAX 19 /* length of LONG_MAX */
#define CONNECTION_MAX 1
t@@ -24,6 +24,12 @@ struct client_t {
struct in_addr in;
};
+struct metadata_t {
+ char path[PATH_MAX];
+ unsigned char hash[64];
+ long mtime;
+};
+
enum {
SYNK_CLIENT,
SYNK_SERVER
t@@ -31,14 +37,14 @@ enum {
const char *rsync_cmd[] = { "rsync", "-azEq", "--delete", NULL };
-void usage(char *name);
-int sha512(FILE *stream, unsigned char *hash);
-int sha512_compare(unsigned char *h1, unsigned char *h2);
+void usage(char *name);
+int sha512(FILE *stream, unsigned char *hash);
+int sha512_compare(unsigned char *h1, unsigned char *h2);
char *sha512_format(unsigned char *hash);
-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, FILE *f, const char *path);
+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, FILE *f, const char *path);
void
usage(char *name)
t@@ -129,26 +135,30 @@ int
handleclient(int cfd, struct in_addr inet)
{
ssize_t len = 0;
- char path[PATH_MAX] = "";
FILE *f = NULL;
- unsigned char hash[64];
+ struct metadata_t local, remote;
+
+ memset(&local, 0, sizeof(local));
+ memset(&remote, 0, sizeof(remote));
- if ((len = read(cfd, &path, PATH_MAX)) < 0) {
+ if ((len = read(cfd, &remote, sizeof(remote))) < 0) {
perror(inet_ntoa(inet));
return -1;
}
- path[len] = '\0';
- printf("%s: %s\n", inet_ntoa(inet), path);
+ strncpy(local.path, remote.path, PATH_MAX);
/* compute sha512 hash for the given file... */
- if ((f = fopen(path, "r")) != NULL) {
- sha512(f, hash);
+ if ((f = fopen(local.path, "r")) != NULL) {
+ sha512(f, local.hash);
fclose(f);
}
+ local.mtime = gettimestamp(local.path);
+
+ printf("%s: %s\t%s\t%lu\n", inet_ntoa(inet), local.path, sha512_format(local.hash), local.mtime);
/* .. and send it to the client */
- write(cfd, hash, 64);
+ write(cfd, &local, sizeof(local));
close(cfd);
t@@ -215,10 +225,10 @@ client(in_addr_t host, in_port_t port, FILE *f, const char *fn)
int cfd;
ssize_t len = 0;
struct sockaddr_in clt;
- char path[PATH_MAX] = "";
- char buf[PATH_MAX + 64 + TIMESTAMP_MAX + 3] = "";
- unsigned char hash[64], rhash[64];
- char *fmt;
+ struct metadata_t local, remote;
+
+ memset(&local, 0, sizeof(local));
+ memset(&remote, 0, sizeof(remote));
if ((cfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("socket");
t@@ -235,21 +245,22 @@ client(in_addr_t host, in_port_t port, FILE *f, const char *fn)
return -1;
}
- /* we first send a filename to the server ... */
- snprintf(path, PATH_MAX, "%s", fn);
- len = strnlen(path, PATH_MAX);
- sha512(f, hash);
- fmt = sha512_format(hash);
- snprintf(buf, PATH_MAX + 64 + TIMESTAMP_MAX + 3, "%s\t%s\t%lu", path, fmt, gettimestamp(fn));
- printf("%s: %s\n", inet_ntoa(clt.sin_addr), buf);
- if ((len = write(cfd, path, len)) < 0) {
+ sha512(f, local.hash);
+ snprintf(local.path, PATH_MAX, "%s", fn);
+ local.mtime = gettimestamp(local.path);
+
+ if ((len = write(cfd, &local, sizeof(struct metadata_t))) < 0) {
perror("write");
return -1;
}
/* ... which should return the timestamp of this file */
- read(cfd, rhash, 64);
- printf("%s:%s\n", path, sha512_compare(hash, rhash)?"NOT SYNKED":"SYNKED");
+ if ((len = read(cfd, &remote, sizeof(struct metadata_t))) < 0) {
+ perror("write");
+ return -1;
+ }
+
+ printf("%s\t%s\n", local.path, sha512_compare(local.hash, remote.hash)?"NOT SYNKED":"SYNKED");
close(cfd);