Add dtach -N.
dtach -N is similar to dtach -n, except dtach will not daemonize. Based on patches by Ciprian Dorin Craciun and Frank Hunleth.
This commit is contained in:
parent
8527d8e876
commit
c7b68ae3fa
10
dtach.1
10
dtach.1
|
|
@ -13,6 +13,9 @@ dtach \- simple program that emulates the detach feature of screen.
|
||||||
.br
|
.br
|
||||||
.B dtach \-n
|
.B dtach \-n
|
||||||
.I <socket> <options> <command...>
|
.I <socket> <options> <command...>
|
||||||
|
.br
|
||||||
|
.B dtach \-N
|
||||||
|
.I <socket> <options> <command...>
|
||||||
|
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.B dtach
|
.B dtach
|
||||||
|
|
@ -93,6 +96,13 @@ which the specified program is executed.
|
||||||
.B dtach
|
.B dtach
|
||||||
does not try to attach to the newly created session, however, and exits
|
does not try to attach to the newly created session, however, and exits
|
||||||
instead.
|
instead.
|
||||||
|
.TP
|
||||||
|
.B \-N
|
||||||
|
Creates a new session, without attaching to it or daemonizing. A new session is
|
||||||
|
created in which the specified program is executed.
|
||||||
|
.B dtach
|
||||||
|
does not try to attach to the newly created session, however, and will stay
|
||||||
|
in the foreground until the program exits.
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
.SS OPTIONS
|
.SS OPTIONS
|
||||||
|
|
|
||||||
2
dtach.h
2
dtach.h
|
|
@ -128,7 +128,7 @@ struct packet
|
||||||
#define EOS "\033[999H"
|
#define EOS "\033[999H"
|
||||||
|
|
||||||
int attach_main(int noerror);
|
int attach_main(int noerror);
|
||||||
int master_main(char **argv, int waitattach);
|
int master_main(char **argv, int waitattach, int dontfork);
|
||||||
|
|
||||||
#ifdef sun
|
#ifdef sun
|
||||||
#define BROKEN_MASTER
|
#define BROKEN_MASTER
|
||||||
|
|
|
||||||
16
main.c
16
main.c
|
|
@ -55,6 +55,7 @@ usage()
|
||||||
" dtach -A <socket> <options> <command...>\n"
|
" dtach -A <socket> <options> <command...>\n"
|
||||||
" dtach -c <socket> <options> <command...>\n"
|
" dtach -c <socket> <options> <command...>\n"
|
||||||
" dtach -n <socket> <options> <command...>\n"
|
" dtach -n <socket> <options> <command...>\n"
|
||||||
|
" dtach -N <socket> <options> <command...>\n"
|
||||||
"Modes:\n"
|
"Modes:\n"
|
||||||
" -a\t\tAttach to the specified socket.\n"
|
" -a\t\tAttach to the specified socket.\n"
|
||||||
" -A\t\tAttach to the specified socket, or create it if it\n"
|
" -A\t\tAttach to the specified socket, or create it if it\n"
|
||||||
|
|
@ -62,6 +63,9 @@ usage()
|
||||||
" -c\t\tCreate a new socket and run the specified command.\n"
|
" -c\t\tCreate a new socket and run the specified command.\n"
|
||||||
" -n\t\tCreate a new socket and run the specified command "
|
" -n\t\tCreate a new socket and run the specified command "
|
||||||
"detached.\n"
|
"detached.\n"
|
||||||
|
" -N\t\tCreate a new socket and run the specified command "
|
||||||
|
"detached,\n"
|
||||||
|
"\t\t and have dtach run in the foreground.\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
" -e <char>\tSet the detach character to <char>, defaults "
|
" -e <char>\tSet the detach character to <char>, defaults "
|
||||||
"to ^\\.\n"
|
"to ^\\.\n"
|
||||||
|
|
@ -102,7 +106,7 @@ main(int argc, char **argv)
|
||||||
if (mode == '?')
|
if (mode == '?')
|
||||||
usage();
|
usage();
|
||||||
else if (mode != 'a' && mode != 'c' && mode != 'n' &&
|
else if (mode != 'a' && mode != 'c' && mode != 'n' &&
|
||||||
mode != 'A')
|
mode != 'A' && mode != 'N')
|
||||||
{
|
{
|
||||||
printf("%s: Invalid mode '-%c'\n", progname, mode);
|
printf("%s: Invalid mode '-%c'\n", progname, mode);
|
||||||
printf("Try '%s --help' for more information.\n",
|
printf("Try '%s --help' for more information.\n",
|
||||||
|
|
@ -215,7 +219,7 @@ main(int argc, char **argv)
|
||||||
dont_have_tty = 1;
|
dont_have_tty = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dont_have_tty && mode != 'n')
|
if (dont_have_tty && mode != 'n' && mode != 'N')
|
||||||
{
|
{
|
||||||
printf("%s: Attaching to a session requires a terminal.\n",
|
printf("%s: Attaching to a session requires a terminal.\n",
|
||||||
progname);
|
progname);
|
||||||
|
|
@ -235,10 +239,12 @@ main(int argc, char **argv)
|
||||||
return attach_main(0);
|
return attach_main(0);
|
||||||
}
|
}
|
||||||
else if (mode == 'n')
|
else if (mode == 'n')
|
||||||
return master_main(argv, 0);
|
return master_main(argv, 0, 0);
|
||||||
|
else if (mode == 'N')
|
||||||
|
return master_main(argv, 0, 1);
|
||||||
else if (mode == 'c')
|
else if (mode == 'c')
|
||||||
{
|
{
|
||||||
if (master_main(argv, 1) != 0)
|
if (master_main(argv, 1, 0) != 0)
|
||||||
return 1;
|
return 1;
|
||||||
return attach_main(0);
|
return attach_main(0);
|
||||||
}
|
}
|
||||||
|
|
@ -252,7 +258,7 @@ main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
if (errno == ECONNREFUSED)
|
if (errno == ECONNREFUSED)
|
||||||
unlink(sockname);
|
unlink(sockname);
|
||||||
if (master_main(argv, 1) != 0)
|
if (master_main(argv, 1, 0) != 0)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return attach_main(0);
|
return attach_main(0);
|
||||||
|
|
|
||||||
19
master.c
19
master.c
|
|
@ -543,7 +543,7 @@ master_process(int s, char **argv, int waitattach, int statusfd)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
master_main(char **argv, int waitattach)
|
master_main(char **argv, int waitattach, int dontfork)
|
||||||
{
|
{
|
||||||
int fd[2] = {-1, -1};
|
int fd[2] = {-1, -1};
|
||||||
int s;
|
int s;
|
||||||
|
|
@ -566,7 +566,16 @@ master_main(char **argv, int waitattach)
|
||||||
|
|
||||||
/* If FD_CLOEXEC works, create a pipe and use it to report any errors
|
/* If FD_CLOEXEC works, create a pipe and use it to report any errors
|
||||||
** that occur while trying to execute the program. */
|
** that occur while trying to execute the program. */
|
||||||
if (pipe(fd) >= 0)
|
if (dontfork)
|
||||||
|
{
|
||||||
|
fd[1] = dup(2);
|
||||||
|
if (fcntl(fd[1], F_SETFD, FD_CLOEXEC) < 0)
|
||||||
|
{
|
||||||
|
close(fd[1]);
|
||||||
|
fd[1] = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (pipe(fd) >= 0)
|
||||||
{
|
{
|
||||||
if (fcntl(fd[0], F_SETFD, FD_CLOEXEC) < 0 ||
|
if (fcntl(fd[0], F_SETFD, FD_CLOEXEC) < 0 ||
|
||||||
fcntl(fd[1], F_SETFD, FD_CLOEXEC) < 0)
|
fcntl(fd[1], F_SETFD, FD_CLOEXEC) < 0)
|
||||||
|
|
@ -578,6 +587,12 @@ master_main(char **argv, int waitattach)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (dontfork)
|
||||||
|
{
|
||||||
|
master_process(s, argv, waitattach, fd[1]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Fork off so we can daemonize and such */
|
/* Fork off so we can daemonize and such */
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if (pid < 0)
|
if (pid < 0)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue