000
21.05.2007, 14:28 Uhr
~dadevelopa
Gast
|
Hallo zusammen, ich habe ein kleines Problem mit einem Programm welches Username, Hostname und Zeit in welcher der User nicht an der Maschine war ausliest. Das ganze Programm läuft als Daemon und soll in bestimmten Intervallen die ausgelesenen Daten an einen Server senden. Soweit so gut, das funktioniert auch, wenn ich mich Remote auf einer Maschine einlogge und den Daemon starte. Jedoch wenn die Person, welche nun Physisch an dieser Maschine sitzt den Daemon startet, landet dieser zwar in meiner endlosen schleife, fliegt dann aber wieder irgendwo raus und das Programm wird ohne Nachricht, ohne core dump, ohne segmentation fault beendet. Das Programm scheint sich offensichtlich in folgender Funktion selbst zu beenden:
C++: |
/* * Return the idleTime of the user. * At the moment there are two methods supported to get the idleTime. * The first and precise one is to check, if the XScreenSaver extension is available. * If this is the case, we can ask the the extension to give us the idleTime. * If this extension is not available, we have to check the tty's and stat the files they * belong to. */ int my_getidletime (char *idleString, char *user) { int idleTime; int event_base, error_base; struct stat f_info; const char *standardFileName = "/dev/mouse"; static XScreenSaverInfo *mit_info = NULL; if(isConsoleUser(user)){ if (XScreenSaverQueryExtension(GDK_DISPLAY(), &event_base, &error_base)) { if (mit_info == NULL) { mit_info = XScreenSaverAllocInfo(); } XScreenSaverQueryInfo(GDK_DISPLAY(), GDK_ROOT_WINDOW(), mit_info); idleTime = (mit_info->idle); } else { idleTime = idleFromTty(user); } } else { idleTime = idleFromTty(user); } sprintf(idleString, "%i", idleTime); return 1; }
/* * Returns Idle Time from the tty in milliseconds */ int idleFromTty(char *user){ int idleTime = INT_MAX; int newIdleTime = INT_MAX; utmpx_t *u; setutxent(); for (;;) { u = getutxent(); if (u == NULL) break; if(u->ut_type == USER_PROCESS){ if(strcmp(user, u->ut_user) == 0){ newIdleTime = getidletime(u); if(newIdleTime < idleTime){ idleTime = newIdleTime; } } } } endutxent(); return idleTime * 1000; }
static int getidletime(utmpx_t *u) { /* AP want to send in info and get the idle time in seconds */ unsigned i; char tty[5 + sizeof u->ut_line + 1] = "/dev/"; for (i=0; i < sizeof(u->ut_line); i++) /* clean up tty if garbled */ if (isalnum(u->ut_line[i]) || (u->ut_line[i]=='/')) tty[i+5] = u->ut_line[i]; else tty[i+5] = '\0'; return idletime(tty); }
/**** stat the device file to get an idle time */ static time_t idletime(char *tty) { struct stat sbuf; if (stat(tty, &sbuf) != 0) return 0; return time(NULL) - sbuf.st_atime; }
/* * Check if the user, which has started the client is only remote logged in * on the host, or if he is the one who sits physically in front of the monitor. * This is checked by the name of the tty. If the user which owns the tty "console" is the * same user, which is logged in, he is the console user. */ int isConsoleUser(char *username){ utmpx_t *u; setutxent(); for (;;) { u = getutxent(); if (u == NULL) break; if((strcmp(u->ut_line, "console") == 0) || (strcmp(u->ut_line, ":0") == 0)){ if(strcmp(username, u->ut_user) == 0){ endutent(); return 1; } } } endutxent(); return 0; }
|
Ich nehme an, das ganze hängt mit XScreenSaver zusammen. Ich habe jedoch keine Ahnung warum, wieso, wesshalb. Ich hoffe irgendjemand von euch hat eine Idee wie ich das Problem umgehen kann.
Danke im voraus. |