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