+ 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; i<flist->num_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;
+ }
+