Чтение структур utmpx

FreeBSD, NetBSD, OpenBSD, DragonFly и т. д.

Модератор: arachnid

Ответить
Аватара пользователя
AlphaGh0St
Сообщения: 41

Чтение структур utmpx

Сообщение AlphaGh0St »

Всем привет!
Работаю с FreeBSD 9.2.
Столкнулся со следующей проблемой: пытаюсь вручную читать структуры utmpx из файлов:
/var/run/utx.active
/var/log/utx.lastlogin
/var/log/utx.log

На языке Си

Код: Выделить всё

fread(&tm, sizeof(struct utmpx), 1, fd)


Ведь в мануале говорится, что в этих файлах находятся именно utmpx структуры.
А на деле получается иначе. Вместо ожидаемой структуры, получаю хлам.
Просмотрел эти файлы вручную, и получил что-то невнятное. Все структуры разного размера, смещение между структурами тоже разное, да и на вид структуры из этих файлов не похожи на utmpx.

Вот пример такой структуры:
Изображение
И то, что находится в ней отличается от utmpx.

Но работая с системными функциями, например, getutxent, удаётся получить данные в структурах utmpx. Однако меня интересует чтение этих структур вручную.

Подскажите, что именно находится в этих фалах? Что за структуры?
Как их правильно считывать?

Благодарю.
Спасибо сказали:
Аватара пользователя
lastpriot
Сообщения: 218
ОС: FreeBSD

Re: Чтение структур utmpx

Сообщение lastpriot »

Все ответы в

Код: Выделить всё

/usr/src/lib/libc/gen/getutxent.c
/usr/src/lib/libc/gen/utxdb.c
/usr/src/lib/libc/gen/utxdb.р
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Чтение структур utmpx

Сообщение drBatty »

AlphaGh0St писал(а):
10.05.2014 17:16
Но работая с системными функциями, например, getutxent, удаётся получить данные в структурах utmpx. Однако меня интересует чтение этих структур вручную.

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

Т.е. если вы вручную будете читать, то ваш код неминуемо сломается с обновлением.
lastpriot писал(а):
10.05.2014 20:48
/usr/src/lib/libc/gen/getutxent.c

да. Но таки это плохой совет.

И да, как всегда: ИМХО.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
lastpriot
Сообщения: 218
ОС: FreeBSD

Re: Чтение структур utmpx

Сообщение lastpriot »

а почему "плохой"?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Чтение структур utmpx

Сообщение drBatty »

lastpriot писал(а):
10.05.2014 21:35
а почему "плохой"?

drBatty писал(а):
10.05.2014 21:27
реализация структур может меняться, именно для этого и предусмотрены функции, которые дают неизменный интерфейс.

т.е. если у вас сегодня поле в структуре int, то завтра оно станет long int, что сломает "ручной" код. Ну или свежий пример: указатель int*, он ещё недавно был в 32 бита, а сейчас уже почти везде 64 бита. Потому-то даже в стандарте появились такие типы как ptrdiff_t и size_t. Если программист использует функции с такими типами, у него ничего не ломается, а если использует(как хочет ТС) свои велосипеды, то у него рано или поздно всё накроется ☣.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Чтение структур utmpx

Сообщение drBatty »

PS: посмотрел указанный ТСом ман, так и есть, там полно char[], что представляет собой указатель. Естественно, данный указатель нужно разбирать по разному для IA-32 и amd64(хотя-бы), байтов там 4 и 8 соответственно. Ну и плюс всякое выравнивание и всё такое. Я так вообще не понимаю, где в файле лежат эти строки? По большому счёту, эта структура внутри файла не имеет смысла, т.к. указатель по определению указывает на память, а не на файл. Что ТС хотел добиться -- неясно.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
lastpriot
Сообщения: 218
ОС: FreeBSD

Re: Чтение структур utmpx

Сообщение lastpriot »

взято с /usr/src/lib/libc/gen/utxdb.h

Код: Выделить всё

struct futx {
        uint8_t         fu_type;
        uint64_t        fu_tv;
        char            fu_id[8];
        uint32_t        fu_pid;
        char            fu_user[32];
        char            fu_line[16];
        char            fu_host[128];
} __packed;

Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Чтение структур utmpx

Сообщение drBatty »

lastpriot
а вот тут написано:

Код: Выделить всё

struct utmpx    {
           short       ut_type;    /* Type of entry. */
           struct timeval  ut_tv;      /* Time entry was made. */
           char           ut_id[];    /* Record identifier. */
           pid_t       ut_pid;     /* Process ID. */
           char           ut_user[];  /* User login name. */
           char           ut_line[];  /* Device name. */
           char           ut_host[];  /* Remote hostname. */
       };

т.е. размер массивов не определён в *.h файле, а значит может как угодно меняться.

Впрочем, не буду спорить, себе дороже. Я вас предупреждал, делайте как хотите.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
lastpriot
Сообщения: 218
ОС: FreeBSD

Re: Чтение структур utmpx

Сообщение lastpriot »

в хедере массив определен
http://svnweb.freebsd.org/base/release/9.2.0/include/utmpx.h

а вот в мане - нет, недоработка
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Чтение структур utmpx

Сообщение drBatty »

lastpriot писал(а):
11.05.2014 00:03
в хедере массив определен

ваше упорство и в мирных целях...

Ну и что, что определён? Оно может измениться в любой момент. Потому и в мане этого нет, потому и есть функции специальные, которыми вы пользоваться не хотите.

Это как в маздае: делают "вручную, чтоб быстрее", а потом всё ломается. Или одну и ту же ОС юзают по 15 лет, ибо в другой ваш г-но код не работает.

Делайте как хотите.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ответить