else {
subneg_addchar:
if (telnet->sb_len >= telnet->sb_size) {
- unsigned char *newbuf;
telnet->sb_size += SB_DELTA;
- newbuf = (telnet->sb_buf ?
- srealloc(telnet->sb_buf, telnet->sb_size) :
- smalloc(telnet->sb_size));
- if (newbuf)
- telnet->sb_buf = newbuf;
- else
- telnet->sb_size -= SB_DELTA;
+ telnet->sb_buf = sresize(telnet->sb_buf, telnet->sb_size,
+ unsigned char);
}
- if (telnet->sb_len < telnet->sb_size)
- telnet->sb_buf[telnet->sb_len++] = c;
+ telnet->sb_buf[telnet->sb_len++] = c;
telnet->state = SUBNEGOT; /* in case we came here by goto */
}
break;
char *err;
Telnet telnet;
- telnet = smalloc(sizeof(*telnet));
+ telnet = snew(struct telnet_tag);
telnet->fn = &fn_table;
telnet->cfg = *cfg; /* STRUCTURE COPY */
telnet->s = NULL;
}
}
+static const struct telnet_special *telnet_get_specials(void *handle)
+{
+ static const struct telnet_special specials[] = {
+ {"Are You There", TS_AYT},
+ {"Break", TS_BRK},
+ {"Synch", TS_SYNCH},
+ {"Erase Character", TS_EC},
+ {"Erase Line", TS_EL},
+ {"Go Ahead", TS_GA},
+ {"No Operation", TS_NOP},
+ {"", 0},
+ {"Abort Process", TS_ABORT},
+ {"Abort Output", TS_AO},
+ {"Interrupt Process", TS_IP},
+ {"Suspend Process", TS_SUSP},
+ {"", 0},
+ {"End Of Record", TS_EOR},
+ {"End Of File", TS_EOF},
+ {NULL, 0}
+ };
+ return specials;
+}
+
static Socket telnet_socket(void *handle)
{
Telnet telnet = (Telnet) handle;
static int telnet_exitcode(void *handle)
{
- /* Telnet telnet = (Telnet) handle; */
- /* Telnet doesn't transmit exit codes back to the client */
- return 0;
+ Telnet telnet = (Telnet) handle;
+ if (telnet->s != NULL)
+ return -1; /* still connected */
+ else
+ /* Telnet doesn't transmit exit codes back to the client */
+ return 0;
}
Backend telnet_backend = {
telnet_sendbuffer,
telnet_size,
telnet_special,
+ telnet_get_specials,
telnet_socket,
telnet_exitcode,
telnet_sendok,