«Не каталог» при написании конфигураций ядра - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь переключить IPv6 в системах Linux, используя эту функцию в Qt. Проблема в том, что он не может открыть файл и просто сообщает «Не каталог».

bool toggle_ipv6(const bool &enabled) {
    const std::vector<std::string> ipv6_kernel_option_files = {
        "/proc/sys/net/ipv6/conf/all/disable_ipv6"
        "/proc/sys/net/ipv6/conf/default/disable_ipv6"
        "/proc/sys/net/ipv6/conf/lo/disable_ipv6"
    };

    for (const auto &filename: ipv6_kernel_option_files) {
        QFile kernel_option_file( filename.c_str() );
        if ( kernel_option_file.open(QIODevice::WriteOnly) ) {
            QTextStream stream(&kernel_option_file);
            stream << (enabled ? "0" : "1");
            kernel_option_file.close();
        } else {
            const std::string error_message = kernel_option_file.errorString().toStdString();
            qDebug().nospace().noquote() << '[' << QTime::currentTime().toString() << "]: " << error_message.c_str();
            return false;
        }
    }

    return true;
}

Я попытался выполнить поиск в Интернете, но не могу найти других проблем, связанных с QFile и этим конкретным сообщением об ошибке. Как я могу это исправить?

1 Ответ

1 голос
/ 17 октября 2019

Запятые отсутствуют при инициализации вектора:

const std::vector<std::string> ipv6_kernel_option_files = {
    "/proc/sys/net/ipv6/conf/all/disable_ipv6"
    "/proc/sys/net/ipv6/conf/default/disable_ipv6"
    "/proc/sys/net/ipv6/conf/lo/disable_ipv6"
};

Следовательно, в векторе есть только один элемент, представляющий собой строку из трех путей, объединенных:

"/proc/sys/net/ipv6/conf/all/disable_ipv6/proc/sys/net/ipv6/conf/default/disable_ipv6/proc/sys/net/ipv6/conf/lo/disable_ipv6"

Учитывая, что

"/proc/sys/net/ipv6/conf/all/disable_ipv6"

- это файл, а не каталог, он не может содержать остальную часть пути.

Используйте запятые для разделения путей в векторной инициализации:

const std::vector<std::string> ipv6_kernel_option_files = {
    "/proc/sys/net/ipv6/conf/all/disable_ipv6",
    "/proc/sys/net/ipv6/conf/default/disable_ipv6",
    "/proc/sys/net/ipv6/conf/lo/disable_ipv6"
};
...