forked from pool/screen
Accepting request 314668 from Base:System
- Add license file as documentation - GNU screen 4.3.1 * This is a bug fix release. * Visible content get messed up after window resize - GNU screen 4.3.0: * Introduce Xx string escape showing the executed command of a window * Implement dead/zombie window polling, allowing for auto reconnecting * Allow setting hardstatus on first line * 'sort' command sorting windows by title * 'bumpleft', 'bumpright' - manually move windows on window list * 'collapse' removing numbering 'gaps' between windows, by renumbering * 'windows' command now accepts arguments for use with querying - packaging changes: * move screen-poll-zombies.patch to savannah git * move screen-4.0.3-ipv6.patch to savannah git * move sort_command.patch to savannah git * move xX_string_escape.patch to savannah git * move screen_enhance_windows_list.patch to savannah git OBS-URL: https://build.opensuse.org/request/show/314668 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/screen?expand=0&rev=46
This commit is contained in:
commit
d883bd6e26
@ -1,5 +1,5 @@
|
||||
--- ./configure.in.orig 2012-06-11 14:43:51.000000000 +0000
|
||||
+++ ./configure.in 2012-06-11 14:45:19.000000000 +0000
|
||||
--- ./configure.ac.orig 2012-06-11 14:43:51.000000000 +0000
|
||||
+++ ./configure.ac 2012-06-11 14:45:19.000000000 +0000
|
||||
@@ -668,8 +668,8 @@ tgetent((char *)0, (char *)0);
|
||||
LIBS="-ltermcap $olibs"
|
||||
AC_CHECKING(libtermcap)
|
||||
|
@ -1,323 +0,0 @@
|
||||
--- ./extern.h.orig 2012-06-08 15:20:18.000000000 +0000
|
||||
+++ ./extern.h 2012-06-08 15:58:08.000000000 +0000
|
||||
@@ -458,8 +458,7 @@ extern void LayProcessMouseSwitch __P((
|
||||
|
||||
/* teln.c */
|
||||
#ifdef BUILTIN_TELNET
|
||||
-extern int TelOpen __P((char **));
|
||||
-extern int TelConnect __P((struct win *));
|
||||
+extern int TelOpenAndConnect __P((struct win *));
|
||||
extern int TelIsline __P((struct win *p));
|
||||
extern void TelProcessLine __P((char **, int *));
|
||||
extern int DoTelnet __P((char *, int *, int));
|
||||
--- ./help.c.orig 2012-06-08 15:20:18.000000000 +0000
|
||||
+++ ./help.c 2012-06-08 15:58:08.000000000 +0000
|
||||
@@ -66,6 +66,10 @@ char *myname, *message, *arg;
|
||||
{
|
||||
printf("Use: %s [-opts] [cmd [args]]\n", myname);
|
||||
printf(" or: %s -r [host.tty]\n\nOptions:\n", myname);
|
||||
+#ifdef BUILTIN_TELNET
|
||||
+ printf("-4 Use IPv4.\n");
|
||||
+ printf("-6 Use IPv6.\n");
|
||||
+#endif
|
||||
printf("-a Force all capabilities into each window's termcap.\n");
|
||||
printf("-A -[r|R] Adapt all windows to the new display width & height.\n");
|
||||
printf("-c file Read configuration file instead of '.screenrc'.\n");
|
||||
--- ./screen.c.orig 2012-06-08 15:20:18.000000000 +0000
|
||||
+++ ./screen.c 2012-06-08 15:58:08.000000000 +0000
|
||||
@@ -248,8 +248,9 @@ struct layer *flayer;
|
||||
struct win *fore;
|
||||
struct win *windows;
|
||||
struct win *console_window;
|
||||
-
|
||||
-
|
||||
+#ifdef BUILTIN_TELNET
|
||||
+int af;
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* Do this last
|
||||
@@ -507,6 +508,9 @@ char **av;
|
||||
nwin = nwin_undef;
|
||||
nwin_options = nwin_undef;
|
||||
strcpy(screenterm, "screen");
|
||||
+#ifdef BUILTIN_TELNET
|
||||
+ af = AF_UNSPEC;
|
||||
+#endif
|
||||
|
||||
logreopen_register(lf_secreopen);
|
||||
|
||||
@@ -541,6 +545,14 @@ char **av;
|
||||
{
|
||||
switch (*ap)
|
||||
{
|
||||
+#ifdef BUILTIN_TELNET
|
||||
+ case '4':
|
||||
+ af = AF_INET;
|
||||
+ break;
|
||||
+ case '6':
|
||||
+ af = AF_INET6;
|
||||
+ break;
|
||||
+#endif
|
||||
case 'a':
|
||||
nwin_options.aflag = 1;
|
||||
break;
|
||||
--- ./teln.c.orig 2009-07-22 15:59:27.000000000 +0000
|
||||
+++ ./teln.c 2012-06-08 15:58:08.000000000 +0000
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <sys/socket.h>
|
||||
#include <fcntl.h>
|
||||
#include <netdb.h>
|
||||
+#include <stdio.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
@@ -42,12 +43,13 @@ extern struct win *fore;
|
||||
extern struct layer *flayer;
|
||||
extern int visual_bell;
|
||||
extern char screenterm[];
|
||||
+extern int af;
|
||||
|
||||
static void TelReply __P((struct win *, char *, int));
|
||||
static void TelDocmd __P((struct win *, int, int));
|
||||
static void TelDosub __P((struct win *));
|
||||
-
|
||||
-#define TEL_DEFPORT 23
|
||||
+// why TEL_DEFPORT has "
|
||||
+#define TEL_DEFPORT "23"
|
||||
#define TEL_CONNECTING (-2)
|
||||
|
||||
#define TC_IAC 255
|
||||
@@ -105,86 +107,78 @@ char *data;
|
||||
}
|
||||
|
||||
int
|
||||
-TelOpen(args)
|
||||
-char **args;
|
||||
-{
|
||||
- int fd;
|
||||
- int on = 1;
|
||||
-
|
||||
- if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
|
||||
- {
|
||||
- Msg(errno, "TelOpen: socket");
|
||||
- return -1;
|
||||
- }
|
||||
- if (setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on)))
|
||||
- Msg(errno, "TelOpen: setsockopt SO_OOBINLINE");
|
||||
- return fd;
|
||||
-}
|
||||
-
|
||||
-int
|
||||
-TelConnect(p)
|
||||
-struct win *p;
|
||||
-{
|
||||
- int port = TEL_DEFPORT;
|
||||
- struct hostent *hp;
|
||||
- char **args;
|
||||
+TelOpenAndConnect(struct win *p) {
|
||||
+ int fd, on = 1;
|
||||
char buf[256];
|
||||
|
||||
- args = p->w_cmdargs + 1;
|
||||
-
|
||||
- if (!*args)
|
||||
- {
|
||||
- Msg(0, "Usage: screen //telnet host [port]");
|
||||
- return -1;
|
||||
- }
|
||||
- if (args[1])
|
||||
- port = atoi(args[1]);
|
||||
- p->w_telsa.sin_family = AF_INET;
|
||||
- if((p->w_telsa.sin_addr.s_addr = inet_addr(*args)) == -1)
|
||||
- {
|
||||
- if ((hp = gethostbyname(*args)) == NULL)
|
||||
- {
|
||||
- Msg(0, "unknown host: %s", *args);
|
||||
- return -1;
|
||||
- }
|
||||
- if (hp->h_length != sizeof(p->w_telsa.sin_addr.s_addr) || hp->h_addrtype != AF_INET)
|
||||
- {
|
||||
- Msg(0, "Bad address type for %s", hp->h_name);
|
||||
- return -1;
|
||||
- }
|
||||
- bcopy((char *)hp->h_addr,(char *)&p->w_telsa.sin_addr.s_addr, hp->h_length);
|
||||
- p->w_telsa.sin_family = hp->h_addrtype;
|
||||
- }
|
||||
- p->w_telsa.sin_port = htons(port);
|
||||
- if (port != TEL_DEFPORT)
|
||||
- sprintf(buf, "Trying %s %d...", inet_ntoa(p->w_telsa.sin_addr), port);
|
||||
- else
|
||||
- sprintf(buf, "Trying %s...", inet_ntoa(p->w_telsa.sin_addr));
|
||||
- WriteString(p, buf, strlen(buf));
|
||||
- if (connect(p->w_ptyfd, (struct sockaddr *)&p->w_telsa, sizeof(p->w_telsa)))
|
||||
- {
|
||||
- if (errno == EINPROGRESS)
|
||||
- {
|
||||
- p->w_telstate = TEL_CONNECTING;
|
||||
- p->w_telconnev.fd = p->w_ptyfd;
|
||||
- p->w_telconnev.handler = tel_connev_fn;
|
||||
- p->w_telconnev.data = (char *)p;
|
||||
- p->w_telconnev.type = EV_WRITE;
|
||||
- p->w_telconnev.pri = 1;
|
||||
- debug("telnet connect in progress...\n");
|
||||
- evenq(&p->w_telconnev);
|
||||
- }
|
||||
- else
|
||||
- {
|
||||
- Msg(errno, "TelOpen: connect");
|
||||
- return -1;
|
||||
- }
|
||||
- }
|
||||
- else
|
||||
- WriteString(p, "connected.\r\n", 12);
|
||||
- if (port == TEL_DEFPORT)
|
||||
- TelReply(p, (char *)tn_init, sizeof(tn_init));
|
||||
- return 0;
|
||||
+ struct addrinfo hints, *res0, *res;
|
||||
+
|
||||
+ if (!(p->w_cmdargs[1])) {
|
||||
+ Msg(0, "Usage: screen //telnet host [port]");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ memset(&hints, 0, sizeof(hints));
|
||||
+ hints.ai_family = af;
|
||||
+ hints.ai_socktype = SOCK_STREAM;
|
||||
+ hints.ai_protocol = IPPROTO_TCP;
|
||||
+ if(getaddrinfo(p->w_cmdargs[1], p->w_cmdargs[2] ? p->w_cmdargs[2] : TEL_DEFPORT,
|
||||
+ &hints, &res0)) {
|
||||
+ Msg(0, "unknown host: %s", p->w_cmdargs[1]);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ for(res = res0; res; res = res->ai_next) {
|
||||
+ if((fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1) {
|
||||
+ if(res->ai_next)
|
||||
+ continue;
|
||||
+ else {
|
||||
+ Msg(errno, "TelOpenAndConnect: socket");
|
||||
+ freeaddrinfo(res0);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on)))
|
||||
+ Msg(errno, "TelOpenAndConnect: setsockopt SO_OOBINLINE");
|
||||
+
|
||||
+ if (p->w_cmdargs[2] && strcmp(p->w_cmdargs[2], TEL_DEFPORT))
|
||||
+ snprintf(buf, 256, "Trying %s %s...", p->w_cmdargs[1], p->w_cmdargs[2]);
|
||||
+ else
|
||||
+ snprintf(buf, 256, "Trying %s...", p->w_cmdargs[1]);
|
||||
+ WriteString(p, buf, strlen(buf));
|
||||
+ if (connect(fd, res->ai_addr, res->ai_addrlen)) {
|
||||
+ if (errno == EINPROGRESS) {
|
||||
+ p->w_telstate = TEL_CONNECTING;
|
||||
+ p->w_telconnev.fd = fd;
|
||||
+ p->w_telconnev.handler = tel_connev_fn;
|
||||
+ p->w_telconnev.data = (char *)p;
|
||||
+ p->w_telconnev.type = EV_WRITE;
|
||||
+ p->w_telconnev.pri = 1;
|
||||
+ debug("telnet connect in progress...\n");
|
||||
+ evenq(&p->w_telconnev);
|
||||
+ }
|
||||
+ else {
|
||||
+ close(fd);
|
||||
+ if(res->ai_next)
|
||||
+ continue;
|
||||
+ else {
|
||||
+ Msg(errno, "TelOpenAndConnect: connect");
|
||||
+ freeaddrinfo(res0);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ WriteString(p, "connected.\r\n", 12);
|
||||
+ if (!(p->w_cmdargs[2] && strcmp(p->w_cmdargs[2], TEL_DEFPORT)))
|
||||
+ TelReply(p, (char *)tn_init, sizeof(tn_init));
|
||||
+ p->w_ptyfd = fd;
|
||||
+ memcpy(&p->w_telsa, &res->ai_addr, sizeof(res->ai_addr));
|
||||
+ freeaddrinfo(res0);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
int
|
||||
--- ./window.c.orig 2012-06-08 15:20:18.000000000 +0000
|
||||
+++ ./window.c 2012-06-08 16:01:54.000000000 +0000
|
||||
@@ -607,6 +607,13 @@ struct NewWindow *newwin;
|
||||
n = pp - wtab;
|
||||
debug1("Makewin creating %d\n", n);
|
||||
|
||||
+#ifdef BUILTIN_TELNET
|
||||
+ if(!strcmp(nwin.args[0], "//telnet")) {
|
||||
+ type = W_TYPE_TELNET;
|
||||
+ TtyName = "telnet";
|
||||
+ }
|
||||
+ else
|
||||
+#endif
|
||||
if ((f = OpenDevice(nwin.args, nwin.lflag, &type, &TtyName)) < 0)
|
||||
return -1;
|
||||
if (type == W_TYPE_GROUP)
|
||||
@@ -768,7 +775,7 @@ struct NewWindow *newwin;
|
||||
#ifdef BUILTIN_TELNET
|
||||
if (type == W_TYPE_TELNET)
|
||||
{
|
||||
- if (TelConnect(p))
|
||||
+ if (TelOpenAndConnect(p))
|
||||
{
|
||||
FreeWindow(p);
|
||||
return -1;
|
||||
@@ -880,6 +887,13 @@ struct win *p;
|
||||
int lflag, f;
|
||||
|
||||
lflag = nwin_default.lflag;
|
||||
+#ifdef BUILTIN_TELNET
|
||||
+ if(!strcmp(p->w_cmdargs[0], "//telnet")) {
|
||||
+ p->w_type = W_TYPE_TELNET;
|
||||
+ TtyName = "telnet";
|
||||
+ }
|
||||
+ else
|
||||
+#endif
|
||||
if ((f = OpenDevice(p->w_cmdargs, lflag, &p->w_type, &TtyName)) < 0)
|
||||
return -1;
|
||||
|
||||
@@ -913,7 +927,7 @@ struct win *p;
|
||||
#ifdef BUILTIN_TELNET
|
||||
if (p->w_type == W_TYPE_TELNET)
|
||||
{
|
||||
- if (TelConnect(p))
|
||||
+ if (TelOpenAndConnect(p))
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
@@ -1072,16 +1086,6 @@ char **namep;
|
||||
*namep = "telnet";
|
||||
return 0;
|
||||
}
|
||||
-#ifdef BUILTIN_TELNET
|
||||
- if (strcmp(arg, "//telnet") == 0)
|
||||
- {
|
||||
- f = TelOpen(args + 1);
|
||||
- lflag = 0;
|
||||
- *typep = W_TYPE_TELNET;
|
||||
- *namep = "telnet";
|
||||
- }
|
||||
- else
|
||||
-#endif
|
||||
if (strncmp(arg, "//", 2) == 0)
|
||||
{
|
||||
Msg(0, "Invalid argument '%s'", arg);
|
||||
--- ./window.h.orig 2012-06-08 15:20:18.000000000 +0000
|
||||
+++ ./window.h 2012-06-08 15:58:08.000000000 +0000
|
||||
@@ -268,7 +268,7 @@ struct win
|
||||
struct display *w_zdisplay;
|
||||
#endif
|
||||
#ifdef BUILTIN_TELNET
|
||||
- struct sockaddr_in w_telsa;
|
||||
+ struct sockaddr_storage w_telsa;
|
||||
char w_telbuf[IOSIZE];
|
||||
int w_telbufl;
|
||||
char w_telmopts[256];
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5468545047e301d2b3579f9d9ce00466d14a7eec95ce806e3834a3d6b0b9b080
|
||||
size 1062485
|
Binary file not shown.
3
screen-4.3.1.tar.gz
Normal file
3
screen-4.3.1.tar.gz
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:fa4049f8aee283de62e283d427f2cfd35d6c369b40f7f45f947dbfd915699d63
|
||||
size 845958
|
BIN
screen-4.3.1.tar.gz.sig
Normal file
BIN
screen-4.3.1.tar.gz.sig
Normal file
Binary file not shown.
@ -1,206 +0,0 @@
|
||||
screen: Implement dead/zombie window polling
|
||||
|
||||
Currently if zombie keys are defined, one needs to explicitly
|
||||
hit a key to tell screen to try to reconnect a window.
|
||||
This is rather unfortunte if you for example have dozens of screens
|
||||
connected to foreign machines through network connections.
|
||||
Once the network connection is cut for a while, all windows will
|
||||
enter the dead/zombie state and one has to go through all windows
|
||||
manually and hit the zombie resurrect key, once the network got
|
||||
set up again.
|
||||
|
||||
This patch implements auto-reconnecting via zombie_timeout
|
||||
(in seconds) variable. By default it is set to 0 which complies
|
||||
to current behavior (no polling is done).
|
||||
|
||||
Signed-off-by: Thomas Renninger <trenn@suse.de>
|
||||
|
||||
--- ./comm.c.orig 2013-09-13 13:22:50.993279658 +0000
|
||||
+++ ./comm.c 2013-09-13 13:23:15.264279615 +0000
|
||||
@@ -339,5 +339,6 @@ struct comm comms[RC_LAST + 1] =
|
||||
#ifdef ZMODEM
|
||||
{ "zmodem", ARGS_012 },
|
||||
#endif
|
||||
- { "zombie", ARGS_012 }
|
||||
+ { "zombie", ARGS_012 },
|
||||
+ { "zombie_timeout", ARGS_1 }
|
||||
};
|
||||
--- ./doc/screen.1.orig 2013-09-13 13:22:50.993279658 +0000
|
||||
+++ ./doc/screen.1 2013-09-13 13:23:15.266279615 +0000
|
||||
@@ -3547,6 +3547,15 @@ Optionally you can put the word \*Qonerr
|
||||
to monitor exit status of the process running in the window. If it exits normally ('0'),
|
||||
the window disappears. Any other exit value causes the window to become a zombie.
|
||||
|
||||
+.BR "zombie_timeout" [\fIseconds\fP]
|
||||
+.PP
|
||||
+Per default
|
||||
+.I screen
|
||||
+windows are removed from the window list as soon as
|
||||
+the windows process (e.g. shell) exits. If \fBzombie\fP keys are defined
|
||||
+(compare with above \fBzombie\fP command), it is possible to also set a
|
||||
+timeout when screen tries to automatically reconnect a dead screen window.
|
||||
+
|
||||
.SH "THE MESSAGE LINE"
|
||||
.I Screen
|
||||
displays informational messages and other diagnostics in a \fImessage line\fP.
|
||||
--- ./doc/screen.texinfo.orig 2013-09-13 13:22:50.985279658 +0000
|
||||
+++ ./doc/screen.texinfo 2013-09-13 13:23:15.268279615 +0000
|
||||
@@ -1239,6 +1239,8 @@ Send an XON character. @xref{XON/XOFF}.
|
||||
Define how screen treats zmodem requests. @xref{Zmodem}.
|
||||
@item zombie [@var{keys} [onerror] ]
|
||||
Keep dead windows. @xref{Zombie}.
|
||||
+@item zombie_timeout [@var{seconds}]
|
||||
+Try to reconnect dead windows after timeout. @xref{Zombie}.
|
||||
@end table
|
||||
|
||||
@node New Window, Selecting, Commands, Top
|
||||
@@ -5223,6 +5225,8 @@ Display the version and modification dat
|
||||
@section Zombie
|
||||
@deffn Command zombie [@var{keys} [onerror] ]
|
||||
@deffnx Command defzombie [@var{keys}]
|
||||
+@deffn Command zombie_timeout [@var{seconds}]
|
||||
+@end deffn
|
||||
(none)@*
|
||||
Per default windows are removed from the window list as soon as the
|
||||
windows process (e.g. shell) exits. When a string of two keys is
|
||||
@@ -5242,6 +5246,11 @@ Optionally you can put the word @code{on
|
||||
cause screen to monitor exit status of the process running in the window.
|
||||
If it exits normally ('0'), the window disappears. Any other exit value
|
||||
causes the window to become a zombie.
|
||||
+
|
||||
+Additionally the @code{zombie_timeout} command exists.
|
||||
+If a window is declared ``dead'', screen will automatically try to
|
||||
+resurrect the window after the timeout.
|
||||
+It only works if zombie keys are defined via @code{zombie} command.
|
||||
@end deffn
|
||||
|
||||
@node Printcmd, Rendition, Zombie, Miscellaneous
|
||||
--- ./process.c.orig 2013-09-13 13:22:50.994279658 +0000
|
||||
+++ ./process.c 2013-09-13 13:23:15.270279615 +0000
|
||||
@@ -3067,6 +3067,18 @@ int key;
|
||||
}
|
||||
WindowChanged((struct win *)0, 0);
|
||||
break;
|
||||
+ case RC_ZOMBIE_TIMEOUT:
|
||||
+ if (argc != 1)
|
||||
+ {
|
||||
+ Msg(0, "Setting zombie polling needs a timeout arg\n");
|
||||
+ break;
|
||||
+ }
|
||||
+ nwin_default.poll_zombie_timeout = atoi(args[0]);
|
||||
+ if (fore)
|
||||
+ fore->w_poll_zombie_timeout = nwin_default.poll_zombie_timeout;
|
||||
+
|
||||
+ debug1("Setting zombie polling to %d\n", nwin_default.poll_zombie_timeout);
|
||||
+ break;
|
||||
case RC_SILENCE:
|
||||
n = fore->w_silence != 0;
|
||||
i = fore->w_silencewait;
|
||||
--- ./screen.c.orig 2013-09-13 13:22:50.989279658 +0000
|
||||
+++ ./screen.c 2013-09-13 13:23:15.270279615 +0000
|
||||
@@ -1557,6 +1557,13 @@ int wstat_valid;
|
||||
p->w_y = MFindUsedLine(p, p->w_bot, 1);
|
||||
sprintf(buf, "\n\r=== Command %s (%s) ===", reason, s ? s : "?");
|
||||
WriteString(p, buf, strlen(buf));
|
||||
+ if (p->w_poll_zombie_timeout)
|
||||
+ {
|
||||
+ debug2("Set zombie poll timeout for window %s to %d\n", p->w_title,
|
||||
+ p->w_poll_zombie_timeout);
|
||||
+ SetTimeout(&p->w_zombieev, p->w_poll_zombie_timeout * 1000);
|
||||
+ evenq(&p->w_zombieev);
|
||||
+ }
|
||||
WindowChanged(p, 'f');
|
||||
}
|
||||
else
|
||||
--- ./window.c.orig 2013-09-13 13:22:50.990279658 +0000
|
||||
+++ ./window.c 2013-09-13 13:23:15.270279615 +0000
|
||||
@@ -87,6 +87,7 @@ static int DoAutolf __P((char *, int *,
|
||||
static void ZombieProcess __P((char **, int *));
|
||||
static void win_readev_fn __P((struct event *, char *));
|
||||
static void win_writeev_fn __P((struct event *, char *));
|
||||
+static void win_resurrect_zombie_fn __P((struct event *, char *));
|
||||
static int muchpending __P((struct win *, struct event *));
|
||||
#ifdef COPY_PASTE
|
||||
static void paste_slowev_fn __P((struct event *, char *));
|
||||
@@ -164,7 +165,8 @@ struct NewWindow nwin_default =
|
||||
0, /* bce */
|
||||
0, /* encoding */
|
||||
(char *)0, /* hstatus */
|
||||
- (char *)0 /* charset */
|
||||
+ (char *)0, /* charset */
|
||||
+ 0 /* poll_zombie_timeout */
|
||||
};
|
||||
|
||||
struct NewWindow nwin_options;
|
||||
@@ -198,6 +200,7 @@ struct NewWindow *def, *new, *res;
|
||||
COMPOSE(encoding);
|
||||
COMPOSE(hstatus);
|
||||
COMPOSE(charset);
|
||||
+ COMPOSE(poll_zombie_timeout);
|
||||
#undef COMPOSE
|
||||
}
|
||||
|
||||
@@ -842,6 +845,14 @@ struct NewWindow *newwin;
|
||||
DoStartLog(p, buf, sizeof(buf));
|
||||
}
|
||||
|
||||
+ /* Is this all where I have to init window poll timeout? */
|
||||
+ if (nwin.poll_zombie_timeout)
|
||||
+ p->w_poll_zombie_timeout = nwin.poll_zombie_timeout;
|
||||
+
|
||||
+ p->w_zombieev.type = EV_TIMEOUT;
|
||||
+ p->w_zombieev.data = (char *)p;
|
||||
+ p->w_zombieev.handler = win_resurrect_zombie_fn;
|
||||
+
|
||||
p->w_readev.fd = p->w_writeev.fd = p->w_ptyfd;
|
||||
p->w_readev.type = EV_READ;
|
||||
p->w_writeev.type = EV_WRITE;
|
||||
@@ -1064,6 +1075,7 @@ struct win *wp;
|
||||
evdeq(&wp->w_readev); /* just in case */
|
||||
evdeq(&wp->w_writeev); /* just in case */
|
||||
evdeq(&wp->w_silenceev);
|
||||
+ evdeq(&wp->w_zombieev);
|
||||
evdeq(&wp->w_destroyev);
|
||||
#ifdef COPY_PASTE
|
||||
FreePaster(&wp->w_paster);
|
||||
@@ -1945,6 +1957,21 @@ char *data;
|
||||
return;
|
||||
}
|
||||
|
||||
+static void
|
||||
+win_resurrect_zombie_fn(ev, data)
|
||||
+struct event *ev;
|
||||
+char *data;
|
||||
+{
|
||||
+ struct win *p = (struct win *)data;
|
||||
+ debug2("Try to resurrecting Zombie event: %d [%s]\n",
|
||||
+ p->w_number, p->w_title);
|
||||
+ /* Already reconnected? */
|
||||
+ if (p->w_deadpid != p->w_pid)
|
||||
+ return;
|
||||
+ debug1("Resurrecting Zombie: %d\n", p->w_number);
|
||||
+ WriteString(p, "\r\n", 2);
|
||||
+ RemakeWindow(p);
|
||||
+}
|
||||
|
||||
static void
|
||||
win_writeev_fn(ev, data)
|
||||
--- ./window.h.orig 2013-09-13 13:22:50.990279658 +0000
|
||||
+++ ./window.h 2013-09-13 13:23:15.270279615 +0000
|
||||
@@ -57,6 +57,7 @@ struct NewWindow
|
||||
int encoding;
|
||||
char *hstatus;
|
||||
char *charset;
|
||||
+ int poll_zombie_timeout;
|
||||
};
|
||||
|
||||
#ifdef PSEUDOS
|
||||
@@ -150,6 +151,8 @@ struct win
|
||||
struct event w_readev;
|
||||
struct event w_writeev;
|
||||
struct event w_silenceev; /* silence event */
|
||||
+ struct event w_zombieev; /* event to try to resurrect window */
|
||||
+ int w_poll_zombie_timeout;
|
||||
int w_ptyfd; /* fd of the master pty */
|
||||
char w_inbuf[IOSIZE];
|
||||
int w_inlen;
|
@ -1,3 +1,34 @@
|
||||
-------------------------------------------------------------------
|
||||
Wed Jul 1 10:13:31 UTC 2015 - trenn@suse.de
|
||||
|
||||
- Add license file as documentation
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jul 01 09:48:45 UTC 2015 - alexander_naumov@opensuse.org
|
||||
|
||||
- GNU screen 4.3.1
|
||||
* This is a bug fix release.
|
||||
* Visible content get messed up after window resize
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Jun 15 09:28:15 UTC 2015 - alexander_naumov@opensuse.org
|
||||
|
||||
- GNU screen 4.3.0:
|
||||
* Introduce Xx string escape showing the executed command of a window
|
||||
* Implement dead/zombie window polling, allowing for auto reconnecting
|
||||
* Allow setting hardstatus on first line
|
||||
* 'sort' command sorting windows by title
|
||||
* 'bumpleft', 'bumpright' - manually move windows on window list
|
||||
* 'collapse' removing numbering 'gaps' between windows, by renumbering
|
||||
* 'windows' command now accepts arguments for use with querying
|
||||
|
||||
- packaging changes:
|
||||
* move screen-poll-zombies.patch to savannah git
|
||||
* move screen-4.0.3-ipv6.patch to savannah git
|
||||
* move sort_command.patch to savannah git
|
||||
* move xX_string_escape.patch to savannah git
|
||||
* move screen_enhance_windows_list.patch to savannah git
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri May 2 19:42:12 UTC 2014 - andreas.stieger@gmx.de
|
||||
|
||||
|
23
screen.spec
23
screen.spec
@ -1,7 +1,7 @@
|
||||
#
|
||||
# spec file for package screen
|
||||
#
|
||||
# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||
# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
@ -38,23 +38,17 @@ BuildRequires: autoconf
|
||||
BuildRequires: automake
|
||||
PreReq: %install_info_prereq
|
||||
PreReq: coreutils
|
||||
Version: 4.2.1
|
||||
Version: 4.3.1
|
||||
Release: 0
|
||||
Summary: A program to allow multiple screens on a VT100/ANSI Terminal
|
||||
License: GPL-2.0+
|
||||
License: GPL-3.0+
|
||||
Group: System/Console
|
||||
Source: http://ftp.gnu.org/gnu/screen/%{name}-%{version}.tar.gz
|
||||
Source1: screen.conf
|
||||
Source2: http://ftp.gnu.org/gnu/screen/%{name}-%{version}.tar.gz.sig
|
||||
Source3: https://savannah.gnu.org/project/memberlist-gpgkeys.php?group=screen&download=1#/%{name}.keyring
|
||||
Patch0: global_screenrc.patch
|
||||
Patch3: screen-4.0.3-ipv6.patch
|
||||
# upstream savannah#30880
|
||||
Patch5: sort_command.patch
|
||||
Patch6: libtinfo.diff
|
||||
Patch10: screen-poll-zombies.patch
|
||||
Patch11: xX_string_escape.patch
|
||||
Patch12: screen_enhance_windows_list.patch
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
|
||||
%description
|
||||
@ -68,18 +62,8 @@ Documentation: man page
|
||||
%setup
|
||||
# global_screenrc.patch
|
||||
%patch0
|
||||
# screen-4.0.3-ipv6.patch
|
||||
%patch3
|
||||
# sort_command.patch
|
||||
%patch5
|
||||
# libtinfo.diff
|
||||
%patch6
|
||||
# screen-poll-zombies.patch
|
||||
%patch10 -p1
|
||||
# xX_string_escape.patch
|
||||
%patch11
|
||||
# screen_enhance_windows_list.patch
|
||||
%patch12
|
||||
|
||||
%build
|
||||
sh ./autogen.sh
|
||||
@ -131,6 +115,7 @@ install -m 644 %SOURCE1 $RPM_BUILD_ROOT/usr/lib/tmpfiles.d
|
||||
%ghost %dir %rundir/uscreens
|
||||
%doc %{_infodir}/screen.info*.gz
|
||||
%doc %{_mandir}/man1/screen.1.gz
|
||||
%doc COPYING
|
||||
|
||||
%post
|
||||
%install_info --info-dir=%{_infodir} %{_infodir}/%{name}.info.gz
|
||||
|
@ -1,121 +0,0 @@
|
||||
screen: Introduce argument to windows command
|
||||
|
||||
A string escape can be passed which makes the windows command
|
||||
much more flexible. The default string escape if no argument
|
||||
is passed is "%n%f %t " which is intended to rebuild
|
||||
the same output the windows command would give as good
|
||||
as possible (slight changes with the flags can happen).
|
||||
|
||||
This command is also not be limited in output size
|
||||
(the windows command is limited to 1024 bytes).
|
||||
|
||||
The windowsx command can be queried (-Q command) and
|
||||
this is its main purpose (be able to query the exact
|
||||
window list status of an active screen session from
|
||||
shell).
|
||||
|
||||
Signed-off-by: Thomas Renninger <trenn@suse.de>
|
||||
|
||||
--- ./comm.c.orig 2013-09-13 13:37:01.440278153 +0000
|
||||
+++ ./comm.c 2013-09-13 13:37:21.830278117 +0000
|
||||
@@ -328,7 +328,7 @@ struct comm comms[RC_LAST + 1] =
|
||||
{ "wall", NEED_DISPLAY|ARGS_1},
|
||||
{ "width", ARGS_0123 },
|
||||
{ "windowlist", ARGS_012 },
|
||||
- { "windows", CAN_QUERY|ARGS_0 },
|
||||
+ { "windows", CAN_QUERY|ARGS_01 },
|
||||
{ "wrap", NEED_FORE|ARGS_01 },
|
||||
#ifdef COPY_PASTE
|
||||
{ "writebuf", ARGS_0123 },
|
||||
--- ./doc/screen.1.orig 2013-09-13 13:39:15.327277916 +0000
|
||||
+++ ./doc/screen.1 2013-09-13 13:38:46.391277967 +0000
|
||||
@@ -3435,7 +3435,7 @@ settings).
|
||||
and 6 characters high in order to display.
|
||||
.sp
|
||||
.ne 3
|
||||
-.B windows
|
||||
+.B windows [ string ]
|
||||
.PP
|
||||
Uses the message line to display a list of all the windows.
|
||||
Each window is listed by number with the name of process that has been
|
||||
@@ -3451,6 +3451,9 @@ windows occupied by other users are mark
|
||||
windows in the zombie state are marked with `Z'.
|
||||
If this list is too long to fit on the terminal's status line only the
|
||||
portion around the current window is displayed.
|
||||
+The optional string parameter follows the \*QSTRING ESCAPES\*U format.
|
||||
+If string parameter is passed, the output size is unlimited.
|
||||
+The default command without any parameter is limited to a size of 1024 bytes.
|
||||
.sp
|
||||
.ne 3
|
||||
.BR "wrap " [ on | off ]
|
||||
--- ./doc/screen.texinfo.orig 2013-09-13 13:38:53.376277955 +0000
|
||||
+++ ./doc/screen.texinfo 2013-09-13 13:39:47.392277859 +0000
|
||||
@@ -2617,7 +2617,7 @@ before displaying a message. Default is
|
||||
@section Windows
|
||||
@kindex w
|
||||
@kindex C-w
|
||||
-@deffn Command windows
|
||||
+@deffn Command windows [string]
|
||||
(@kbd{C-a w}, @kbd{C-a C-w})@*
|
||||
Uses the message line to display a list of all the windows. Each
|
||||
window is listed by number with the name of the program running in the
|
||||
@@ -2636,6 +2636,11 @@ windows in the zombie state are marked w
|
||||
|
||||
If this list is too long to fit on the terminal's status line only the
|
||||
portion around the current window is displayed.
|
||||
+
|
||||
+You can customize the output format to any string you like including
|
||||
+string escapes (@pxref{String Escapes}).
|
||||
+In this case, if the string parameter is passed, the maximum output
|
||||
+size is unlimited (instead of 1024 bytes if no parameter is passed).
|
||||
@end deffn
|
||||
|
||||
@node Hardstatus, Mousetrack, Windows, Window Settings
|
||||
--- ./process.c.orig 2013-09-13 13:39:55.192277845 +0000
|
||||
+++ ./process.c 2013-09-13 13:53:18.672276423 +0000
|
||||
@@ -170,6 +170,7 @@ static void ResizeFin __P((char *, int,
|
||||
static struct action *FindKtab __P((char *, int));
|
||||
static void SelectFin __P((char *, int, char *));
|
||||
static void SelectLayoutFin __P((char *, int, char *));
|
||||
+static void ShowWindowsX __P((char *));
|
||||
|
||||
|
||||
extern struct layer *flayer;
|
||||
@@ -1838,6 +1839,11 @@ int key;
|
||||
Activate(-1);
|
||||
break;
|
||||
case RC_WINDOWS:
|
||||
+ if (args[0])
|
||||
+ {
|
||||
+ ShowWindowsX(args[0]);
|
||||
+ break;
|
||||
+ }
|
||||
ShowWindows(-1);
|
||||
break;
|
||||
case RC_VERSION:
|
||||
@@ -5637,6 +5643,25 @@ int where;
|
||||
Msg(0, "%s", ss);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * String Escape based windows listing
|
||||
+ * mls: currently does a Msg() call for each(!) window, dunno why
|
||||
+ */
|
||||
+static void
|
||||
+ShowWindowsX(str)
|
||||
+char *str;
|
||||
+{
|
||||
+ int i;
|
||||
+ debug1("ShowWindowsX: string [%s]", string);
|
||||
+ for (i = 0; i < maxwin ; i++)
|
||||
+ {
|
||||
+ if (!wtab[i])
|
||||
+ continue;
|
||||
+ Msg(0, "%s", MakeWinMsg(str, wtab[i], '%'));
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+
|
||||
static void
|
||||
ShowInfo()
|
||||
{
|
@ -1,88 +0,0 @@
|
||||
---
|
||||
comm.c | 1 +
|
||||
doc/screen.1 | 5 +++++
|
||||
process.c | 43 +++++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 49 insertions(+)
|
||||
|
||||
Index: comm.c
|
||||
===================================================================
|
||||
--- comm.c.orig
|
||||
+++ comm.c
|
||||
@@ -297,6 +297,7 @@ struct comm comms[RC_LAST + 1] =
|
||||
{ "sleep", ARGS_1 },
|
||||
{ "slowpaste", NEED_FORE|ARGS_01 },
|
||||
{ "sorendition", ARGS_012 },
|
||||
+ { "sort", ARGS_0 },
|
||||
{ "source", ARGS_1 },
|
||||
{ "split", NEED_DISPLAY|ARGS_01 },
|
||||
{ "startup_message", ARGS_1 },
|
||||
Index: doc/screen.1
|
||||
===================================================================
|
||||
--- doc/screen.1.orig
|
||||
+++ doc/screen.1
|
||||
@@ -3015,6 +3015,11 @@ underlying system exposes flow control p
|
||||
text.
|
||||
.sp
|
||||
.ne 3
|
||||
+.B sort
|
||||
+.PP
|
||||
+Sort the windows in alphabetical order of the window tiles.
|
||||
+.sp
|
||||
+.ne 3
|
||||
.BI "source " file
|
||||
.PP
|
||||
Read and execute commands from file \fIfile\fP. Source commands may
|
||||
Index: process.c
|
||||
===================================================================
|
||||
--- process.c.orig
|
||||
+++ process.c
|
||||
@@ -3024,6 +3024,49 @@ int key;
|
||||
}
|
||||
}
|
||||
break;
|
||||
+ case RC_SORT:
|
||||
+ if (fore)
|
||||
+ {
|
||||
+ /* Better do not allow this. Not sure what the utmp stuff in number
|
||||
+ command above is for (you get four entries in e.g. /var/log/wtmp
|
||||
+ per number switch). But I don't know enough about this.*/
|
||||
+ Msg(0, "Sorting inside a window is not allowed. Push CTRL-a \" "
|
||||
+ "and try again\n");
|
||||
+ break;
|
||||
+ }
|
||||
+ /*
|
||||
+ * Simple sort algorithm: Look out for the smallest, put it
|
||||
+ * to the first place, look out for the 2nd smallest, ...
|
||||
+ */
|
||||
+ for (i = 0; i < maxwin ; i++)
|
||||
+ {
|
||||
+ if (wtab[i] == NULL)
|
||||
+ continue;
|
||||
+ n = i;
|
||||
+ for (nr = i + 1; nr < maxwin; nr++)
|
||||
+ {
|
||||
+ if (wtab[nr] == NULL)
|
||||
+ continue;
|
||||
+ debug2("Testing window %d and %d.\n", nr, n);
|
||||
+ if (strcmp(wtab[nr]->w_title,wtab[n]->w_title) < 0)
|
||||
+ n = nr;
|
||||
+ }
|
||||
+ if (n != i)
|
||||
+ {
|
||||
+ debug2("Exchange window %d and %d.\n", i, n);
|
||||
+ p = wtab[n];
|
||||
+ wtab[n] = wtab[i];
|
||||
+ wtab[i] = p;
|
||||
+ wtab[n]->w_number = n;
|
||||
+ wtab[i]->w_number = i;
|
||||
+#ifdef MULTIUSER
|
||||
+ /* exchange the acls for these windows. */
|
||||
+ AclWinSwap(i, n);
|
||||
+#endif
|
||||
+ }
|
||||
+ }
|
||||
+ WindowChanged((struct win *)0, 0);
|
||||
+ break;
|
||||
case RC_SILENCE:
|
||||
n = fore->w_silence != 0;
|
||||
i = fore->w_silencewait;
|
@ -1,43 +0,0 @@
|
||||
screen: Introduce Xx string escape showing the executed command of a window
|
||||
|
||||
either only the executed command ('X') or the whole command line ('x') of
|
||||
each window is shown.
|
||||
|
||||
Signed-off-by: Thomas Renninger <trenn@suse.de>
|
||||
|
||||
--- ./doc/screen.1.orig 2013-09-13 13:26:28.055279274 +0000
|
||||
+++ ./doc/screen.1 2013-09-13 13:26:41.385279250 +0000
|
||||
@@ -3747,6 +3747,10 @@ window; with '+' qualifier: starting wit
|
||||
one.
|
||||
.IP W
|
||||
all window numbers and names except the current one
|
||||
+.IP x
|
||||
+the executed command including arguments running in this windows
|
||||
+.IP X
|
||||
+the executed command without arguments running in this windows
|
||||
.IP y
|
||||
last two digits of the year number
|
||||
.IP Y
|
||||
--- ./screen.c.orig 2013-09-13 13:26:28.057279274 +0000
|
||||
+++ ./screen.c 2013-09-13 13:34:30.151278421 +0000
|
||||
@@ -2693,6 +2693,20 @@ int rec;
|
||||
}
|
||||
p += strlen(p) - 1;
|
||||
break;
|
||||
+ case 'X': case 'x':
|
||||
+ *p = 0;
|
||||
+ for (i = 0; win && win->w_cmdargs[i]; i++)
|
||||
+ {
|
||||
+ if (l < strlen(win->w_cmdargs[i]) + 1)
|
||||
+ break;
|
||||
+ sprintf(p, i ? "%s" : " %s", win->w_cmdargs[i]);
|
||||
+ l -= strlen(p);
|
||||
+ p += strlen(p);
|
||||
+ if (i == 0 && *s == 'X')
|
||||
+ break;
|
||||
+ }
|
||||
+ p--;
|
||||
+ break;
|
||||
case 'l':
|
||||
#ifdef LOADAV
|
||||
*p = 0;
|
Loading…
Reference in New Issue
Block a user