Prihlasovani pres KDM v RH 7.1cz

9r na seznam.cz 9r na seznam.cz
Pondělí Červen 25 11:01:11 CEST 2001


Miroslav Lednicky wrote:
> Tak jsem zjistil, ze problem bude asi v samotnych Xfree.
> Dosahl jsem vyse uvedeneho efektu i pri spusteni Xek
> z prikazove radky.
>     Rad bych ten problem vyresil. Pomuze nekdo?
> 
>                               Miroslav Lednicky

dobre by asi bylo zjistit, co, kdo a kdy pise do utmp apod. za timto
ucelem muzete vyuzit prilozeny programek (doufam ze projde), ktery vam
umozni prozkoumat, jake polozky utmp soubor obsahuje. spousti se to
napr. "./utmped /var/run/utmp", prikazy pak jsou napr.
"c"	    zdeli vam aktualni pocet polozek
"p 0 2-5 7" zobrazi polozky 0,2,3,4,5,7
"d ...."    smaze polozky (musite zadavat od nejvyssi k nejnizsi,
	    protoze smazani polozky zmeni cislovani)
"w"	    zapise zpet do souboru (musite mit adekvatni prava)
"q"	    konec

takze si v man/info utmp zjistete, co tam ma kdo zapisovat, a potom
cihejte na toho, kdo se splete. hodne stesti.

-- 
NOTE FOR WINDOWS (TM) USERS: I AM NOT LIABLE TO YOU FOR ANY SOFTWARE OR
HARDWARE DAMAGE, SYSTEM MALFUNCTION OR DATA LOSS ARISING OUT WHILE YOU
ARE READING THIS TEXT.
------------- další část ---------------
#include <stdio.h>
#include <utmp.h>

#define MAXLEN 1024
#define MAX_UT_TYPE 9
#define HELP_STRING "commands:\n"\
"	h (or other than those below): print"\
" this\n"\
"	p [n | n1-n2]... :  print record(s)\n"\
"	d [n | n1-n2]... :  delete record(s)\n"\
"	c: print number of records\n"\
"	w: save changes (need write access)\n"\
"	q: quit this nice tool\n\n"

typedef int (*action_fn_t)(unsigned int);

struct utmp *buf;
unsigned int cnt;
char linebuf[MAXLEN], *args;
action_fn_t action;

char *ut_types[] = {"UT_UNKNOWN", "RUN_LVL", "BOOT_TIME",
	"NEW_TIME", "OLD_TIME", "INIT_PROCESS", "LOGIN_PROCESS",
       	"USER_PROCESS", "DEAD_PROCESS", "ACCOUNTING"};

int print(unsigned int n)
{
	printf("%-0.6d %-13.13s %-10.10s %-10.10s %-16.16s %-20.20s\n", n,
               ut_types[(buf+n)->ut_type], (buf + n)->ut_line,
	       (buf + n)->ut_user, (buf + n)->ut_host,
	       (char *) ctime(&((buf+n)->ut_tv.tv_sec)));
       	return 0;
}	

int delete(unsigned int n)
{
	if (n != (cnt - 1))
		memmove((buf + n), (buf + n + 1),
		      	(cnt - 1 - n) * sizeof(struct utmp));
	cnt--;
	return 0;
}

void eat_args(void)
{
	int n0, n1, n2;
	int range;
	char *tmp;
	while (1){
		while ((*args == ' ') || (*args == '\t'))
			args++;
		if ((*args == '\0') || (cnt == 0))
			break;
		range = 0;
		tmp = args;
		while ((*tmp != ' ') && (*tmp != '\t') && (*tmp != '\0')){
			if (*tmp == '-'){
				range = 1;
				break;
			}
			tmp++;
		}
		if (range){
			if (sscanf(args, "%i-%i", &n0, &n1) != 2)
				break;
			if (n0 < 0)
				n0 = 0;
			if (n1 < 0)
				n1 = 0;
			if (n0 >= cnt)
				n0 = cnt - 1;
			if (n1 >= cnt)
				n1 = cnt - 1;
			if (n1 < n0){
				n2 = n0;
				n0 = n1;
				n1 = n2;	
			}
			for (; n1 >= n0; n1--)
				(*action)(n1);
		} else {
			if (sscanf(args, "%i", &n0) != 1)
				break;
			if (n0 < 0)
				n0 = 0;
			if (n0 >= cnt)
				n0 = cnt - 1;
			(*action)(n0);
		}
		while ((*args != ' ') && (*args != '\t') && (*args != '\0'))
			args++;
	}
}	

int main(int argc, char **argv)
{
	FILE *f;
	unsigned int tmp;
	if (argc < 2)
		return 1;
	if ((f = fopen(argv[1], "rb")) == NULL){
		perror("error");
		return 1;
	}
	fseek(f, 0L, SEEK_END);
	if ((buf = (struct utmp *) malloc(tmp = ftell(f))) == NULL){
		perror("error");
		fclose(f);
		return 1;
	}
	rewind(f);
	if (fread(buf, sizeof(struct utmp),
		  cnt = tmp / sizeof(struct utmp), f) != cnt){
		perror("error");
		free(buf);
		fclose(f);
		return 1;
	}
	fclose(f);
	printf("%s: %d records\n", argv[1], cnt);
	printf("utmped (%s)> ", argv[1]);
	while (fgets(linebuf, MAXLEN, stdin)){
		if (linebuf[tmp = strlen(linebuf)] == '\n')
			linebuf[tmp]='\0';
		args = linebuf;
		while ((*args != ' ') && (*args != '\0'))
			args++;
		switch(linebuf[0]){
		case 'p':
			action = &print;
			eat_args();
			break;
		case 'd':
			action = &delete;
			eat_args();
		case 'c':
			printf("%u record(s)\n", cnt);
			break;
		case 'w':
			if ((f = fopen(argv[1], "wb")) == NULL){
				perror("error");
				free(buf);
				return 1;
			}
			if (fwrite(buf, sizeof(struct utmp), cnt, f) != cnt){
				perror("error");
				free(buf);
				fclose(f);
				return 1;
			}
			fclose(f);
			break;
		case 'q':
			return 0;
		default:
		case 'h':
			printf(HELP_STRING);
		}
		printf("utmped (%s)> ", argv[1]);
	}	       	
}



Další informace o konferenci Linux