cfgopen()

Открыть конфигурационный файл

Прототип:

#include <cfgopen.h>
int cfgopen( const char *path,
unsigned flags,
const char *historical,
char *namebuf,
int nblen );

Аргументы:

path
Имя конфигурационного файла, который нужно открыть.
flags
Флаги, управляющие открытием.
historical
Необязательный файл, который следует открыть в крайнем случае, если не выполняется ни один критерий поиска. Данная строка используется как определение порядка поиска пути и дает возможность выполнить поиск более, чем в одном месте. Можно также указать %H для подстановки имени хоста в строку. Следует установить в NULL для игнорирования опции.
namebuf
Буфер, в котором нужно сохранить путь к файлу. Следует установить в NULL для игнорирования опции.
nblen
Длина буфера, на который указывает namebuf. Следует установить в 0 для игнорирования опции.

Библиотека:

libc

Описание:

Функция cfgopen() открывает конфигурационный файл, определяемый в path. Данная функция является оберткой open() и имеет возможность выполнять поиск в нескольких системных локациях на основе заданных характеристик.

Значение flags соответствует стандартным флагам open() и имеет те же ограничения. Значение flags создается путем побитового ИЛИ из значений из списка, определенного в заголовочном файле <cfgopen.h> . Приложения должны устанавливать только один режим доступа к файлу для значения flag:

CFGFILE_RDONLY
Открыть только для чтения.
CFGFILE_RDWR
Открыть для чтения и записи.
CFGFILE_WRONLY
Открыть только для записи.

В значение flag можно включить любые комбинации следующих битов:

CFGFILE_APPEND
Если установлен, смещение файла устанавливается в конец файла перед каждой операцией записи.
CFGFILE_CREAT
Если файл не существует, то создается с режимом 0644, идентификатор пользователя устанавливается в эффективный идентификатор пользователя процесса, идентификатор группы устанавливается в эффективный идентификатор группы процесса или идентификатор группы родительской директории файла (смотрите chmod()).
CFGFILE_EXCL
Если флаги CFGFILE_EXCL и CFGFILE_CREAT установлены, и файл существует, cfgopen() завершается с ошибкой. Проверка существования и создания файла, если он не существует, является атомарной операцией по отношению к другим процессам, пытающимся выполнить те же операции с тем же именем файла. Установка CFGFILE_EXCL без CFGFILE_CREAT не имеет никакого эффекта.
CFGFILE_TRUNC
Если файл существует и является обычным, при этом файл успешно открыт с CFGFILE_WRONLY или CFGFILE_RDWR, длина файла усекается до нуля, а режим и владелец остаются неизменными. CFGFILE_TRUNC не имеет эффекта для FIFO или блочных или специальных символьных файлов или директорий. Использование CFGFILE_TRUNC с CFGFILE_RDONLY не имеет эффекта.

Флаги условий поиска

Чтобы указать функции, где искать или создавать (в случае of CFGFILE_CREAT) path, есть следующие биты, которые можно установить с помощью ИЛИ в значении flags. Если биты установлены, они задают следующий порядок поиска:

  1. CFGFILE_USER_NODE
    $HOME/.cfg/node_name/path
  2. CFGFILE_USER
    $HOME/.cfg/path
  3. CFGFILE_NODE
    /etc/host_cfg/node_name/path
  4. CFGFILE_GLOBAL
    path

где node_name - значение, получаемое с помощью вызова confstr() для CS_HOSTNAME.


Note: Если директория /etc/host_cfg не существует в системе, следующие flags автоматически изменяются:
  • CFGFILE_USER_NODE становится CFGFILE_USER
  • CFGFILE_NODE становится CFGFILE_GLOBAL

При создании или открытии файла для записи можно установить только один из описанных выше флагов расположения. Установите CFGFILE_NOFD, если необходим только путь к файлу, а файловый дескриптор не нужен. Если директория пути не существует при создании файла, cfgopen() попытается создать путь.

Возвращаемое значение:

Корректный файловый дескриптор, если CFGFILE_NOFD не установлен, неотрицательное значение, если CFGFILE_NOFD установлен, -1 в случае возникновения ошибки.

Классификация:

ЗОСРВ «Нейтрино»

Безопасность использования
Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

confstr(), fcfgopen(), open()




Предыдущий раздел: Описание API системной библиотеки