On Wednesday 12 November 2008 20:35, Cathey, Jim wrote:
> Both approaches seem to work just fine. The add_iacs()
> patch I did is smaller, and I believe fits better into
> the existing structure of telnetd, such as it is:
>
> $ size networking/telnetd.o
> text data bss dec hex filename
> 3752 16 16 3784 ec8 networking/telnetd.o
> $ # Replace add_iacs() patch with iac_safe_write() patch & rebuild...
> $ size networking/telnetd.o
> text data bss dec hex filename
> 3792 16 16 3824 ef0 networking/telnetd.o
> $
>
> (These are mips64 numbers.)
>
> I had to apply iac_safe_write() code as a patch to what we
> had, replacing my patch. (For comparison purposes.) I couldn't
> get the current svn to fully build for me, and I've got nearly
> zero time to spend on this. I believe the comparative results
> are still valid, however.
>
> Essentially both patches each apply one new subroutine, which
> are listed here for easy comparison:
>
> static void
> add_iacs(struct tsession *ts, int *pnum_fromtty)
> {
> unsigned char *ptr = TS_BUF2 + ts->rdidx2;
> unsigned char *end = ptr + MIN(BUFSIZE - ts->rdidx2, *pnum_fromtty);
Let's assume there are full "BUFSIZE - ts->rdidx2" bytes
in the buffer, and the very first byte is 0xff.
> while (ptr < end) {
> if (*ptr == IAC) {
> memmove(ptr+1, ptr, end - ptr);// Results in dupe IAC!
Here we would store one byte past the buffer's end.
> if (end < TS_BUF2 + BUFSIZE)
> end++;
...else - just forget that pesky last byte, who cares?
> (*pnum_fromtty)++;
> ptr++; // Don't process the dupe next time either.
> }
> ptr++;
> }
> }
>
> *** Versus ***
>
> static size_t iac_safe_write(int fd, const char *buf, size_t count)
> {
> const char *oxff;
> size_t wr, rc, total;
>
> total = 0;
> while (1) {
> if (count == 0)
> return total;
> if (*buf == (char)0xff) {
> rc = safe_write(fd, "\xff\xff", 2);
> if (rc != 2)
> break;
> buf++;
> total++;
> count--;
> continue;
> }
> /* count != 0, *buf != 0xff */
> oxff = memchr(buf, 0xff, count);
> wr = count;
> if (oxff)
> wr = oxff - buf;
> rc = safe_write(fd, buf, wr);
> if (rc != wr)
> break;
> buf += rc;
> total += rc;
> count -= rc;
> }
> /* here: rc - result of last short write */
> if ((ssize_t)rc < 0) { /* error? */
> if (total == 0)
> return rc;
> rc = 0;
> }
> return total + rc;
> }
>
> I happen to think that mine is simpler; it's for certain smaller!
I am all for smaller, as long as it does not introduce bugs.
--
vda
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox