diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c index b4690d56b23c0d3fcf8f3499adb53233d457da69..e0ac741538a0b90a7cf89200d119606ab4efd207 100644 --- a/src/syncterm/bbslist.c +++ b/src/syncterm/bbslist.c @@ -21,6 +21,7 @@ struct bbslist_file { unsigned int calls; char user[MAX_USER_LEN+1]; char password[MAX_PASSWD_LEN+1]; + int dumb; }; void sort_list(struct bbslist **list) { @@ -69,6 +70,7 @@ void write_list(struct bbslist **list) bbs.added=list[i]->added; bbs.connected=list[i]->connected; bbs.calls=list[i]->calls; + bbs.dumb=list[i]->dumb; strcpy(bbs.user,list[i]->user); strcpy(bbs.password,list[i]->password); fwrite(&bbs,sizeof(bbs),1,listfile); @@ -103,6 +105,7 @@ void read_list(char *listpath, struct bbslist **list, int *i, int type) list[*i]->calls=bbs.calls; strcpy(list[*i]->user,bbs.user); strcpy(list[*i]->password,bbs.password); + list[*i]->dumb=bbs.dumb; list[*i]->type=type; list[*i]->id=(*i)++; } @@ -126,7 +129,9 @@ int edit_list(struct bbslist *item) if(item->type==SYSTEM_BBSLIST) { uifc.helpbuf= "`Cannot edit system BBS list`\n\n" "SyncTERM supports system-wide and per-user lists. You may only edit entries" - "in your own personal list.\n"; + "in your own personal list.\n" + "\n" + "The Be Dumb option can be used to connect to BBSs which support 'dumb' telnet"; uifc.msg("Cannot edit system BBS list"); return(0); } @@ -137,6 +142,7 @@ int edit_list(struct bbslist *item) sprintf(opt[2],"RLogin Port: %hu",item->port); sprintf(opt[3],"Username: %s",item->user); sprintf(opt[4],"Password"); + sprintf(opt[5],"Be Dumb: %s",item->dumb?"Yes":"No"); uifc.changes=0; uifc.helpbuf= "`Edit BBS`\n\n" @@ -206,6 +212,7 @@ struct bbslist *show_bbslist(int mode) int val; int listcount=0; char str[6]; + char *YesNo[3]={"Yes","No",""}; if(init_uifc()) return(NULL); @@ -301,12 +308,24 @@ struct bbslist *show_bbslist(int mode) j=0; list[listcount-1]->port=j; } - uifc.helpbuf= "`Username`\n\n" - "Enter the username to attempt auto-login to the remote with."; - uifc.input(WIN_MID|WIN_SAV,0,0,"User Name",list[listcount-1]->user,MAX_USER_LEN,K_EDIT); - uifc.helpbuf= "`Password`\n\n" - "Enter your password for auto-login."; - uifc.input(WIN_MID|WIN_SAV,0,0,"Password",list[listcount-1]->password,MAX_PASSWD_LEN,K_EDIT); + if(list[listcount-1]->port != 513) { + uifc.helpbuf= "`Be Dumb`\n\n" + "Select this option if attempting to connect to a dumb telnet BBS"; + list[listcount-1]->dumb=0; + uifc.list(WIN_MID|WIN_SAV,0,0,0,&list[listcount-1]->dumb,NULL,"Be Dumb",YesNo); + } + if(list[listcount-1]->dumb) { + uifc.helpbuf= "`Username`\n\n" + "Enter the username to attempt auto-login to the remote with."; + uifc.input(WIN_MID|WIN_SAV,0,0,"User Name",list[listcount-1]->user,MAX_USER_LEN,K_EDIT); + uifc.helpbuf= "`Password`\n\n" + "Enter your password for auto-login."; + uifc.input(WIN_MID|WIN_SAV,0,0,"Password",list[listcount-1]->password,MAX_PASSWD_LEN,K_EDIT); + } + else { + list[listcount-1]->user[0]=0; + list[listcount-1]->password[0]=0; + } sort_list(list); for(j=0;list[j]->name[0];j++) { if(list[j]->id==listcount-1) diff --git a/src/syncterm/bbslist.h b/src/syncterm/bbslist.h index 495cbb659edb63f802581a5f7afd594f1c8c1438..0662d0e160961237860448bb3532087119c83b93 100644 --- a/src/syncterm/bbslist.h +++ b/src/syncterm/bbslist.h @@ -24,6 +24,7 @@ struct bbslist { char password[MAX_PASSWD_LEN+1]; int type; int id; + int dumb; }; struct bbslist *show_bbslist(int mode); diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c index 52882ca6848548c6cc6b61d4134348dfe560d90f..99353bfd03775499c9a7cbd6e77c81606add7231 100644 --- a/src/syncterm/rlogin.c +++ b/src/syncterm/rlogin.c @@ -44,13 +44,14 @@ int rlogin_send(char *buffer, size_t buflen, unsigned int timeout) return(0); } -int rlogin_connect(char *addr, int port, char *ruser, char *passwd) +int rlogin_connect(char *addr, int port, char *ruser, char *passwd, int bedumb) { HOSTENT *ent; SOCKADDR_IN saddr; char nil=0; char *p; unsigned int neta; + sigset_t sigset; for(p=addr;*p;p++) if(*p!='.' && !isdigit(*p)) @@ -81,22 +82,32 @@ int rlogin_connect(char *addr, int port, char *ruser, char *passwd) saddr.sin_addr.s_addr = neta; saddr.sin_family = AF_INET; saddr.sin_port = htons(port); + + sigemptyset(&sigset); + sigaddset(&sigset, SIGIO); + sigaddset(&sigset, SIGALRM); + sigprocmask(SIG_BLOCK, &sigset, 0); if(connect(rlogin_socket, (struct sockaddr *)&saddr, sizeof(saddr))) { char str[LIST_ADDR_MAX+20]; + sigprocmask(SIG_UNBLOCK, &sigset, 0); + rlogin_close(); sprintf(str,"Cannot connect to %s!",addr); uifcmsg(str, "`Unable to connect`\n\n" "Cannot connect to the remost system... it is down or unreachable."); return(-1); } + sigprocmask(SIG_UNBLOCK, &sigset, 0); fcntl(rlogin_socket, F_SETFL, fcntl(rlogin_socket, F_GETFL)|O_NONBLOCK); - rlogin_send("",1,1000); - rlogin_send(passwd,strlen(passwd)+1,1000); - rlogin_send(ruser,strlen(ruser)+1,1000); - rlogin_send("ansi-bbs/9600",14,1000); + if(!bedumb) { + rlogin_send("",1,1000); + rlogin_send(passwd,strlen(passwd)+1,1000); + rlogin_send(ruser,strlen(ruser)+1,1000); + rlogin_send("ansi-bbs/9600",14,1000); + } return(0); } diff --git a/src/syncterm/rlogin.h b/src/syncterm/rlogin.h index 8f8d9940d38e3cfacae3137ff44fac2c9581dae3..3375654803b890e96a13f950cd6a0d4beef1af82 100644 --- a/src/syncterm/rlogin.h +++ b/src/syncterm/rlogin.h @@ -7,7 +7,7 @@ extern SOCKET rlogin_socket; int rlogin_recv(char *buffer, size_t buflen); int rlogin_send(char *buffer, size_t buflen, unsigned int timeout); -int rlogin_connect(char *addr, int port, char *ruser, char *passwd); +int rlogin_connect(char *addr, int port, char *ruser, char *passwd, int dumb); int rlogin_close(void); #endif diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c index b5563a642eb8e5c67c0f8f67651d200140f52998..011791de3e4bde6e8b01eb600d92136e56011beb 100644 --- a/src/syncterm/syncterm.c +++ b/src/syncterm/syncterm.c @@ -49,7 +49,7 @@ int main(int argc, char **argv) atexit(uifcbail); while((bbs=show_bbslist(BBSLIST_SELECT))!=NULL) { - if(!rlogin_connect(bbs->addr,bbs->port,bbs->user,bbs->password)) { + if(!rlogin_connect(bbs->addr,bbs->port,bbs->user,bbs->password,bbs->dumb)) { /* ToDo: Update the entry with new lastconnected */ /* ToDo: Disallow duplicate entries */ uifcbail();