From mboxrd@z Thu Jan 1 00:00:00 1970 From: kupcevic@sourceware.org Date: 24 Aug 2006 14:51:45 -0000 Subject: [Cluster-devel] conga/ricci/modules/storage PartitionTable.cpp ... Message-ID: <20060824145145.15087.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: conga Changes by: kupcevic at sourceware.org 2006-08-24 14:51:44 Modified files: ricci/modules/storage: PartitionTable.cpp parted_wrapper.cpp Log message: storage module: fix parted versioning differences Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/PartitionTable.cpp.diff?cvsroot=cluster&r1=1.3&r2=1.4 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/parted_wrapper.cpp.diff?cvsroot=cluster&r1=1.6&r2=1.7 --- conga/ricci/modules/storage/PartitionTable.cpp 2006/08/10 22:53:09 1.3 +++ conga/ricci/modules/storage/PartitionTable.cpp 2006/08/24 14:51:44 1.4 @@ -41,9 +41,9 @@ // check if a partition table is on the path list ids; - for (list::iterator iter = hds.begin(); + for (list::const_iterator iter = hds.begin(); iter != hds.end(); - iter ++) { + iter++) { try { Parted::partitions(*iter); ids.push_back(PT_PREFIX + *iter); --- conga/ricci/modules/storage/parted_wrapper.cpp 2006/08/10 22:53:09 1.6 +++ conga/ricci/modules/storage/parted_wrapper.cpp 2006/08/24 14:51:44 1.7 @@ -39,6 +39,8 @@ list& parts, long long begin, long long end); +static String +__probe_pt_execute(const String& pt_path); static list plain_partitions(const String& path, String& label, @@ -235,18 +237,11 @@ - -list -plain_partitions(const String& path, - String& label, - long long& disk_size) +String +__probe_pt_execute(const String& pt_path) { - list parts; - label = ""; - disk_size = 0; - vector args; - args.push_back(path); + args.push_back(pt_path); args.push_back("print"); args.push_back("-s"); String out, err; @@ -254,28 +249,57 @@ if (utils::execute(PARTED_BIN_PATH, args, out, err, status)) throw String("execute failed"); if (status) - throw String("parted failed") + " " + path; + throw String("parted failed") + " " + pt_path; + return out; +} + +list +plain_partitions(const String& path, + String& label, + long long& disk_size) +{ + list parts; + label = ""; + disk_size = 0; - vector lines = utils::split(utils::strip(out), "\n"); - for (vector::iterator iter = lines.begin(); + String parted_output = utils::strip(__probe_pt_execute(path)); + vector lines = utils::split(parted_output, "\n"); + for (vector::const_iterator iter = lines.begin(); iter != lines.end(); iter++) { vector words = utils::split(utils::strip(*iter)); if (words.size() < 3) continue; - if (words[0] == "Disk" && words[1] == "label" && words[2] == "type:") { - label = words[3]; + + // label + if ((words[0] == "Disk" && words[1] == "label" && words[2] == "type:") || + (words[0] == "Partition" && words[1] == "Table:")) { + label = words.back(); continue; } - if (words[0] == "Disk" && words[1] == "geometry" && words[5] == "megabytes") { - String size = words[4]; - String::size_type idx = size.find("-"); - if (idx != size.npos) { - size = size.substr(idx + 1); - disk_size = utils::to_long(size) * 1024 * 1024; - } + + // disk size + if (words[0] == "Disk" && words[1] == (path + ":")) { + disk_size = parted_size_to_bytes(words[2]); continue; } + if (words.size() > 4) { + if (words[0] == "Disk" && + words[1] == "geometry" && + words[2] == "for" && + words[3] == (path + ":")) { + String s = words[4]; + String::size_type idx = s.find("-"); + if (idx != s.npos) + s = s.substr(idx + 1); + else + s = words.back(); + disk_size = parted_size_to_bytes(s); + continue; + } + } + + // partition if (!isdigit(words[0][0])) continue; int partnum = utils::to_long(words[0]); @@ -283,7 +307,7 @@ long long end = parted_size_to_bytes(words[2]); bool bootable = false; PPType type = PPTprimary; - for (vector::iterator word_iter = words.begin(); + for (vector::const_iterator word_iter = words.begin(); word_iter != words.end(); word_iter++) { if (*word_iter == "boot") @@ -305,6 +329,8 @@ if (label.empty() || label == "loop") throw String("not a partition table"); + if (disk_size == 0) + throw String("disk_size == 0???"); return parts; } @@ -457,7 +483,7 @@ if (status) throw String("blockdev failed"); vector lines = utils::split(out, "\n"); - for (vector::iterator iter = lines.begin(); + for (vector::const_iterator iter = lines.begin(); iter != lines.end(); iter++) { vector words = utils::split(utils::strip(*iter)); @@ -519,7 +545,7 @@ // don't overwrite existing label bool in_use = false; try { - partitions(path); + __probe_pt_execute(path); // throws if empty (no PT or known FS) in_use = true; } catch ( ... ) {} if (in_use) @@ -638,7 +664,7 @@ String s = utils::to_lower(utils::strip(size_str)); long long multiplier; if (s.find("b") == s.npos) - multiplier = 1024 * 1024; // by old parted behavior. size is in MB + multiplier = 1024 * 1024; // by old parted behavior, size is in MB else { if (s.size() < 3) throw String("parted size has an invalid value: ") + s;