bool Dorade::writeSwpfile() { // Check the byte order if (!machineBigEndian()) { swap_bytes = true; } QByteArray ba = filename.toLocal8Bit(); const char* ccfilename = ba.constData(); int flag = 0; sweepwrite(ccfilename, ssptr, vptr, rptr, cptr, cfptr, pptr, sptr, ryptr, aptr, dptr, flag); return true; }
bool Dorade::writeDoradefile(const QString& doradeFilename) { // Check the byte order if (!machineBigEndian()) { swap_bytes = true; } // Change the output file to a dorade file filename = doradeFilename; QByteArray ba = filename.toLocal8Bit(); const char* ccfilename = ba.constData(); int flag = 1; sweepwrite(ccfilename, ssptr, vptr, rptr, cptr, cfptr, pptr, sptr, ryptr, aptr, dptr, flag); return true; }
bool Dorade::writeSwpfile(const QString& newfilename) { // Check the byte order if (!machineBigEndian()) { swap_bytes = true; } // Add a suffix to indicate we've modified the file filename = newfilename; QByteArray ba = filename.toLocal8Bit(); const char* ccfilename = ba.constData(); int flag = 0; sweepwrite(ccfilename, ssptr, vptr, rptr, cptr, cfptr, pptr, sptr, ryptr, aptr, dptr, flag); return true; }
static char * sweepblock(LogfsServer *server, uchar *buf) { char *errmsg; LogSegment *active = server->activelog; LogSegment *swept = server->sweptlog; int pagesize, ppb, page; LogfsLowLevel *ll = server->ll; LogfsLowLevelReadResult llrr; int markedbad; long oblock; if(active == nil) return nil; if(swept == nil) { errmsg = logfslogsegmentnew(server, loggensucc(active->gen), &server->sweptlog); if(errmsg) return errmsg; swept = server->sweptlog; } /* * if this is last block in the active log, flush it, so that the read of the last page works */ if(active->unsweptblockindex == active->curblockindex) logfslogsegmentflush(server, 1); ppb = (1 << ll->l2pagesperblock); pagesize = (1 << ll->l2pagesize); for(page = 0; page < ppb; page++) { uchar *p, *bufend; errmsg = (*ll->readpagerange)(ll, buf, active->blockmap[active->unsweptblockindex], page, 0, pagesize, &llrr); if(errmsg) goto fail; if(llrr != LogfsLowLevelReadResultOk) logfsserverreplacelogblock(server, active, active->unsweptblockindex); p = buf; if(*p == 0xff) break; bufend = p + pagesize; while(p < bufend) { int action; uint size; LogMessage s; Entry *e; int trim; size = logfsconvM2S(p, bufend - p, &s); if(size == 0) return "parse failure"; if(server->trace > 1) { print("A>> "); logfsdumpS(&s); print("\n"); } if(s.type == LogfsLogTend) break; action = ThrowAway; switch(s.type) { case LogfsLogTstart: break; case LogfsLogTcreate: errmsg = sweepcreate(server, &s, &action); break; case LogfsLogTremove: /* always obsolete; might check that path really doesn't exist */ break; case LogfsLogTtrunc: /* always obsolete, unless collecting out of order */ break; case LogfsLogTwrite: errmsg = sweepwrite(server, &s, s.u.write.data ? s.u.write.data - buf : 0, &e, &trim, &action); break; case LogfsLogTwstat: /* always obsolete, unless collecting out of order */ break; default: return "bad tag in log page"; } if(action == Error) return errmsg; if(errmsg) print("bad sweep: %s\n", errmsg); if(action == Keep) action = Repack; /* input buffer has been wrecked, so can't just copy it */ if(action == Keep) { /* write 'size' bytes to log */ errmsg = logfslogbytes(server, 0, p, size); if(errmsg) goto fail; } else if(action == Repack) { /* TODO - handle writes */ if(s.type == LogfsLogTwrite && s.u.write.data) { FixupState state; errmsg = logfslogwrite(server, 0, s.path, s.u.write.offset + trim, s.u.write.count - trim, s.u.write.mtime, s.u.write.cvers, s.u.write.muid, s.u.write.data + trim, &state.newflashaddr); if(errmsg == nil && s.u.write.data != nil) { Extent extent; /* TODO - deal with a failure to write the changes */ state.oldoffset = s.u.write.data - buf + trim; state.server = server; extent.min = s.u.write.offset; extent.max = extent.min + s.u.write.count; extent.flashaddr = s.u.write.flashaddr; logfsextentlistmatchall(e->u.file.extent, fixup, &state, &extent); } } else errmsg = logfslog(server, 0, &s); if(errmsg) goto fail; } p += size; } } /* * this log block is no longer needed */ oblock = active->blockmap[active->unsweptblockindex++]; errmsg = logfsbootfettleblock(server->lb, oblock, LogfsTnone, ~0, &markedbad); if(errmsg) goto fail; if(active->unsweptblockindex > active->curblockindex) { /* * the activelog is now empty, so make the sweptlog the active one */ logfslogsegmentfree(&active); server->activelog = swept; server->sweptlog = nil; swept->dirty = 0; } return nil; fail: return errmsg; }