tMoving client/server part into functions - synk - synchronize files between hosts
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit e355d45e1f7b7db572874e8e0a5770470a42a0a6
 (DIR) parent d19f7b2d444e65f4d780ac3132968e432110ede9
 (HTM) Author: Willy <willyatmailoodotorg>
       Date:   Tue, 16 Aug 2016 08:48:11 +0200
       
       Moving client/server part into functions
       
       Diffstat:
         M synk.c                              |      47 ++++++++++++++++++-------------
         M synkd.c                             |      55 ++++++++++++++++++-------------
       
       2 files changed, 60 insertions(+), 42 deletions(-)
       ---
 (DIR) diff --git a/synk.c b/synk.c
       t@@ -22,23 +22,12 @@ usage(char *name)
        }
        
        int
       -main(int argc, char *argv[])
       +client(in_addr_t host, in_port_t port, const char *fn)
        {
                int cfd;
       -        char *argv0;
                size_t len = 0;
       -        uint16_t port = SERVER_PORT;
       -        uint32_t host = INADDR_LOOPBACK;
                struct sockaddr_in clt;
       -        char path[PATH_MAX] = "", ts[32] = "";
       -
       -        ARGBEGIN{
       -        case 'h': host = atol(EARGF(usage(argv0))); break;
       -        case 'p': port = atoi(EARGF(usage(argv0))); break;
       -        }ARGEND;
       -
       -        if (argc < 2)
       -                return 1;
       +        char path[PATH_MAX] = "", ts[PATH_MAX] = "";
                
                if ((cfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
                        perror("socket");
       t@@ -55,17 +44,37 @@ main(int argc, char *argv[])
                        return 1;
                }
        
       -        snprintf(path, PATH_MAX, "%s", argv[1]);
       +        snprintf(path, PATH_MAX, "%s", fn);
                len = strnlen(path, PATH_MAX);
       -        if (send(cfd, path, len, 0) < 0) {
       -                perror("send");
       +        printf("%s: %s\n", inet_ntoa(clt.sin_addr), path);
       +        if ((len = write(cfd, path, len)) < 0) {
       +                perror("write");
                        return -1;
                }
        
       -        send(cfd, "\n", 1, 0);
       -
       -        recv(cfd, ts, 32, 0);
       +        read(cfd, ts, PATH_MAX);
                printf("%s: %s\n", path, ts);
        
       +        close(cfd);
       +
       +        return 0;
       +}
       +
       +int
       +main(int argc, char *argv[])
       +{
       +        char *argv0;
       +        in_port_t port = SERVER_PORT;
       +        in_addr_t host = INADDR_LOOPBACK;
       +
       +        ARGBEGIN{
       +        case 'h': host = inet_network(EARGF(usage(argv0))); break;
       +        case 'p': port = atoi(EARGF(usage(argv0))); break;
       +        }ARGEND;
       +
       +        if (argc < 1)
       +                usage(argv0);
       +
       +        client(host, port, argv[0]);
                return 0;
        }
 (DIR) diff --git a/synkd.c b/synkd.c
       t@@ -29,29 +29,26 @@ void *
        handle_client(void *arg)
        {
                int i = 0;
       -        char buf, path[PATH_MAX] = "", ts[32] = "";
       +        char path[PATH_MAX] = "", ts[32] = "";
                size_t len = 0;
                struct stat sb;
                struct client_t *c = *(struct client_t **)arg;
        
                printf("%s: connected\n", inet_ntoa(c->in));
       -        while ((len = recv(c->fd, &buf, 1, 0)) > 0) {
       +        while ((len = read(c->fd, &path, PATH_MAX)) > 0) {
                        if (i > PATH_MAX) {
                                printf("%s: filename too long (>%d)\n", inet_ntoa(c->in), PATH_MAX);
                                break;
                        }
        
       -                if (buf == '\n' || buf == '\0') {
       -                        printf("%s: %s\n", inet_ntoa(c->in), path);
       -                        stat(path, &sb);
       -                        snprintf(ts, 32, "%lu", sb.st_mtim.tv_sec);
       -                        len = strnlen(ts, 32);
       -                        send(c->fd, ts, len, 0);
       -                        memset(path, 0, PATH_MAX);
       -                        i = 0;
       -                } else {
       -                        path[i++] = buf;
       -                }
       +                path[len] = '\0';
       +                printf("%s: %s\n", inet_ntoa(c->in), path);
       +                stat(path, &sb);
       +                snprintf(ts, 32, "%lu", sb.st_mtim.tv_sec);
       +                len = strnlen(ts, 32);
       +                write(c->fd, ts, len);
       +                memset(path, 0, PATH_MAX);
       +                i = 0;
                }
        
                close(c->fd);
       t@@ -86,20 +83,11 @@ loop(int sfd)
        }
        
        int
       -main(int argc, char *argv[])
       +server(in_addr_t host, in_port_t port)
        {
                int sfd;
       -        char *argv0;
       -        uint16_t port = LISTEN_PORT;
       -        uint32_t host = INADDR_LOOPBACK;
                struct sockaddr_in srv;
        
       -        ARGBEGIN{
       -        case 'p':
       -                port = atoi(EARGF(usage(argv0)));
       -                break;
       -        }ARGEND;
       -        
                if ((sfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
                        perror("socket");
                        return 1;
       t@@ -122,3 +110,24 @@ main(int argc, char *argv[])
        
                return loop(sfd);
        }
       +
       +int
       +main(int argc, char *argv[])
       +{
       +        char *argv0;
       +        in_port_t port = LISTEN_PORT;
       +        in_addr_t host = INADDR_LOOPBACK;
       +
       +        ARGBEGIN{
       +        case 'h':
       +                host = inet_network(EARGF(usage(argv0)));
       +                break;
       +        case 'p':
       +                port = atoi(EARGF(usage(argv0)));
       +                break;
       +        }ARGEND;
       +        
       +        server(host, port);
       +
       +        return 0;
       +}