diff options
author | Peng Fan <van.freenix@gmail.com> | 2013-08-29 19:41:23 +0800 |
---|---|---|
committer | Peng Fan <van.freenix@gmail.com> | 2013-08-29 19:41:23 +0800 |
commit | 1d2c9b7f8001c21c472c7da8a18739c3d48a5718 (patch) | |
tree | 8a6b7d59a6d0f6713530fdc18a0b25b4ce41f99c /rld-files.cpp | |
parent | 7f982b32bd276d08c5273353073cc6958aaaecac (diff) |
Fix archive writer
1. align to even address
2. Fix the use of GElf_Ehdr and Elf32_Ehdr
3. Fix the header related
Diffstat (limited to 'rld-files.cpp')
-rw-r--r-- | rld-files.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/rld-files.cpp b/rld-files.cpp index 45a10bd..e10abb5 100644 --- a/rld-files.cpp +++ b/rld-files.cpp @@ -777,7 +777,7 @@ namespace rld archive::add_object (objects& objs, const char* path, off_t offset, size_t size) { const char* end = path; - while ((*end != '\0') && (*end != '/')) + while ((*end != '\0') && (*end != '/') && (*end != '\n')) ++end; std::string str; @@ -843,12 +843,16 @@ namespace rld { object& obj = *(*oi); const std::string& oname = basename (obj.name ().oname ()); - if (oname.length () > rld_archive_fname_size) + if (oname.length () >= rld_archive_fname_size) extended_file_names += oname + '\n'; } if (!extended_file_names.empty ()) { + if (extended_file_names.length () & 1) + { + extended_file_names += ' '; + } write_header ("//", 0, 0, 0, 0, extended_file_names.length ()); write (extended_file_names.c_str (), extended_file_names.length ()); } @@ -870,7 +874,7 @@ namespace rld * table if the file name is too long for the header. */ - if (oname.length () > rld_archive_fname_size) + if (oname.length () >= rld_archive_fname_size) { size_t pos = extended_file_names.find (oname + '\n'); if (pos == std::string::npos) @@ -879,10 +883,13 @@ namespace rld oss << '/' << pos; oname = oss.str (); } + else oname += '/'; - write_header (oname, 0, 0, 0, 0666, obj.name ().size ()); + write_header (oname, 0, 0, 0, 0666, (obj.name ().size () + 1) & ~1); obj.seek (0); copy_file (obj, *this); + if (obj.name ().size () & 1) + write ("\n", 1); } catch (...) { |