Редактирование записи / etc / fstab в C ++ - PullRequest
2 голосов
/ 07 декабря 2010

Я пытаюсь отредактировать файл /etc/fstab в установке CentOS с использованием C ++.Идея заключается в том, что на основе другого файла конфигурации я буду добавлять записи, которые не существуют в fstab, или редактировать записи в файле fstab, где точка монтирования совпадает.Это позволяет нам правильно настроить систему при начальной загрузке.

Я нашел setmntent() и getmntent() для перебора выходных записей, поэтому я могу легко проверить, существует ли запись в fstab также в моей конфигурациифайл.И затем я могу использовать addmntent(), чтобы добавить любую запись, которая еще не существует - в документации ничего не говорится о том, что она может редактировать запись, а только добавить новую запись в конец файла.Кажется, нет никакого способа отредактировать существующую запись или удалить запись.Кажется странным, что эта функция не существует, только CR, а не UD CRUD.

Я бы предпочел не писать свой собственный синтаксический анализатор, если вообще смогу помочь.

Моя другая альтернатива:

  • открыть файл с помощью setmntent()
  • прочитать весь fstab в память с помощью getmentent() и выполнить любые добавления и / или правки
  • закрыть файл, используя endmntent()
  • открыть /etc/fstab для записи
  • закрыть /etc/fstab (таким образом очистив файл)
  • открыть файл fstab, используяsetmntent()
  • прокручивает записи, которые я прочитал ранее, и записывает их, используя addmntent()

Что, хотя, вероятно, хорошо, просто кажется немного грязным.

1 Ответ

5 голосов
/ 07 декабря 2010

При изменении файлов конфигурации системы, таких как /etc/fstab, имейте в виду, что это критическое состояние, и если ваше «редактирование» будет прервано из-за потери питания, это может привести к невозможности перезагрузки.
Способ справиться с этим:

  1. создать пустой вывод:
    FILE* out = setmntent("/etc/fstab.new", "rw");
  2. открыть оригинал для ввода:
    FILE* in = setmntent("/etc/fstab", "r");
  3. скопировать содержимое:
    while (m = getmntent(in)) { addmntent(out, m); }
  4. убедитесь, что в выводе есть все:
    fflush(out); endmntent(out); endmntent(in);
  5. атомно заменить /etc/fstab:
    rename("/etc/fstab.new", "/etc/fstab");

В качестве упражнения читателю предлагается изменить тело цикла while, внести изменения в существующий элемент, заменить специально созданный mntent или что-то еще. Если у вас есть конкретные вопросы по этому вопросу, пожалуйста, задавайте.

UN * X семантика для rename() гарантирует, что даже в случае потери питания у вас будет либо оригинальная, либо новая обновленная версия.

Есть причина, по которой нет modifymntent() - потому что это будет способствовать плохому программированию / плохим способам изменения критических системных файлов. Вы говорите в конце своего поста "... вероятно, хорошо ..." - не . Единственный безопасный способ изменить файл конфигурации системы - написать полную измененную копию, синхронизировать ее в безопасном хранилище, а затем использовать переименование для замены старого.

...