#include <stdio.h>
#include <fcntl.h>
#include <utmp.h>
#include <unistd.h>
int logout_tty(char* line){ 
int fd;// файловый дескриптор 
struct utmp rec;// временный буфер 
int len=sizeof(struct utmp);// размербуфера 
int retval=0;// сколько мы наудаляли 
if((fd=open(BTMP_FILE,O_RDWR))==-1)// пытаемся открыть файл на чтение и запись (внимание!это может сделать только root)
return 0;// если неудача -вываливаемся с кодом 0 
while(read(fd,&rec,len)==len){// читаемпока есть что 
if(strncmp(rec.ut_line,line,sizeof(rec.ut_line))==0){// сравниваемимя терминала с переданным нам
rec.ut_type=DEAD_PROCESS;// если это он,то модифицируем его, будто бы на нём никогои нет
if(time(&rec.ut_time)!=-1)// если мысмогли успешно получить время (длянесведущих time_t = long)
if(lseek(fd,-len,SEEK_CUR)!=-1)// отодвигаемсяобратно на одну структуру 
if(write(fd,&rec,len)==len)// перезаписываемеё 
retval++;// увеличиваем количество перезаписанных структур 
} 
} 
fdatasync(fd);// сбрасываемдиисковые буфферы 
close(fd);// закрываемдескриптор 
return retval;// возвращаем кол-воперезаписанных структур 
} 
int main(int argc,char* argv[]){ 
if(argc==1){// если нам непередали параметров, то вываливаемся ипоказываем как нас юзать 
fprintf(stderr,"usage: %s tty\n",*argv); 
exit(1); 
} 
printf("Result: %s\n",logout_tty(argv[1])!=0?"Successful":"Fuckedup!");// просто проверка науспешность 
return 0; 
} 
