diff --git a/tools/cpiod/cpio.cc b/tools/cpiod/cpio.cc index ccf846fe678e262d5417e1dcc6c3b777fbd961ae..9e1603adcf8181000a2f7ac3ed05cf238e127554 100644 --- a/tools/cpiod/cpio.cc +++ b/tools/cpiod/cpio.cc @@ -96,6 +96,13 @@ bool cpio_in::parse_one(istream& is, cpio_in& out) out.add_file(name, file); break; } + case C_ISLNK: { + unique_ptr<char[]> targetbuf{new char[filesize]}; + is.read(targetbuf.get(), filesize); + string target{targetbuf.get(), filesize}; + out.add_symlink(name, target); + break; + } default: cout << name << ": unknown type " << type << "\n"; is.ignore(filesize); diff --git a/tools/cpiod/cpio.hh b/tools/cpiod/cpio.hh index b2fb732384c7e64e068db4e1fd2df14cf001142a..1ee6c8b6264f8d45acffb7d7ae5bc83e4f93d65c 100644 --- a/tools/cpiod/cpio.hh +++ b/tools/cpiod/cpio.hh @@ -18,6 +18,7 @@ class cpio_in { public: virtual ~cpio_in(); virtual void add_file(std::string name, std::istream& is) = 0; + virtual void add_symlink(std::string oldpath, std::string newpath) = 0; public: static void parse(std::istream& is, cpio_in& out); private: diff --git a/tools/cpiod/cpiod.cc b/tools/cpiod/cpiod.cc index 3d6d3a07b51400465ec9d508adace70e51aa4b9b..e6a66ad1461d239ac69830e7c445de23cd340807 100644 --- a/tools/cpiod/cpiod.cc +++ b/tools/cpiod/cpiod.cc @@ -34,6 +34,9 @@ public: ofstream os(name); os << is.rdbuf(); } + virtual void add_symlink(string oldpath, string newpath) override { + cout << "Skipping symlink " << oldpath << "...\n"; + } private: std::string _prefix;