- Add zombie and enhance windows commands

screen-poll-zombies.patch: Dead windows will be restarted after
                              a specified timeout (if enabled)
   screen_enhance_windows_list_1_3.patch:
       Cleanup window flags processing. This leads to a slight
       output change in "Ww" string escapes (window list), but these
       should be rather seldom used and flags are still shown.
   screen_enhance_windows_list_2_3.patch:
       Enhance windows command with an optional string escape based
       parameter which also removes the output size (1024 bytes)
       restriction (only if param is passed) of the windows command.   
- Only Require makeinfo for openSUSE versions 11.4 and above.
  This requirement did not exist in earlier versions, now the package
  builds again for example against SLES 11 (11.4 based).

OBS-URL: https://build.opensuse.org/package/show/Base:System/screen?expand=0&rev=41
This commit is contained in:
Thomas Renninger 2013-02-06 14:43:50 +00:00 committed by Git OBS Bridge
parent becfc8a51c
commit a13ce2fdf3
5 changed files with 470 additions and 1 deletions

243
screen-poll-zombies.patch Normal file
View File

@ -0,0 +1,243 @@
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 | 3 ++-
comm.h.dist | 3 ++-
doc/screen.1 | 9 +++++++++
doc/screen.texinfo | 9 +++++++++
process.c | 12 ++++++++++++
screen.c | 7 +++++++
window.c | 29 ++++++++++++++++++++++++++++-
window.h | 3 +++
8 files changed, 72 insertions(+), 3 deletions(-)
Index: screen-4.0.4/comm.c
===================================================================
--- screen-4.0.4.orig/comm.c
+++ screen-4.0.4/comm.c
@@ -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 }
};
Index: screen-4.0.4/doc/screen.1
===================================================================
--- screen-4.0.4.orig/doc/screen.1
+++ screen-4.0.4/doc/screen.1
@@ -3545,6 +3545,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.
Index: screen-4.0.4/doc/screen.texinfo
===================================================================
--- screen-4.0.4.orig/doc/screen.texinfo
+++ screen-4.0.4/doc/screen.texinfo
@@ -1238,6 +1238,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
@@ -5222,6 +5224,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
@@ -5241,6 +5245,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
Index: screen-4.0.4/process.c
===================================================================
--- screen-4.0.4.orig/process.c
+++ screen-4.0.4/process.c
@@ -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;
Index: screen-4.0.4/screen.c
===================================================================
--- screen-4.0.4.orig/screen.c
+++ screen-4.0.4/screen.c
@@ -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
Index: screen-4.0.4/window.c
===================================================================
--- screen-4.0.4.orig/window.c
+++ screen-4.0.4/window.c
@@ -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
}
@@ -838,6 +841,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;
@@ -1060,6 +1071,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);
@@ -1941,6 +1953,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)
Index: screen-4.0.4/window.h
===================================================================
--- screen-4.0.4.orig/window.h
+++ screen-4.0.4/window.h
@@ -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;
Index: screen-4.0.4/comm.h.dist
===================================================================
--- screen-4.0.4.orig/comm.h.dist
+++ screen-4.0.4/comm.h.dist
@@ -236,5 +236,6 @@ struct action
#define RC_XON 179
#define RC_ZMODEM 180
#define RC_ZOMBIE 181
+#define RC_ZOMBIE_TIMEOUT 182
-#define RC_LAST 181
+#define RC_LAST 182

View File

@ -1,3 +1,21 @@
-------------------------------------------------------------------
Tue Feb 5 19:06:46 UTC 2013 - trenn@suse.de
- Add zombie and enhance windows commands
screen-poll-zombies.patch: Dead windows will be restarted after
a specified timeout (if enabled)
screen_enhance_windows_list_1_3.patch:
Cleanup window flags processing. This leads to a slight
output change in "Ww" string escapes (window list), but these
should be rather seldom used and flags are still shown.
screen_enhance_windows_list_2_3.patch:
Enhance windows command with an optional string escape based
parameter which also removes the output size (1024 bytes)
restriction (only if param is passed) of the windows command.
- Only Require makeinfo for openSUSE versions 11.4 and above.
This requirement did not exist in earlier versions, now the package
builds again for example against SLES 11 (11.4 based).
-------------------------------------------------------------------
Thu Oct 25 13:11:20 UTC 2012 - trenn@suse.de

View File

@ -1,7 +1,7 @@
#
# spec file for package screen
#
# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany.
# Copyright (c) 2013 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
@ -19,7 +19,9 @@
Url: http://www.gnu.org/software/screen/
Name: screen
%if 0%{?suse_version} > 1140
BuildRequires: makeinfo
%endif
BuildRequires: ncurses-devel
%if 0%{?suse_version} > 1130
BuildRequires: utempter-devel
@ -46,6 +48,9 @@ Patch6: libtinfo.diff
Patch7: mappedcmd.diff
Patch8: styroptcrash.diff
Patch9: use_locale.diff
Patch10: screen-poll-zombies.patch
Patch11: screen_enhance_windows_list_1_3.patch
Patch12: screen_enhance_windows_list_2_3.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
@ -67,6 +72,9 @@ Documentation: man page
%patch7 -p2
%patch8 -p2
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%build
CFLAGS="-DMAXWIN=1000 $RPM_OPT_FLAGS" %configure --prefix=/usr --infodir=%{_infodir} \

