problem z utmpx'em
Andrzej Szombierski
qq w kuku.eu.org
Czw, 30 Maj 2002, 17:10:22 CEST
On Thu, 30 May 2002, ebola wrote:
>
> Jest jakis sposob zeby to ominac, poprawic, naprawic... ?
>
>
> ________________________
> http://lists.pld.org.pl/
>
W załączniku mały program, który sprząta utmpx. Co prawda to trochę
prowizoryczne rozwiązanie, ale działa :)
Andrzej Szombierski
anszom w v-lo.krakow.pl / qq w kuku.eu.org / anszom w klub.chip.pl
-------------- następna część ---------
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <utmp.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pwd.h>
int check_entry(struct utmp * ut)
{
char buf[100];
struct stat st;
struct passwd * pwd;
int s;
pwd=getpwnam(ut->ut_user);
if(!pwd)return 1;
snprintf(buf,100,"/proc/%d/",ut->ut_pid);
s=stat(buf,&st);
if(s)return 2;
if(st.st_uid!=pwd->pw_uid && st.st_uid!=0)return 3;
return 0;
}
char * msgs[]={"","Nonexistent user","Dead process","Owner mismatch"};
int main(int ac, char ** av)
{
int clean=1;
int justcheck=0;
int fd;
char * file="/var/run/utmpx";
if(ac>1)file=av[1];
fd=open(file,O_RDWR,0);
if(fd<0){
fd=open(file,O_RDONLY,0);
justcheck=1;
printf("Warning: opening %s read-only\n",file);
}
if(fd<0){
perror("open"); exit(1);
}
while(1){
struct utmp ut;
int r=read(fd,&ut,sizeof(ut));
if(r!=sizeof(ut))break;
if(ut.ut_type==USER_PROCESS){
int i;
if((i=check_entry(&ut))){
clean=0;
printf("%s: %d (%s)\n",msgs[i],ut.ut_pid,ut.ut_name);
if(justcheck)continue;
lseek(fd,-sizeof(ut),SEEK_CUR);
bzero(&ut,sizeof(ut));
ut.ut_type=DEAD_PROCESS;
write(fd,&ut,sizeof(ut));
}
}
}
if(clean)printf("%s is clean\n",file);
return 0;
}
Więcej informacji o liście dyskusyjnej pld-users-pl