|
|
| |
| |
unsigned char slc_reply[128]; | unsigned char slc_reply[128]; |
|
unsigned char const * const slc_reply_eom = &slc_reply[sizeof(slc_reply)]; |
unsigned char *slc_replyp; | unsigned char *slc_replyp; |
| |
void | void |
|
|
void | void |
slc_add_reply(unsigned char func, unsigned char flags, cc_t value) | slc_add_reply(unsigned char func, unsigned char flags, cc_t value) |
{ | { |
|
/* A sequence of up to 6 bytes my be written for this member of the SLC |
|
* suboption list by this function. The end of negotiation command, |
|
* which is written by slc_end_reply(), will require 2 additional |
|
* bytes. Do not proceed unless there is sufficient space for these |
|
* items. |
|
*/ |
|
if (&slc_replyp[6+2] > slc_reply_eom) |
|
return; |
if ((*slc_replyp++ = func) == IAC) | if ((*slc_replyp++ = func) == IAC) |
*slc_replyp++ = IAC; | *slc_replyp++ = IAC; |
if ((*slc_replyp++ = flags) == IAC) | if ((*slc_replyp++ = flags) == IAC) |
|
|
{ | { |
int len; | int len; |
| |
|
/* The end of negotiation command requires 2 bytes. */ |
|
if (&slc_replyp[2] > slc_reply_eom) |
|
return; |
|
|
*slc_replyp++ = IAC; | *slc_replyp++ = IAC; |
*slc_replyp++ = SE; | *slc_replyp++ = SE; |
len = slc_replyp - slc_reply; | len = slc_replyp - slc_reply; |
|
|
} | } |
} | } |
| |
#define OPT_REPLY_SIZE 256 |
#define OPT_REPLY_SIZE (2 * SUBBUFSIZE) |
unsigned char *opt_reply; |
unsigned char *opt_reply = NULL; |
unsigned char *opt_replyp; | unsigned char *opt_replyp; |
unsigned char *opt_replyend; | unsigned char *opt_replyend; |
| |
|
|
return; | return; |
} | } |
vp = env_getvalue(ep); | vp = env_getvalue(ep); |
if (opt_replyp + (vp ? strlen((char *)vp) : 0) + |
if (opt_replyp + (vp ? 2 * strlen((char *)vp) : 0) + |
strlen((char *)ep) + 6 > opt_replyend) |
2 * strlen((char *)ep) + 6 > opt_replyend) |
{ | { |
int len; | int len; |
unsigned char *p; | unsigned char *p; |
|
|
*opt_replyp++ = ENV_USERVAR; | *opt_replyp++ = ENV_USERVAR; |
for (;;) { | for (;;) { |
while ((c = *ep++)) { | while ((c = *ep++)) { |
|
if (opt_replyp + (2 + 2) > opt_replyend) |
|
return; |
switch(c&0xff) { | switch(c&0xff) { |
case IAC: | case IAC: |
*opt_replyp++ = IAC; | *opt_replyp++ = IAC; |
|
|
*opt_replyp++ = c; | *opt_replyp++ = c; |
} | } |
if ((ep = vp)) { | if ((ep = vp)) { |
|
if (opt_replyp + (1 + 2 + 2) > opt_replyend) |
|
return; |
*opt_replyp++ = ENV_VALUE; | *opt_replyp++ = ENV_VALUE; |
vp = NULL; | vp = NULL; |
} else | } else |
|
|
{ | { |
int len; | int len; |
| |
len = opt_replyp - opt_reply + 2; |
if (opt_replyp + 2 > opt_replyend) |
|
return; |
|
len = opt_replyp + 2 - opt_reply; |
|
|
if (emptyok || len > 6) { | if (emptyok || len > 6) { |
*opt_replyp++ = IAC; | *opt_replyp++ = IAC; |
*opt_replyp++ = SE; | *opt_replyp++ = SE; |