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