X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=src%2Fclient.c;h=cd11c78b53b45446b654744c721f4abb7b672b6f;hb=bd95f04650a16c15d5691a7a318d51ed764e8b39;hp=22e06f6976505fdebac7b3fa31db1e739d95519e;hpb=5947a205b3f36462fc1fe5ed5a08c7d8293ab744;p=spider.git diff --git a/src/client.c b/src/client.c index 22e06f69..cd11c78b 100644 --- a/src/client.c +++ b/src/client.c @@ -232,7 +232,12 @@ void send_text(fcb_t *f, char *s, int l) flush_text(f); f->obuf = mp = cmsg_new(paclen+1, f->sort, f); } - *mp->inp++ = nl; + if (nl == '\r') + *mp->inp++ = nl; + else { + *mp->inp++ = '\r'; + *mp->inp++ = '\n'; + } if (!f->buffer_it) flush_text(f); } @@ -264,7 +269,7 @@ void send_msg(fcb_t *f, char let, unsigned char *s, int l) } else *mp->inp++ = *p; } - } + } *mp->inp++ = '\n'; *mp->inp = 0; cmsg_send(f->outq, mp, 0); @@ -295,14 +300,16 @@ int fcb_handler(sel_t *sp, int in, int out, int err) case EAGAIN: goto lout; default: - if (f->sort == MSG) - send_Z = 0; +/* if (f->sort == MSG) + send_Z = 0; */ + dbg(DBUF,"got errno %d in input", errno); ending++; return 0; } } else if (r == 0) { - if (f->sort == MSG) - send_Z = 0; +/* if (f->sort == MSG) + send_Z = 0; */ + dbg(DBUF, "ending normally"); ending++; return 0; } @@ -473,8 +480,9 @@ lout:; case EAGAIN: goto lend; default: - if (f->sort == MSG) - send_Z = 0; +/* if (f->sort == MSG) + send_Z = 0; */ + dbg(DBUF,"got errno %d in output", errno); ending++; return; } @@ -597,6 +605,7 @@ void term_timeout(int i) if (in && in->t_set) tcsetattr(0, TCSANOW, &in->t); if (node) { + shutdown(node->cnum, 3); close(node->cnum); } exit(i); @@ -605,7 +614,7 @@ void term_timeout(int i) void terminate(int i) { if (node && send_Z && call) { - send_msg(node, 'Z', "", 0); + send_msg(node, 'Z', "bye", 3); } signal(SIGALRM, term_timeout); @@ -617,8 +626,10 @@ void terminate(int i) } if (in && in->t_set) tcsetattr(0, TCSADRAIN, &in->t); - if (node) + if (node) { + shutdown(node->cnum, 3); close(node->cnum); + } exit(i); } @@ -746,7 +757,8 @@ main(int argc, char *argv[]) /* is this a login? */ if (eq(call, "LOGIN")) { char buf[MAXPACLEN+1]; - int r; + char callsign[MAXCALLSIGN+1]; + int r, i; int f = xopen("data", "issue", 0); if (f > 0) { while ((r = read(f, buf, paclen)) > 0) { @@ -764,19 +776,32 @@ main(int argc, char *argv[]) signal(SIGALRM, login_timeout); alarm(timeout); write(0, "login: ", 7); - r = read(0, buf, 20); - if (r <= 0) - die("No login or error (%d)", errno); + dbgdump(DBUF, "<-out", "login: ", 7); + for (i = 0;;) { + char *p; + r = read(0, buf, 20); + dbgdump(DBUF, "in ->", buf, r); + if (r <= 0) + die("No login or error (%d)", errno); + write(0, buf, r); + dbgdump(DBUF, "<-out", buf, r); + for (p = buf; p < buf+r; ++p) { + if (i < MAXCALLSIGN) { + if (*p == '\r' || *p == '\n') + goto lgotcall; + else if (isalnum(*p)) + callsign[i++] = *p; + else + die("%c is not a valid callsign character", *p); + } else + die("callsign entered is too long"); + } + } +lgotcall: signal(SIGALRM, SIG_IGN); alarm(0); - while (r > 0) { - if (buf[r-1] == ' ' || buf[r-1] == '\r' || buf[r-1] == '\n') - --r; - else - break; - } - buf[r] = 0; - call = strupper(buf); + callsign[i]= 0; + call = strupper(callsign); } /* check the callsign */ @@ -788,7 +813,7 @@ main(int argc, char *argv[]) in = fcb_new(0, TEXT); in->sp = sel_open(0, in, "STDIN", fcb_handler, TEXT, SEL_INPUT); if (tcgetattr(0, &in->t) < 0) { - echo = 0; +/* echo = 0; */ in->t_set = 0; } else { struct termios t = in->t;