Hello community, here is the log from the commit of package screen for openSUSE:Factory checked in at Fri Aug 28 00:44:52 CEST 2009. -------- --- screen/screen.changes 2009-05-26 14:22:52.000000000 +0200 +++ screen/screen.changes 2009-08-01 19:19:34.000000000 +0200 @@ -1,0 +2,6 @@ +Fri Jul 31 02:17:31 CEST 2009 - crrodriguez@suse.de + +- add fedora patch for IPv6 support, this removes usage + of gethostbyname(3) + +------------------------------------------------------------------- calling whatdependson for head-i586 New: ---- screen-4.0.3-ipv6.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ screen.spec ++++++ --- /var/tmp/diff_new_pack.v0mQ0k/_old 2009-08-28 00:39:38.000000000 +0200 +++ /var/tmp/diff_new_pack.v0mQ0k/_new 2009-08-28 00:39:38.000000000 +0200 @@ -26,7 +26,7 @@ PreReq: %install_info_prereq AutoReqProv: on Version: 4.0.2 -Release: 189 +Release: 190 Summary: A program to allow multiple screens on a VT100/ANSI Terminal Source: screen-4.0.2.tar.gz Patch: screen-4.0.2.dif @@ -34,6 +34,7 @@ Patch2: screen-gcc4.diff Patch3: screen-4.0.2-comb.diff Patch4: screen-man-loginshell.diff +Patch5: screen-4.0.3-ipv6.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build %description @@ -58,6 +59,7 @@ %patch2 -p1 %patch3 %patch4 -p1 +%patch5 -p1 %build CFLAGS="-DMAXWIN=1000 $RPM_OPT_FLAGS" ./configure --prefix=/usr --infodir=%{_infodir} \ ++++++ screen-4.0.3-ipv6.patch ++++++ --- 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 <sys/socket.h> #include <fcntl.h> #include <netdb.h> +#include <stdio.h> #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 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-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)); ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org