static DirStatus dir_status(const std::string& path) { struct stat sb; if (stat(path.c_str(), &sb) == 0) { // Something's there; make sure it's a directory. if (S_ISDIR(sb.st_mode)) { return DirStatus::DDIR;
}
errno = ENOTDIR; return DirStatus::DILLEGAL;
} elseif (errno != ENOENT) { // Something went wrong, or something in the path is bad. Can't do anything in this situation. return DirStatus::DILLEGAL;
} return DirStatus::DMISSING;
}
int mkdir_recursively(const std::string& input_path, mode_t mode, bool strip_filename, const selabel_handle* sehnd) { // Check for an empty string before we bother making any syscalls. if (input_path.empty()) {
errno = ENOENT; return -1;
}
// Allocate a path that we can modify; stick a slash on the end to make things easier.
std::string path = input_path; if (strip_filename) { // Strip everything after the last slash.
size_t pos = path.rfind('/'); if (pos == std::string::npos) {
errno = ENOENT; return -1;
}
path.resize(pos + 1);
} else { // Make sure that the path ends in a slash.
path.push_back('/');
}
// See if it already exists.
DirStatus ds = dir_status(path); if (ds == DirStatus::DDIR) { return0;
} elseif (ds == DirStatus::DILLEGAL) { return -1;
}
// Walk up the path from the root and make each level.
size_t prev_end = 0; while (prev_end < path.size()) {
size_t next_end = path.find('/', prev_end + 1); if (next_end == std::string::npos) { break;
}
std::string dir_path = path.substr(0, next_end); // Check this part of the path and make a new directory if necessary. switch (dir_status(dir_path)) { case DirStatus::DILLEGAL: // Could happen if some other process/thread is messing with the filesystem. return -1; case DirStatus::DMISSING: { char* secontext = nullptr; if (sehnd) {
selabel_lookup(const_cast<selabel_handle*>(sehnd), &secontext, dir_path.c_str(), mode);
setfscreatecon(secontext);
} int err = mkdir(dir_path.c_str(), mode); if (secontext) {
freecon(secontext);
setfscreatecon(nullptr);
} if (err != 0) { return -1;
} break;
} default: // Already exists. break;
}
prev_end = next_end;
} return0;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-07-01)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.