void ResourceBuilder::scan(Scanner next)
{
bool first = true;
-
+
while (FTSENT *ent = fts_read(mFTS)) {
static const char ds_store[] = ".DS_Store";
- const char *relpath = ent->fts_path + mRoot.size() + 1; // skip prefix + "/"
+ const char *relpath = ent->fts_path + mRoot.size(); // skip prefix
+
+ if (strlen(relpath) > 0) {
+ relpath += 1; // skip "/"
+ }
+
std::string rp;
if (mRelBase != mRoot) {
assert(mRelBase == mRoot + "/Contents");
secinfo("rdirenum", "entering %s", ent->fts_path);
GKBIS_Num_dirs++;
- if (!first) { // skip root directory (relpath invalid)
+ if (!first) { // skip root directory
if (Rule *rule = findRule(relpath)) {
if (rule->flags & nested) {
if (strchr(ent->fts_name, '.')) { // nested, has extension -> treat as nested bundle
}
if (!bestRule || rule->weight > bestRule->weight)
bestRule = rule;
+
+
+#if TARGET_OS_WATCH
+/* rdar://problem/30517969 */
+ if (bestRule && bestRule->weight == rule->weight && !(bestRule->flags & omitted) && (rule->flags & omitted))
+ bestRule = rule;
+#endif
}
}
secinfo("rscan", "choosing %s (%d,0x%x)",
fd.fcntl(F_NOCACHE, true); // turn off page caching (one-pass)
RefPointer<DynamicHash> hasher(CodeDirectory::hashFor(type));
hashFileData(fd, hasher.get());
- Hashing::Byte digest[hasher->digestLength()];
- hasher->finish(digest);
- return CFDataCreate(NULL, digest, sizeof(digest));
+ vector<Hashing::Byte> digest_vector(hasher->digestLength());
+ hasher->finish(digest_vector.data());
+ return CFDataCreate(NULL, digest_vector.data(),
+ digest_vector.size() * sizeof(Hashing::Byte));
}
CFMutableDictionaryRef resultRef = result;
CodeDirectory::multipleHashFileData(fd, 0, types, ^(CodeDirectory::HashAlgorithm type, Security::DynamicHash *hasher) {
size_t length = hasher->digestLength();
- Hashing::Byte digest[length];
- hasher->finish(digest);
- CFDictionaryAddValue(resultRef, CFTempString(hashName(type)), CFTempData(digest, length));
+ vector<Hashing::Byte> digest_vector(length);
+ hasher->finish(digest_vector.data());
+ CFDictionaryAddValue(resultRef, CFTempString(hashName(type)), CFTempData(digest_vector.data(), length));
});
return result.yield();
}