diff --git a/.gitignore b/.gitignore index 366fdeb..724a152 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ screen-4.0.3.tar.gz +/screen-20101110git066b098.tar.bz2 diff --git a/screen-4.0.1-args.patch b/screen-4.0.1-args.patch deleted file mode 100644 index e404fb7..0000000 --- a/screen-4.0.1-args.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- ansi.c.orig 2003-12-04 10:59:05.000000000 -0500 -+++ ansi.c 2003-12-04 10:59:20.000000000 -0500 -@@ -559,7 +559,7 @@ - { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': -- if (curr->w_NumArgs < MAXARGS) -+ if (curr->w_NumArgs >= 0 && curr->w_NumArgs < MAXARGS) - { - if (curr->w_args[curr->w_NumArgs] < 100000000) - curr->w_args[curr->w_NumArgs] = ---- resize.c.old 2003-11-27 02:55:07.000000000 +0200 -+++ resize.c 2003-11-27 02:58:33.000000000 +0200 -@@ -682,6 +682,17 @@ - if (wi == 0) - he = hi = 0; - -+ if (wi > 1000) -+ { -+ Msg(0, "Window width too large, truncated"); -+ wi = 1000; -+ } -+ if (he > 1000) -+ { -+ Msg(0, "Window height too large, truncated"); -+ he = 1000; -+ } -+ - if (p->w_width == wi && p->w_height == he && p->w_histheight == hi) - { - debug("ChangeWindowSize: No change.\n"); diff --git a/screen-4.0.2-maxstr.patch b/screen-4.0.2-maxstr.patch deleted file mode 100644 index 466e2f1..0000000 --- a/screen-4.0.2-maxstr.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- screen-4.0.2/screen.h.maxstr 2006-07-10 13:37:11.000000000 +0200 -+++ screen-4.0.2/screen.h 2006-07-10 13:36:36.000000000 +0200 -@@ -86,7 +86,7 @@ - - #define Ctrl(c) ((c)&037) - --#define MAXSTR 256 -+#define MAXSTR 4096 - #define MAXARGS 64 - #define MSGWAIT 5 - #define MSGMINWAIT 1 diff --git a/screen-4.0.3-configh.patch b/screen-4.0.3-configh.patch deleted file mode 100644 index 5f46385..0000000 --- a/screen-4.0.3-configh.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -up screen-4.0.3/config.h.in.configh screen-4.0.3/config.h.in ---- screen-4.0.3/config.h.in.configh 2006-10-23 15:06:32.000000000 +0200 -+++ screen-4.0.3/config.h.in 2008-05-19 15:47:19.000000000 +0200 -@@ -291,7 +291,7 @@ - * Define USE_LOCALE if you want screen to use the locale names - * for the name of the month and day of the week. - */ --#define USE_LOCALE -+#undef USE_LOCALE - - /* - * Define USE_PAM if your system supports PAM (Pluggable Authentication -@@ -563,7 +563,6 @@ - * If you are on a SYS V machine that restricts filename length to 14 - * characters, you may need to enforce that by setting NAME_MAX to 14 - */ --#undef NAME_MAX /* KEEP_UNDEF_HERE override system value */ - #undef NAME_MAX - - /* diff --git a/screen-4.0.3-ipv6.patch b/screen-4.0.3-ipv6.patch deleted file mode 100644 index bc8ec1a..0000000 --- a/screen-4.0.3-ipv6.patch +++ /dev/null @@ -1,339 +0,0 @@ -diff -up screen-4.0.3/doc/screen.1.ipv6 screen-4.0.3/doc/screen.1 ---- screen-4.0.3/doc/screen.1.ipv6 2003-12-05 14:51:57.000000000 +0100 -+++ screen-4.0.3/doc/screen.1 2010-11-12 14:29:52.125028912 +0100 -@@ -366,6 +366,12 @@ Send the specified command to a running - the \fB-d\fP or \fB-r\fP option to tell screen to look only for - attached or detached screen sessions. Note that this command doesn't - work if the session is password protected. -+.TP 5 -+.B \-4 -+Resolve hostnames only to IPv4 addresses. -+.TP 5 -+.B \-6 -+Resolve hostnames only to IPv6 addresses. - - - .SH "DEFAULT KEY BINDINGS" ---- screen-4.0.3/window.h.ipv6 2003-08-21 16:57:30.000000000 +0200 -+++ screen-4.0.3/window.h 2006-11-15 13:36:57.000000000 +0100 -@@ -254,7 +254,7 @@ - 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]; ---- screen-4.0.3/window.c.ipv6 2003-12-05 14:45:41.000000000 +0100 -+++ screen-4.0.3/window.c 2006-11-15 13:39:27.000000000 +0100 -@@ -582,6 +582,13 @@ - 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; - -@@ -736,7 +743,7 @@ - #ifdef BUILTIN_TELNET - if (type == W_TYPE_TELNET) - { -- if (TelConnect(p)) -+ if (TelOpenAndConnect(p)) - { - FreeWindow(p); - return -1; -@@ -834,6 +841,13 @@ - 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; - -@@ -864,7 +878,7 @@ - #ifdef BUILTIN_TELNET - if (p->w_type == W_TYPE_TELNET) - { -- if (TelConnect(p)) -+ if (TelOpenAndConnect(p)) - return -1; - } - else -@@ -1007,16 +1021,6 @@ - - if (!arg) - return -1; --#ifdef BUILTIN_TELNET -- if (strcmp(arg, "//telnet") == 0) -- { -- f = TelOpen(args + 1); -- lflag = 0; -- *typep = W_TYPE_TELNET; -- *namep = "telnet"; -- } -- else --#endif - if ((stat(arg, &st)) == 0 && S_ISCHR(st.st_mode)) - { - if (access(arg, R_OK | W_OK) == -1) ---- screen-4.0.3/teln.c.ipv6 2003-09-08 16:26:56.000000000 +0200 -+++ screen-4.0.3/teln.c 2006-11-15 13:36:57.000000000 +0100 -@@ -25,6 +25,7 @@ - #include - #include - #include -+#include - - #include "config.h" - -@@ -37,12 +38,13 @@ - 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 -@@ -99,86 +101,78 @@ - } - - 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 ---- screen-4.0.3/help.c.ipv6 2003-09-08 16:25:33.000000000 +0200 -+++ screen-4.0.3/help.c 2006-11-15 13:36:57.000000000 +0100 -@@ -49,6 +49,10 @@ - { - printf("Use: %s [-opts] [cmd [args]]\n", myname); - printf(" or: %s -r [host.tty]\n\nOptions:\n", myname); -+#ifdef BUILTIN_TELNET -+ printf("-4 Resolve hostnames only to IPv4 addresses.\n"); -+ printf("-6 Resolve hostnames only to IPv6 addresses.\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-4.0.3/screen.c.ipv6 2003-09-08 16:26:41.000000000 +0200 -+++ screen-4.0.3/screen.c 2006-11-15 13:36:57.000000000 +0100 -@@ -231,8 +231,9 @@ - struct win *fore; - struct win *windows; - struct win *console_window; -- -- -+#ifdef BUILTIN_TELNET -+int af; -+#endif - - /* - * Do this last -@@ -471,6 +472,9 @@ - nwin = nwin_undef; - nwin_options = nwin_undef; - strcpy(screenterm, "screen"); -+#ifdef BUILTIN_TELNET -+ af = AF_UNSPEC; -+#endif - - logreopen_register(lf_secreopen); - -@@ -505,6 +509,14 @@ - { - 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; ---- screen-4.0.3/extern.h.ipv6 2003-08-22 14:27:57.000000000 +0200 -+++ screen-4.0.3/extern.h 2006-11-15 13:36:57.000000000 +0100 -@@ -446,8 +446,7 @@ - - /* 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)); diff --git a/screen-4.0.3-resize.patch b/screen-4.0.3-resize.patch deleted file mode 100644 index da4ea77..0000000 --- a/screen-4.0.3-resize.patch +++ /dev/null @@ -1,116 +0,0 @@ -commit 45d0c395945d2ae0f99748d030a8bffcb4cb46f9 -Author: Sadrul Habib Chowdhury -Date: Wed Sep 23 16:22:06 2009 -0400 - - Fix a crash when resizing. - - The alternate screen has to be reset after a resize. Thanks to - Enrico Scholz for pointing - this out. Closes savannah bug #26742. - -diff --git a/src/resize.c b/src/resize.c -index 0bf5f3d..5477bb7 100644 ---- a/src/resize.c -+++ b/src/resize.c -@@ -497,6 +497,7 @@ CheckMaxSize(wi) - int wi; - { - unsigned char *oldnull = null; -+ unsigned char *oldblank = blank; - struct win *p; - int i; - struct mline *ml; -@@ -542,49 +543,34 @@ int wi; - # endif - #endif - -+#define RESET_AFC(x, bl) do { if (x == old##bl) x = bl; } while (0) -+ -+#define RESET_LINES(lines, count) \ -+ do { \ -+ ml = lines; \ -+ for (i = 0; i < count; i++, ml++) \ -+ { \ -+ RESET_AFC(ml->image, blank); \ -+ RESET_AFC(ml->attr, null); \ -+ IFFONT(RESET_AFC(ml->font, null)); \ -+ IFCOLOR(RESET_AFC(ml->color, null)); \ -+ IFCOLORX(RESET_AFC(ml->colorx, null)); \ -+ } \ -+ } while (0) -+ - /* We have to run through all windows to substitute -- * the null references. -+ * the null and blank references. - */ - for (p = windows; p; p = p->w_next) - { -- ml = p->w_mlines; -- for (i = 0; i < p->w_height; i++, ml++) -- { -- if (ml->attr == oldnull) -- ml->attr = null; --#ifdef FONT -- if (ml->font == oldnull) -- ml->font = null; --#endif --#ifdef COLOR -- if (ml->color == oldnull) -- ml->color= null; --#ifdef COLORS256 -- if (ml->colorx == oldnull) -- ml->colorx = null; --#endif --#endif -- } -+ RESET_LINES(p->w_mlines, p->w_height); -+ - #ifdef COPY_PASTE -- ml = p->w_hlines; -- for (i = 0; i < p->w_histheight; i++, ml++) -- { -- if (ml->attr == oldnull) -- ml->attr = null; --# ifdef FONT -- if (ml->font == oldnull) -- ml->font = null; --# endif --# ifdef COLOR -- if (ml->color == oldnull) -- ml->color= null; --# ifdef COLORS256 -- if (ml->colorx == oldnull) -- ml->colorx = null; --# endif --# endif -- } -+ RESET_LINES(p->w_hlines, p->w_histheight); -+ RESET_LINES(p->w_alt_hlines, p->w_alt_histheight); - #endif -+ -+ RESET_LINES(p->w_alt_mlines, p->w_alt_height); - } - } - -commit 7cb17d54cc8fca88e17d6d1e7be2fd49daef1b9d -Author: Enrico Scholz -Date: Wed Sep 23 16:24:21 2009 -0400 - - Typo fix. - - Fixing this typo fixes this crash: - https://bugzilla.redhat.com/show_bug.cgi?id=515055 - -diff --git a/src/resize.c b/src/resize.c -index 5477bb7..9c7b70f 100644 ---- a/src/resize.c -+++ b/src/resize.c -@@ -517,7 +517,7 @@ int wi; - #ifdef COLOR - mline_old.color = (unsigned char *)xrealloc((char *)mline_old.color, maxwidth); - # ifdef COLORS256 -- mline_old.colorx = (unsigned char *)xrealloc((char *)mline_old.color, maxwidth); -+ mline_old.colorx = (unsigned char *)xrealloc((char *)mline_old.colorx, maxwidth); - # endif - #endif - if (!(blank && null && mline_old.image && mline_old.attr IFFONT(&& mline_old.font) IFCOLOR(&& mline_old.color) IFCOLORX(&& mline_old.colorx))) diff --git a/screen-4.0.3-stropts.patch b/screen-4.0.3-stropts.patch deleted file mode 100644 index d6cbed7..0000000 --- a/screen-4.0.3-stropts.patch +++ /dev/null @@ -1,48 +0,0 @@ -diff -up screen-4.0.3/tty.sh.stropts screen-4.0.3/tty.sh ---- screen-4.0.3/tty.sh.stropts 2003-09-08 16:24:25.000000000 +0200 -+++ screen-4.0.3/tty.sh 2008-04-07 11:28:34.000000000 +0200 -@@ -76,7 +76,7 @@ exit 0 - #endif - - #include "config.h" --#ifdef SVR4 -+#if 0 - #include /* for I_POP */ - #endif - -diff -up screen-4.0.3/screen.c.stropts screen-4.0.3/screen.c ---- screen-4.0.3/screen.c.stropts 2008-04-07 11:25:21.000000000 +0200 -+++ screen-4.0.3/screen.c 2008-04-07 11:29:14.000000000 +0200 -@@ -50,7 +50,7 @@ - - #include "config.h" - --#ifdef SVR4 -+#if 0 - # include - #endif - -diff -up screen-4.0.3/process.c.stropts screen-4.0.3/process.c ---- screen-4.0.3/process.c.stropts 2003-09-18 14:53:54.000000000 +0200 -+++ screen-4.0.3/process.c 2008-04-07 11:29:47.000000000 +0200 -@@ -37,7 +37,7 @@ - #include "config.h" - - /* for solaris 2.1, Unixware (SVR4.2) and possibly others: */ --#ifdef SVR4 -+#if 0 - # include - #endif - -diff -up screen-4.0.3/pty.c.stropts screen-4.0.3/pty.c ---- screen-4.0.3/pty.c.stropts 2003-09-08 16:26:18.000000000 +0200 -+++ screen-4.0.3/pty.c 2008-04-07 11:30:07.000000000 +0200 -@@ -34,7 +34,7 @@ - #endif - - /* for solaris 2.1, Unixware (SVR4.2) and possibly others */ --#ifdef HAVE_SVR4_PTYS -+#if 0 - # include - #endif - diff --git a/screen-ipv6.patch b/screen-ipv6.patch new file mode 100644 index 0000000..baad227 --- /dev/null +++ b/screen-ipv6.patch @@ -0,0 +1,345 @@ +diff -up screen/src/doc/screen.1.ipv6 screen/src/doc/screen.1 +--- screen/src/doc/screen.1.ipv6 2010-11-11 03:47:46.000000000 +0100 ++++ screen/src/doc/screen.1 2011-02-03 16:05:35.957087079 +0100 +@@ -398,6 +398,12 @@ Send the specified command to a running + the \fB-d\fP or \fB-r\fP option to tell screen to look only for + attached or detached screen sessions. Note that this command doesn't + work if the session is password protected. ++.TP 5 ++.B \-4 ++Resolve hostnames only to IPv4 addresses. ++.TP 5 ++.B \-6 ++Resolve hostnames only to IPv6 addresses. + + .SH "DEFAULT KEY BINDINGS" + .ta 12n 26n +diff -up screen/src/extern.h.ipv6 screen/src/extern.h +--- screen/src/extern.h.ipv6 2010-11-11 03:47:46.000000000 +0100 ++++ screen/src/extern.h 2011-02-03 16:04:35.995743620 +0100 +@@ -455,8 +455,7 @@ extern void ExitOverlayPage __P((void)) + + /* 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)); +diff -up screen/src/help.c.ipv6 screen/src/help.c +--- screen/src/help.c.ipv6 2010-11-11 03:47:46.000000000 +0100 ++++ screen/src/help.c 2011-02-03 16:04:35.992744154 +0100 +@@ -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 Resolve hostnames only to IPv4 addresses.\n"); ++ printf("-6 Resolve hostnames only to IPv6 addresses.\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"); +diff -up screen/src/screen.c.ipv6 screen/src/screen.c +--- screen/src/screen.c.ipv6 2010-11-11 03:47:46.000000000 +0100 ++++ screen/src/screen.c 2011-02-03 16:04:35.994743798 +0100 +@@ -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; +diff -up screen/src/teln.c.ipv6 screen/src/teln.c +--- screen/src/teln.c.ipv6 2010-11-11 03:47:46.000000000 +0100 ++++ screen/src/teln.c 2011-02-03 16:04:35.992744154 +0100 +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + + #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 +diff -up screen/src/window.c.ipv6 screen/src/window.c +--- screen/src/window.c.ipv6 2010-11-11 03:47:46.000000000 +0100 ++++ screen/src/window.c 2011-02-03 16:30:56.900750293 +0100 +@@ -605,6 +605,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) +@@ -766,7 +773,7 @@ struct NewWindow *newwin; + #ifdef BUILTIN_TELNET + if (type == W_TYPE_TELNET) + { +- if (TelConnect(p)) ++ if (TelOpenAndConnect(p)) + { + FreeWindow(p); + return -1; +@@ -878,6 +885,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; + +@@ -909,7 +923,7 @@ struct win *p; + #ifdef BUILTIN_TELNET + if (p->w_type == W_TYPE_TELNET) + { +- if (TelConnect(p)) ++ if (TelOpenAndConnect(p)) + return -1; + } + else +@@ -1068,16 +1082,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); +diff -up screen/src/window.h.ipv6 screen/src/window.h +--- screen/src/window.h.ipv6 2010-11-11 03:47:46.000000000 +0100 ++++ screen/src/window.h 2011-02-03 16:04:35.989744687 +0100 +@@ -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]; diff --git a/screen.spec b/screen.spec index 70658ff..cd2a467 100644 --- a/screen.spec +++ b/screen.spec @@ -1,7 +1,7 @@ Summary: A screen manager that supports multiple logins on one terminal Name: screen -Version: 4.0.3 -Release: 16%{?dist} +Version: 4.1.0 +Release: 0.1.20101110git066b098%{?dist} License: GPLv2+ Group: Applications/System URL: http://www.gnu.org/software/screen @@ -10,23 +10,17 @@ Requires(preun): /sbin/install-info Requires(post): /sbin/install-info BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: ncurses-devel pam-devel libutempter-devel autoconf texinfo +BuildRequires: automake -# The one and only true source -Source0: ftp://ftp.uni-erlangen.de/pub/utilities/screen/screen-%{version}.tar.gz -# Except for the PAM configuration, that is. +#Source0: ftp://ftp.uni-erlangen.de/pub/utilities/screen/screen-%{version}.tar.gz +# snapshot from git://git.savannah.gnu.org/screen.git +Source0: screen-20101110git066b098.tar.bz2 Source1: screen.pam Source2: screen.tmpfs Patch1: screen-4.0.3-libs.patch -# Some tweaks of the default screenrc Patch2: screen-4.0.3-screenrc.patch -Patch3: screen-4.0.3-configh.patch -Patch4: screen-4.0.3-stropts.patch -# Fixes potential buffer overflow when > 2^31 semicolons are passed. -Patch7: screen-4.0.1-args.patch -Patch11: screen-4.0.2-maxstr.patch -Patch12: screen-4.0.3-ipv6.patch -Patch13: screen-4.0.3-resize.patch +Patch3: screen-ipv6.patch %description The screen utility allows you to have multiple logins on just one @@ -39,18 +33,13 @@ support multiple logins on one terminal. %prep -%setup -q +%setup -q -n screen/src %patch1 -p1 -b .libs %patch2 -p1 -b .screenrc -%patch3 -p1 -b .configh -%patch4 -p1 -b .stropts -%patch7 -p0 -b .args -%patch11 -p1 -b .maxstr -%patch12 -p1 -b .ipv6 -%patch13 -p2 -b .resize +%patch3 -p2 -b .ipv6 %build -autoconf +./autogen.sh %configure \ --enable-pam \ @@ -67,9 +56,10 @@ autoconf sed -i -e 's/.*#.*undef.*HAVE_BRAILLE.*/#define HAVE_BRAILLE 1/;' config.h sed -i -e 's/\(\/usr\)\?\/local\/etc/\/etc/g;' doc/screen.{1,texinfo} -rm doc/screen.info* +rm -f doc/screen.info* -make %{?_smp_mflags} +# fails with %{?_smp_mflags} +make %install rm -rf $RPM_BUILD_ROOT diff --git a/sources b/sources index e9b4cf4..9d588b0 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -8506fd205028a96c741e4037de6e3c42 screen-4.0.3.tar.gz +7c4808080e88f1eb3f7a149a7aa5686c screen-20101110git066b098.tar.bz2