Remove most platform-specific ifdef workarounds
Since most of the #ifdef hacks are meant to facilitate the use of the daemon under older versions of SunOS which didn't have many of the utmp library functions and facilities most modern Unices have, and since they significantly hamper the readability of the code, they have been removed. For portabilities sake, further changes will have to be made anyways, many modern systems, such as newer versions of FreeBSD, don't support utmp anymore, and require use of utmpx instead. The program will have to be changed accordingly. The getdisc() function has been almost entirely stripped, and now is just a stub that always returns N_TTY. This will have to be changed quickly, so that the function returns the actual tty discipline, but works in most cases.
This commit is contained in:
parent
d1e322d12d
commit
e6c8f1b6c1
129
timeoutd.c
129
timeoutd.c
|
@ -57,55 +57,6 @@
|
||||||
#define OPENLOG_FLAGS LOG_CONS|LOG_PID
|
#define OPENLOG_FLAGS LOG_CONS|LOG_PID
|
||||||
#define SYSLOG_DEBUG LOG_DEBUG
|
#define SYSLOG_DEBUG LOG_DEBUG
|
||||||
|
|
||||||
/* For those systems (SUNOS) which don't define this: */
|
|
||||||
#ifndef WTMP_FILE
|
|
||||||
#define WTMP_FILE "/usr/adm/wtmp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SUNOS
|
|
||||||
#define ut_pid ut_time
|
|
||||||
#define ut_user ut_name
|
|
||||||
#define SEEK_CUR 1
|
|
||||||
#define SEEK_END 2
|
|
||||||
#define SURE_KILL 1
|
|
||||||
|
|
||||||
FILE *utfile = NULL;
|
|
||||||
#define NEED_UTMP_UTILS
|
|
||||||
#define NEED_STRSEP
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef NEED_UTMP_UTILS
|
|
||||||
void setutent()
|
|
||||||
{
|
|
||||||
if (utfile == NULL) {
|
|
||||||
if ((utfile = fopen("/etc/utmp", "r")) == NULL) {
|
|
||||||
openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON);
|
|
||||||
syslog(LOG_ERR, "Could not open /etc/utmp");
|
|
||||||
closelog();
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
fseek(utfile, 0L, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct utmp *getutent()
|
|
||||||
{ /* returns next utmp file entry */
|
|
||||||
static struct utmp uent;
|
|
||||||
|
|
||||||
while (fread(&uent, sizeof(struct utmp), 1, utfile) == 1) {
|
|
||||||
if (uent.ut_line[0] != 0 && uent.ut_name[0] != 0)
|
|
||||||
return &uent;
|
|
||||||
}
|
|
||||||
return (struct utmp *) NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef linux
|
|
||||||
#define N_TTY 1
|
|
||||||
#define N_SLIP 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CONFIG
|
#ifndef CONFIG
|
||||||
#define CONFIG "/etc/timeouts"
|
#define CONFIG "/etc/timeouts"
|
||||||
#endif
|
#endif
|
||||||
|
@ -220,33 +171,6 @@ int strcasecmp(char *s1, char *s2)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NEED_STRSEP
|
|
||||||
char *strsep(stringp, delim)
|
|
||||||
char **stringp;
|
|
||||||
char *delim;
|
|
||||||
{
|
|
||||||
char *retp = *stringp;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
if (!**stringp)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
while (**stringp) {
|
|
||||||
p = delim;
|
|
||||||
while (*p) {
|
|
||||||
if (*p == **stringp) {
|
|
||||||
**stringp = '\0';
|
|
||||||
(*stringp)++;
|
|
||||||
return retp;
|
|
||||||
}
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
(*stringp)++;
|
|
||||||
}
|
|
||||||
return retp;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(argc, argv)
|
int main(argc, argv)
|
||||||
int argc;
|
int argc;
|
||||||
char *argv[];
|
char *argv[];
|
||||||
|
@ -1248,23 +1172,6 @@ char *host;
|
||||||
return; /* returns */
|
return; /* returns */
|
||||||
|
|
||||||
/* Wait a little while in case the above message gets lost during logout */
|
/* Wait a little while in case the above message gets lost during logout */
|
||||||
#ifdef SURE_KILL
|
|
||||||
signal(SIGHUP, SIG_IGN);
|
|
||||||
if ((pw = getpwnam(user)) == NULL) {
|
|
||||||
openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON);
|
|
||||||
syslog(LOG_ERR, "Could not log user %s off line %s - unable to determine uid.", user, dev);
|
|
||||||
closelog();
|
|
||||||
}
|
|
||||||
if (setuid(pw->pw_uid)) {
|
|
||||||
openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON);
|
|
||||||
syslog(LOG_ERR, "Could not log user %s off line %s - unable to setuid(%d).", user, dev,
|
|
||||||
pw->pw_uid);
|
|
||||||
closelog();
|
|
||||||
}
|
|
||||||
kill(-1, SIGHUP);
|
|
||||||
sleep(KWAIT);
|
|
||||||
kill(-1, SIGKILL);
|
|
||||||
#else
|
|
||||||
kill(pid, SIGHUP); /* first send "hangup" signal */
|
kill(pid, SIGHUP); /* first send "hangup" signal */
|
||||||
sleep(KWAIT);
|
sleep(KWAIT);
|
||||||
if (!kill(pid, 0)) { /* SIGHUP might be ignored */
|
if (!kill(pid, 0)) { /* SIGHUP might be ignored */
|
||||||
|
@ -1276,7 +1183,6 @@ char *host;
|
||||||
closelog();
|
closelog();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1329,41 +1235,8 @@ char *host;
|
||||||
int fd;
|
int fd;
|
||||||
int disc;
|
int disc;
|
||||||
|
|
||||||
#ifdef linux
|
|
||||||
if (chk_xsession(d, host) || chk_xterm(d, host))
|
|
||||||
return N_TTY;
|
return N_TTY;
|
||||||
|
/* TODO: add an actual portable way of getting terminal discipline */
|
||||||
if ((fd = open(d, O_RDONLY | O_NONBLOCK | O_NOCTTY)) < 0) {
|
|
||||||
openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON);
|
|
||||||
syslog(LOG_WARNING,
|
|
||||||
"Could not open %s for checking line discipline - idle limits will be enforced.", d);
|
|
||||||
closelog();
|
|
||||||
return N_TTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ioctl(fd, TIOCGETD, &disc) < 0) {
|
|
||||||
close(fd);
|
|
||||||
openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON);
|
|
||||||
syslog(LOG_WARNING, "Could not get line discipline for %s - idle limits will be enforced.",
|
|
||||||
d);
|
|
||||||
closelog();
|
|
||||||
return N_TTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
openlog("timeoutd", OPENLOG_FLAGS, LOG_DAEMON);
|
|
||||||
syslog(SYSLOG_DEBUG, "TTY %s: Discipline=%s.", d,
|
|
||||||
disc == N_SLIP ? "SLIP" : disc == N_TTY ? "TTY" : disc ==
|
|
||||||
N_PPP ? "PPP" : disc == N_MOUSE ? "MOUSE" : "UNKNOWN");
|
|
||||||
closelog();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return disc;
|
|
||||||
#else
|
|
||||||
return N_TTY;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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. */
|
||||||
|
|
Loading…
Reference in a new issue