X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=reposerve;a=blobdiff_plain;f=client%2Fsrc%2Fmain.c;h=b76ef5040ffa661dcf7723c3ee421a4d24548d94;hp=a4c3cf55fc7e8622fa713a2d00694b47463ebdef;hb=8f61a4a76806a3788f817d8833ac77a34c76484f;hpb=9aae937f30532ce26191c0380706b9250e0819ca diff --git a/client/src/main.c b/client/src/main.c index a4c3cf5..b76ef50 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -7,12 +7,18 @@ #include #include #include +#include "proto.h" + int main(int argc, char **argv) { - int s; + int i, s, sz; struct sockaddr_in addr; struct hostent *host; + char *resp, *ptr; + int resp_size, pending; + struct proto_flist *flist; + char buf[256]; if((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("failed to create socket"); @@ -27,13 +33,65 @@ int main(int argc, char **argv) memset(&addr, 0, sizeof addr); addr.sin_family = AF_INET; addr.sin_port = htons(64357); - addr.sin_addr.s_addr = inet_addr(host->h_addr); + addr.sin_addr.s_addr = *(in_addr_t*)host->h_addr; + + printf("Connecting to %s ...\n", inet_ntoa(addr.sin_addr)); if(connect(s, (struct sockaddr*)&addr, sizeof addr) == -1) { fprintf(stderr, "Failed to connect to %s: %s\n", argv[1], strerror(errno)); return 1; } + if(read_line(s, buf, sizeof buf) == -1) { + fprintf(stderr, "Failed to read server identifier\n"); + return 1; + } + if(memcmp(buf, "reposerve-", 10) != 0) { + fprintf(stderr, "Protocol error, doesn't seem we're talking to reposerve at the other end\n"); + return 1; + } + + write(s, "flist\n", 6); + shutdown(s, SHUT_WR); + + if((resp_size = read_resp(s)) == -1) { + fprintf(stderr, "flist request failed\n"); + return -1; + } + if(!resp_size) { + fprintf(stderr, "flist response empty\n"); + return 0; + } + + if(!(resp = malloc(resp_size))) { + fprintf(stderr, "failed to allocate response buffer (%d bytes)\n", resp_size); + return -1; + } + ptr = resp; + pending = resp_size; + while(pending > 0 && (sz = read(s, ptr, pending)) > 0) { + pending -= sz; + ptr += sz; + } + if(pending > 0) { + fprintf(stderr, "failed to read complete response (%d/%d bytes)\n", + resp_size - pending, resp_size); + free(resp); + return -1; + } + + /* parse response */ + flist = (struct proto_flist*)resp; + ptr = resp + sizeof *flist + (flist->num_files - 1) * sizeof *flist->files; + for(i=0; inum_files; i++) { + char *name = ptr + flist->files[i].nameoffs; + int tmp = name[flist->files[i].namelen]; + name[flist->files[i].namelen] = 0; + + printf("%s\n", name); + name[flist->files[i].namelen] = tmp; + } + close(s); return 0; }