r3866 - in trunk/varnish-cache: bin/varnishd include lib/libvarnish
phk at projects.linpro.no
phk at projects.linpro.no
Tue Mar 3 13:23:11 CET 2009
Author: phk
Date: 2009-03-03 13:23:11 +0100 (Tue, 03 Mar 2009)
New Revision: 3866
Modified:
trunk/varnish-cache/bin/varnishd/mgt_cli.c
trunk/varnish-cache/include/vlu.h
trunk/varnish-cache/lib/libvarnish/vlu.c
Log:
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: trunk/varnish-cache/bin/varnishd/mgt_cli.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_cli.c 2009-03-03 11:25:46 UTC (rev 3865)
+++ trunk/varnish-cache/bin/varnishd/mgt_cli.c 2009-03-03 12:23:11 UTC (rev 3866)
@@ -501,6 +501,10 @@
XXXAN(cp->cli->sb);
cp->cli->priv = cp;
+ /* Deal with TELNET options */
+ if (cp->fdi != 0)
+ VLU_SetTelnet(cp->vlu, cp->fdo);
+
/*
* If we have a secret file authenticate all CLI connections
* except the stdin/stdout debug port.
Modified: trunk/varnish-cache/include/vlu.h
===================================================================
--- trunk/varnish-cache/include/vlu.h 2009-03-03 11:25:46 UTC (rev 3865)
+++ trunk/varnish-cache/include/vlu.h 2009-03-03 12:23:11 UTC (rev 3866)
@@ -38,5 +38,6 @@
int VLU_File(FILE *f, struct vlu *l);
int VLU_Data(const void *ptr, int len, struct vlu *l);
void VLU_Destroy(struct vlu *l);
+void VLU_SetTelnet(struct vlu *l, int fd);
#endif
Modified: trunk/varnish-cache/lib/libvarnish/vlu.c
===================================================================
--- trunk/varnish-cache/lib/libvarnish/vlu.c 2009-03-03 11:25:46 UTC (rev 3865)
+++ trunk/varnish-cache/lib/libvarnish/vlu.c 2009-03-03 12:23:11 UTC (rev 3866)
@@ -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