r3981 - in branches/2.0/varnish-cache: bin/varnishd include lib/libvarnish

tfheen at projects.linpro.no tfheen at projects.linpro.no
Mon Mar 23 09:47:38 CET 2009


Author: tfheen
Date: 2009-03-23 09:47:37 +0100 (Mon, 23 Mar 2009)
New Revision: 3981

Modified:
   branches/2.0/varnish-cache/bin/varnishd/mgt_cli.c
   branches/2.0/varnish-cache/include/vlu.h
   branches/2.0/varnish-cache/lib/libvarnish/vlu.c
Log:
Merge r3866: Handle telnet options

Add minimal facility for dealing with TELNET option negotiation
in a way that telnet clients don't get confused about:

Return WONT on to all DO or DONT and ignore everything else.



Modified: branches/2.0/varnish-cache/bin/varnishd/mgt_cli.c
===================================================================
--- branches/2.0/varnish-cache/bin/varnishd/mgt_cli.c	2009-03-23 08:31:25 UTC (rev 3980)
+++ branches/2.0/varnish-cache/bin/varnishd/mgt_cli.c	2009-03-23 08:47:37 UTC (rev 3981)
@@ -372,6 +372,10 @@
 	cp->cli->sb = vsb_newauto();
 	XXXAN(cp->cli->sb);
 
+	/* Deal with TELNET options */
+	if (cp->fdi != 0)
+		VLU_SetTelnet(cp->vlu, cp->fdo);
+
 	cp->ev = calloc(sizeof *cp->ev, 1);
 	cp->ev->name = cp->name;
 	cp->ev->fd = fdi;

Modified: branches/2.0/varnish-cache/include/vlu.h
===================================================================
--- branches/2.0/varnish-cache/include/vlu.h	2009-03-23 08:31:25 UTC (rev 3980)
+++ branches/2.0/varnish-cache/include/vlu.h	2009-03-23 08:47:37 UTC (rev 3981)
@@ -37,5 +37,6 @@
 int VLU_Fd(int fd, struct vlu *l);
 int VLU_File(FILE *f, struct vlu *l);
 void VLU_Destroy(struct vlu *l);
+void VLU_SetTelnet(struct vlu *l, int fd);
 
 #endif

Modified: branches/2.0/varnish-cache/lib/libvarnish/vlu.c
===================================================================
--- branches/2.0/varnish-cache/lib/libvarnish/vlu.c	2009-03-23 08:31:25 UTC (rev 3980)
+++ branches/2.0/varnish-cache/lib/libvarnish/vlu.c	2009-03-23 08:47:37 UTC (rev 3981)
@@ -46,6 +46,7 @@
 	unsigned	bufl;
 	unsigned	bufp;
 	void		*priv;
+	int 		telnet;
 	vlu_f	*func;
 };
 
@@ -66,11 +67,20 @@
 			FREE_OBJ(l);
 			l = NULL;
 		}
+		l->telnet = -1;
 	}
 	return (l);
 }
 
 void
+VLU_SetTelnet(struct vlu *l, int fd)
+{
+	CHECK_OBJ_NOTNULL(l, LINEUP_MAGIC);
+	assert(fd >= 0);
+	l->telnet = fd;
+}
+
+void
 VLU_Destroy(struct vlu *l)
 {
 
@@ -80,6 +90,51 @@
 }
 
 static int
+vlu_dotelnet(struct vlu *l, char *p)
+{
+	char *e;
+	char tno[3];
+	int i;
+
+	e = l->buf + l->bufp;
+	assert(p >= l->buf && p < e);
+	assert(*p == (char)255);
+
+	/* We need at least two characters */
+	if (p == e - 1)
+		return (1);
+
+	/* And three for will/wont/do/dont */
+	if (p[1] >= (char)251 && p[1] <= (char)254 && p == e - 2)
+		return (1);
+
+	switch (p[1]) {
+	case (char)251:	/* WILL */
+	case (char)252:	/* WONT */
+		/* Ignore these */
+		i = 3;
+		break;
+	case (char)253:	/* DO */
+	case (char)254:	/* DONT */
+		/* Return WONT for these */
+		memcpy(tno, p, 3);
+		tno[1] = (char)252;
+		write(l->telnet, tno, 3);
+		i = 3;
+		break;
+	default:
+		/* Ignore the rest */
+		/* XXX: only p[1] >= 240 ? */
+		i = 2;
+	}
+
+	/* Remove telnet sequence from buffer */
+	memmove(p, p + i, 1 + e - (p + i));
+	l->bufp -= i;
+	return (0);
+}
+
+static int
 LineUpProcess(struct vlu *l)
 {
 	char *p, *q;
@@ -88,9 +143,13 @@
 	l->buf[l->bufp] = '\0';
 	for (p = l->buf; *p != '\0'; p = q) {
 		/* Find first CR or NL */
-		for (q = p; *q != '\0'; q++)
+		for (q = p; *q != '\0'; q++) {
+			while (l->telnet >= 0 && *q == (char)255) 
+				if (vlu_dotelnet(l, q))
+					return (0);
 			if (*q == '\n' || *q == '\r')
 				break;
+		}
 		if (*q == '\0')
 			break;
 		*q++ = '\0';



More information about the varnish-commit mailing list