Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

utmp and other stuff

1 view
Skip to first unread message

Dmitry V. Gorozhankin

unread,
Nov 22, 1997, 3:00:00 AM11/22/97
to

Доброго дня тебе, о гуру! Взывает к твоей мудрости смертный, пытающийся
разобраться в некоторых вопросах. Так как опыта предыдущего не было, то
и вопросов много. Руководствуясь правилом: "Read the source, Luke" было
найдено следущее:

int main (int argc, char **argv) {

FILE *ut; /* /var/run/utmp */
struct utmp uts; /* utmp record */
{...}
ut = fopen(UTMP_FILE, "r");
while (fread(&uts, sizeof(uts), 1, ut))
if (((uts.ut_type == USER_PROCESS) && (uts.ut_name[0] != '\000'))
|| print_all) {
strncpy(user, uts.ut_user, UT_NAMESIZE);
{...}

Это писал, а черт, он в исходнике не написал кто он был при жизни. Hе суть
важно.

Руководствуясь правилом: "Чтение манов облагораживает" наблюдаем:

dallas:dvg[1]:/home/dvg [68] man getutent

NAME
getutent, getutid, getutline, pututline, setutent, endutent, utmpname
-
access utmp file entries

SYNOPSIS
#include <utmp.h>

struct utmp *getutent(void);
struct utmp *getutid(struct utmp *ut);
struct utmp *getutline(struct utmp *ut);

void pututline(struct utmp *ut);

void setutent(void);
void endutent(void);

void utmpname(const char *file);

DESCRIPTION
utmpname() sets the name of the utmp-format file for the other utmp
func-
tions to access. If utmpname() is not used to set the filename before
the
other functions are used, they assume _PATH_UTMP, as defined in
<paths.h>.

setutent() rewinds the file pointer to the beginning of the utmp file.
It
is generally a Good Idea to call it before any of the other functions.

endutent() closes the utmp file. It should be called when the user
code
is done accessing the file with the other functions.

getutent() reads a line from the current file position in the utmp
file.
It returns a pointer to a structure containing the fields of the line.


Пишем сами:

main(){

struct utmp *utp;
char user_name[UT_NAMESIZE + 1];

setutent();
while((utp = getutent()) != NULL){
if(utp->ut_type == USER_PROCESS && utp->ut_user[0] != '\000'){
strncpy(user_name, utp->ut_user, UT_NAMESIZE);
user_name[UT_NAMESIZE]=0;

/* Далее мы творим чего мы там хотели, это уже не важно для данного вопроса */

endutent();
return 0;
}

И вот вопрос: Этот дядя из первого исходника ;-) писал все через fread и очень
оно даже у него работает. Все что он использовал, так это struct utmp. Я читая
маны,
нашел этот пучок функций для работы с utmp. И использовал их, ибо как мне
показалось,
что накой же черт их писали если их не использовать. Работает оно и так и так,
но все
же какой способ более идеологически правильный? (любимое выражение в ru.linux
;-)

Прелесть первого способа -- сразу видно когда файл закончился. Во втором
варианте,
в мане хрен чего сказано про то, что возвращает getutent() в случае окончания
файла.
Если подразумевается, что NULL (вроде так и есть), то все ОК. Это дефаулт
возврат
NULL, если ничего не сказано специально?

Вопрос 2: В мане на utmp сказано, что в общем формат wtmp тот же и ведет его
init. Еще не успел попробовать, но мысль такова: utmpname("/var/adm/wtmp");
И далее этим же пучком функций помахать. Пройдет? Или мы имеем нечто отдельное
для
wtmp?

И последний вопрос: Все это разбирательство возникло благодаря попытке
написания
некого демона, который бы сидел и раз в n минут||часов смотрел, а не появился
ли
искомый пользователь на машине. Поскольку никогда ранее подобного не делал, то
что
гуру посоветует использовать, дабы этот демон будить время от времени. Можно,
конечно, его прицепить на rtc. Благо драйвер в ядре есть, но это вроде как-то
получается слишком накрученно. Ведь живут же обычные демоны и без rtc. Как
просыпаются демоны, если их только не толкают специально, как, например,
в случае с любыми сетевыми демонами? Предложите, какой-нибудь механизм.

Готовые исходники предлагать не надо, ибо пишется это просто ради
самообразования
и брать чужое готовое не интересно.

P.S. Буду очень рад услышать классические решения данного вопроса.
--

Dmitry V. Gorozhankin E-mail: d...@dallas.kharkov.ua
-= Dallas Station =- Fido : 2:461/5...@fidonet.org

Dmitry V. Gorozhankin

unread,
Nov 24, 1997, 3:00:00 AM11/24/97
to

On 22 Nov 1997 20:04:36 GMT, Dmitry V. Gorozhankin <d...@dallas.kharkov.ua>
wrote:

>И последний вопрос: Все это разбирательство возникло благодаря попытке
написания
>некого демона, который бы сидел и раз в n минут||часов смотрел, а не появился
ли
>искомый пользователь на машине. Поскольку никогда ранее подобного не делал, то
что
>гуру посоветует использовать, дабы этот демон будить время от времени. Можно,
>конечно, его прицепить на rtc. Благо драйвер в ядре есть, но это вроде как-то
>получается слишком накрученно. Ведь живут же обычные демоны и без rtc. Как
>просыпаются демоны, если их только не толкают специально, как, например,
>в случае с любыми сетевыми демонами? Предложите, какой-нибудь механизм.

Да уж, видать к вечеру совсем голова была задурена, когда это писал. Всем
кто ответил -- спасибо. Я уже нашел man sleep и это меня сильно возрадовало.
Если есть еще варианты, буду очень рад узнать.

Alexey Raschepkin

unread,
Nov 26, 1997, 3:00:00 AM11/26/97
to

Dmitry V. Gorozhankin wrote:
>
> Доброго дня тебе, о гуру! Взывает к твоей мудрости смертный, пытающийся
> разобраться в некоторых вопросах. Так как опыта предыдущего не было, то
> и вопросов много. Руководствуясь правилом: "Read the source, Luke" было
> найдено следущее:
>
> int main (int argc, char **argv) {
>
> FILE *ut; /* /var/run/utmp */
> struct utmp uts; /* utmp record */
> {...}
> ut = fopen(UTMP_FILE, "r");
> while (fread(&uts, sizeof(uts), 1, ut))
> if (((uts.ut_type == USER_PROCESS) && (uts.ut_name[0] != '\000'))
> || print_all) {
> strncpy(user, uts.ut_user, UT_NAMESIZE);
> {...}

>

> И вот вопрос: Этот дядя из первого исходника ;-) писал все через fread и очень
> оно даже у него работает. Все что он использовал, так это struct utmp. Я читая
> маны,
> нашел этот пучок функций для работы с utmp. И использовал их, ибо как мне
> показалось,
> что накой же черт их писали если их не использовать. Работает оно и так и так,
> но все
> же какой способ более идеологически правильный? (любимое выражение в ru.linux
> ;-)

IMHO пиши как тебе нравится :)
какая может быть идеология, ведь программирование - это исскуство :)


> в мане хрен чего сказано про то, что возвращает getutent() в случае окончания
> файла.
> Если подразумевается, что NULL (вроде так и есть), то все ОК. Это дефаулт

я когда-то использовал эти функции, точно не помню, но по-моему NULL.

>
> Вопрос 2: В мане на utmp сказано, что в общем формат wtmp тот же и ведет его
> init. Еще не успел попробовать, но мысль такова: utmpname("/var/adm/wtmp");

точно так

> И последний вопрос: Все это разбирательство возникло благодаря попытке
> написания
> некого демона, который бы сидел и раз в n минут||часов смотрел, а не появился
> ли
> искомый пользователь на машине. Поскольку никогда ранее подобного не делал, то
> что
> гуру посоветует использовать, дабы этот демон будить время от времени. Можно,
> конечно, его прицепить на rtc. Благо драйвер в ядре есть, но это вроде как-то
> получается слишком накрученно. Ведь живут же обычные демоны и без rtc. Как
> просыпаются демоны, если их только не толкают специально, как, например,
> в случае с любыми сетевыми демонами? Предложите, какой-нибудь механизм.

можно повесить на cron, а можно сделать следующее

while(do not exit){

/* do some useful work */

sleep(secs); /* or usleep(ms) */
}

ну ты понял :)

Regards

Dmitry V. Gorozhankin

unread,
Nov 28, 1997, 3:00:00 AM11/28/97
to

On Wed, 26 Nov 97 09:59:39 +0200, Alexey Raschepkin
<Alexey.R...@f400.n5020.z2.fidonet.org> wrote:

>IMHO пиши как тебе нравится :)
>какая может быть идеология, ведь программирование - это исскуство :)

