Hi everybody,
after having been using screen a lot on different servers, I though that
beeing able to display any source address reported by ifconfig could be a
nice feature.
I've made that patch, which is supposed to work for linux os (it uses ioctl to
get the addresses from actives interfaces).
Basicly, it adds a file to the build, which offers a AddInetInfo function,
called in screen.c using the I attribute for hardstatus line.
It prints on it something like "lo:127.0.0.1 eth0:10.0.2.2 wlan0:192.168.5.22"
(supposing that eth0 and wlan0 are active).
Thanks for comments, review and if possible a merge.
Berry Octave
Rev : Sorry, I just forgot the patch
Les sous-répertoires screen-4.0.3.orig/doc et screen-4.0.3/doc sont identiques.
Les sous-répertoires screen-4.0.3.orig/etc et screen-4.0.3/etc sont identiques.
diff -uN screen-4.0.3.orig/extern.h screen-4.0.3/extern.h
--- screen-4.0.3.orig/extern.h 2003-08-22 14:27:57.000000000 +0200
+++ screen-4.0.3/extern.h 2009-07-12 11:07:43.000000000 +0200
@@ -177,6 +177,11 @@
extern int OpenPTY __P((char **));
extern void InitPTY __P((int));
+#if defined (linux)
+/* inet.c */
+extern void AddInetInfo __P((char *));
+#endif
+
/* process.c */
extern void InitKeytab __P((void));
extern void ProcessInput __P((char *, int));
diff -uN screen-4.0.3.orig/inet.c screen-4.0.3/inet.c
--- screen-4.0.3.orig/inet.c 1970-01-01 01:00:00.000000000 +0100
+++ screen-4.0.3/inet.c 2009-07-12 11:06:53.000000000 +0200
@@ -0,0 +1,68 @@
+
+#if defined (linux)
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <arpa/inet.h>
+
+#define BUFLEN 80
+
+
+void
+AddInetInfo(p)
+char *p;
+{
+ int sock = socket(AF_INET, SOCK_DGRAM,IPPROTO_IP);
+ struct ifconf buffer;
+ struct sockaddr_in * sockaddr;
+ int i, j = 0, buffer_size = sizeof(struct ifreq);
+ char buf[BUFLEN];
+
+ buffer.ifc_len = buffer_size;
+ buffer.ifc_buf = malloc(sizeof(char) * buffer_size);
+
+ ioctl(sock, SIOCGIFCONF,&buffer);
+
+ while (buffer.ifc_len == buffer_size)
+ {
+ buffer_size += sizeof(struct ifreq);
+ buffer.ifc_len = buffer_size;
+ buffer.ifc_buf = realloc(buffer.ifc_buf, sizeof(char) * buffer_size);
+ ioctl(sock, SIOCGIFCONF,&buffer);
+ }
+
+ /* We have a kind of a hash with the active interfaces as key and the
+ inet addr as value */
+ for (i = 0 ; i < buffer.ifc_len / sizeof(struct ifreq) ; i++)
+ {
+ //if (!strcmp(buffer.ifc_req[i].ifr_name, "lo"))
+ // continue;
+
+
+ sockaddr = (struct sockaddr_in *) &buffer.ifc_req[i].ifr_addr;
+
+ sprintf(buf, "%s:%s", buffer.ifc_req[i].ifr_name, inet_ntoa(sockaddr->sin_addr));
+
+ if (j + strlen(buf) + /*3*/ 1 <= BUFLEN)
+ {
+ if (j != 0)
+ {
+// p[j++] = ' ';
+// p[j++] = ';';
+ p[j++] = ' ';
+ }
+ strcpy(p + j, buf);
+ j += strlen(buf);
+ }
+ }
+
+ free(buffer.ifc_buf);
+ close(sock);
+}
+
+#endif
+
Les fichiers binaires screen-4.0.3.orig/.loadav.c.swp et screen-4.0.3/.loadav.c.swp sont différents.
diff -uN screen-4.0.3.orig/Makefile.in screen-4.0.3/Makefile.in
--- screen-4.0.3.orig/Makefile.in 2006-10-23 15:06:32.000000000 +0200
+++ screen-4.0.3/Makefile.in 2009-07-12 11:05:40.000000000 +0200
@@ -55,12 +55,12 @@
search.c tty.c term.c window.c utmp.c loadav.c putenv.c help.c \
termcap.c input.c attacher.c pty.c process.c display.c comm.c \
kmapdef.c acls.c braille.c braille_tsi.c logfile.c layer.c \
- sched.c teln.c nethack.c encoding.c
+ sched.c teln.c nethack.c encoding.c inet.c
OFILES= screen.o ansi.o fileio.o mark.o misc.o resize.o socket.o \
search.o tty.o term.o window.o utmp.o loadav.o putenv.o help.o \
termcap.o input.o attacher.o pty.o process.o display.o comm.o \
kmapdef.o acls.o braille.o braille_tsi.o logfile.o layer.o \
- sched.o teln.o nethack.o encoding.o
+ sched.o teln.o nethack.o encoding.o inet.o
all: screen
diff -uN screen-4.0.3.orig/screen.c screen-4.0.3/screen.c
--- screen-4.0.3.orig/screen.c 2003-09-08 16:26:41.000000000 +0200
+++ screen-4.0.3/screen.c 2009-07-12 11:06:30.000000000 +0200
@@ -2517,6 +2517,25 @@
p += strlen(p) - 1;
}
break;
+
+#if defined (linux)
+ case 'I':
+ *p = 0;
+ if (l > 40)
+ AddInetInfo(p);
+ if (*p)
+ {
+ qmflag = 1;
+ p += strlen(p) - 1;
+ }
+ else
+ *p = '?';
+ if (!tick || tick > 10)
+ tick = 10;
+ break;
+#endif
+
+
case 'w':
case 'W':
{
Les sous-répertoires screen-4.0.3.orig/terminfo et screen-4.0.3/terminfo sont identiques.
Les sous-répertoires screen-4.0.3.orig/utf8encodings et screen-4.0.3/utf8encodings sont identiques.