X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=src%2Fclient.c;h=edd2a0ff1a7cee651d695d4f13df517751c2911b;hb=652f5fb4391306230ef158211dafd4662ff3f85e;hp=5991ed76ffc6aa4bf1935ce5df6fce75c34ad405;hpb=8ec8de844b14f4d48308eaf3c0fd05e080baa46a;p=spider.git diff --git a/src/client.c b/src/client.c index 5991ed76..edd2a0ff 100644 --- a/src/client.c +++ b/src/client.c @@ -146,7 +146,7 @@ void send_msg(fcb_t *f, char let, char *s, int l) int ln; int myl = strlen(call)+2+l; - mp = cmsg_new(myl+4, f->sort, f); + mp = cmsg_new(myl+4+1, f->sort, f); ln = htonl(myl); memcpy(mp->inp, &ln, 4); mp->inp += 4; @@ -154,7 +154,7 @@ void send_msg(fcb_t *f, char let, char *s, int l) strcpy(mp->inp, call); mp->inp += strlen(call); *mp->inp++ = '|'; - if (l) { + if (l > 0) { memcpy(mp->inp, s, l); mp->inp += l; } @@ -163,6 +163,10 @@ void send_msg(fcb_t *f, char let, char *s, int l) f->sp->flags |= SEL_OUTPUT; } +/* + * the callback (called by sel_run) that handles all the inputs and outputs + */ + int fcb_handler(sel_t *sp, int in, int out, int err) { fcb_t *f = sp->fcb; @@ -198,14 +202,14 @@ int fcb_handler(sel_t *sp, int in, int out, int err) /* create a new message buffer if required */ if (!f->in) - f->in = cmsg_new(MAXBUFL, f->sort, f); + f->in = cmsg_new(MAXBUFL+1, f->sort, f); mp = f->in; switch (f->sort) { case TEXT: p = buf; if (f->echo) - omp = cmsg_new(3*r, f->sort, f); + omp = cmsg_new(3*r+1, f->sort, f); while (r > 0 && p < &buf[r]) { /* echo processing */ @@ -230,7 +234,7 @@ int fcb_handler(sel_t *sp, int in, int out, int err) ++p; break; default: - if (nl == '\n' && *p == '\r') { + if (nl == '\n' && *p == '\r') { /* ignore \r in telnet mode (ugh) */ p++; } else if (*p == nl) { if (mp->inp == mp->data) @@ -238,7 +242,7 @@ int fcb_handler(sel_t *sp, int in, int out, int err) *mp->inp = 0; /* zero terminate it, but don't include it in the length */ dbgdump(DMSG, "QUEUE TEXT", mp->data, mp->inp-mp->data); cmsg_send(f->inq, mp, 0); - f->in = mp = cmsg_new(MAXBUFL, f->sort, f); + f->in = mp = cmsg_new(MAXBUFL+1, f->sort, f); ++p; } else { if (mp->inp < &mp->data[MAXBUFL]) @@ -284,7 +288,7 @@ int fcb_handler(sel_t *sp, int in, int out, int err) /* kick it upstairs */ dbgdump(DMSG, "QUEUE MSG", mp->data, mp->inp - mp->data); cmsg_send(f->inq, mp, 0); - mp = f->in = cmsg_new(MAXBUFL, f->sort, f); + mp = f->in = cmsg_new(MAXBUFL+1, f->sort, f); } } } @@ -334,8 +338,6 @@ lout:; if (mp->inp - mp->data >= mp->size) { cmsg_callback(mp, 0); f->out = 0; -/* if (is_chain_empty(f->outq)) - sp->flags &= ~SEL_OUTPUT; */ } } lend:; @@ -370,7 +372,7 @@ void initargs(int argc, char *argv[]) lerr: if (err) { - die("usage: client [-x nn] |login [local|telnet|ax25]"); + die("usage: client [-x n|-h|-p] |login [local|telnet|ax25]"); } if (optind < argc) { @@ -501,8 +503,6 @@ void process_node() case 'D': if (p) { int l = mp->inp - (unsigned char *) p; - if (nl == '\n' && l >= 1 && p[l-1] == '\r') /* kludge for GB7DXM */ - l--; send_text(in, p, l); } break;