|
version 1.1.1.1, 2012/02/21 16:23:02
|
version 1.1.1.3, 2012/10/09 09:29:52
|
|
Line 112 mkdir_parents(char *path)
|
Line 112 mkdir_parents(char *path)
|
| { |
{ |
| struct stat sb; |
struct stat sb; |
| char *slash = path; |
char *slash = path; |
| |
debug_decl(mkdir_parents, SUDO_DEBUG_UTIL) |
| |
|
| for (;;) { |
for (;;) { |
| if ((slash = strchr(slash + 1, '/')) == NULL) |
if ((slash = strchr(slash + 1, '/')) == NULL) |
|
Line 119 mkdir_parents(char *path)
|
Line 120 mkdir_parents(char *path)
|
| *slash = '\0'; |
*slash = '\0'; |
| if (stat(path, &sb) != 0) { |
if (stat(path, &sb) != 0) { |
| if (mkdir(path, S_IRWXU) != 0) |
if (mkdir(path, S_IRWXU) != 0) |
| log_error(USE_ERRNO, _("unable to mkdir %s"), path); | log_fatal(USE_ERRNO, _("unable to mkdir %s"), path); |
| } else if (!S_ISDIR(sb.st_mode)) { |
} else if (!S_ISDIR(sb.st_mode)) { |
| log_error(0, _("%s: %s"), path, strerror(ENOTDIR)); | log_fatal(0, _("%s: %s"), path, strerror(ENOTDIR)); |
| } |
} |
| *slash = '/'; |
*slash = '/'; |
| } |
} |
| |
debug_return; |
| } |
} |
| |
|
| /* |
/* |
|
Line 133 mkdir_parents(char *path)
|
Line 135 mkdir_parents(char *path)
|
| * Uses file locking to avoid sequence number collisions. |
* Uses file locking to avoid sequence number collisions. |
| */ |
*/ |
| void |
void |
| io_nextid(char *iolog_dir, char sessid[7]) | io_nextid(char *iolog_dir, char *iolog_dir_fallback, char sessid[7]) |
| { |
{ |
| struct stat sb; |
struct stat sb; |
| char buf[32], *ep; |
char buf[32], *ep; |
|
Line 143 io_nextid(char *iolog_dir, char sessid[7])
|
Line 145 io_nextid(char *iolog_dir, char sessid[7])
|
| ssize_t nread; |
ssize_t nread; |
| char pathbuf[PATH_MAX]; |
char pathbuf[PATH_MAX]; |
| static const char b36char[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
static const char b36char[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
| |
debug_decl(io_nextid, SUDO_DEBUG_UTIL) |
| |
|
| /* |
/* |
| * Create I/O log directory if it doesn't already exist. |
* Create I/O log directory if it doesn't already exist. |
|
Line 150 io_nextid(char *iolog_dir, char sessid[7])
|
Line 153 io_nextid(char *iolog_dir, char sessid[7])
|
| mkdir_parents(iolog_dir); |
mkdir_parents(iolog_dir); |
| if (stat(iolog_dir, &sb) != 0) { |
if (stat(iolog_dir, &sb) != 0) { |
| if (mkdir(iolog_dir, S_IRWXU) != 0) |
if (mkdir(iolog_dir, S_IRWXU) != 0) |
| log_error(USE_ERRNO, _("unable to mkdir %s"), iolog_dir); | log_fatal(USE_ERRNO, _("unable to mkdir %s"), iolog_dir); |
| } else if (!S_ISDIR(sb.st_mode)) { |
} else if (!S_ISDIR(sb.st_mode)) { |
| log_error(0, _("%s exists but is not a directory (0%o)"), | log_fatal(0, _("%s exists but is not a directory (0%o)"), |
| iolog_dir, (unsigned int) sb.st_mode); |
iolog_dir, (unsigned int) sb.st_mode); |
| } |
} |
| |
|
|
Line 162 io_nextid(char *iolog_dir, char sessid[7])
|
Line 165 io_nextid(char *iolog_dir, char sessid[7])
|
| len = snprintf(pathbuf, sizeof(pathbuf), "%s/seq", iolog_dir); |
len = snprintf(pathbuf, sizeof(pathbuf), "%s/seq", iolog_dir); |
| if (len <= 0 || len >= sizeof(pathbuf)) { |
if (len <= 0 || len >= sizeof(pathbuf)) { |
| errno = ENAMETOOLONG; |
errno = ENAMETOOLONG; |
| log_error(USE_ERRNO, "%s/seq", pathbuf); | log_fatal(USE_ERRNO, "%s/seq", pathbuf); |
| } |
} |
| fd = open(pathbuf, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); |
fd = open(pathbuf, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); |
| if (fd == -1) |
if (fd == -1) |
| log_error(USE_ERRNO, _("unable to open %s"), pathbuf); | log_fatal(USE_ERRNO, _("unable to open %s"), pathbuf); |
| lock_file(fd, SUDO_LOCK); |
lock_file(fd, SUDO_LOCK); |
| |
|
| /* Read seq number (base 36). */ | /* |
| nread = read(fd, buf, sizeof(buf)); | * If there is no seq file in iolog_dir and a fallback dir was |
| if (nread != 0) { | * specified, look for seq in the fallback dir. This is to work |
| if (nread == -1) | * around a bug in sudo 1.8.5 and older where iolog_dir was not |
| log_error(USE_ERRNO, _("unable to read %s"), pathbuf); | * expanded before the sequence number was updated. |
| id = strtoul(buf, &ep, 36); | */ |
| if (buf == ep || id >= SESSID_MAX) | if (iolog_dir_fallback != NULL && fstat(fd, &sb) == 0 && sb.st_size == 0) { |
| log_error(0, _("invalid sequence number %s"), pathbuf); | char fallback[PATH_MAX]; |
| | |
| | len = snprintf(fallback, sizeof(fallback), "%s/seq", |
| | iolog_dir_fallback); |
| | if (len > 0 && len < sizeof(fallback)) { |
| | int fd2 = open(fallback, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); |
| | if (fd2 != -1) { |
| | nread = read(fd2, buf, sizeof(buf)); |
| | if (nread > 0) { |
| | id = strtoul(buf, &ep, 36); |
| | if (buf == ep || id >= SESSID_MAX) |
| | id = 0; |
| | } |
| | close(fd2); |
| | } |
| | } |
| } |
} |
| |
|
| |
/* Read current seq number (base 36). */ |
| |
if (id == 0) { |
| |
nread = read(fd, buf, sizeof(buf)); |
| |
if (nread != 0) { |
| |
if (nread == -1) |
| |
log_fatal(USE_ERRNO, _("unable to read %s"), pathbuf); |
| |
id = strtoul(buf, &ep, 36); |
| |
if (buf == ep || id >= SESSID_MAX) |
| |
log_fatal(0, _("invalid sequence number %s"), pathbuf); |
| |
} |
| |
} |
| id++; |
id++; |
| |
|
| /* |
/* |
|
Line 190 io_nextid(char *iolog_dir, char sessid[7])
|
Line 220 io_nextid(char *iolog_dir, char sessid[7])
|
| } |
} |
| buf[6] = '\n'; |
buf[6] = '\n'; |
| |
|
| /* Stash id logging purposes */ | /* Stash id for logging purposes. */ |
| memcpy(sessid, buf, 6); |
memcpy(sessid, buf, 6); |
| sessid[6] = '\0'; |
sessid[6] = '\0'; |
| |
|
| /* Rewind and overwrite old seq file. */ |
/* Rewind and overwrite old seq file. */ |
| if (lseek(fd, 0, SEEK_SET) == (off_t)-1 || write(fd, buf, 7) != 7) | if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1 || write(fd, buf, 7) != 7) |
| log_error(USE_ERRNO, _("unable to write to %s"), pathbuf); | log_fatal(USE_ERRNO, _("unable to write to %s"), pathbuf); |
| close(fd); |
close(fd); |
| |
|
| |
debug_return; |
| } |
} |
| |
|
| /* |
/* |
|
Line 208 static size_t
|
Line 240 static size_t
|
| mkdir_iopath(const char *iolog_path, char *pathbuf, size_t pathsize) |
mkdir_iopath(const char *iolog_path, char *pathbuf, size_t pathsize) |
| { |
{ |
| size_t len; |
size_t len; |
| |
debug_decl(mkdir_iopath, SUDO_DEBUG_UTIL) |
| |
|
| len = strlcpy(pathbuf, iolog_path, pathsize); |
len = strlcpy(pathbuf, iolog_path, pathsize); |
| if (len >= pathsize) { |
if (len >= pathsize) { |
| errno = ENAMETOOLONG; |
errno = ENAMETOOLONG; |
| log_error(USE_ERRNO, "%s", iolog_path); | log_fatal(USE_ERRNO, "%s", iolog_path); |
| } |
} |
| |
|
| /* |
/* |
|
Line 222 mkdir_iopath(const char *iolog_path, char *pathbuf, si
|
Line 255 mkdir_iopath(const char *iolog_path, char *pathbuf, si
|
| mkdir_parents(pathbuf); |
mkdir_parents(pathbuf); |
| if (len >= 6 && strcmp(&pathbuf[len - 6], "XXXXXX") == 0) { |
if (len >= 6 && strcmp(&pathbuf[len - 6], "XXXXXX") == 0) { |
| if (mkdtemp(pathbuf) == NULL) |
if (mkdtemp(pathbuf) == NULL) |
| log_error(USE_ERRNO, _("unable to create %s"), pathbuf); | log_fatal(USE_ERRNO, _("unable to create %s"), pathbuf); |
| } else { |
} else { |
| if (mkdir(pathbuf, S_IRWXU) != 0) |
if (mkdir(pathbuf, S_IRWXU) != 0) |
| log_error(USE_ERRNO, _("unable to create %s"), pathbuf); | log_fatal(USE_ERRNO, _("unable to create %s"), pathbuf); |
| } |
} |
| |
|
| return len; | debug_return_size_t(len); |
| } |
} |
| |
|
| /* |
/* |
| * Append suffix to pathbuf after len chars and open the resulting file. |
* Append suffix to pathbuf after len chars and open the resulting file. |
| * Note that the size of pathbuf is assumed to be PATH_MAX. |
* Note that the size of pathbuf is assumed to be PATH_MAX. |
| * Uses zlib if docompress is TRUE. | * Uses zlib if docompress is true. |
| * Returns the open file handle which has the close-on-exec flag set. |
* Returns the open file handle which has the close-on-exec flag set. |
| */ |
*/ |
| static void * |
static void * |
| open_io_fd(char *pathbuf, size_t len, const char *suffix, int docompress) | open_io_fd(char *pathbuf, size_t len, const char *suffix, bool docompress) |
| { |
{ |
| void *vfd = NULL; |
void *vfd = NULL; |
| int fd; |
int fd; |
| |
debug_decl(open_io_fd, SUDO_DEBUG_UTIL) |
| |
|
| pathbuf[len] = '\0'; |
pathbuf[len] = '\0'; |
| strlcat(pathbuf, suffix, PATH_MAX); |
strlcat(pathbuf, suffix, PATH_MAX); |
|
Line 255 open_io_fd(char *pathbuf, size_t len, const char *suff
|
Line 289 open_io_fd(char *pathbuf, size_t len, const char *suff
|
| #endif |
#endif |
| vfd = fdopen(fd, "w"); |
vfd = fdopen(fd, "w"); |
| } |
} |
| return vfd; | debug_return_ptr(vfd); |
| } |
} |
| |
|
| /* |
/* |
|
Line 272 iolog_deserialize_info(struct iolog_details *details,
|
Line 306 iolog_deserialize_info(struct iolog_details *details,
|
| unsigned long ulval; |
unsigned long ulval; |
| uid_t runas_uid = 0; |
uid_t runas_uid = 0; |
| gid_t runas_gid = 0; |
gid_t runas_gid = 0; |
| |
debug_decl(iolog_deserialize_info, SUDO_DEBUG_UTIL) |
| |
|
| memset(details, 0, sizeof(*details)); |
memset(details, 0, sizeof(*details)); |
| |
|
|
Line 312 iolog_deserialize_info(struct iolog_details *details,
|
Line 347 iolog_deserialize_info(struct iolog_details *details,
|
| continue; |
continue; |
| } |
} |
| if (strncmp(*cur, "iolog_stdin=", sizeof("iolog_stdin=") - 1) == 0) { |
if (strncmp(*cur, "iolog_stdin=", sizeof("iolog_stdin=") - 1) == 0) { |
| if (atobool(*cur + sizeof("iolog_stdin=") - 1) == TRUE) | if (atobool(*cur + sizeof("iolog_stdin=") - 1) == true) |
| details->iolog_stdin = TRUE; | details->iolog_stdin = true; |
| continue; |
continue; |
| } |
} |
| if (strncmp(*cur, "iolog_stdout=", sizeof("iolog_stdout=") - 1) == 0) { |
if (strncmp(*cur, "iolog_stdout=", sizeof("iolog_stdout=") - 1) == 0) { |
| if (atobool(*cur + sizeof("iolog_stdout=") - 1) == TRUE) | if (atobool(*cur + sizeof("iolog_stdout=") - 1) == true) |
| details->iolog_stdout = TRUE; | details->iolog_stdout = true; |
| continue; |
continue; |
| } |
} |
| if (strncmp(*cur, "iolog_stderr=", sizeof("iolog_stderr=") - 1) == 0) { |
if (strncmp(*cur, "iolog_stderr=", sizeof("iolog_stderr=") - 1) == 0) { |
| if (atobool(*cur + sizeof("iolog_stderr=") - 1) == TRUE) | if (atobool(*cur + sizeof("iolog_stderr=") - 1) == true) |
| details->iolog_stderr = TRUE; | details->iolog_stderr = true; |
| continue; |
continue; |
| } |
} |
| if (strncmp(*cur, "iolog_ttyin=", sizeof("iolog_ttyin=") - 1) == 0) { |
if (strncmp(*cur, "iolog_ttyin=", sizeof("iolog_ttyin=") - 1) == 0) { |
| if (atobool(*cur + sizeof("iolog_ttyin=") - 1) == TRUE) | if (atobool(*cur + sizeof("iolog_ttyin=") - 1) == true) |
| details->iolog_ttyin = TRUE; | details->iolog_ttyin = true; |
| continue; |
continue; |
| } |
} |
| if (strncmp(*cur, "iolog_ttyout=", sizeof("iolog_ttyout=") - 1) == 0) { |
if (strncmp(*cur, "iolog_ttyout=", sizeof("iolog_ttyout=") - 1) == 0) { |
| if (atobool(*cur + sizeof("iolog_ttyout=") - 1) == TRUE) | if (atobool(*cur + sizeof("iolog_ttyout=") - 1) == true) |
| details->iolog_ttyout = TRUE; | details->iolog_ttyout = true; |
| continue; |
continue; |
| } |
} |
| if (strncmp(*cur, "iolog_compress=", sizeof("iolog_compress=") - 1) == 0) { |
if (strncmp(*cur, "iolog_compress=", sizeof("iolog_compress=") - 1) == 0) { |
| if (atobool(*cur + sizeof("iolog_compress=") - 1) == TRUE) | if (atobool(*cur + sizeof("iolog_compress=") - 1) == true) |
| iolog_compress = TRUE; /* must be global */ | iolog_compress = true; /* must be global */ |
| continue; |
continue; |
| } |
} |
| break; |
break; |
|
Line 402 iolog_deserialize_info(struct iolog_details *details,
|
Line 437 iolog_deserialize_info(struct iolog_details *details,
|
| details->runas_gr = sudo_fakegrnam(id); |
details->runas_gr = sudo_fakegrnam(id); |
| } |
} |
| } |
} |
| |
debug_return; |
| } |
} |
| |
|
| static int |
static int |
| sudoers_io_open(unsigned int version, sudo_conv_t conversation, |
sudoers_io_open(unsigned int version, sudo_conv_t conversation, |
| sudo_printf_t plugin_printf, char * const settings[], |
sudo_printf_t plugin_printf, char * const settings[], |
| char * const user_info[], char * const command_info[], |
char * const user_info[], char * const command_info[], |
| int argc, char * const argv[], char * const user_env[]) | int argc, char * const argv[], char * const user_env[], char * const args[]) |
| { |
{ |
| struct iolog_details details; |
struct iolog_details details; |
| char pathbuf[PATH_MAX], sessid[7]; |
char pathbuf[PATH_MAX], sessid[7]; |
| char *tofree = NULL; |
char *tofree = NULL; |
| char * const *cur; |
char * const *cur; |
| |
const char *debug_flags = NULL; |
| FILE *io_logfile; |
FILE *io_logfile; |
| size_t len; |
size_t len; |
| int rval = -1; |
int rval = -1; |
| |
debug_decl(sudoers_io_open, SUDO_DEBUG_PLUGIN) |
| |
|
| if (!sudo_conv) |
if (!sudo_conv) |
| sudo_conv = conversation; |
sudo_conv = conversation; |
|
Line 425 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
Line 463 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
| |
|
| /* If we have no command (because -V was specified) just return. */ |
/* If we have no command (because -V was specified) just return. */ |
| if (argc == 0) |
if (argc == 0) |
| return TRUE; | debug_return_bool(true); |
| |
|
| if (sigsetjmp(error_jmp, 1)) { |
if (sigsetjmp(error_jmp, 1)) { |
| /* called via error(), errorx() or log_error() */ | /* called via error(), errorx() or log_fatal() */ |
| rval = -1; |
rval = -1; |
| goto done; |
goto done; |
| } |
} |
|
Line 439 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
Line 477 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
| sudo_setgrent(); |
sudo_setgrent(); |
| |
|
| /* |
/* |
| |
* Check for debug flags in settings list. |
| |
*/ |
| |
for (cur = settings; *cur != NULL; cur++) { |
| |
if (strncmp(*cur, "debug_flags=", sizeof("debug_flags=") - 1) == 0) |
| |
debug_flags = *cur + sizeof("debug_flags=") - 1; |
| |
} |
| |
if (debug_flags != NULL) |
| |
sudo_debug_init(NULL, debug_flags); |
| |
|
| |
/* |
| * Pull iolog settings out of command_info, if any. |
* Pull iolog settings out of command_info, if any. |
| */ |
*/ |
| iolog_deserialize_info(&details, user_info, command_info); |
iolog_deserialize_info(&details, user_info, command_info); |
|
Line 446 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
Line 494 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
| if (!details.iolog_stdin && !details.iolog_ttyin && |
if (!details.iolog_stdin && !details.iolog_ttyin && |
| !details.iolog_stdout && !details.iolog_stderr && |
!details.iolog_stdout && !details.iolog_stderr && |
| !details.iolog_ttyout) { |
!details.iolog_ttyout) { |
| rval = FALSE; | rval = false; |
| goto done; |
goto done; |
| } |
} |
| |
|
|
Line 455 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
Line 503 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
| /* Get next session ID and convert it into a path. */ |
/* Get next session ID and convert it into a path. */ |
| tofree = emalloc(sizeof(_PATH_SUDO_IO_LOGDIR) + sizeof(sessid) + 2); |
tofree = emalloc(sizeof(_PATH_SUDO_IO_LOGDIR) + sizeof(sessid) + 2); |
| memcpy(tofree, _PATH_SUDO_IO_LOGDIR, sizeof(_PATH_SUDO_IO_LOGDIR)); |
memcpy(tofree, _PATH_SUDO_IO_LOGDIR, sizeof(_PATH_SUDO_IO_LOGDIR)); |
| io_nextid(tofree, sessid); | io_nextid(tofree, NULL, sessid); |
| snprintf(tofree + sizeof(_PATH_SUDO_IO_LOGDIR), sizeof(sessid) + 2, |
snprintf(tofree + sizeof(_PATH_SUDO_IO_LOGDIR), sizeof(sessid) + 2, |
| "%c%c/%c%c/%c%c", sessid[0], sessid[1], sessid[2], sessid[3], |
"%c%c/%c%c/%c%c", sessid[0], sessid[1], sessid[2], sessid[3], |
| sessid[4], sessid[5]); |
sessid[4], sessid[5]); |
|
Line 473 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
Line 521 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
| /* |
/* |
| * We create 7 files: a log file, a timing file and 5 for input/output. |
* We create 7 files: a log file, a timing file and 5 for input/output. |
| */ |
*/ |
| io_logfile = open_io_fd(pathbuf, len, "/log", FALSE); | io_logfile = open_io_fd(pathbuf, len, "/log", false); |
| if (io_logfile == NULL) |
if (io_logfile == NULL) |
| log_error(USE_ERRNO, _("unable to create %s"), pathbuf); | log_fatal(USE_ERRNO, _("unable to create %s"), pathbuf); |
| |
|
| io_fds[IOFD_TIMING].v = open_io_fd(pathbuf, len, "/timing", |
io_fds[IOFD_TIMING].v = open_io_fd(pathbuf, len, "/timing", |
| iolog_compress); |
iolog_compress); |
| if (io_fds[IOFD_TIMING].v == NULL) |
if (io_fds[IOFD_TIMING].v == NULL) |
| log_error(USE_ERRNO, _("unable to create %s"), pathbuf); | log_fatal(USE_ERRNO, _("unable to create %s"), pathbuf); |
| |
|
| if (details.iolog_ttyin) { |
if (details.iolog_ttyin) { |
| io_fds[IOFD_TTYIN].v = open_io_fd(pathbuf, len, "/ttyin", |
io_fds[IOFD_TTYIN].v = open_io_fd(pathbuf, len, "/ttyin", |
| iolog_compress); |
iolog_compress); |
| if (io_fds[IOFD_TTYIN].v == NULL) |
if (io_fds[IOFD_TTYIN].v == NULL) |
| log_error(USE_ERRNO, _("unable to create %s"), pathbuf); | log_fatal(USE_ERRNO, _("unable to create %s"), pathbuf); |
| } else { |
} else { |
| sudoers_io.log_ttyin = NULL; |
sudoers_io.log_ttyin = NULL; |
| } |
} |
|
Line 494 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
Line 542 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
| io_fds[IOFD_STDIN].v = open_io_fd(pathbuf, len, "/stdin", |
io_fds[IOFD_STDIN].v = open_io_fd(pathbuf, len, "/stdin", |
| iolog_compress); |
iolog_compress); |
| if (io_fds[IOFD_STDIN].v == NULL) |
if (io_fds[IOFD_STDIN].v == NULL) |
| log_error(USE_ERRNO, _("unable to create %s"), pathbuf); | log_fatal(USE_ERRNO, _("unable to create %s"), pathbuf); |
| } else { |
} else { |
| sudoers_io.log_stdin = NULL; |
sudoers_io.log_stdin = NULL; |
| } |
} |
|
Line 502 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
Line 550 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
| io_fds[IOFD_TTYOUT].v = open_io_fd(pathbuf, len, "/ttyout", |
io_fds[IOFD_TTYOUT].v = open_io_fd(pathbuf, len, "/ttyout", |
| iolog_compress); |
iolog_compress); |
| if (io_fds[IOFD_TTYOUT].v == NULL) |
if (io_fds[IOFD_TTYOUT].v == NULL) |
| log_error(USE_ERRNO, _("unable to create %s"), pathbuf); | log_fatal(USE_ERRNO, _("unable to create %s"), pathbuf); |
| } else { |
} else { |
| sudoers_io.log_ttyout = NULL; |
sudoers_io.log_ttyout = NULL; |
| } |
} |
|
Line 510 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
Line 558 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
| io_fds[IOFD_STDOUT].v = open_io_fd(pathbuf, len, "/stdout", |
io_fds[IOFD_STDOUT].v = open_io_fd(pathbuf, len, "/stdout", |
| iolog_compress); |
iolog_compress); |
| if (io_fds[IOFD_STDOUT].v == NULL) |
if (io_fds[IOFD_STDOUT].v == NULL) |
| log_error(USE_ERRNO, _("unable to create %s"), pathbuf); | log_fatal(USE_ERRNO, _("unable to create %s"), pathbuf); |
| } else { |
} else { |
| sudoers_io.log_stdout = NULL; |
sudoers_io.log_stdout = NULL; |
| } |
} |
|
Line 518 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
Line 566 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
| io_fds[IOFD_STDERR].v = open_io_fd(pathbuf, len, "/stderr", |
io_fds[IOFD_STDERR].v = open_io_fd(pathbuf, len, "/stderr", |
| iolog_compress); |
iolog_compress); |
| if (io_fds[IOFD_STDERR].v == NULL) |
if (io_fds[IOFD_STDERR].v == NULL) |
| log_error(USE_ERRNO, _("unable to create %s"), pathbuf); | log_fatal(USE_ERRNO, _("unable to create %s"), pathbuf); |
| } else { |
} else { |
| sudoers_io.log_stderr = NULL; |
sudoers_io.log_stderr = NULL; |
| } |
} |
|
Line 539 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
Line 587 sudoers_io_open(unsigned int version, sudo_conv_t conv
|
| fputc('\n', io_logfile); |
fputc('\n', io_logfile); |
| fclose(io_logfile); |
fclose(io_logfile); |
| |
|
| rval = TRUE; | rval = true; |
| |
|
| done: |
done: |
| efree(tofree); |
efree(tofree); |
| if (details.runas_pw) |
if (details.runas_pw) |
| pw_delref(details.runas_pw); | sudo_pw_delref(details.runas_pw); |
| sudo_endpwent(); |
sudo_endpwent(); |
| if (details.runas_gr) |
if (details.runas_gr) |
| gr_delref(details.runas_gr); | sudo_gr_delref(details.runas_gr); |
| sudo_endgrent(); |
sudo_endgrent(); |
| |
|
| return rval; | debug_return_bool(rval); |
| } |
} |
| |
|
| static void |
static void |
| sudoers_io_close(int exit_status, int error) |
sudoers_io_close(int exit_status, int error) |
| { |
{ |
| int i; |
int i; |
| |
debug_decl(sudoers_io_close, SUDO_DEBUG_PLUGIN) |
| |
|
| if (sigsetjmp(error_jmp, 1)) { |
if (sigsetjmp(error_jmp, 1)) { |
| /* called via error(), errorx() or log_error() */ | /* called via error(), errorx() or log_fatal() */ |
| return; | debug_return; |
| } |
} |
| |
|
| for (i = 0; i < IOFD_MAX; i++) { |
for (i = 0; i < IOFD_MAX; i++) { |
|
Line 573 sudoers_io_close(int exit_status, int error)
|
Line 622 sudoers_io_close(int exit_status, int error)
|
| #endif |
#endif |
| fclose(io_fds[i].f); |
fclose(io_fds[i].f); |
| } |
} |
| |
debug_return; |
| } |
} |
| |
|
| static int |
static int |
| sudoers_io_version(int verbose) |
sudoers_io_version(int verbose) |
| { |
{ |
| |
debug_decl(sudoers_io_version, SUDO_DEBUG_PLUGIN) |
| |
|
| if (sigsetjmp(error_jmp, 1)) { |
if (sigsetjmp(error_jmp, 1)) { |
| /* called via error(), errorx() or log_error() */ | /* called via error(), errorx() or log_fatal() */ |
| return -1; | debug_return_bool(-1); |
| } |
} |
| |
|
| sudo_printf(SUDO_CONV_INFO_MSG, "Sudoers I/O plugin version %s\n", |
sudo_printf(SUDO_CONV_INFO_MSG, "Sudoers I/O plugin version %s\n", |
| PACKAGE_VERSION); |
PACKAGE_VERSION); |
| |
|
| return TRUE; | debug_return_bool(true); |
| } |
} |
| |
|
| /* |
/* |
|
Line 596 static int
|
Line 648 static int
|
| sudoers_io_log(const char *buf, unsigned int len, int idx) |
sudoers_io_log(const char *buf, unsigned int len, int idx) |
| { |
{ |
| struct timeval now, delay; |
struct timeval now, delay; |
| |
debug_decl(sudoers_io_version, SUDO_DEBUG_PLUGIN) |
| |
|
| gettimeofday(&now, NULL); |
gettimeofday(&now, NULL); |
| |
|
| if (sigsetjmp(error_jmp, 1)) { |
if (sigsetjmp(error_jmp, 1)) { |
| /* called via error(), errorx() or log_error() */ | /* called via error(), errorx() or log_fatal() */ |
| return -1; | debug_return_bool(-1); |
| } |
} |
| |
|
| #ifdef HAVE_ZLIB_H |
#ifdef HAVE_ZLIB_H |
| if (iolog_compress) |
if (iolog_compress) |
| gzwrite(io_fds[idx].g, buf, len); | ignore_result(gzwrite(io_fds[idx].g, (const voidp)buf, len)); |
| else |
else |
| #endif |
#endif |
| fwrite(buf, 1, len, io_fds[idx].f); | ignore_result(fwrite(buf, 1, len, io_fds[idx].f)); |
| delay.tv_sec = now.tv_sec; |
delay.tv_sec = now.tv_sec; |
| delay.tv_usec = now.tv_usec; |
delay.tv_usec = now.tv_usec; |
| timevalsub(&delay, &last_time); |
timevalsub(&delay, &last_time); |
|
Line 624 sudoers_io_log(const char *buf, unsigned int len, int
|
Line 677 sudoers_io_log(const char *buf, unsigned int len, int
|
| last_time.tv_sec = now.tv_sec; |
last_time.tv_sec = now.tv_sec; |
| last_time.tv_usec = now.tv_usec; |
last_time.tv_usec = now.tv_usec; |
| |
|
| return TRUE; | debug_return_bool(true); |
| } |
} |
| |
|
| static int |
static int |
|
Line 657 sudoers_io_log_stderr(const char *buf, unsigned int le
|
Line 710 sudoers_io_log_stderr(const char *buf, unsigned int le
|
| return sudoers_io_log(buf, len, IOFD_STDERR); |
return sudoers_io_log(buf, len, IOFD_STDERR); |
| } |
} |
| |
|
| struct io_plugin sudoers_io = { | __dso_public struct io_plugin sudoers_io = { |
| SUDO_IO_PLUGIN, |
SUDO_IO_PLUGIN, |
| SUDO_API_VERSION, |
SUDO_API_VERSION, |
| sudoers_io_open, |
sudoers_io_open, |