From 63de5bec69ac4aa39784be2f9ea11ab61cbb8662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sl=C3=A1vek=20Banko?= Date: Fri, 26 Jun 2015 13:13:04 +0200 Subject: Add utmpx support in ktalk [taken from FreeBSD kdenetwork3 patches] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Slávek Banko (cherry picked from commit 509a3cfb67078d33028c276cee865f41b847f9f3) --- ktalkd/ktalkd/find_user.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++++ ktalkd/ktalkd/includ.h | 3 +++ 2 files changed, 66 insertions(+) diff --git a/ktalkd/ktalkd/find_user.cpp b/ktalkd/ktalkd/find_user.cpp index 37b39428..4cca8b22 100644 --- a/ktalkd/ktalkd/find_user.cpp +++ b/ktalkd/ktalkd/find_user.cpp @@ -339,6 +339,66 @@ int find_user(char *name, char *tty, char *disp) { #else /*not PROC_FIND_USER*/ +#ifdef HAVE_UTMPX_H + +int find_user(char *name, char *tty, char *disp) { + + struct utmpx *ubuf; + int status; + struct stat statb; + char ftty[20 + sizeof ubuf->ut_line]; + char ttyFound[sizeof ubuf->ut_line] = ""; + char dispFound[sizeof ubuf->ut_line + 1] = ""; + + setutxent(); +#define SCMPN(a, b) strncmp(a, b, sizeof (a)) + status = NOT_HERE; + (void) strcpy(ftty, _PATH_DEV); + while ((ubuf = getutxent())) { + if ((ubuf->ut_type == USER_PROCESS) && + (!SCMPN(ubuf->ut_user, name))) { + if (*tty == '\0') { + /* no particular tty was requested */ + (void) strcpy(ftty+5, ubuf->ut_line); + if (stat(ftty,&statb) == 0) { + if (!(statb.st_mode & 020)) /* ?character device? */ + continue; + (void) strcpy(ttyFound, ubuf->ut_line); +#ifdef USE_UT_HOST + (void) strcpy(dispFound, ubuf->ut_host); + strcat(dispFound, " "); +#endif + status = SUCCESS; + + syslog(LOG_DEBUG, "%s", ttyFound); + if ((int) ttyFound[3] > (int) 'f') { +#ifdef USE_UT_HOST + if (Options.debug_mode) { + syslog(LOG_DEBUG, "I wanna this:%s", ttyFound); + syslog(LOG_DEBUG, "ut_host=%s", ubuf.ut_host); + syslog(LOG_DEBUG, "%s", ubuf.ut_line); + } +#endif + break; + } + } + } + else if (!strcmp(ubuf->ut_line, tty)) { + status = SUCCESS; + break; + } + } + } + endutxent(); + if (status == SUCCESS) { + (void) strcpy(tty, ttyFound); + (void) strcpy(disp, dispFound); + } + return (status); +} + +#else /* HAVE_UTMPX_H */ + int find_user(char *name, char *tty, char *disp) { struct utmp ubuf; @@ -397,4 +457,7 @@ int find_user(char *name, char *tty, char *disp) { } return (status); } + +#endif /* HAVE_UTMPX_H */ + #endif /*PROC_FIND_USER*/ diff --git a/ktalkd/ktalkd/includ.h b/ktalkd/ktalkd/includ.h index 41f36fbd..923b452d 100644 --- a/ktalkd/ktalkd/includ.h +++ b/ktalkd/ktalkd/includ.h @@ -58,6 +58,9 @@ #ifdef HAVE_UTMP_H #include #endif +#ifdef HAVE_UTMPX_H +#include +#endif #ifndef UT_LINESIZE #define UT_LINESIZE 12 #endif -- cgit v1.2.3