Fixed local X session handling

An X.org (or perhaps kernel?) change sometime around 7.04
broke timeoutd.  This fixes it.
This commit is contained in:
Shawn Willden 2009-01-04 23:12:25 -07:00
parent 642d4c9ea8
commit 45a9836343

View file

@ -863,7 +863,7 @@ char *host;
/* then send the message using xmessage */ /* then send the message using xmessage */
/* well, this is not really clean: */ /* well, this is not really clean: */
sprintf(cmdbuf, "su %s -c \"xmessage -display %s -center 'WARNING: You will be logged out in %d minute%s when your %s limit expires.'&\"", user, tty, time_remaining, time_remaining==1?"":"s", limit_names[limit_type]); sprintf(cmdbuf, "su %s -c \"xmessage -display %s -center 'WARNING: You will be logged out in %d minute%s when your %s limit expires.'&\"", user, host, time_remaining, time_remaining==1?"":"s", limit_names[limit_type]);
system(cmdbuf); system(cmdbuf);
/*#ifdef DEBUG*/ /*#ifdef DEBUG*/
openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON);
@ -1016,7 +1016,9 @@ void check_idle() /* Check for exceeded time limits & logoff exceeders */
pstat = &status; /* point to status structure */ pstat = &status; /* point to status structure */
#ifndef SUNOS #ifndef SUNOS
if (utmpp->ut_type != USER_PROCESS || !utmpp->ut_user[0]) /* if not user process */ sprintf(path, "/proc/%d", utmpp->ut_pid);
if (utmpp->ut_type != USER_PROCESS || !utmpp->ut_user[0] || /* if not user process */
stat(path, pstat)) /* or if proc doesn't exist */
return; /* skip the utmp entry */ return; /* skip the utmp entry */
#endif #endif
strncpy(user, utmpp->ut_user, sizeof(user) - 1); /* get user name */ strncpy(user, utmpp->ut_user, sizeof(user) - 1); /* get user name */
@ -1033,7 +1035,7 @@ void check_idle() /* Check for exceeded time limits & logoff exceeders */
break; break;
} }
if(aktconfigline > 0) { /* > 0 if user is in config */ if(aktconfigline > 0) { /* > 0 if user is not in config */
#ifdef DEBUG #ifdef DEBUG
openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON);
syslog(SYSLOG_DEBUG, "User %s or * not in config -> No restrictions. Not checking %s on %s", user, user, dev); syslog(SYSLOG_DEBUG, "User %s or * not in config -> No restrictions. Not checking %s on %s", user, user, dev);
@ -1047,7 +1049,8 @@ void check_idle() /* Check for exceeded time limits & logoff exceeders */
host[sizeof(host) - 1] = '\0'; host[sizeof(host) - 1] = '\0';
strncpy(dev, utmpp->ut_line, sizeof(dev) - 1); /* get device name */ strncpy(dev, utmpp->ut_line, sizeof(dev) - 1); /* get device name */
dev[sizeof(dev) - 1] = '\0'; dev[sizeof(dev) - 1] = '\0';
if (stat(dev, pstat) && !chk_xsession(dev, host) == TIMEOUTD_XSESSION_LOCAL) /* if can't get status for sprintf(path, "/dev/%s", dev);
if (stat(path, pstat) && !chk_xsession(dev, host) == TIMEOUTD_XSESSION_LOCAL) /* if can't get status for
port && if it's not a local Xsession */ port && if it's not a local Xsession */
{ {
sprintf(errmsg, "Can't get status of user %s's terminal (%s)\n", sprintf(errmsg, "Can't get status of user %s's terminal (%s)\n",
@ -1061,7 +1064,7 @@ void check_idle() /* Check for exceeded time limits & logoff exceeders */
*/ */
#ifdef TIMEOUTDX11 #ifdef TIMEOUTDX11
if(chk_xsession(dev, host) && !chk_xterm(dev, host)) { /* check idle for Xsession, but not for xterm */ if(chk_xsession(dev, host) && !chk_xterm(dev, host)) { /* check idle for Xsession, but not for xterm */
idle = get_xidle(user, dev) / 1000 / 60; /* get_xidle returns millisecs, we need mins */ idle = get_xidle(user, host) / 1000 / 60; /* get_xidle returns millisecs, we need mins */
openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON);
syslog(SYSLOG_DEBUG, "get_xidle(%s,%s) returned %d mins idle for %s.", dev, host, (int)idle, user); syslog(SYSLOG_DEBUG, "get_xidle(%s,%s) returned %d mins idle for %s.", dev, host, (int)idle, user);
closelog(); closelog();
@ -1190,7 +1193,7 @@ char *host;
#endif #endif
if(chk_xsession(dev, host) && !chk_xterm(dev, host)) { if(chk_xsession(dev, host) && !chk_xterm(dev, host)) {
killit_xsession(utmpp->ut_pid, user, dev); killit_xsession(utmpp->ut_pid, user, host);
return; return;
} }
/* Tell user which limit they have exceeded and that they will be logged off */ /* Tell user which limit they have exceeded and that they will be logged off */
@ -1356,8 +1359,7 @@ char *host;
int chk_xsession(dev, host) /* returns TIMEOUTD_XSESSION_{REMOTE,LOCAL,NONE} when dev and host seem to be a xSession. */ int chk_xsession(dev, host) /* returns TIMEOUTD_XSESSION_{REMOTE,LOCAL,NONE} when dev and host seem to be a xSession. */
char *dev,*host; char *dev,*host;
{ {
if(strncmp(dev, ":0", 1) == 0 && strlen(host) == 0 /*|| if( strncmp(host, ":0", 1) == 0 ) {
(strncmp(dev, "pts/0", 3) == 0 && strncmp(host, ":0", 1) == 0 )*/) { /* if strings are the same, str[n]cmp returns 0 */
/* Look here, how we check if it's a Xsession but no telnet or whatever. /* Look here, how we check if it's a Xsession but no telnet or whatever.
* The problem is that a xterm running on :0 has the device pts/?. But if we ignore * The problem is that a xterm running on :0 has the device pts/?. But if we ignore
* all pts/?, ssh users won't be restricted. * all pts/?, ssh users won't be restricted.
@ -1424,9 +1426,9 @@ char *dev,*host;
} /* chk_xterm(dev,host) */ } /* chk_xterm(dev,host) */
void killit_xsession(pid, user, dev) /* returns 1 when dev and host seem to be a xSession. */ void killit_xsession(pid, user, host) /* returns 1 when host seems to be a xSession. */
int pid; int pid;
char *dev, *user; char *host, *user;
{ {
char msgbuf[1024], cmdbuf[1024]; char msgbuf[1024], cmdbuf[1024];
/* first, get the message into msgbuf */ /* first, get the message into msgbuf */
@ -1438,7 +1440,7 @@ char *dev, *user;
/* then send the message using xmessage */ /* then send the message using xmessage */
/* well, this is not really clean: */ /* well, this is not really clean: */
sprintf(cmdbuf, "su %s -c \"xmessage -display %s -center '%s'&\"", user, dev, msgbuf); sprintf(cmdbuf, "su %s -c \"xmessage -display %s -center '%s'&\"", user, host, msgbuf);
system(cmdbuf); system(cmdbuf);
#ifdef DEBUG #ifdef DEBUG
openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON);
@ -1458,7 +1460,7 @@ char *dev, *user;
if (!kill(pid, 0)) if (!kill(pid, 0))
{ {
openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON); openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON);
syslog(LOG_ERR, "Could not log user %s off line %s. (running X)", user, dev); syslog(LOG_ERR, "Could not log user %s off line %s. (running X)", user, host);
closelog(); closelog();
} }
} }