mirror of
https://github.com/sheumann/hush.git
synced 2024-08-20 19:29:02 +00:00
*: more readable handling of pipe fds. No code changes.
This commit is contained in:
parent
1e18f1bab3
commit
3718832a15
@ -15,10 +15,10 @@ int open_transformer(int src_fd,
|
|||||||
USE_DESKTOP(long long) int (*transformer)(int src_fd, int dst_fd),
|
USE_DESKTOP(long long) int (*transformer)(int src_fd, int dst_fd),
|
||||||
const char *transform_prog)
|
const char *transform_prog)
|
||||||
{
|
{
|
||||||
int fd_pipe[2];
|
struct fd_pair fd_pipe;
|
||||||
int pid;
|
int pid;
|
||||||
|
|
||||||
xpipe(fd_pipe);
|
xpiped_pair(fd_pipe);
|
||||||
|
|
||||||
#if BB_MMU
|
#if BB_MMU
|
||||||
pid = fork();
|
pid = fork();
|
||||||
@ -30,12 +30,12 @@ int open_transformer(int src_fd,
|
|||||||
|
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
/* child process */
|
/* child process */
|
||||||
close(fd_pipe[0]); /* We don't want to read from the parent */
|
close(fd_pipe.rd); /* We don't want to read from the parent */
|
||||||
// FIXME: error check?
|
// FIXME: error check?
|
||||||
#if BB_MMU
|
#if BB_MMU
|
||||||
transformer(src_fd, fd_pipe[1]);
|
transformer(src_fd, fd_pipe.wr);
|
||||||
if (ENABLE_FEATURE_CLEAN_UP) {
|
if (ENABLE_FEATURE_CLEAN_UP) {
|
||||||
close(fd_pipe[1]); /* Send EOF */
|
close(fd_pipe.wr); /* Send EOF */
|
||||||
close(src_fd);
|
close(src_fd);
|
||||||
}
|
}
|
||||||
exit(0);
|
exit(0);
|
||||||
@ -43,7 +43,7 @@ int open_transformer(int src_fd,
|
|||||||
{
|
{
|
||||||
char *argv[4];
|
char *argv[4];
|
||||||
xmove_fd(src_fd, 0);
|
xmove_fd(src_fd, 0);
|
||||||
xmove_fd(fd_pipe[1], 1);
|
xmove_fd(fd_pipe.wr, 1);
|
||||||
argv[0] = (char*)transform_prog;
|
argv[0] = (char*)transform_prog;
|
||||||
argv[1] = (char*)"-cf";
|
argv[1] = (char*)"-cf";
|
||||||
argv[2] = (char*)"-";
|
argv[2] = (char*)"-";
|
||||||
@ -56,7 +56,7 @@ int open_transformer(int src_fd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* parent process */
|
/* parent process */
|
||||||
close(fd_pipe[1]); /* Don't want to write to the child */
|
close(fd_pipe.wr); /* Don't want to write to the child */
|
||||||
|
|
||||||
return fd_pipe[0];
|
return fd_pipe.rd;
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include "libbb.h"
|
#include "libbb.h"
|
||||||
#include "unarchive.h"
|
#include "unarchive.h"
|
||||||
|
|
||||||
void seek_by_jump(const archive_handle_t *archive_handle, const unsigned int amount)
|
void seek_by_jump(const archive_handle_t *archive_handle, unsigned amount)
|
||||||
{
|
{
|
||||||
if (lseek(archive_handle->src_fd, (off_t) amount, SEEK_CUR) == (off_t) -1) {
|
if (lseek(archive_handle->src_fd, (off_t) amount, SEEK_CUR) == (off_t) -1) {
|
||||||
#if ENABLE_FEATURE_UNARCHIVE_TAPE
|
#if ENABLE_FEATURE_UNARCHIVE_TAPE
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
#include "libbb.h"
|
#include "libbb.h"
|
||||||
#include "unarchive.h"
|
#include "unarchive.h"
|
||||||
|
|
||||||
/* If we are reading through a pipe(), or from stdin then we can't lseek,
|
/* If we are reading through a pipe, or from stdin then we can't lseek,
|
||||||
* we must read and discard the data to skip over it.
|
* we must read and discard the data to skip over it.
|
||||||
*/
|
*/
|
||||||
void seek_by_read(const archive_handle_t *archive_handle, const unsigned int jump_size)
|
void seek_by_read(const archive_handle_t *archive_handle, unsigned jump_size)
|
||||||
{
|
{
|
||||||
if (jump_size)
|
if (jump_size)
|
||||||
bb_copyfd_exact_size(archive_handle->src_fd, -1, jump_size);
|
bb_copyfd_exact_size(archive_handle->src_fd, -1, jump_size);
|
||||||
|
@ -521,14 +521,14 @@ static int writeTarFile(const int tar_fd, const int verboseFlag,
|
|||||||
|
|
||||||
volatile int vfork_exec_errno = 0;
|
volatile int vfork_exec_errno = 0;
|
||||||
#if WAIT_FOR_CHILD
|
#if WAIT_FOR_CHILD
|
||||||
struct { int rd; int wr; } gzipStatusPipe;
|
struct fd_pair gzipStatusPipe;
|
||||||
#endif
|
#endif
|
||||||
struct { int rd; int wr; } gzipDataPipe;
|
struct fd_pair gzipDataPipe;
|
||||||
const char *zip_exec = (gzip == 1) ? "gzip" : "bzip2";
|
const char *zip_exec = (gzip == 1) ? "gzip" : "bzip2";
|
||||||
|
|
||||||
xpipe(&gzipDataPipe.rd);
|
xpiped_pair(gzipDataPipe);
|
||||||
#if WAIT_FOR_CHILD
|
#if WAIT_FOR_CHILD
|
||||||
xpipe(&gzipStatusPipe.rd);
|
xpiped_pair(gzipStatusPipe);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
signal(SIGPIPE, SIG_IGN); /* we only want EPIPE on errors */
|
signal(SIGPIPE, SIG_IGN); /* we only want EPIPE on errors */
|
||||||
|
@ -294,10 +294,15 @@ int xopen(const char *pathname, int flags);
|
|||||||
int xopen3(const char *pathname, int flags, int mode);
|
int xopen3(const char *pathname, int flags, int mode);
|
||||||
int open_or_warn(const char *pathname, int flags);
|
int open_or_warn(const char *pathname, int flags);
|
||||||
int open3_or_warn(const char *pathname, int flags, int mode);
|
int open3_or_warn(const char *pathname, int flags, int mode);
|
||||||
void xpipe(int filedes[2]);
|
|
||||||
off_t xlseek(int fd, off_t offset, int whence);
|
off_t xlseek(int fd, off_t offset, int whence);
|
||||||
off_t fdlength(int fd);
|
off_t fdlength(int fd);
|
||||||
|
|
||||||
|
void xpipe(int filedes[2]);
|
||||||
|
/* In this form code with pipes is much more readable */
|
||||||
|
struct fd_pair { int rd; int wr; };
|
||||||
|
#define piped_pair(pair) pipe(&((pair).rd))
|
||||||
|
#define xpiped_pair(pair) xpipe(&((pair).rd))
|
||||||
|
|
||||||
/* Useful for having small structure members/global variables */
|
/* Useful for having small structure members/global variables */
|
||||||
typedef int8_t socktype_t;
|
typedef int8_t socktype_t;
|
||||||
typedef int8_t family_t;
|
typedef int8_t family_t;
|
||||||
|
@ -92,8 +92,8 @@ extern char get_header_tar_bz2(archive_handle_t *archive_handle);
|
|||||||
extern char get_header_tar_lzma(archive_handle_t *archive_handle);
|
extern char get_header_tar_lzma(archive_handle_t *archive_handle);
|
||||||
extern char get_header_tar_gz(archive_handle_t *archive_handle);
|
extern char get_header_tar_gz(archive_handle_t *archive_handle);
|
||||||
|
|
||||||
extern void seek_by_jump(const archive_handle_t *archive_handle, const unsigned amount);
|
extern void seek_by_jump(const archive_handle_t *archive_handle, unsigned amount);
|
||||||
extern void seek_by_read(const archive_handle_t *archive_handle, const unsigned amount);
|
extern void seek_by_read(const archive_handle_t *archive_handle, unsigned amount);
|
||||||
|
|
||||||
extern ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned char *buf, size_t count);
|
extern ssize_t archive_xread_all_eof(archive_handle_t *archive_handle, unsigned char *buf, size_t count);
|
||||||
|
|
||||||
|
@ -70,18 +70,18 @@ static void edit_file(const struct passwd *pas, const char *file)
|
|||||||
|
|
||||||
static int open_as_user(const struct passwd *pas, const char *file)
|
static int open_as_user(const struct passwd *pas, const char *file)
|
||||||
{
|
{
|
||||||
int filedes[2];
|
struct fd_pair filedes;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
xpipe(filedes);
|
xpiped_pair(filedes);
|
||||||
pid = vfork();
|
pid = vfork();
|
||||||
if (pid < 0) /* ERROR */
|
if (pid < 0) /* ERROR */
|
||||||
bb_perror_msg_and_die("vfork");
|
bb_perror_msg_and_die("vfork");
|
||||||
if (pid) { /* PARENT */
|
if (pid) { /* PARENT */
|
||||||
int n = safe_read(filedes[0], &c, 1);
|
int n = safe_read(filedes.rd, &c, 1);
|
||||||
close(filedes[0]);
|
close(filedes.rd);
|
||||||
close(filedes[1]);
|
close(filedes.wr);
|
||||||
if (n > 0) /* child says it can read */
|
if (n > 0) /* child says it can read */
|
||||||
return open(file, O_RDONLY);
|
return open(file, O_RDONLY);
|
||||||
return -1;
|
return -1;
|
||||||
@ -95,7 +95,7 @@ static int open_as_user(const struct passwd *pas, const char *file)
|
|||||||
/* We just try to read one byte. If that works, file is readable
|
/* We just try to read one byte. If that works, file is readable
|
||||||
* under this user. We signal that by sending one byte to parent. */
|
* under this user. We signal that by sending one byte to parent. */
|
||||||
if (safe_read(xopen(file, O_RDONLY), &c, 1) == 1)
|
if (safe_read(xopen(file, O_RDONLY), &c, 1) == 1)
|
||||||
safe_write(filedes[1], &c, 1); /* "papa, I can read!" */
|
safe_write(filedes.wr, &c, 1); /* "papa, I can read!" */
|
||||||
_exit(0);
|
_exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1305,8 +1305,8 @@ static void send_cgi_and_exit(
|
|||||||
const char *cookie,
|
const char *cookie,
|
||||||
const char *content_type)
|
const char *content_type)
|
||||||
{
|
{
|
||||||
struct { int rd; int wr; } fromCgi; /* CGI -> httpd pipe */
|
struct fd_pair fromCgi; /* CGI -> httpd pipe */
|
||||||
struct { int rd; int wr; } toCgi; /* httpd -> CGI pipe */
|
struct fd_pair toCgi; /* httpd -> CGI pipe */
|
||||||
char *fullpath;
|
char *fullpath;
|
||||||
char *script;
|
char *script;
|
||||||
char *purl;
|
char *purl;
|
||||||
@ -1396,8 +1396,8 @@ static void send_cgi_and_exit(
|
|||||||
if (referer)
|
if (referer)
|
||||||
setenv1("HTTP_REFERER", referer);
|
setenv1("HTTP_REFERER", referer);
|
||||||
|
|
||||||
xpipe(&fromCgi.rd);
|
xpiped_pair(fromCgi);
|
||||||
xpipe(&toCgi.rd);
|
xpiped_pair(toCgi);
|
||||||
|
|
||||||
pid = vfork();
|
pid = vfork();
|
||||||
if (pid < 0) {
|
if (pid < 0) {
|
||||||
|
@ -987,11 +987,11 @@ static int iface_down(struct interface_defn_t *iface)
|
|||||||
static int popen2(FILE **in, FILE **out, char *command, char *param)
|
static int popen2(FILE **in, FILE **out, char *command, char *param)
|
||||||
{
|
{
|
||||||
char *argv[3] = { command, param, NULL };
|
char *argv[3] = { command, param, NULL };
|
||||||
int infd[2], outfd[2];
|
struct fd_pair infd, outfd;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
|
||||||
xpipe(infd);
|
xpiped_pair(infd);
|
||||||
xpipe(outfd);
|
xpiped_pair(outfd);
|
||||||
|
|
||||||
fflush(NULL);
|
fflush(NULL);
|
||||||
pid = fork();
|
pid = fork();
|
||||||
@ -1001,18 +1001,18 @@ static int popen2(FILE **in, FILE **out, char *command, char *param)
|
|||||||
bb_perror_msg_and_die("fork");
|
bb_perror_msg_and_die("fork");
|
||||||
case 0: /* child */
|
case 0: /* child */
|
||||||
/* NB: close _first_, then move fds! */
|
/* NB: close _first_, then move fds! */
|
||||||
close(infd[1]);
|
close(infd.wr);
|
||||||
close(outfd[0]);
|
close(outfd.rd);
|
||||||
xmove_fd(infd[0], 0);
|
xmove_fd(infd.rd, 0);
|
||||||
xmove_fd(outfd[1], 1);
|
xmove_fd(outfd.wr, 1);
|
||||||
BB_EXECVP(command, argv);
|
BB_EXECVP(command, argv);
|
||||||
_exit(127);
|
_exit(127);
|
||||||
}
|
}
|
||||||
/* parent */
|
/* parent */
|
||||||
close(infd[0]);
|
close(infd.rd);
|
||||||
close(outfd[1]);
|
close(outfd.wr);
|
||||||
*in = fdopen(infd[1], "w");
|
*in = fdopen(infd.wr, "w");
|
||||||
*out = fdopen(outfd[0], "r");
|
*out = fdopen(outfd.rd, "r");
|
||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,12 +23,12 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
|
||||||
static int signal_pipe[2];
|
static struct fd_pair signal_pipe;
|
||||||
|
|
||||||
static void signal_handler(int sig)
|
static void signal_handler(int sig)
|
||||||
{
|
{
|
||||||
unsigned char ch = sig; /* use char, avoid dealing with partial writes */
|
unsigned char ch = sig; /* use char, avoid dealing with partial writes */
|
||||||
if (write(signal_pipe[1], &ch, 1) != 1)
|
if (write(signal_pipe.wr, &ch, 1) != 1)
|
||||||
bb_perror_msg("cannot send signal");
|
bb_perror_msg("cannot send signal");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,10 +38,10 @@ static void signal_handler(int sig)
|
|||||||
void udhcp_sp_setup(void)
|
void udhcp_sp_setup(void)
|
||||||
{
|
{
|
||||||
/* was socketpair, but it needs AF_UNIX in kernel */
|
/* was socketpair, but it needs AF_UNIX in kernel */
|
||||||
xpipe(signal_pipe);
|
xpiped_pair(signal_pipe);
|
||||||
close_on_exec_on(signal_pipe[0]);
|
close_on_exec_on(signal_pipe.rd);
|
||||||
close_on_exec_on(signal_pipe[1]);
|
close_on_exec_on(signal_pipe.wr);
|
||||||
ndelay_on(signal_pipe[1]);
|
ndelay_on(signal_pipe.wr);
|
||||||
signal(SIGUSR1, signal_handler);
|
signal(SIGUSR1, signal_handler);
|
||||||
signal(SIGUSR2, signal_handler);
|
signal(SIGUSR2, signal_handler);
|
||||||
signal(SIGTERM, signal_handler);
|
signal(SIGTERM, signal_handler);
|
||||||
@ -54,12 +54,12 @@ void udhcp_sp_setup(void)
|
|||||||
int udhcp_sp_fd_set(fd_set *rfds, int extra_fd)
|
int udhcp_sp_fd_set(fd_set *rfds, int extra_fd)
|
||||||
{
|
{
|
||||||
FD_ZERO(rfds);
|
FD_ZERO(rfds);
|
||||||
FD_SET(signal_pipe[0], rfds);
|
FD_SET(signal_pipe.rd, rfds);
|
||||||
if (extra_fd >= 0) {
|
if (extra_fd >= 0) {
|
||||||
close_on_exec_on(extra_fd);
|
close_on_exec_on(extra_fd);
|
||||||
FD_SET(extra_fd, rfds);
|
FD_SET(extra_fd, rfds);
|
||||||
}
|
}
|
||||||
return signal_pipe[0] > extra_fd ? signal_pipe[0] : extra_fd;
|
return signal_pipe.rd > extra_fd ? signal_pipe.rd : extra_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -70,10 +70,10 @@ int udhcp_sp_read(const fd_set *rfds)
|
|||||||
{
|
{
|
||||||
unsigned char sig;
|
unsigned char sig;
|
||||||
|
|
||||||
if (!FD_ISSET(signal_pipe[0], rfds))
|
if (!FD_ISSET(signal_pipe.rd, rfds))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (read(signal_pipe[0], &sig, 1) != 1)
|
if (safe_read(signal_pipe.rd, &sig, 1) != 1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return sig;
|
return sig;
|
||||||
|
@ -90,8 +90,8 @@ struct globals {
|
|||||||
smallint haslog;
|
smallint haslog;
|
||||||
smallint sigterm;
|
smallint sigterm;
|
||||||
smallint pidchanged;
|
smallint pidchanged;
|
||||||
int selfpipe[2];
|
struct fd_pair selfpipe;
|
||||||
int logpipe[2];
|
struct fd_pair logpipe;
|
||||||
char *dir;
|
char *dir;
|
||||||
struct svdir svd[2];
|
struct svdir svd[2];
|
||||||
};
|
};
|
||||||
@ -130,13 +130,13 @@ static void warn_cannot(const char *m)
|
|||||||
|
|
||||||
static void s_child(int sig_no)
|
static void s_child(int sig_no)
|
||||||
{
|
{
|
||||||
write(selfpipe[1], "", 1);
|
write(selfpipe.wr, "", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void s_term(int sig_no)
|
static void s_term(int sig_no)
|
||||||
{
|
{
|
||||||
sigterm = 1;
|
sigterm = 1;
|
||||||
write(selfpipe[1], "", 1); /* XXX */
|
write(selfpipe.wr, "", 1); /* XXX */
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *add_str(char *p, const char *to_add)
|
static char *add_str(char *p, const char *to_add)
|
||||||
@ -275,7 +275,7 @@ static unsigned custom(struct svdir *s, char c)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!pid) {
|
if (!pid) {
|
||||||
if (haslog && dup2(logpipe[1], 1) == -1)
|
if (haslog && dup2(logpipe.wr, 1) == -1)
|
||||||
warn_cannot("setup stdout for control/?");
|
warn_cannot("setup stdout for control/?");
|
||||||
prog[0] = a;
|
prog[0] = a;
|
||||||
prog[1] = NULL;
|
prog[1] = NULL;
|
||||||
@ -335,13 +335,14 @@ static void startservice(struct svdir *s)
|
|||||||
if (p == 0) {
|
if (p == 0) {
|
||||||
/* child */
|
/* child */
|
||||||
if (haslog) {
|
if (haslog) {
|
||||||
|
/* NB: bug alert! right order is close, then dup2 */
|
||||||
if (s->islog) {
|
if (s->islog) {
|
||||||
xdup2(logpipe[0], 0);
|
|
||||||
close(logpipe[1]);
|
|
||||||
xchdir("./log");
|
xchdir("./log");
|
||||||
|
close(logpipe.wr);
|
||||||
|
xdup2(logpipe.rd, 0);
|
||||||
} else {
|
} else {
|
||||||
xdup2(logpipe[1], 1);
|
close(logpipe.rd);
|
||||||
close(logpipe[0]);
|
xdup2(logpipe.wr, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
signal(SIGCHLD, SIG_DFL);
|
signal(SIGCHLD, SIG_DFL);
|
||||||
@ -452,11 +453,11 @@ int runsv_main(int argc, char **argv)
|
|||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
dir = argv[1];
|
dir = argv[1];
|
||||||
|
|
||||||
xpipe(selfpipe);
|
xpiped_pair(selfpipe);
|
||||||
close_on_exec_on(selfpipe[0]);
|
close_on_exec_on(selfpipe.rd);
|
||||||
close_on_exec_on(selfpipe[1]);
|
close_on_exec_on(selfpipe.wr);
|
||||||
ndelay_on(selfpipe[0]);
|
ndelay_on(selfpipe.rd);
|
||||||
ndelay_on(selfpipe[1]);
|
ndelay_on(selfpipe.wr);
|
||||||
|
|
||||||
sig_block(SIGCHLD);
|
sig_block(SIGCHLD);
|
||||||
sig_catch(SIGCHLD, s_child);
|
sig_catch(SIGCHLD, s_child);
|
||||||
@ -489,9 +490,9 @@ int runsv_main(int argc, char **argv)
|
|||||||
gettimeofday_ns(&svd[1].start);
|
gettimeofday_ns(&svd[1].start);
|
||||||
if (stat("log/down", &s) != -1)
|
if (stat("log/down", &s) != -1)
|
||||||
svd[1].want = W_DOWN;
|
svd[1].want = W_DOWN;
|
||||||
xpipe(logpipe);
|
xpiped_pair(logpipe);
|
||||||
close_on_exec_on(logpipe[0]);
|
close_on_exec_on(logpipe.rd);
|
||||||
close_on_exec_on(logpipe[1]);
|
close_on_exec_on(logpipe.wr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -572,7 +573,7 @@ int runsv_main(int argc, char **argv)
|
|||||||
if (svd[0].want == W_UP || svd[0].state == S_FINISH)
|
if (svd[0].want == W_UP || svd[0].state == S_FINISH)
|
||||||
startservice(&svd[0]);
|
startservice(&svd[0]);
|
||||||
|
|
||||||
x[0].fd = selfpipe[0];
|
x[0].fd = selfpipe.rd;
|
||||||
x[0].events = POLLIN;
|
x[0].events = POLLIN;
|
||||||
x[1].fd = svd[0].fdcontrol;
|
x[1].fd = svd[0].fdcontrol;
|
||||||
x[1].events = POLLIN;
|
x[1].events = POLLIN;
|
||||||
@ -585,7 +586,7 @@ int runsv_main(int argc, char **argv)
|
|||||||
sig_block(SIGTERM);
|
sig_block(SIGTERM);
|
||||||
sig_block(SIGCHLD);
|
sig_block(SIGCHLD);
|
||||||
|
|
||||||
while (read(selfpipe[0], &ch, 1) == 1)
|
while (read(selfpipe.rd, &ch, 1) == 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@ -630,7 +631,7 @@ int runsv_main(int argc, char **argv)
|
|||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} /* for (;;) */
|
||||||
if (read(svd[0].fdcontrol, &ch, 1) == 1)
|
if (read(svd[0].fdcontrol, &ch, 1) == 1)
|
||||||
ctrl(&svd[0], ch);
|
ctrl(&svd[0], ch);
|
||||||
if (haslog)
|
if (haslog)
|
||||||
@ -649,11 +650,11 @@ int runsv_main(int argc, char **argv)
|
|||||||
svd[1].want = W_EXIT;
|
svd[1].want = W_EXIT;
|
||||||
/* stopservice(&svd[1]); */
|
/* stopservice(&svd[1]); */
|
||||||
update_status(&svd[1]);
|
update_status(&svd[1]);
|
||||||
close(logpipe[1]);
|
close(logpipe.wr);
|
||||||
close(logpipe[0]);
|
close(logpipe.rd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} /* for (;;) */
|
||||||
/* not reached */
|
/* not reached */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ static char *svdir;
|
|||||||
static int svnum;
|
static int svnum;
|
||||||
static char *rplog;
|
static char *rplog;
|
||||||
static int rploglen;
|
static int rploglen;
|
||||||
static int logpipe[2];
|
static struct fd_pair logpipe;
|
||||||
static struct pollfd pfd[1];
|
static struct pollfd pfd[1];
|
||||||
static unsigned stamplog;
|
static unsigned stamplog;
|
||||||
static smallint check = 1;
|
static smallint check = 1;
|
||||||
@ -186,19 +186,19 @@ static int setup_log(void)
|
|||||||
warnx("log must have at least seven characters");
|
warnx("log must have at least seven characters");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (pipe(logpipe)) {
|
if (piped_pair(logpipe)) {
|
||||||
warnx("cannot create pipe for log");
|
warnx("cannot create pipe for log");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
close_on_exec_on(logpipe[1]);
|
close_on_exec_on(logpipe.rd);
|
||||||
close_on_exec_on(logpipe[0]);
|
close_on_exec_on(logpipe.wr);
|
||||||
ndelay_on(logpipe[0]);
|
ndelay_on(logpipe.rd);
|
||||||
ndelay_on(logpipe[1]);
|
ndelay_on(logpipe.wr);
|
||||||
if (dup2(logpipe[1], 2) == -1) {
|
if (dup2(logpipe.wr, 2) == -1) {
|
||||||
warnx("cannot set filedescriptor for log");
|
warnx("cannot set filedescriptor for log");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pfd[0].fd = logpipe[0];
|
pfd[0].fd = logpipe.rd;
|
||||||
pfd[0].events = POLLIN;
|
pfd[0].events = POLLIN;
|
||||||
stamplog = monotonic_sec();
|
stamplog = monotonic_sec();
|
||||||
return 1;
|
return 1;
|
||||||
@ -296,7 +296,7 @@ int runsvdir_main(int argc, char **argv)
|
|||||||
|
|
||||||
if (rplog) {
|
if (rplog) {
|
||||||
if ((int)(now - stamplog) >= 0) {
|
if ((int)(now - stamplog) >= 0) {
|
||||||
write(logpipe[1], ".", 1);
|
write(logpipe.wr, ".", 1);
|
||||||
stamplog = now + 900;
|
stamplog = now + 900;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -311,7 +311,7 @@ int runsvdir_main(int argc, char **argv)
|
|||||||
sig_unblock(SIGCHLD);
|
sig_unblock(SIGCHLD);
|
||||||
|
|
||||||
if (pfd[0].revents & POLLIN) {
|
if (pfd[0].revents & POLLIN) {
|
||||||
while (read(logpipe[0], &ch, 1) > 0) {
|
while (read(logpipe.rd, &ch, 1) > 0) {
|
||||||
if (ch) {
|
if (ch) {
|
||||||
for (i = 6; i < rploglen; i++)
|
for (i = 6; i < rploglen; i++)
|
||||||
rplog[i-1] = rplog[i];
|
rplog[i-1] = rplog[i];
|
||||||
|
Loading…
Reference in New Issue
Block a user