mirror of
https://github.com/sudo-project/sudo.git
synced 2025-09-04 00:05:11 +00:00
Sort output of "sudoreplay -l"
This commit is contained in:
@@ -239,8 +239,8 @@ static void free_log_info(struct log_info *li);
|
|||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int ch, idx, plen, nready, exitcode = 0, interactive = 0, listonly = 0;
|
int ch, idx, plen, nready, exitcode = 0, rows = 0, cols = 0;
|
||||||
int rows = 0, cols = 0;
|
bool interactive = false, listonly = false;
|
||||||
const char *id, *user = NULL, *pattern = NULL, *tty = NULL, *decimal = ".";
|
const char *id, *user = NULL, *pattern = NULL, *tty = NULL, *decimal = ".";
|
||||||
char path[PATH_MAX], buf[LINE_MAX], *cp, *ep;
|
char path[PATH_MAX], buf[LINE_MAX], *cp, *ep;
|
||||||
double seconds, to_wait, speed = 1.0, max_wait = 0;
|
double seconds, to_wait, speed = 1.0, max_wait = 0;
|
||||||
@@ -295,7 +295,7 @@ main(int argc, char *argv[])
|
|||||||
help();
|
help();
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
case 'l':
|
case 'l':
|
||||||
listonly = 1;
|
listonly = true;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
errno = 0;
|
errno = 0;
|
||||||
@@ -841,6 +841,14 @@ done:
|
|||||||
debug_return_int(rval);
|
debug_return_int(rval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
session_compare(const void *v1, const void *v2)
|
||||||
|
{
|
||||||
|
const char *s1 = *(const char **)v1;
|
||||||
|
const char *s2 = *(const char **)v2;
|
||||||
|
return strcmp(s1, s2);
|
||||||
|
}
|
||||||
|
|
||||||
/* XXX - always returns 0, calls error() on failure */
|
/* XXX - always returns 0, calls error() on failure */
|
||||||
static int
|
static int
|
||||||
find_sessions(const char *dir, REGEX_T *re, const char *user, const char *tty)
|
find_sessions(const char *dir, REGEX_T *re, const char *user, const char *tty)
|
||||||
@@ -848,9 +856,9 @@ find_sessions(const char *dir, REGEX_T *re, const char *user, const char *tty)
|
|||||||
DIR *d;
|
DIR *d;
|
||||||
struct dirent *dp;
|
struct dirent *dp;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
size_t sdlen;
|
size_t sdlen, sessions_len = 0, sessions_size = 36*36;
|
||||||
int len;
|
int i, len;
|
||||||
char pathbuf[PATH_MAX];
|
char pathbuf[PATH_MAX], **sessions = NULL;
|
||||||
debug_decl(find_sessions, SUDO_DEBUG_UTIL)
|
debug_decl(find_sessions, SUDO_DEBUG_UTIL)
|
||||||
|
|
||||||
d = opendir(dir);
|
d = opendir(dir);
|
||||||
@@ -865,18 +873,34 @@ find_sessions(const char *dir, REGEX_T *re, const char *user, const char *tty)
|
|||||||
}
|
}
|
||||||
pathbuf[sdlen++] = '/';
|
pathbuf[sdlen++] = '/';
|
||||||
pathbuf[sdlen] = '\0';
|
pathbuf[sdlen] = '\0';
|
||||||
|
|
||||||
|
/* Store potential session dirs for sorting. */
|
||||||
|
sessions = emalloc2(sessions_size, sizeof(char *));
|
||||||
while ((dp = readdir(d)) != NULL) {
|
while ((dp = readdir(d)) != NULL) {
|
||||||
/* Skip "." and ".." */
|
/* Skip "." and ".." */
|
||||||
if (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' ||
|
if (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' ||
|
||||||
(dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
|
(dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* Add name to session list. */
|
||||||
|
if (sessions_len + 1 > sessions_size) {
|
||||||
|
sessions_size <<= 1;
|
||||||
|
sessions = erealloc3(sessions, sessions_size, sizeof(char *));
|
||||||
|
}
|
||||||
|
sessions[sessions_len++] = estrdup(dp->d_name);
|
||||||
|
}
|
||||||
|
closedir(d);
|
||||||
|
|
||||||
|
/* Sort and list the sessions. */
|
||||||
|
qsort(sessions, sessions_len, sizeof(char *), session_compare);
|
||||||
|
for (i = 0; i < sessions_len; i++) {
|
||||||
len = snprintf(&pathbuf[sdlen], sizeof(pathbuf) - sdlen,
|
len = snprintf(&pathbuf[sdlen], sizeof(pathbuf) - sdlen,
|
||||||
"%s/log", dp->d_name);
|
"%s/log", sessions[i]);
|
||||||
if (len <= 0 || len >= sizeof(pathbuf) - sdlen) {
|
if (len <= 0 || len >= sizeof(pathbuf) - sdlen) {
|
||||||
errno = ENAMETOOLONG;
|
errno = ENAMETOOLONG;
|
||||||
error(1, "%s/%s/log", dir, dp->d_name);
|
error(1, "%s/%s/log", dir, sessions[i]);
|
||||||
}
|
}
|
||||||
|
efree(sessions[i]);
|
||||||
|
|
||||||
/* Check for dir with a log file. */
|
/* Check for dir with a log file. */
|
||||||
if (lstat(pathbuf, &sb) == 0 && S_ISREG(sb.st_mode)) {
|
if (lstat(pathbuf, &sb) == 0 && S_ISREG(sb.st_mode)) {
|
||||||
@@ -888,7 +912,7 @@ find_sessions(const char *dir, REGEX_T *re, const char *user, const char *tty)
|
|||||||
find_sessions(pathbuf, re, user, tty);
|
find_sessions(pathbuf, re, user, tty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
closedir(d);
|
efree(sessions);
|
||||||
|
|
||||||
debug_return_int(0);
|
debug_return_int(0);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user