Skip to content
Snippets Groups Projects
Commit 0cdffdea authored by deuce's avatar deuce
Browse files

* Block SIGALRM and SIGIO during connect()

* Support "Be Dumb" mode which does NOT send the RLogin initial sequence.
  This is handy for connecting to BBSs which support "dumb" telnet.
  this is *NOT* telnet!  0xff is treated as a normal character.  As a result,
  do NOT be surprised at garbage characters.
parent d3788fb9
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
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)
......
......@@ -24,6 +24,7 @@ struct bbslist {
char password[MAX_PASSWD_LEN+1];
int type;
int id;
int dumb;
};
struct bbslist *show_bbslist(int mode);
......
......@@ -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);
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);
}
......
......@@ -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
......@@ -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();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment