47
47
struct path_escape {
49
size_t (*copy_fn)(char *, size_t);
49
size_t (*copy_fn)(char *, size_t, char *);
52
static size_t fill_seq(char *, size_t);
53
static size_t fill_user(char *, size_t);
54
static size_t fill_group(char *, size_t);
55
static size_t fill_runas_user(char *, size_t);
56
static size_t fill_runas_group(char *, size_t);
57
static size_t fill_hostname(char *, size_t);
58
static size_t fill_command(char *, size_t);
52
static size_t fill_seq(char *, size_t, char *);
53
static size_t fill_user(char *, size_t, char *);
54
static size_t fill_group(char *, size_t, char *);
55
static size_t fill_runas_user(char *, size_t, char *);
56
static size_t fill_runas_group(char *, size_t, char *);
57
static size_t fill_hostname(char *, size_t, char *);
58
static size_t fill_command(char *, size_t, char *);
60
static struct path_escape escapes[] = {
60
/* Note: "seq" must be first in the list. */
61
static struct path_escape io_path_escapes[] = {
61
62
{ "seq", fill_seq },
62
63
{ "user", fill_user },
63
64
{ "group", fill_group },
72
fill_seq(char *str, size_t strsize)
73
fill_seq(char *str, size_t strsize, char *logdir)
74
75
static char sessid[7];
76
77
debug_decl(sudoers_io_version, SUDO_DEBUG_UTIL)
78
79
if (sessid[0] == '\0')
79
io_nextid(def_iolog_dir, sessid);
80
io_nextid(logdir, def_iolog_dir, sessid);
81
82
/* Path is of the form /var/log/sudo-io/00/00/01. */
82
83
len = snprintf(str, strsize, "%c%c/%c%c/%c%c", sessid[0],
90
fill_user(char *str, size_t strsize)
91
fill_user(char *str, size_t strsize, char *unused)
92
93
debug_decl(fill_user, SUDO_DEBUG_UTIL)
93
94
debug_return_size_t(strlcpy(str, user_name, strsize));
97
fill_group(char *str, size_t strsize)
98
fill_group(char *str, size_t strsize, char *unused)
99
100
struct group *grp;
103
104
if ((grp = sudo_getgrgid(user_gid)) != NULL) {
104
105
len = strlcpy(str, grp->gr_name, strsize);
107
108
len = strlen(str);
108
109
len = snprintf(str + len, strsize - len, "#%u",
115
fill_runas_user(char *str, size_t strsize)
116
fill_runas_user(char *str, size_t strsize, char *unused)
117
118
debug_decl(fill_runas_user, SUDO_DEBUG_UTIL)
118
119
debug_return_size_t(strlcpy(str, runas_pw->pw_name, strsize));
122
fill_runas_group(char *str, size_t strsize)
123
fill_runas_group(char *str, size_t strsize, char *unused)
124
125
struct group *grp;
131
132
if ((grp = sudo_getgrgid(runas_pw->pw_gid)) != NULL) {
132
133
len = strlcpy(str, grp->gr_name, strsize);
135
136
len = strlen(str);
136
137
len = snprintf(str + len, strsize - len, "#%u",
144
fill_hostname(char *str, size_t strsize)
145
fill_hostname(char *str, size_t strsize, char *unused)
146
147
debug_decl(fill_hostname, SUDO_DEBUG_UTIL)
147
148
debug_return_size_t(strlcpy(str, user_shost, strsize));
151
fill_command(char *str, size_t strsize)
152
fill_command(char *str, size_t strsize, char *unused)
153
154
debug_decl(fill_command, SUDO_DEBUG_UTIL)
154
155
debug_return_size_t(strlcpy(str, user_base, strsize));
166
167
size_t len, prelen = 0;
167
168
char *dst, *dst0, *path, *pathend, tmpbuf[PATH_MAX];
168
170
const char *endbrace, *src = dir;
171
static struct path_escape *escapes;
171
174
debug_decl(expand_iolog_path, SUDO_DEBUG_UTIL)
199
escapes = io_path_escapes + 1; /* skip "${seq}" */
198
202
/* Trim trailing slashes from dir component. */
199
203
while (dst - path - 1 > prelen && dst[-1] == '/')
205
/* The NUL will be replaced with a '/' at the end. */
206
if (dst + 1 >= pathend)
212
escapes = io_path_escapes;
222
228
if (esc->name != NULL) {
223
len = esc->copy_fn(dst, (size_t)(pathend - dst));
229
len = esc->copy_fn(dst, (size_t)(pathend - dst),
224
231
if (len >= (size_t)(pathend - dst))