int get_vss(BFILE *bfd, struct sbuf *sb, char **vssdata, size_t *vlen, struct conf **confs) { bsid sid; char *tmp=NULL; *vlen=0; while(!ensure_read(bfd, (char *)&sid, bsidsize, 0)) { int64_t s=0; if(!(tmp=(char *)realloc_w(tmp, (*vlen)+bsidsize, __func__))) goto error; memcpy(tmp+(*vlen), &sid, bsidsize); (*vlen)+=bsidsize; // dwStreamId==1 means start of backup data, so finish. if(sid.dwStreamId==1) { // logp("\n%s: %d + %d\n", // path, (int)sid.Size, (int)sid.dwStreamNameSize); bfd->datalen=sid.Size; break; } // Otherwise, need to read in the rest of the VSS header. s=(sid.Size)+(sid.dwStreamNameSize); if(!(tmp=(char *)realloc_w(tmp, (*vlen)+s, __func__)) || ensure_read(bfd, tmp+(*vlen), s, 1)) { goto error; return -1; } (*vlen)+=s; } if(!(*vssdata=(char *)realloc_w(*vssdata, (*vlen)+9, __func__))) goto error; snprintf(*vssdata, 9, "%c%08X", META_VSS, (unsigned int)*vlen); memcpy((*vssdata)+9, tmp, *vlen); (*vlen)+=9; return 0; error: if(tmp) free(tmp); if(*vssdata) { free(*vssdata); *vssdata=NULL; } *vlen=0; return -1; }
int szb_read8(szb_t *buf) { int r; assert(buf != NULL); ensure_read(buf, 1); r = buf->data[buf->pos]; buf->pos += 1; return r; }
static int dump_headers(FILE *inp) { struct bsid sid; while(!ensure_read(&sid, inp)) { size_t s=0; dump_sid(&sid); //if(sid.dwStreamId==1) break; s=(sid.Size)+(sid.dwStreamNameSize); if(skip_data(inp, s)) return -1; } return 0; }
static int main_work(FILE *inp, FILE *outp) { struct bsid sid; while(!ensure_read(&sid, inp)) { size_t s=0; s=(sid.Size)+(sid.dwStreamNameSize); if(sid.dwStreamId==1) { if(extract_data(inp, outp, s)) return 1; break; } else { if(skip_data(inp, s)) return -1; } } return 0; }