// Implement the 'x' operation. This function extracts files back to the file // system. static void doExtract(StringRef Name, object::Archive::child_iterator I) { // Retain the original mode. sys::fs::perms Mode = I->getAccessMode(); SmallString<128> Storage = Name; int FD; failIfError( sys::fs::openFileForWrite(Storage.c_str(), FD, sys::fs::F_None, Mode), Storage.c_str()); { raw_fd_ostream file(FD, false); // Get the data and its length StringRef Data = I->getBuffer(); // Write the data. file.write(Data.data(), Data.size()); } // If we're supposed to retain the original modification times, etc. do so // now. if (OriginalDates) failIfError( sys::fs::setLastModificationAndAccessTime(FD, I->getLastModified())); if (close(FD)) fail("Could not close the file"); }
// Implements the 'p' operation. This function traverses the archive // looking for members that match the path list. static void doPrint(StringRef Name, object::Archive::child_iterator I) { if (Verbose) outs() << "Printing " << Name << "\n"; StringRef Data = I->getBuffer(); outs().write(Data.data(), Data.size()); }