X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=src%2Fclient.c;h=98f5a668f96e62c17a5537b106fc62d372ade3e1;hb=f155969d600561b9ef151a7ce2494a0c89aed033;hp=cd11c78b53b45446b654744c721f4abb7b672b6f;hpb=bd95f04650a16c15d5691a7a318d51ed764e8b39;p=spider.git diff --git a/src/client.c b/src/client.c index cd11c78b..98f5a668 100644 --- a/src/client.c +++ b/src/client.c @@ -81,6 +81,7 @@ char *connsort; /* the type of connection */ fcb_t *in; /* the fcb of 'stdin' that I shall use */ fcb_t *node; /* the fcb of the msg system */ char nl = '\n'; /* line end character */ +char mode = 1; /* 0 - ax25, 1 - normal telnet, 2 - nlonly telnet */ char ending = 0; /* set this to end the program */ char send_Z = 1; /* set a Z record to the node on termination */ char echo = 1; /* echo characters on stdout from stdin */ @@ -235,7 +236,8 @@ void send_text(fcb_t *f, char *s, int l) if (nl == '\r') *mp->inp++ = nl; else { - *mp->inp++ = '\r'; + if (mode != 2) + *mp->inp++ = '\r'; *mp->inp++ = '\n'; } if (!f->buffer_it) @@ -352,7 +354,7 @@ int fcb_handler(sel_t *sp, int in, int out, int err) *mp->inp++ = *p++; } break; - case '\b': + case 0x08: case 0x7f: if (mp->inp > mp->data) mp->inp--; @@ -500,6 +502,29 @@ lend:; return 0; } +/* + * set up the various mode flags, NL endings and things + */ +void setmode(char *m) +{ + char *connsort = strlower(m); + if (eq(connsort, "telnet") || eq(connsort, "local") || eq(connsort, "nlonly") { + nl = '\n'; + echo = 1; + mode = eq(connsort, "nlonly") 2 : 1; + } else if (eq(connsort, "ax25")) { + nl = '\r'; + echo = 0; + mode = 0; + } else if (eq(connsort, "connect")) { + nl = '\n'; + echo = 0; + mode = 3; + } else { + die("Connection type must be \"telnet\", \"nlonly\", \"ax25\", \"login\" or \"local\""); + } +} + /* * things to do with initialisation */ @@ -546,20 +571,9 @@ lerr: die("Must have at least a callsign (for now)"); if (optind < argc) { - connsort = strlower(argv[optind]); - if (eq(connsort, "telnet") || eq(connsort, "local")) { - nl = '\n'; - echo = 1; - } else if (eq(connsort, "ax25")) { - nl = '\r'; - echo = 0; - } else { - die("2nd argument must be \"telnet\" or \"ax25\" or \"local\""); - } + setmode(argv[optind]); } else { - connsort = "local"; - nl = '\n'; - echo = 1; + setmode("local"); } /* this is kludgy, but hey so is the rest of this! */ @@ -755,7 +769,10 @@ main(int argc, char *argv[]) } /* is this a login? */ - if (eq(call, "LOGIN")) { + if (eq(call, "LOGIN") || eq(call, "login")) { + chgstate(LOGIN); + } else if (eq( + char buf[MAXPACLEN+1]; char callsign[MAXCALLSIGN+1]; int r, i; @@ -789,7 +806,7 @@ main(int argc, char *argv[]) if (i < MAXCALLSIGN) { if (*p == '\r' || *p == '\n') goto lgotcall; - else if (isalnum(*p)) + else if (isalnum(*p) || *p == '-') callsign[i++] = *p; else die("%c is not a valid callsign character", *p); @@ -814,6 +831,7 @@ lgotcall: in->sp = sel_open(0, in, "STDIN", fcb_handler, TEXT, SEL_INPUT); if (tcgetattr(0, &in->t) < 0) { /* echo = 0; */ + in->echo = echo; in->t_set = 0; } else { struct termios t = in->t;