conmon: Break out connection socket setup to a separate function
Signed-off-by: Alexander Larsson <alexl@redhat.com>
This commit is contained in:
parent
b269969216
commit
cc3a1615fb
1 changed files with 41 additions and 34 deletions
|
@ -485,6 +485,7 @@ static int afd = -1;
|
||||||
static int cfd = -1;
|
static int cfd = -1;
|
||||||
/* Used for OOM notification API */
|
/* Used for OOM notification API */
|
||||||
static int ofd = -1;
|
static int ofd = -1;
|
||||||
|
static int csfd = -1;
|
||||||
|
|
||||||
static bool timed_out = FALSE;
|
static bool timed_out = FALSE;
|
||||||
|
|
||||||
|
@ -784,6 +785,42 @@ static void write_sync_fd(int sync_pipe_fd, int res, const char *message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *setup_console_socket(void)
|
||||||
|
{
|
||||||
|
struct sockaddr_un addr = {0};
|
||||||
|
char csname[PATH_MAX] = "/tmp/conmon-term.XXXXXXXX";
|
||||||
|
/*
|
||||||
|
* Generate a temporary name. Is this unsafe? Probably, but we can
|
||||||
|
* replace it with a rename(2) setup if necessary.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int unusedfd = g_mkstemp(csname);
|
||||||
|
if (unusedfd < 0)
|
||||||
|
pexit("Failed to generate random path for console-socket");
|
||||||
|
close(unusedfd);
|
||||||
|
|
||||||
|
addr.sun_family = AF_UNIX;
|
||||||
|
strncpy(addr.sun_path, csname, sizeof(addr.sun_path)-1);
|
||||||
|
|
||||||
|
ninfo("addr{sun_family=AF_UNIX, sun_path=%s}", addr.sun_path);
|
||||||
|
|
||||||
|
/* Bind to the console socket path. */
|
||||||
|
csfd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
|
||||||
|
if (csfd < 0)
|
||||||
|
pexit("Failed to create console-socket");
|
||||||
|
if (fchmod(csfd, 0700))
|
||||||
|
pexit("Failed to change console-socket permissions");
|
||||||
|
/* XXX: This should be handled with a rename(2). */
|
||||||
|
if (unlink(csname) < 0)
|
||||||
|
pexit("Failed to unlink temporary ranom path");
|
||||||
|
if (bind(csfd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
|
||||||
|
pexit("Failed to bind to console-socket");
|
||||||
|
if (listen(csfd, 128) < 0)
|
||||||
|
pexit("Failed to listen on console-socket");
|
||||||
|
|
||||||
|
return g_strdup(csname);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -791,17 +828,16 @@ int main(int argc, char *argv[])
|
||||||
_cleanup_free_ char *default_pid_file = NULL;
|
_cleanup_free_ char *default_pid_file = NULL;
|
||||||
_cleanup_free_ char *attach_sock_path = NULL;
|
_cleanup_free_ char *attach_sock_path = NULL;
|
||||||
_cleanup_free_ char *ctl_fifo_path = NULL;
|
_cleanup_free_ char *ctl_fifo_path = NULL;
|
||||||
|
_cleanup_free_ char *csname = NULL;
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
_cleanup_free_ char *contents = NULL;
|
_cleanup_free_ char *contents = NULL;
|
||||||
int cpid = -1;
|
int cpid = -1;
|
||||||
int status;
|
int status;
|
||||||
pid_t pid, main_pid, create_pid;
|
pid_t pid, main_pid, create_pid;
|
||||||
_cleanup_close_ int csfd = -1;
|
|
||||||
/* Used for !terminal cases. */
|
/* Used for !terminal cases. */
|
||||||
int slavefd_stdin = -1;
|
int slavefd_stdin = -1;
|
||||||
int slavefd_stdout = -1;
|
int slavefd_stdout = -1;
|
||||||
int slavefd_stderr = -1;
|
int slavefd_stderr = -1;
|
||||||
char csname[PATH_MAX] = "/tmp/conmon-term.XXXXXXXX";
|
|
||||||
char buf[BUF_SIZE];
|
char buf[BUF_SIZE];
|
||||||
int num_read;
|
int num_read;
|
||||||
int sync_pipe_fd = -1;
|
int sync_pipe_fd = -1;
|
||||||
|
@ -912,36 +948,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_terminal) {
|
if (opt_terminal) {
|
||||||
struct sockaddr_un addr = {0};
|
csname = setup_console_socket();
|
||||||
|
|
||||||
/*
|
|
||||||
* Generate a temporary name. Is this unsafe? Probably, but we can
|
|
||||||
* replace it with a rename(2) setup if necessary.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int unusedfd = g_mkstemp(csname);
|
|
||||||
if (unusedfd < 0)
|
|
||||||
pexit("Failed to generate random path for console-socket");
|
|
||||||
close(unusedfd);
|
|
||||||
|
|
||||||
addr.sun_family = AF_UNIX;
|
|
||||||
strncpy(addr.sun_path, csname, sizeof(addr.sun_path)-1);
|
|
||||||
|
|
||||||
ninfo("addr{sun_family=AF_UNIX, sun_path=%s}", addr.sun_path);
|
|
||||||
|
|
||||||
/* Bind to the console socket path. */
|
|
||||||
csfd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
|
|
||||||
if (csfd < 0)
|
|
||||||
pexit("Failed to create console-socket");
|
|
||||||
if (fchmod(csfd, 0700))
|
|
||||||
pexit("Failed to change console-socket permissions");
|
|
||||||
/* XXX: This should be handled with a rename(2). */
|
|
||||||
if (unlink(csname) < 0)
|
|
||||||
pexit("Failed to unlink temporary ranom path");
|
|
||||||
if (bind(csfd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
|
|
||||||
pexit("Failed to bind to console-socket");
|
|
||||||
if (listen(csfd, 128) < 0)
|
|
||||||
pexit("Failed to listen on console-socket");
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1001,7 +1008,7 @@ int main(int argc, char *argv[])
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_terminal) {
|
if (csname != NULL) {
|
||||||
add_argv(runtime_argv,
|
add_argv(runtime_argv,
|
||||||
"--console-socket", csname,
|
"--console-socket", csname,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -1059,7 +1066,7 @@ int main(int argc, char *argv[])
|
||||||
close(slavefd_stderr);
|
close(slavefd_stderr);
|
||||||
|
|
||||||
ninfo("about to waitpid: %d", create_pid);
|
ninfo("about to waitpid: %d", create_pid);
|
||||||
if (opt_terminal) {
|
if (csname != NULL) {
|
||||||
guint terminal_watch = g_unix_fd_add (csfd, G_IO_IN, terminal_accept_cb, csname);
|
guint terminal_watch = g_unix_fd_add (csfd, G_IO_IN, terminal_accept_cb, csname);
|
||||||
g_child_watch_add (create_pid, runtime_exit_cb, NULL);
|
g_child_watch_add (create_pid, runtime_exit_cb, NULL);
|
||||||
g_main_loop_run (main_loop);
|
g_main_loop_run (main_loop);
|
||||||
|
|
Loading…
Reference in a new issue