diff --git a/src/syncterm/bbslist.c b/src/syncterm/bbslist.c index cb6d8a6474455ea8f7a0bef2470ef8e16990537f..95b622d19ca47411287d589de7b1626d9911e5ae 100644 --- a/src/syncterm/bbslist.c +++ b/src/syncterm/bbslist.c @@ -153,6 +153,12 @@ struct sort_order_info sort_order[] = { ,offsetof(struct bbslist, music) ,sizeof(((struct bbslist *)NULL)->music) } + ,{ + "Address Family" + ,0 + ,offsetof(struct bbslist, address_family) + ,sizeof(((struct bbslist *)NULL)->address_family) + } ,{ "Font" ,SORT_ORDER_STRING @@ -179,6 +185,14 @@ char *rate_names[]={"300", "600", "1200", "2400", "4800", "9600", "19200", "3840 int rates[]={300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200, 0}; char *music_names[]={"ESC [ | only", "BANSI Style", "All ANSI Music enabled", NULL}; +char *address_families[]={"PerDNS", "IPv4", "IPv6", NULL}; +char *address_family_names[]={"As per DNS", "IPv4 only", "IPv6 only", NULL}; + +char *address_family_help = "`Address Family`\n\n" + "Select the address family to resolve\n\n" + "`As per DNS`..: Uses what is in the DNS system\n" + "`IPv4 only`...: Only uses IPv4 addresses.\n" + "`IPv6 only`...: Only uses IPv6 addresses.\n"; char *address_help= #ifdef __unix__ @@ -644,6 +658,7 @@ void read_item(str_list_t listfile, struct bbslist *entry, char *bbsname, int id entry->bpsrate=iniGetInteger(section,NULL,"BPSRate",0); entry->music=iniGetInteger(section,NULL,"ANSIMusic",CTERM_MUSIC_BANSI); + entry->address_family=iniGetEnum(section,NULL,"AddressFamily",address_families, ADDRESS_FAMILY_UNSPEC); iniGetString(section,NULL,"Font","Codepage 437 English",entry->font); entry->type=type; entry->id=id; @@ -730,8 +745,8 @@ void read_list(char *listpath, struct bbslist **list, struct bbslist *defaults, int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isdefault) { - char opt[19][80]; /* <- Beware of magic number! */ - char *opts[20]; /* <- Beware of magic number! */ + char opt[20][80]; /* <- Beware of magic number! */ + char *opts[(sizeof(opt)/sizeof(opt[0]))+1]; int changed=0; int copt=0,i,j; int bar=0; @@ -742,7 +757,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd char *itemname; char *YesNo[3]={"Yes","No",""}; - for(i=0;i<19;i++) /* <- Beware of magic number! */ + for(i=0;i<sizeof(opt)/sizeof(opt[0]);i++) opts[i]=opt[i]; if(item->type==SYSTEM_BBSLIST) { uifc.helpbuf= "`Copy from system directory`\n\n" @@ -805,6 +820,7 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd strcpy(str,"Current"); sprintf(opt[i++], "Comm Rate %s",str); sprintf(opt[i++], "ANSI Music %s",music_names[item->music]); + sprintf(opt[i++], "Address Family %s",address_family_names[item->address_family]); sprintf(opt[i++], "Font %s",item->font); opt[i][0]=0; uifc.changes=0; @@ -1087,6 +1103,15 @@ int edit_list(struct bbslist **list, struct bbslist *item,char *listpath,int isd } break; case 17: + uifc.helpbuf=address_family_help; + i=item->address_family; + if(uifc.list(WIN_SAV, 0, 0, 0, &i, NULL, "Address Family", address_family_names)!=-1) { + item->address_family=i; + iniSetEnum(&inifile, itemname, "AddressFamily", address_families, item->address_family, &ini_style); + changed=1; + } + break; + case 18: uifc.helpbuf= "`Font`\n\n" "Select the desired font for this connection.\n\n" "Some fonts do not allow some modes. When this is the case, an\n" @@ -1146,6 +1171,7 @@ void add_bbs(char *listpath, struct bbslist *bbs) iniSetBool(&inifile,bbs->name,"AppendLogFile",bbs->append_logfile,&ini_style); iniSetInteger(&inifile,bbs->name,"BPSRate",bbs->bpsrate,&ini_style); iniSetInteger(&inifile,bbs->name,"ANSIMusic",bbs->music,&ini_style); + iniSetEnum(&inifile, bbs->name, "AddressFamily", address_families, bbs->address_family, &ini_style); iniSetString(&inifile,bbs->name,"Font",bbs->font,&ini_style); if((listfile=fopen(listpath,"w"))!=NULL) { iniWriteFile(listfile,inifile); diff --git a/src/syncterm/bbslist.h b/src/syncterm/bbslist.h index 26330497cb72980796cd8379ba88745c755772f1..f3b9f6308bd9bbcebe4c5d784eacf458416200a6 100644 --- a/src/syncterm/bbslist.h +++ b/src/syncterm/bbslist.h @@ -53,6 +53,12 @@ enum { ,SCREEN_MODE_TERMINATOR }; +enum { + ADDRESS_FAMILY_UNSPEC + ,ADDRESS_FAMILY_INET + ,ADDRESS_FAMILY_INET6 +}; + /* NOTE: changing this may require updating sort_order in bbslist.c */ struct bbslist { char name[LIST_NAME_MAX+1]; @@ -77,6 +83,7 @@ struct bbslist { int telnet_loglevel; int bpsrate; int music; + int address_family; char font[80]; }; diff --git a/src/syncterm/conn.c b/src/syncterm/conn.c index 786d12369b905480cf67a368f1d6a41f4ee05f41..226bfb20b1c6e4927ded5bd9263b4a135199a0ad 100644 --- a/src/syncterm/conn.c +++ b/src/syncterm/conn.c @@ -420,6 +420,18 @@ int conn_socket_connect(struct bbslist *bbs) uifc.pop("Looking up host"); memset(&hints, 0, sizeof(hints)); hints.ai_flags=PF_UNSPEC; + switch(bbs->address_family) { + case ADDRESS_FAMILY_INET: + hints.ai_family=PF_INET; + break; + case ADDRESS_FAMILY_INET6: + hints.ai_family=PF_INET6; + break; + case ADDRESS_FAMILY_UNSPEC: + default: + hints.ai_family=PF_UNSPEC; + break; + } hints.ai_socktype=SOCK_STREAM; hints.ai_protocol=IPPROTO_TCP; hints.ai_flags=AI_NUMERICSERV; diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c index 090c11d09db3744e90a0e7ba538b16a7766e61d0..af951294998b839614eff47ec9955acac60fd57c 100644 --- a/src/syncterm/syncterm.c +++ b/src/syncterm/syncterm.c @@ -1207,6 +1207,7 @@ int main(int argc, char **argv) int conn_type=CONN_TYPE_TELNET; int text_mode; BOOL override_conn=FALSE; + int addr_family=PF_UNSPEC; char *last_bbs=NULL; const char syncterm_termcap[]="\n# terminfo database entry for SyncTERM\n" "syncterm|SyncTERM 80x25,\n" @@ -1229,7 +1230,7 @@ int main(int argc, char **argv) " il=\\E[%p1%dL,cub=\\E[%p1%dD,cuf=\\E[%p1%dC,rin=\\E[%p1%dT,cuu=\\E[%p1%dA,\n" " rc=\\E[u,sc=\\E[s,ind=\\E[S,ri=\\E[T,setab=\\E[4%p1%dm,setaf=\\E[3%p1%dm,\n" " sgr=\\E[0%?%p1%p6%|%t;1%;%?%p4%|%t;5%;%?%p1%p3%|%t;7%;%?%p7%|%t;8%;m,\n" - " smso=\\E[0;1;7m,\n" + " smso=\\E[0;1;7m,csr=\\E[%i%p1%d;%p2%dr\n" "syncterm-25|SyncTERM No Status Line,\n" " lines#25,use=syncterm,\n" "syncterm-27|SyncTERM 80x28 With Status,\n" @@ -1301,6 +1302,12 @@ int main(int argc, char **argv) #endif ) switch(toupper(argv[i][1])) { + case '6': + addr_family=ADDRESS_FAMILY_INET6; + break; + case '4': + addr_family=ADDRESS_FAMILY_INET; + break; case 'E': uifc.esc_delay=atoi(argv[i]+2); break; @@ -1450,6 +1457,8 @@ int main(int argc, char **argv) parse_url(url, bbs, conn_type, FALSE); strListFree(&inilines); } + if(addr_family != ADDRESS_FAMILY_UNSPEC) + bbs->address_family=addr_family; if(bbs->port==0) goto USAGE; } @@ -1599,6 +1608,8 @@ int main(int argc, char **argv) "-t = use telnet mode if URL does not include the scheme\n" "-r = use rlogin mode if URL does not include the scheme\n" "-h = use SSH mode if URL does not include the scheme\n" + "-4 = Only resolve IPv4 addresses\n" + "-6 = Only resolve IPv6 addresses\n" "-s = enable \"Safe Mode\" which prevents writing/browsing local files\n" "-T = when the ONLY argument, dumps the terminfo entry to stdout and exits\n" "\n"