--- bash-2.05/bashhist.c.orig Wed Jan 9 23:37:18 2002 +++ bash-2.05/bashhist.c Wed Jan 9 23:39:30 2002 @@ -484,6 +484,237 @@ *p = '\0'; return (line); } +#ifdef LOGHIST +# include +# ifndef LOGFAC +# define LOGFAC LOG_USER +# endif +# ifndef LOGPRI +# define LOGPRI LOG_INFO +# endif +# ifndef NAMLEN +# define NAMLEN 32 +# endif + +static unsigned char *logsafe(unsigned char *line) { + unsigned char *b; + int i, j; + + for (i = j = 0; line[i]; ++i) + if (line[i] < ' ') ++j; + if (j == 0 || !(b = malloc(i + j*3 + 1))) + return line; + for (i = j = 0; line[i]; ++i) { + if (line[i] < ' ') { + b[j++] = '\\'; + b[j++] = ((line[i] >> 6) & 7) + '0'; + b[j++] = ((line[i] >> 3) & 7) + '0'; + b[j++] = (line[i] & 7) + '0'; + } else b[j++] = line[i]; + } + return b; +} + +# ifdef LOGNUMERIC +static void dolog(char *line) { + char *l; + int pid, uid, euid, gid, egid; + + l = logsafe(line); + pid = getpid(); + uid = getuid(); + euid = geteuid(); + gid = getgid(); + egid = getegid(); + if (uid != euid) { + if (gid != egid) { + syslog(LOGFAC | LOGPRI, "(%d) [%d.%d] |%d.%d| %s", + pid, uid, gid, euid, egid, l); + } else { + syslog(LOGFAC | LOGPRI, "(%d) [%d.%d] |%d.| %s", + pid, uid, gid, euid, l); + } + } else if (gid != egid) { + syslog(LOGFAC | LOGPRI, "(%d) [%d.%d] |.%d| %s", + pid, uid, gid, egid, l); + } else { + syslog(LOGFAC | LOGPRI, "(%d) [%d.%d] |.| %s", + pid, uid, gid, l); + } + if (l != line) free(l); +} +# else +# include +# include +# include +static char uname[NAMLEN]; +static char gname[NAMLEN]; +static char euname[NAMLEN]; +static char egname[NAMLEN]; +static int loguid = -1; +static int loggid = -1; +static int logeuid = -1; +static int logegid = -1; +static int logpid = -1; + +static const char *loggetuid(void) { + static char b[NAMLEN*2+8]; + struct passwd *pw; + int n; + + if (loguid < 0) { + if ((loguid = getuid()) == logeuid) { + strcpy(uname, euname); + } else if ((pw = getpwuid(loguid))) { + strncpy(uname, pw->pw_name, NAMLEN); + uname[NAMLEN-1] = '\0'; + } else { + snprintf(uname, NAMLEN, "%u", loguid); + } + } else if (loguid != (n = getuid())) { + strcpy(b, uname); + strcat(b, "->"); + if (n == logeuid) { + strcpy(uname, euname); + } else if ((pw = getpwuid(n))) { + strncpy(uname, pw->pw_name, NAMLEN); + uname[NAMLEN-1] = '\0'; + } else { + snprintf(uname, NAMLEN, "%u", n); + } + strcat(b, uname); + return b; + } + return uname; +} + +static const char *loggeteuid(void) { + static char b[NAMLEN*2+8]; + struct passwd *pw; + int n; + + if (logeuid < 0) { + if ((logeuid = geteuid()) == loguid) { + strcpy(euname, uname); + } else if ((pw = getpwuid(logeuid))) { + strncpy(euname, pw->pw_name, NAMLEN); + euname[NAMLEN-1] = '\0'; + } else { + snprintf(euname, NAMLEN, "%u", logeuid); + } + if (logeuid == loguid) b[0] = '\0'; + else strcpy(b, euname); + } else if (logeuid != (n = geteuid())) { + strcpy(b, euname); + strcat(b, "->"); + if (n == loguid) { + strcpy(euname, uname); + } else if ((pw = getpwuid(n))) { + strncpy(euname, pw->pw_name, NAMLEN); + euname[NAMLEN-1] = '\0'; + } else { + snprintf(euname, NAMLEN, "%u", n); + } + strcat(b, euname); + } else { + if (logeuid == loguid) b[0] = '\0'; + else strcpy(b, euname); + } + return b; +} + +static const char *loggetgid(void) { + static char b[NAMLEN*2+8]; + struct group *gr; + int n; + + if (loggid < 0) { + if ((loggid = getgid()) == logegid) { + strcpy(gname, egname); + } else if ((gr = getgrgid(loggid))) { + strncpy(gname, gr->gr_name, NAMLEN); + gname[NAMLEN-1] = '\0'; + } else { + snprintf(gname, NAMLEN, "%u", loggid); + } + } else if (loggid != (n = getgid())) { + strcpy(b, gname); + strcat(b, "->"); + if (n == logegid) { + strcpy(gname, egname); + } else if ((gr = getgrgid(n))) { + strncpy(gname, gr->gr_name, NAMLEN); + gname[NAMLEN-1] = '\0'; + } else { + snprintf(gname, NAMLEN, "%u", n); + } + strcat(b, gname); + return b; + } + return gname; +} + +static const char *loggetegid(void) { + static char b[NAMLEN*2+8]; + struct group *gr; + int n; + + if (logegid < 0) { + if ((logegid = getegid()) == loggid) { + strcpy(egname, gname); + } else if ((gr = getgrgid(logegid))) { + strncpy(egname, gr->gr_name, NAMLEN); + egname[NAMLEN-1] = '\0'; + } else { + snprintf(egname, NAMLEN, "%u", logegid); + } + if (logegid == loggid) b[0] = '\0'; + else strcpy(b, egname); + } else if (logegid != (n = getegid())) { + strcpy(b, egname); + strcat(b, "->"); + if (n == loggid) { + strcpy(egname, gname); + } else if ((gr = getgrgid(n))) { + strncpy(egname, gr->gr_name, NAMLEN); + egname[NAMLEN-1] = '\0'; + } else { + snprintf(egname, NAMLEN, "%u", n); + } + strcat(b, egname); + } else { + if (logegid == loggid) b[0] = '\0'; + else strcpy(b, egname); + } + return b; +} + +static const char *loggetpid(void) { + static char b[16]; + int p; + + if (logpid < 0) { + logpid = getpid(); + snprintf(b, 16, "%u", logpid); + } else if (logpid != (p = getpid())) { + snprintf(b, 16, "%u >> %u", logpid, p); + logpid = p; + } else + snprintf(b, 16, "%u", logpid); + return b; +} + +static void dolog(char *line) { + char *l; + + l = logsafe(line); + syslog(LOGFAC | LOGPRI, "(%s) [%s.%s] |%s.%s| %s", + loggetpid(), loggetuid(), loggetgid(), + loggeteuid(), loggetegid(), l); + if (l != line) free(l); +} +# endif +#endif /* Add LINE to the history list depending on the value of HISTORY_CONTROL. */ void @@ -493,6 +724,19 @@ static int first_line_saved = 0; HIST_ENTRY *temp; +#ifdef LOGHIST +# ifdef LOGMINUID + if (getuid() >= LOGMINUID) +# endif +# ifdef LOGGROUP + if (getgid() == LOGGROUP) +# endif +# ifdef LOGNOTGROUP + if (getgid() != LOGNOTGROUP) +# endif + dolog(line); +#endif + hist_last_line_added = 0; /* Don't use the value of history_control to affect the second