View File

@ -0,0 +1,60 @@
screen: Remove foreground and other window marking workaround
and place it where it always should have been in the generic AddWindowsFlag
function.
The actual implementation when this workaround was added is beyond git
history. This was needed to implement a very specific String Escape (wW)
function:
w all window numbers and names. With '-' quailifier: up to the
current window; with '+' qualifier: starting with the window
after the current one.
W all window numbers and names except the current one
But adding all windows to a String Escape does not make much sense and
may only fit for a very specific special case.
Better clean up the code, whoever needed wW String Escapes can use windows
command nowadays.
Later the whole wW String Escape should vanish in favor for the
String Escaped windows command which can do the same but much more flexible.
Signed-off-by: Thomas Renninger <trenn@suse.de>
Index: screen-4.0.4/process.c
===================================================================
---
src/process.c | 6 ------
1 files changed, 0 insertions(+), 6 deletions(-)
diff --git a/process.c b/process.c
index bbc46e6..7370924 100644
--- a/process.c
+++ b/process.c
@@ -5507,12 +5507,8 @@ int where;
AddWinMsgRend(s, rend);
sprintf(s, "%d", p->w_number);
s += strlen(s);
- if (display && p == D_fore)
- *s++ = '*';
if (!(flags & 2))
{
- if (display && p == D_other)
- *s++ = '-';
s = AddWindowFlags(s, len, p);
}
*s++ = ' ';
@@ -5537,12 +5533,10 @@ struct win *p;
*s = 0;
return s;
}
-#if 0
if (display && p == D_fore)
*s++ = '*';
if (display && p == D_other)
*s++ = '-';
-#endif
if (p->w_layer.l_cvlist && p->w_layer.l_cvlist->c_lnext)
*s++ = '&';
if (p->w_monitor == MON_DONE

View File

@ -0,0 +1,140 @@
screen: Introduce windows command
This new command is doing nearly the same as the windows
command.
But a string escape can be passed which makes it 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>
---
src/comm.c | 2 +-
src/doc/screen.1 | 5 ++++-
src/doc/screen.texinfo | 7 ++++++-
src/process.c | 35 ++++++++++++++++++++++++++++++++++-
4 files changed, 45 insertions(+), 4 deletions(-)
diff --git a/comm.c b/comm.c
index 8722ca8..b8b535f 100644
--- a/comm.c
+++ b/comm.c
@@ -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 },
diff --git a/doc/screen.1 b/doc/screen.1
index 4e72f8b..7a0c1de 100644
--- a/doc/screen.1
+++ b/doc/screen.1
@@ -3430,7 +3430,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
@@ -3446,6 +3446,9 @@ windows occupied by other users are marked with `&';
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 ]
diff --git a/doc/screen.texinfo b/doc/screen.texinfo
index e564abe..e7a693d 100644
--- a/doc/screen.texinfo
+++ b/doc/screen.texinfo
@@ -2613,7 +2613,7 @@ before displaying a message. Default is 30 seconds.
@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
@@ -2632,6 +2632,11 @@ windows in the zombie state are marked with @samp{Z}.
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
diff --git a/process.c b/process.c
index 7370924..79e82b5 100644
--- a/process.c
+++ b/process.c
@@ -1838,7 +1838,12 @@ int key;
Activate(-1);
break;
case RC_WINDOWS:
- ShowWindows(-1);
+ if (args[0]) {
+ s = SaveStr(args[0]);
+ ShowWindowsX(s);
+ }
+ else
+ ShowWindows(-1);
break;
case RC_VERSION:
OutputMsg(0, "screen %s", version);
@@ -5605,6 +5610,34 @@ struct win *p;
return s;
}
+/*
+ * String Escape based windows listing
+ * Unfortunately it is not possible to rebuild the exact
+ * output (flags) from ShowWindows() with a default
+ * string escape. But when there should be a new screen
+ * version where slight output changes get accepted,
+ * ShowWindowsX() should replace the rather static
+ * (in output and size) old ShowWindows() and AddWindows()
+ * functions
+ */
+void
+ShowWindowsX(char *string)
+{
+ int i;
+ char *s = "";
+
+ debug1("ShowWindowsX: string [%s]", string);
+
+ for (i = 0; i < maxwin ; i++)
+ {
+ if (wtab[i] == NULL)
+ continue;
+
+ s = MakeWinMsg(string, wtab[i], '%');
+ Msg(0, "%s", s);
+ }
+}
+
void
ShowWindows(where)
int where;