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