}
}
-int flist_add(struct flist *flist, const char *fname, int contents)
+int flist_add(struct flist *flist, const char *name, const char *path, int contents)
{
FILE *fp;
struct proto_file_entry fent;
return -1;
}
- if(!(fp = fopen(fname, "rb"))) {
- fprintf(stderr, "flist_add: failed to open file: %s: %s\n", fname, strerror(errno));
+ if(!(fp = fopen(path, "rb"))) {
+ fprintf(stderr, "flist_add: failed to open file: %s: %s\n", path, strerror(errno));
return -1;
}
fstat(fileno(fp), &st);
fent.size = st.st_size;
fent.mtime = st.st_mtime;
- namelen = datalen = strlen(fname);
+ namelen = datalen = strlen(name);
if(contents) {
datalen += fent.size;
}
- if(flist->flist->num_files >= flist->max_files) {
+ if(!flist->flist || flist->flist->num_files >= flist->max_files) {
struct proto_flist *tmp;
int newsz = flist->max_files ? flist->max_files << 1 : 32;
fprintf(stderr, "flist_add: failed to resize file list to %d entries\n", newsz);
return -1;
}
+ if(!flist->flist) {
+ tmp->num_files = 0;
+ }
flist->flist = tmp;
flist->max_files = newsz;
}
fent.nameoffs = flist->data_sz;
fent.namelen = namelen;
dptr = flist->data + flist->data_sz;
- memcpy(dptr, fname, namelen);
+ memcpy(dptr, name, namelen);
md5_begin(&md);
if(contents) {
flist->final_size = newsz;
return 0;
}
+
+int read_line(int s, char *buf, int bufsz)
+{
+ char *ptr = buf;
+ while(bufsz > 1 && read(s, ptr, 1) > 0 && *ptr++ != '\n');
+ *ptr = 0;
+ return ptr == buf ? -1 : 0;
+}
+
+int read_resp(int s)
+{
+ int sz, msglen = 0;
+ char buf[64];
+ char *ptr;
+
+ while(msglen < 3 && (sz = read(s, buf + msglen, 3 - msglen)) > 0) {
+ msglen += sz;
+ }
+ if(msglen < 3) return -1;
+
+ if(memcmp(buf, "ERR", 3) == 0) {
+ return -1;
+ }
+
+ ptr = buf;
+ while(read(s, ptr, 1) > 0 && *ptr++ != '\n');
+ *ptr = 0;
+
+ return atoi(buf);
+}