;-) Понятно.

>можно повесить на cron, а можно сделать следующее
>
>while(do not exit){
>
> /* do some useful work */
>
> sleep(secs); /* or usleep(ms) */
>}
>
>ну ты понял :)

Ага, уже и сам догадался. Вот еще вопрос. Дайте, пожалуйста каноническое
определение
демона. Демон -- это программа не имеющая управляющего терминала, спящая в
основном
и пробуждающаяся при наступлении некоторых условий или по времени, имеющая PPID
== 1,
.... (добавьте что еще)

BTW, PPID == 1 получается у программы, которая fork'анулась, отец помер, а сын
остался
здравствовать и был отдан init'у. Это верный метод демона породить или нет?

Alexey Mahotkin

unread,
Nov 29, 1997, 3:00:00 AM11/29/97
to

hail

Monday November 24 1997 08:40, Dmitry V. Gorozhankin wrote to All:
DG> Да уж, видать к вечеру совсем голова была задурена, когда это писал.
DG> Всем кто ответил -- спасибо. Я уже нашел man sleep и это меня сильно
DG> возрадовало. Если есть еще варианты, буду очень рад узнать.
То есть ты теперь вечером будешь спать, да? И без мана было никак, да? гыгыгы

Пусть тени обходят тебя стороной // claw against sun

... The door is nearly shut

0 new messages