--- sbbs/sbbs2/scfg/scfg.c 2018/04/24 16:37:52 1.1 +++ sbbs/sbbs2/scfg/scfg.c 2018/04/24 16:39:25 1.1.1.2 @@ -1,1967 +1,1967 @@ -#line 2 "SCFG.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/****************************************************************************/ -/* Synchronet configuration utility */ -/****************************************************************************/ - -#include "scfg.h" - -#ifdef __FLAT__ - unsigned _stklen=64000; -#else - unsigned _stklen=32000; -#endif - -extern char *wday[]; /* names of weekdays (3 char) */ -extern char uifc_status; - -/********************/ -/* Global Variables */ -/********************/ - -long freedosmem; -int no_dirchk=0,no_msghdr=0,forcesave=0,all_msghdr=0; -char **opt; -char tmp[256]; -char *nulstr=""; -char **mdm_type; -char **mdm_file; -int mdm_types; -int backup_level=3; - -read_cfg_text_t txt={ - "\7\r\nError opening %s for read.\r\n", - "","", - "\7\r\nError allocating %u bytes of memory\r\n", - "\7\r\nERROR: Offset %lu in %s\r\n\r\n" }; - -char *invalid_code= -"Invalid Internal Code:\n\n" -"Internal codes can be up to eight characters in length and can only\n" -"contain valid DOS filename characters. The code you have entered\n" -"contains one or more invalid characters."; - -char *num_flags= -"Number of Flags Needed:\n\n" -"If you want users to be required to have all the flags, select All.\n" -"\n" -"If you want users to be required to have any one or more of the flags,\n" -"select One (Allowed)."; - - -void allocfail(uint size) -{ -cprintf("\7Error allocating %u bytes of memory.\r\n",size); -bail(1); -} - -time_t checktime(void) -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - -int main(int argc, char **argv) -{ - char **mopt,*p; - int i,j,main_dflt=0,no_emsovl=0,chat_dflt=0; - uint u; - long l; - char str[129]; - FILE *instream; -#ifndef __FLAT__ - union REGS reg; -#endif - -printf("\r\nSynchronet Configuration Util (%s) v%s%c Developed 1995-1997 " - "Rob Swindell\r\n", -#ifdef __OS2__ - "OS/2" -#elif defined(__FLAT__) - "DOS/Win32" -#else - "DOS" -#endif - ,VERSION,REVISION); - -if(argc>1) - strcpy(ctrl_dir,argv[1]); -else - getcwd(ctrl_dir,MAXDIR); -if(argc>2) { - for(i=2;i [/c] [/m] [/n] [/s] [/u] [/h] " - "[/t#] [/b#]\r\n" - "\r\n" - "/c = force color mode\r\n" - "/m = show free memory\r\n" - "/n = don't use EMS\r\n" - "/s = don't check directories\r\n" - "/f = force save of config files\r\n" - "/u = update all message base status headers\r\n" - "/h = don't update message base status headers\r\n" - "/t# = set supported time slice APIs to #\r\n" - "/b# = set automatic back-up level (default=3 max=10)\r\n" - ); - exit(0); } } } - -if(backup_level>10) backup_level=10; - -if(ctrl_dir[strlen(ctrl_dir)-1]!='\\' && ctrl_dir[strlen(ctrl_dir)-1]!=':') - strcat(ctrl_dir,"\\"); - -init_mdms(); - -uifcini(); - -#if !defined(__FLAT__) -if(!no_emsovl) { - cputs("\r\nEMS: "); - if((i=open("EMMXXXX0",O_RDONLY))==-1) - cputs("not installed."); - else { - close(i); - reg.h.ah=0x46; /* Get EMS version */ - int86(0x67,®,®); - if(reg.h.ah) - cputs("\7error getting version."); - else { - cprintf("Version %u.%u ",(reg.h.al&0xf0)>>4,reg.h.al&0xf); - if(_OvrInitEms(0,0,23)) /* use up to 360K */ - cprintf("allocation failed."); } } - cputs("\r\n"); } -#endif - -#ifdef __FLAT__ -if(putenv("TZ=UCT0")) - printf("putenv() failed!\n"); -tzset(); -#endif - -if((l=checktime())!=0) { /* Check binary time */ - printf("Time problem (%08lx)\n",l); - exit(1); } - -if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL) - allocfail(sizeof(char *)*(MAX_OPTS+1)); -for(i=0;i<(MAX_OPTS+1);i++) - if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL) - allocfail(MAX_OPLN); - -if((mopt=(char **)MALLOC(sizeof(char *)*14))==NULL) - allocfail(sizeof(char *)*14); -for(i=0;i<14;i++) - if((mopt[i]=(char *)MALLOC(64))==NULL) - allocfail(64); - -txt.reading=nulstr; -txt.readit=nulstr; - -strcpy(str,argv[0]); -p=strrchr(str,'\\'); -if(!p) { - sprintf(helpdatfile,"..\\EXEC\\SCFGHELP.DAT"); - sprintf(helpixbfile,"..\\EXEC\\SCFGHELP.IXB"); } -else { - *p=0; - sprintf(helpdatfile,"%s\\SCFGHELP.DAT",str); - sprintf(helpixbfile,"%s\\SCFGHELP.IXB",str); } - -sprintf(str,"Synchronet Configuration for %s v%s", -#if defined(__OS2__) - "OS/2" -#elif defined(__FLAT__) - "DOS/Win32" -#else - "DOS" -#endif - ,VERSION); -if(uscrn(str)) { - cprintf("USCRN failed!\r\n"); - bail(1); } -i=0; -strcpy(mopt[i++],"Nodes"); -strcpy(mopt[i++],"System"); -strcpy(mopt[i++],"Networks"); -strcpy(mopt[i++],"File Areas"); -strcpy(mopt[i++],"File Options"); -strcpy(mopt[i++],"Chat Features"); -strcpy(mopt[i++],"Message Areas"); -strcpy(mopt[i++],"Message Options"); -strcpy(mopt[i++],"Command Shells"); -strcpy(mopt[i++],"External Programs"); -strcpy(mopt[i++],"Text File Sections"); -mopt[i][0]=0; -#ifndef __FLAT__ -freedosmem=farcoreleft(); -#endif -while(1) { -#if 0 - if(freedosmem!=farcoreleft()) { - errormsg(WHERE,ERR_CHK,"lost memory",freedosmem-farcoreleft()); - freedosmem=farcoreleft(); } -#endif - SETHELP(WHERE); -/* -Main Configuration Menu: - -This is the main menu of the Synchronet configuration utility (SCFG). -From this menu, you have the following choices: - - Nodes : Add, delete, or configure nodes - System : System-wide configuration options - Networks : Message networking configuration - File Areas : File area configuration - File Options : File area options - Chat Features : Chat actions, sections, pagers, and gurus - Message Areas : Message area configuration - Message Options : Message and email options - External Programs : Events, editors, and online programs - Text File Sections : General text file area - -Use the arrow keys and  ENTER  to select an option, or  ESC  to exit. -*/ - switch(ulist(WIN_ORG|WIN_MID|WIN_ESC|WIN_ACT,0,0,30,&main_dflt,0 - ,"Configure",mopt)) { - case 0: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop(0); - node_menu(); - free_main_cfg(); - break; - case 1: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading XTRN.CNF..."); - read_xtrn_cfg(txt); - upop(0); - sys_cfg(); - free_xtrn_cfg(); - free_main_cfg(); - break; - case 2: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading MSGS.CNF..."); - read_msgs_cfg(txt); - upop(0); - net_cfg(); - free_msgs_cfg(); - free_main_cfg(); - break; - case 3: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading FILE.CNF..."); - read_file_cfg(txt); - upop(0); - xfer_cfg(); - free_file_cfg(); - free_main_cfg(); - break; - case 4: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading FILE.CNF..."); - read_file_cfg(txt); - upop(0); - xfer_opts(); - free_file_cfg(); - free_main_cfg(); - break; - case 5: - upop("Reading CHAT.CNF..."); - read_chat_cfg(txt); - upop(0); - while(1) { - i=0; - strcpy(opt[i++],"Artificial Gurus"); - strcpy(opt[i++],"Multinode Chat Actions"); - strcpy(opt[i++],"Multinode Chat Channels"); - strcpy(opt[i++],"External Sysop Chat Pagers"); - opt[i][0]=0; - j=ulist(WIN_ORG|WIN_ACT|WIN_CHE,0,0,0,&chat_dflt,0 - ,"Chat Features",opt); - if(j==-1) { - j=save_changes(WIN_MID); - if(j==-1) - continue; - if(!j) - write_chat_cfg(); - break; } - switch(j) { - case 0: - guru_cfg(); - break; - case 1: - actsets_cfg(); - break; - case 2: - chan_cfg(); - break; - case 3: - page_cfg(); - break; } } - free_chat_cfg(); - break; - case 6: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading MSGS.CNF..."); - read_msgs_cfg(txt); - upop(0); - msgs_cfg(); - free_msgs_cfg(); - free_main_cfg(); - break; - case 7: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading MSGS.CNF..."); - read_msgs_cfg(txt); - upop(0); - msg_opts(); - free_msgs_cfg(); - free_main_cfg(); - break; - case 8: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop(0); - shell_cfg(); - free_main_cfg(); - break; - case 9: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading XTRN.CNF..."); - read_xtrn_cfg(txt); - upop(0); - xprogs_cfg(); - free_xtrn_cfg(); - free_main_cfg(); - break; - case 10: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading FILE.CNF..."); - read_file_cfg(txt); - upop(0); - txt_cfg(); - free_file_cfg(); - free_main_cfg(); - break; - case -1: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Exit SCFG: - -If you want to exit the Synchronet configuration utility, select Yes. -Otherwise, select No or hit  ESC . -*/ - i=ulist(WIN_MID,0,0,0,&i,0,"Exit SCFG",opt); - if(!i) - bail(0); - break; } } -} - -/****************************************************************************/ -/* Checks the changes variable. If there have been no changes, returns 2. */ -/* If there have been changes, it prompts the user to change or not. If the */ -/* user escapes the menu, returns -1, selects Yes, 0, and selects no, 1 */ -/****************************************************************************/ -int save_changes(int mode) -{ - int i=0; - -if(!changes) - return(2); -strcpy(opt[0],"Yes"); -strcpy(opt[1],"No"); -opt[2][0]=0; -if(mode&WIN_SAV && savdepth) - savnum++; -SETHELP(WHERE); -/* -Save Changes: - -You have made some changes to the configuration. If you want to save -these changes, select Yes. If you are positive you DO NOT want to save -these changes, select No. If you are not sure and want to review the -configuration before deciding, hit  ESC . -*/ -i=ulist(mode|WIN_ACT,0,0,0,&i,0,"Save Changes",opt); -if(mode&WIN_SAV && savdepth) - savnum--; -if(i!=-1) - changes=0; -return(i); -} - -void txt_cfg() -{ - static int txt_dflt,bar; - char str[81],code[9],done=0,*p; - int j,k; - uint i; - static txtsec_t savtxtsec; - -while(1) { - for(i=0;iname); - opt[i][0]=0; - j=WIN_ORG|WIN_ACT|WIN_CHE; - if(total_txtsecs) - j|=WIN_DEL|WIN_GET; - if(total_txtsecsi;j--) - txtsec[j]=txtsec[j-1]; - if((txtsec[i]=(txtsec_t *)MALLOC(sizeof(txtsec_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(txtsec_t)); - continue; } - memset((txtsec_t *)txtsec[i],0,sizeof(txtsec_t)); - strcpy(txtsec[i]->name,str); - strcpy(txtsec[i]->code,code); - total_txtsecs++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(txtsec[i]); - total_txtsecs--; - for(j=i;jname); - sprintf(opt[k++],"%-27.27s%s","Access Requirements" - ,txtsec[i]->ar); - sprintf(opt[k++],"%-27.27s%s","Internal Code",txtsec[i]->code); - opt[k][0]=0; - switch(ulist(WIN_ACT|WIN_MID,0,0,60,&j,0,txtsec[i]->name - ,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Text Section Name: - -This is the name of this text section. -*/ - strcpy(str,txtsec[i]->name); /* save */ - if(!uinput(WIN_MID|WIN_SAV,0,10 - ,"Text File Section Name" - ,txtsec[i]->name,40,K_EDIT)) - strcpy(txtsec[i]->name,str); - break; - case 1: - sprintf(str,"%s Text Section",txtsec[i]->name); - getar(str,txtsec[i]->ar); - break; - case 2: - strcpy(str,txtsec[i]->code); - SETHELP(WHERE); -/* -Text Section Internal Code: - -Every text file section must have its own unique internal code for -Synchronet to reference it by. It is helpful if this code is an -abreviation of the name. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)" - ,str,8,K_EDIT|K_UPPER); - if(code_ok(str)) - strcpy(txtsec[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; } } } -} - -void shell_cfg() -{ - static int shell_dflt,shell_bar; - char str[81],code[9],done=0,*p; - int j,k; - uint i; - static shell_t savshell; - -while(1) { - for(i=0;iname); - opt[i][0]=0; - j=WIN_ORG|WIN_ACT|WIN_CHE; - if(total_shells) - j|=WIN_DEL|WIN_GET; - if(total_shellsi;j--) - shell[j]=shell[j-1]; - if((shell[i]=(shell_t *)MALLOC(sizeof(shell_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(shell_t)); - continue; } - memset((shell_t *)shell[i],0,sizeof(shell_t)); - strcpy(shell[i]->name,str); - strcpy(shell[i]->code,code); - total_shells++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(shell[i]); - total_shells--; - for(j=i;jname); - sprintf(opt[k++],"%-27.27s%s","Access Requirements" - ,shell[i]->ar); - sprintf(opt[k++],"%-27.27s%s","Internal Code",shell[i]->code); - opt[k][0]=0; - SETHELP(WHERE); -/* -Command Shell: - -A command shell is a programmed command and menu structure that you or -your users can use to navigate the BBS. For every command shell -configured here, there must be an associated .BIN file in your EXEC -directory for Synchronet to execute. - -Command shell files are created by using the Baja command shell compiler -to turn Baja source code (.SRC) files into binary files (.BIN) for -Synchronet to interpret. See the example .SRC files in the TEXT -directory and the documentation for the Baja compiler for more details. -*/ - switch(ulist(WIN_ACT|WIN_MID,0,0,60,&j,0,shell[i]->name - ,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Command Shell Name: - -This is the descriptive name of this command shell. -*/ - strcpy(str,shell[i]->name); /* save */ - if(!uinput(WIN_MID|WIN_SAV,0,10 - ,"Command Shell Name" - ,shell[i]->name,40,K_EDIT)) - strcpy(shell[i]->name,str); - break; - case 1: - sprintf(str,"%s Command Shell",shell[i]->name); - getar(str,shell[i]->ar); - break; - case 2: - strcpy(str,shell[i]->code); - SETHELP(WHERE); -/* -Command Shell Internal Code: - -Every command shell must have its own unique internal code for -Synchronet to reference it by. It is helpful if this code is an -abreviation of the name. - -This code will be the base filename used to load the shell from your -EXEC directory. e.g. A shell with an internal code of MYBBS would -indicate a Baja shell file named MYBBS.BIN in your EXEC directory. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)" - ,str,8,K_EDIT|K_UPPER); - if(code_ok(str)) - strcpy(shell[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; } } } -} - -/****************************************************************************/ -/* Deletes all files in dir 'path' that match file spec 'spec' */ -/****************************************************************************/ -int delfiles(char *inpath, char *spec) -{ - char str[256],path[128],done,c; - int files=0; - struct ffblk ff; - -strcpy(path,inpath); -c=strlen(path); -if(path[c-1]!='\\' && path[c-1]!=':') - strcat(path,"\\"); -sprintf(str,"%s%s",path,spec); -done=findfirst(str,&ff,0); -while(!done) { - sprintf(str,"%s%s",path,ff.ff_name); - if(remove(str)) - errormsg(WHERE,ERR_REMOVE,str,0); - else - files++; - done=findnext(&ff); } -return(files); -} - -int whichlogic() -{ - int i; - -i=0; -strcpy(opt[0],"Greater than or Equal"); -strcpy(opt[1],"Equal"); -strcpy(opt[2],"Not Equal"); -strcpy(opt[3],"Less than"); -opt[4][0]=0; -if(savdepth) - savnum++; -SETHELP(WHERE); -/* -Select Logic for Requirement: - -This menu allows you to choose the type of logic evaluation to use -in determining if the requirement is met. If, for example, the user's -level is being evaluated and you select Greater than or Equal from -this menu and set the required level to 50, the user must have level -50 or higher to meet this requirement. If you selected Equal from -this menu and set the required level to 50, the user must have level -50 exactly. If you select Not equal and level 50, then the user -must have any level BUT 50. And if you select Less than from this -menu and level 50, the user must have a level below 50. -*/ -i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Select Logic",opt); -if(savdepth) - savnum--; -return(i); -} - -int whichcond() -{ - int i; - -i=0; -strcpy(opt[0],"AND (Both/All)"); -strcpy(opt[1],"OR (Either/Any)"); -opt[2][0]=0; -if(savdepth) - savnum++; -SETHELP(WHERE); -/* -Select Logic for Multiple Requirements: - -If you wish this new parameter to be required along with the other -parameters, select AND to specify that both or all of the -parameter requirments must be met. - -If you wish this new parameter to only be required if the other -parameter requirements aren't met, select OR to specify that either -or any of the parameter requirements must be met. -*/ -i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Multiple Requirement Logic",opt); -if(savdepth) - savnum--; -return(i); -} - - -void getar(char *desc, char *inar) -{ - static int curar; - char str[128],ar[128]; - int i,j,len,done=0,n; - -strcpy(ar,inar); -while(!done) { - len=strlen(ar); - if(len>=30) { /* Needs to be shortened */ - str[0]=0; - n=strlen(ar); - for(i=0;i=30) { - str[0]=0; - n=strlen(ar); - for(i=0;i=30) { - str[0]=0; - n=strlen(ar); - for(i=0;i=30) { /* change week days to numbers */ - str[0]=0; - n=strlen(ar); - for(i=0;i=30) { /* Shorten parameters */ - str[0]=0; - n=strlen(ar); - for(i=0;i=30) { /* Remove all spaces and &s */ - str[0]=0; - n=strlen(ar); - for(i=0;i=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Level: - -You are being prompted to enter the security level to be used in this -requirement evaluation. The valid range is 0 (zero) through 99. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Level",str,2,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"LEVEL "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 3: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - - for(i=0;i<4;i++) - sprintf(opt[i],"Flag Set #%d",i+1); - opt[i][0]=0; - i=0; - if(savdepth) - savnum++; - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Select Flag Set",opt); - if(savdepth) - savnum--; - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Flag: - -You are being prompted to enter the security flag to be used in this -requirement evaluation. The valid range is A through Z. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Flag (A-Z)",str,1 - ,K_UPPER|K_ALPHA); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"FLAG "); - if(i) - strcat(ar,itoa(i+1,tmp,10)); - strcat(ar,str); - break; - case 4: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Age: - -You are being prompted to enter the user's age to be used in this -requirement evaluation. The valid range is 0 through 255. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Age",str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"AGE "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 5: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - str[0]=0; - SETHELP(WHERE); -/* -Required Sex: - -You are being prompted to enter the user's gender to be used in this -requirement evaluation. The valid values are M or F (for male or -female). -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Sex (M or F)",str,1 - ,K_UPPER|K_ALPHA); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"SEX "); - strcat(ar,str); - break; - case 6: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Connect Rate (BPS): - -You are being prompted to enter the connect rate to be used in this -requirement evaluation. The valid range is 300 through 57600. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Connect Rate (BPS)",str,5,K_NUMBER); - if(!str[0]) - break; - j=atoi(str); - if(j>=300 && j<30000) { - j/=100; - sprintf(str,"%d",j); } - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"BPS "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 7: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Post/Call Ratio: - -You are being prompted to enter the post/call ratio to be used in this -requirement evaluation (percentage). The valid range is 0 through 100. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Post/Call Ratio (Percentage)" - ,str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"PCR "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 8: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Number of Credits: - -You are being prompted to enter the number of credits (in kilobytes) to -be used in this requirement evaluation. The valid range is 0 through -65535. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Required Credits",str,5,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"CREDIT "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 9: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Upload/Download Ratio: - -You are being prompted to enter the upload/download ratio to be used in -this requirement evaluation (percentage). The valid range is 0 through -100. This ratio is based on the number of bytes uploaded by the user -divided by the number of bytes downloaded. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Upload/Download Ratio (Percentage)" - ,str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"UDR "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 10: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Upload/Download File Ratio: - -You are being prompted to enter the upload/download ratio to be used in -this requirement evaluation (percentage). The valid range is 0 through -100. This ratio is based on the number of files uploaded by the user -divided by the number of files downloaded. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Upload/Download File Ratio (Percentage)" - ,str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"UDFR "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 11: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=0; - strcpy(opt[0],"Before"); - strcpy(opt[1],"After"); - opt[2][0]=0; - if(savdepth) - savnum++; - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Time Relationship",opt); - if(savdepth) - savnum--; - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Time of Day: - -You are being prompted to enter the time of day to be used in this -requirement evaluation (24 hour HH:MM format). The valid range is 0 -through 23:59. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Time of Day (HH:MM)",str,5,K_UPPER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"TIME "); - if(!i) - strcat(ar,"NOT "); - strcat(ar,str); - break; - case 12: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - SETHELP(WHERE); -/* -Required Day of Week: - -You are being prompted to select a day of the week as an access -requirement value. -*/ - for(n=0;n<7;n++) - strcpy(opt[n],wday[n]); - opt[n][0]=0; - n=0; - if(savdepth) - savnum++; - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0,"Select Day of Week",opt); - if(savdepth) - savnum--; - if(n==-1) - break; - strcpy(str,wday[n]); - strupr(str); - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"DAY "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 13: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Node: - -You are being prompted to enter the number of a node to be used in this -requirement evaluation. The valid range is 1 through 250. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Node Number",str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"NODE "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 14: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required User Number: - -You are being prompted to enter the user's number to be used in this -requirement evaluation. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"User Number",str,5,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"USER "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - - case 15: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Time Remaining: - -You are being prompted to enter the time remaining to be used in this -requirement evaluation (in minutes). The valid range is 0 through 255. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Time Remaining (minutes)" - ,str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"TLEFT "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - - case 16: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Days Till User Account Expiration: - -You are being prompted to enter the required number of days till the -user's account will expire. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Days Till Expiration" - ,str,5,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"EXPIRE "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - } } -sprintf(inar,"%.*s",LEN_ARSTR,ar); -} - -char code_ok(char *str) -{ - -if(!strlen(str)) - return(0); -if(strcspn(str," \\/.|<>*?+[]:=\";,")!=strlen(str)) - return(0); -return(1); -} - -/****************************************************************************/ -/* Functions from MISC.C */ -/****************************************************************************/ - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - int file,share,count=0; - -if(access==O_RDONLY) share=O_DENYWRITE; - else share=O_DENYALL; -while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1) - && errno==EACCES && count++>6&1)*9+val*16; -return(val); -} - -/****************************************************************************/ -/* Returns in 'string' a character representation of the number in l with */ -/* commas. Maximum value of l is 4 gigabytes. */ -/****************************************************************************/ -char *ultoac(ulong l, char *string) -{ - char str[81]; - char i,j; - -ultoa(l,str,10); -if(!(strlen(str)%3)) i=(strlen(str)/3)-1; - else i=strlen(str)/3; -j=strlen(str)+i; -string[j--]=0; -i=strlen(str)-1; -while(i!=-1) { - if(!((strlen(str)-i)%3)) { - string[j--]=str[i--]; - string[j--]=','; } - else string[j--]=str[i--]; } -return(string); -} - -/****************************************************************************/ -/* If the directory 'path' doesn't exist, create it. */ -/****************************************************************************/ -void md(char *inpath) -{ - char path[256],str[128]; - struct ffblk ff; - int curdisk,disk; - -if(!inpath[0] || no_dirchk) - return; -if(!strcmp(inpath+1,":\\")) { - curdisk=getdisk(); - disk=toupper(inpath[0])-'A'; - setdisk(disk); - if(getdisk()!=disk) { - sprintf(str,"Invalid drive %c:",toupper(inpath[0])); - umsg(str); } - setdisk(curdisk); - return; } -strcpy(path,inpath); -if(path[strlen(path)-1]=='\\') - path[strlen(path)-1]=0; -if(!strcmp(path,".")) /* Don't try to make '.' */ - return; -if(findfirst(path,&ff,FA_DIREC)) - if(mkdir(path)) { - sprintf(str,"Failed to create %s",path); - umsg(str); } -} - - -void bail(int code) -{ - char str[256]; - int i,x; - smbstatus_t status; - -if(code) { - cputs("\r\nHit a key..."); - getch(); } -else if(forcesave) { - upop("Loading Configs..."); - read_main_cfg(txt); - read_msgs_cfg(txt); - read_file_cfg(txt); - read_chat_cfg(txt); - read_xtrn_cfg(txt); - upop(0); - write_main_cfg(); - write_msgs_cfg(); - write_file_cfg(); - write_chat_cfg(); - write_xtrn_cfg(); } - -uifcbail(); - -exit(code); -} - -/****************************************************************************/ -/* Error handling routine. Prints to local and remote screens the error */ -/* information, function, action, object and access and then attempts to */ -/* write the error information into the file ERROR.LOG in the text dir. */ -/****************************************************************************/ -void errormsg(int line, char *source, char action, char *object, ulong access) -{ - char scrn_buf[8000]; - char actstr[256]; - -gettext(1,1,80,scrn_len,scrn_buf); -clrscr(); -switch(action) { - case ERR_OPEN: - strcpy(actstr,"opening"); - break; - case ERR_CLOSE: - strcpy(actstr,"closeing"); - break; - case ERR_FDOPEN: - strcpy(actstr,"fdopen"); - break; - case ERR_READ: - strcpy(actstr,"reading"); - break; - case ERR_WRITE: - strcpy(actstr,"writing"); - break; - case ERR_REMOVE: - strcpy(actstr,"removing"); - break; - case ERR_ALLOC: - strcpy(actstr,"allocating memory"); - break; - case ERR_CHK: - strcpy(actstr,"checking"); - break; - case ERR_LEN: - strcpy(actstr,"checking length"); - break; - case ERR_EXEC: - strcpy(actstr,"executing"); - break; - default: - strcpy(actstr,"UNKNOWN"); } -cprintf("ERROR - line: %d\r\n",line); -cprintf(" file: %s\r\n",source); -cprintf(" action: %s\r\n",actstr); -cprintf(" object: %s\r\n",object); -cprintf(" access: %ld (%lx)\r\n",access,access); -cputs("\r\n"); -getch(); -puttext(1,1,80,scrn_len,scrn_buf); -} - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/* Called from upload */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(1); -return(0); -} - -/* End of SCFG.C */ +#line 2 "SCFG.C" + +/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ + +/****************************************************************************/ +/* Synchronet configuration utility */ +/****************************************************************************/ + +#include "scfg.h" + +#ifdef __FLAT__ + unsigned _stklen=64000; +#else + unsigned _stklen=32000; +#endif + +extern char *wday[]; /* names of weekdays (3 char) */ +extern char uifc_status; + +/********************/ +/* Global Variables */ +/********************/ + +long freedosmem; +int no_dirchk=0,no_msghdr=0,forcesave=0,all_msghdr=0; +char **opt; +char tmp[256]; +char *nulstr=""; +char **mdm_type; +char **mdm_file; +int mdm_types; +int backup_level=3; + +read_cfg_text_t txt={ + "\7\r\nError opening %s for read.\r\n", + "","", + "\7\r\nError allocating %u bytes of memory\r\n", + "\7\r\nERROR: Offset %lu in %s\r\n\r\n" }; + +char *invalid_code= +"Invalid Internal Code:\n\n" +"Internal codes can be up to eight characters in length and can only\n" +"contain valid DOS filename characters. The code you have entered\n" +"contains one or more invalid characters."; + +char *num_flags= +"Number of Flags Needed:\n\n" +"If you want users to be required to have all the flags, select All.\n" +"\n" +"If you want users to be required to have any one or more of the flags,\n" +"select One (Allowed)."; + + +void allocfail(uint size) +{ +cprintf("\7Error allocating %u bytes of memory.\r\n",size); +bail(1); +} + +time_t checktime(void) +{ + struct tm tm; + +memset(&tm,0,sizeof(tm)); +tm.tm_year=94; +tm.tm_mday=1; +return(mktime(&tm)^0x2D24BD00L); +} + +int main(int argc, char **argv) +{ + char **mopt,*p; + int i,j,main_dflt=0,no_emsovl=0,chat_dflt=0; + uint u; + long l; + char str[129]; + FILE *instream; +#ifndef __FLAT__ + union REGS reg; +#endif + +printf("\r\nSynchronet Configuration Util (%s) v%s%c Developed 1995-1997 " + "Rob Swindell\r\n", +#ifdef __OS2__ + "OS/2" +#elif defined(__FLAT__) + "DOS/Win32" +#else + "DOS" +#endif + ,VERSION,REVISION); + +if(argc>1) + strcpy(ctrl_dir,argv[1]); +else + getcwd(ctrl_dir,MAXDIR); +if(argc>2) { + for(i=2;i [/c] [/m] [/n] [/s] [/u] [/h] " + "[/t#] [/b#]\r\n" + "\r\n" + "/c = force color mode\r\n" + "/m = show free memory\r\n" + "/n = don't use EMS\r\n" + "/s = don't check directories\r\n" + "/f = force save of config files\r\n" + "/u = update all message base status headers\r\n" + "/h = don't update message base status headers\r\n" + "/t# = set supported time slice APIs to #\r\n" + "/b# = set automatic back-up level (default=3 max=10)\r\n" + ); + exit(0); } } } + +if(backup_level>10) backup_level=10; + +if(ctrl_dir[strlen(ctrl_dir)-1]!='\\' && ctrl_dir[strlen(ctrl_dir)-1]!=':') + strcat(ctrl_dir,"\\"); + +init_mdms(); + +uifcini(); + +#if !defined(__FLAT__) +if(!no_emsovl) { + cputs("\r\nEMS: "); + if((i=open("EMMXXXX0",O_RDONLY))==-1) + cputs("not installed."); + else { + close(i); + reg.h.ah=0x46; /* Get EMS version */ + int86(0x67,®,®); + if(reg.h.ah) + cputs("\7error getting version."); + else { + cprintf("Version %u.%u ",(reg.h.al&0xf0)>>4,reg.h.al&0xf); + if(_OvrInitEms(0,0,23)) /* use up to 360K */ + cprintf("allocation failed."); } } + cputs("\r\n"); } +#endif + +#ifdef __FLAT__ +if(putenv("TZ=UCT0")) + printf("putenv() failed!\n"); +tzset(); +#endif + +if((l=checktime())!=0) { /* Check binary time */ + printf("Time problem (%08lx)\n",l); + exit(1); } + +if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL) + allocfail(sizeof(char *)*(MAX_OPTS+1)); +for(i=0;i<(MAX_OPTS+1);i++) + if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL) + allocfail(MAX_OPLN); + +if((mopt=(char **)MALLOC(sizeof(char *)*14))==NULL) + allocfail(sizeof(char *)*14); +for(i=0;i<14;i++) + if((mopt[i]=(char *)MALLOC(64))==NULL) + allocfail(64); + +txt.reading=nulstr; +txt.readit=nulstr; + +strcpy(str,argv[0]); +p=strrchr(str,'\\'); +if(!p) { + sprintf(helpdatfile,"..\\EXEC\\SCFGHELP.DAT"); + sprintf(helpixbfile,"..\\EXEC\\SCFGHELP.IXB"); } +else { + *p=0; + sprintf(helpdatfile,"%s\\SCFGHELP.DAT",str); + sprintf(helpixbfile,"%s\\SCFGHELP.IXB",str); } + +sprintf(str,"Synchronet Configuration for %s v%s", +#if defined(__OS2__) + "OS/2" +#elif defined(__FLAT__) + "DOS/Win32" +#else + "DOS" +#endif + ,VERSION); +if(uscrn(str)) { + cprintf("USCRN failed!\r\n"); + bail(1); } +i=0; +strcpy(mopt[i++],"Nodes"); +strcpy(mopt[i++],"System"); +strcpy(mopt[i++],"Networks"); +strcpy(mopt[i++],"File Areas"); +strcpy(mopt[i++],"File Options"); +strcpy(mopt[i++],"Chat Features"); +strcpy(mopt[i++],"Message Areas"); +strcpy(mopt[i++],"Message Options"); +strcpy(mopt[i++],"Command Shells"); +strcpy(mopt[i++],"External Programs"); +strcpy(mopt[i++],"Text File Sections"); +mopt[i][0]=0; +#ifndef __FLAT__ +freedosmem=farcoreleft(); +#endif +while(1) { +#if 0 + if(freedosmem!=farcoreleft()) { + errormsg(WHERE,ERR_CHK,"lost memory",freedosmem-farcoreleft()); + freedosmem=farcoreleft(); } +#endif + SETHELP(WHERE); +/* +Main Configuration Menu: + +This is the main menu of the Synchronet configuration utility (SCFG). +From this menu, you have the following choices: + + Nodes : Add, delete, or configure nodes + System : System-wide configuration options + Networks : Message networking configuration + File Areas : File area configuration + File Options : File area options + Chat Features : Chat actions, sections, pagers, and gurus + Message Areas : Message area configuration + Message Options : Message and email options + External Programs : Events, editors, and online programs + Text File Sections : General text file area + +Use the arrow keys and  ENTER  to select an option, or  ESC  to exit. +*/ + switch(ulist(WIN_ORG|WIN_MID|WIN_ESC|WIN_ACT,0,0,30,&main_dflt,0 + ,"Configure",mopt)) { + case 0: + upop("Reading MAIN.CNF..."); + read_main_cfg(txt); + upop(0); + node_menu(); + free_main_cfg(); + break; + case 1: + upop("Reading MAIN.CNF..."); + read_main_cfg(txt); + upop("Reading XTRN.CNF..."); + read_xtrn_cfg(txt); + upop(0); + sys_cfg(); + free_xtrn_cfg(); + free_main_cfg(); + break; + case 2: + upop("Reading MAIN.CNF..."); + read_main_cfg(txt); + upop("Reading MSGS.CNF..."); + read_msgs_cfg(txt); + upop(0); + net_cfg(); + free_msgs_cfg(); + free_main_cfg(); + break; + case 3: + upop("Reading MAIN.CNF..."); + read_main_cfg(txt); + upop("Reading FILE.CNF..."); + read_file_cfg(txt); + upop(0); + xfer_cfg(); + free_file_cfg(); + free_main_cfg(); + break; + case 4: + upop("Reading MAIN.CNF..."); + read_main_cfg(txt); + upop("Reading FILE.CNF..."); + read_file_cfg(txt); + upop(0); + xfer_opts(); + free_file_cfg(); + free_main_cfg(); + break; + case 5: + upop("Reading CHAT.CNF..."); + read_chat_cfg(txt); + upop(0); + while(1) { + i=0; + strcpy(opt[i++],"Artificial Gurus"); + strcpy(opt[i++],"Multinode Chat Actions"); + strcpy(opt[i++],"Multinode Chat Channels"); + strcpy(opt[i++],"External Sysop Chat Pagers"); + opt[i][0]=0; + j=ulist(WIN_ORG|WIN_ACT|WIN_CHE,0,0,0,&chat_dflt,0 + ,"Chat Features",opt); + if(j==-1) { + j=save_changes(WIN_MID); + if(j==-1) + continue; + if(!j) + write_chat_cfg(); + break; } + switch(j) { + case 0: + guru_cfg(); + break; + case 1: + actsets_cfg(); + break; + case 2: + chan_cfg(); + break; + case 3: + page_cfg(); + break; } } + free_chat_cfg(); + break; + case 6: + upop("Reading MAIN.CNF..."); + read_main_cfg(txt); + upop("Reading MSGS.CNF..."); + read_msgs_cfg(txt); + upop(0); + msgs_cfg(); + free_msgs_cfg(); + free_main_cfg(); + break; + case 7: + upop("Reading MAIN.CNF..."); + read_main_cfg(txt); + upop("Reading MSGS.CNF..."); + read_msgs_cfg(txt); + upop(0); + msg_opts(); + free_msgs_cfg(); + free_main_cfg(); + break; + case 8: + upop("Reading MAIN.CNF..."); + read_main_cfg(txt); + upop(0); + shell_cfg(); + free_main_cfg(); + break; + case 9: + upop("Reading MAIN.CNF..."); + read_main_cfg(txt); + upop("Reading XTRN.CNF..."); + read_xtrn_cfg(txt); + upop(0); + xprogs_cfg(); + free_xtrn_cfg(); + free_main_cfg(); + break; + case 10: + upop("Reading MAIN.CNF..."); + read_main_cfg(txt); + upop("Reading FILE.CNF..."); + read_file_cfg(txt); + upop(0); + txt_cfg(); + free_file_cfg(); + free_main_cfg(); + break; + case -1: + i=0; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + SETHELP(WHERE); +/* +Exit SCFG: + +If you want to exit the Synchronet configuration utility, select Yes. +Otherwise, select No or hit  ESC . +*/ + i=ulist(WIN_MID,0,0,0,&i,0,"Exit SCFG",opt); + if(!i) + bail(0); + break; } } +} + +/****************************************************************************/ +/* Checks the changes variable. If there have been no changes, returns 2. */ +/* If there have been changes, it prompts the user to change or not. If the */ +/* user escapes the menu, returns -1, selects Yes, 0, and selects no, 1 */ +/****************************************************************************/ +int save_changes(int mode) +{ + int i=0; + +if(!changes) + return(2); +strcpy(opt[0],"Yes"); +strcpy(opt[1],"No"); +opt[2][0]=0; +if(mode&WIN_SAV && savdepth) + savnum++; +SETHELP(WHERE); +/* +Save Changes: + +You have made some changes to the configuration. If you want to save +these changes, select Yes. If you are positive you DO NOT want to save +these changes, select No. If you are not sure and want to review the +configuration before deciding, hit  ESC . +*/ +i=ulist(mode|WIN_ACT,0,0,0,&i,0,"Save Changes",opt); +if(mode&WIN_SAV && savdepth) + savnum--; +if(i!=-1) + changes=0; +return(i); +} + +void txt_cfg() +{ + static int txt_dflt,bar; + char str[81],code[9],done=0,*p; + int j,k; + uint i; + static txtsec_t savtxtsec; + +while(1) { + for(i=0;iname); + opt[i][0]=0; + j=WIN_ORG|WIN_ACT|WIN_CHE; + if(total_txtsecs) + j|=WIN_DEL|WIN_GET; + if(total_txtsecsi;j--) + txtsec[j]=txtsec[j-1]; + if((txtsec[i]=(txtsec_t *)MALLOC(sizeof(txtsec_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(txtsec_t)); + continue; } + memset((txtsec_t *)txtsec[i],0,sizeof(txtsec_t)); + strcpy(txtsec[i]->name,str); + strcpy(txtsec[i]->code,code); + total_txtsecs++; + changes=1; + continue; } + if((i&MSK_ON)==MSK_DEL) { + i&=MSK_OFF; + FREE(txtsec[i]); + total_txtsecs--; + for(j=i;jname); + sprintf(opt[k++],"%-27.27s%s","Access Requirements" + ,txtsec[i]->ar); + sprintf(opt[k++],"%-27.27s%s","Internal Code",txtsec[i]->code); + opt[k][0]=0; + switch(ulist(WIN_ACT|WIN_MID,0,0,60,&j,0,txtsec[i]->name + ,opt)) { + case -1: + done=1; + break; + case 0: + SETHELP(WHERE); +/* +Text Section Name: + +This is the name of this text section. +*/ + strcpy(str,txtsec[i]->name); /* save */ + if(!uinput(WIN_MID|WIN_SAV,0,10 + ,"Text File Section Name" + ,txtsec[i]->name,40,K_EDIT)) + strcpy(txtsec[i]->name,str); + break; + case 1: + sprintf(str,"%s Text Section",txtsec[i]->name); + getar(str,txtsec[i]->ar); + break; + case 2: + strcpy(str,txtsec[i]->code); + SETHELP(WHERE); +/* +Text Section Internal Code: + +Every text file section must have its own unique internal code for +Synchronet to reference it by. It is helpful if this code is an +abreviation of the name. +*/ + uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)" + ,str,8,K_EDIT|K_UPPER); + if(code_ok(str)) + strcpy(txtsec[i]->code,str); + else { + helpbuf=invalid_code; + umsg("Invalid Code"); + helpbuf=0; } + break; } } } +} + +void shell_cfg() +{ + static int shell_dflt,shell_bar; + char str[81],code[9],done=0,*p; + int j,k; + uint i; + static shell_t savshell; + +while(1) { + for(i=0;iname); + opt[i][0]=0; + j=WIN_ORG|WIN_ACT|WIN_CHE; + if(total_shells) + j|=WIN_DEL|WIN_GET; + if(total_shellsi;j--) + shell[j]=shell[j-1]; + if((shell[i]=(shell_t *)MALLOC(sizeof(shell_t)))==NULL) { + errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(shell_t)); + continue; } + memset((shell_t *)shell[i],0,sizeof(shell_t)); + strcpy(shell[i]->name,str); + strcpy(shell[i]->code,code); + total_shells++; + changes=1; + continue; } + if((i&MSK_ON)==MSK_DEL) { + i&=MSK_OFF; + FREE(shell[i]); + total_shells--; + for(j=i;jname); + sprintf(opt[k++],"%-27.27s%s","Access Requirements" + ,shell[i]->ar); + sprintf(opt[k++],"%-27.27s%s","Internal Code",shell[i]->code); + opt[k][0]=0; + SETHELP(WHERE); +/* +Command Shell: + +A command shell is a programmed command and menu structure that you or +your users can use to navigate the BBS. For every command shell +configured here, there must be an associated .BIN file in your EXEC +directory for Synchronet to execute. + +Command shell files are created by using the Baja command shell compiler +to turn Baja source code (.SRC) files into binary files (.BIN) for +Synchronet to interpret. See the example .SRC files in the TEXT +directory and the documentation for the Baja compiler for more details. +*/ + switch(ulist(WIN_ACT|WIN_MID,0,0,60,&j,0,shell[i]->name + ,opt)) { + case -1: + done=1; + break; + case 0: + SETHELP(WHERE); +/* +Command Shell Name: + +This is the descriptive name of this command shell. +*/ + strcpy(str,shell[i]->name); /* save */ + if(!uinput(WIN_MID|WIN_SAV,0,10 + ,"Command Shell Name" + ,shell[i]->name,40,K_EDIT)) + strcpy(shell[i]->name,str); + break; + case 1: + sprintf(str,"%s Command Shell",shell[i]->name); + getar(str,shell[i]->ar); + break; + case 2: + strcpy(str,shell[i]->code); + SETHELP(WHERE); +/* +Command Shell Internal Code: + +Every command shell must have its own unique internal code for +Synchronet to reference it by. It is helpful if this code is an +abreviation of the name. + +This code will be the base filename used to load the shell from your +EXEC directory. e.g. A shell with an internal code of MYBBS would +indicate a Baja shell file named MYBBS.BIN in your EXEC directory. +*/ + uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)" + ,str,8,K_EDIT|K_UPPER); + if(code_ok(str)) + strcpy(shell[i]->code,str); + else { + helpbuf=invalid_code; + umsg("Invalid Code"); + helpbuf=0; } + break; } } } +} + +/****************************************************************************/ +/* Deletes all files in dir 'path' that match file spec 'spec' */ +/****************************************************************************/ +int delfiles(char *inpath, char *spec) +{ + char str[256],path[128],done,c; + int files=0; + struct ffblk ff; + +strcpy(path,inpath); +c=strlen(path); +if(path[c-1]!='\\' && path[c-1]!=':') + strcat(path,"\\"); +sprintf(str,"%s%s",path,spec); +done=findfirst(str,&ff,0); +while(!done) { + sprintf(str,"%s%s",path,ff.ff_name); + if(remove(str)) + errormsg(WHERE,ERR_REMOVE,str,0); + else + files++; + done=findnext(&ff); } +return(files); +} + +int whichlogic() +{ + int i; + +i=0; +strcpy(opt[0],"Greater than or Equal"); +strcpy(opt[1],"Equal"); +strcpy(opt[2],"Not Equal"); +strcpy(opt[3],"Less than"); +opt[4][0]=0; +if(savdepth) + savnum++; +SETHELP(WHERE); +/* +Select Logic for Requirement: + +This menu allows you to choose the type of logic evaluation to use +in determining if the requirement is met. If, for example, the user's +level is being evaluated and you select Greater than or Equal from +this menu and set the required level to 50, the user must have level +50 or higher to meet this requirement. If you selected Equal from +this menu and set the required level to 50, the user must have level +50 exactly. If you select Not equal and level 50, then the user +must have any level BUT 50. And if you select Less than from this +menu and level 50, the user must have a level below 50. +*/ +i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Select Logic",opt); +if(savdepth) + savnum--; +return(i); +} + +int whichcond() +{ + int i; + +i=0; +strcpy(opt[0],"AND (Both/All)"); +strcpy(opt[1],"OR (Either/Any)"); +opt[2][0]=0; +if(savdepth) + savnum++; +SETHELP(WHERE); +/* +Select Logic for Multiple Requirements: + +If you wish this new parameter to be required along with the other +parameters, select AND to specify that both or all of the +parameter requirments must be met. + +If you wish this new parameter to only be required if the other +parameter requirements aren't met, select OR to specify that either +or any of the parameter requirements must be met. +*/ +i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Multiple Requirement Logic",opt); +if(savdepth) + savnum--; +return(i); +} + + +void getar(char *desc, char *inar) +{ + static int curar; + char str[128],ar[128]; + int i,j,len,done=0,n; + +strcpy(ar,inar); +while(!done) { + len=strlen(ar); + if(len>=30) { /* Needs to be shortened */ + str[0]=0; + n=strlen(ar); + for(i=0;i=30) { + str[0]=0; + n=strlen(ar); + for(i=0;i=30) { + str[0]=0; + n=strlen(ar); + for(i=0;i=30) { /* change week days to numbers */ + str[0]=0; + n=strlen(ar); + for(i=0;i=30) { /* Shorten parameters */ + str[0]=0; + n=strlen(ar); + for(i=0;i=30) { /* Remove all spaces and &s */ + str[0]=0; + n=strlen(ar); + for(i=0;i=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Level: + +You are being prompted to enter the security level to be used in this +requirement evaluation. The valid range is 0 (zero) through 99. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Level",str,2,K_NUMBER); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"LEVEL "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + case 3: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + + for(i=0;i<4;i++) + sprintf(opt[i],"Flag Set #%d",i+1); + opt[i][0]=0; + i=0; + if(savdepth) + savnum++; + i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Select Flag Set",opt); + if(savdepth) + savnum--; + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Flag: + +You are being prompted to enter the security flag to be used in this +requirement evaluation. The valid range is A through Z. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Flag (A-Z)",str,1 + ,K_UPPER|K_ALPHA); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"FLAG "); + if(i) + strcat(ar,itoa(i+1,tmp,10)); + strcat(ar,str); + break; + case 4: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Age: + +You are being prompted to enter the user's age to be used in this +requirement evaluation. The valid range is 0 through 255. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Age",str,3,K_NUMBER); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"AGE "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + case 5: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + str[0]=0; + SETHELP(WHERE); +/* +Required Sex: + +You are being prompted to enter the user's gender to be used in this +requirement evaluation. The valid values are M or F (for male or +female). +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Sex (M or F)",str,1 + ,K_UPPER|K_ALPHA); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"SEX "); + strcat(ar,str); + break; + case 6: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Connect Rate (BPS): + +You are being prompted to enter the connect rate to be used in this +requirement evaluation. The valid range is 300 through 57600. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Connect Rate (BPS)",str,5,K_NUMBER); + if(!str[0]) + break; + j=atoi(str); + if(j>=300 && j<30000) { + j/=100; + sprintf(str,"%d",j); } + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"BPS "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + case 7: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Post/Call Ratio: + +You are being prompted to enter the post/call ratio to be used in this +requirement evaluation (percentage). The valid range is 0 through 100. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Post/Call Ratio (Percentage)" + ,str,3,K_NUMBER); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"PCR "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + case 8: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Number of Credits: + +You are being prompted to enter the number of credits (in kilobytes) to +be used in this requirement evaluation. The valid range is 0 through +65535. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Required Credits",str,5,K_NUMBER); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"CREDIT "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + case 9: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Upload/Download Ratio: + +You are being prompted to enter the upload/download ratio to be used in +this requirement evaluation (percentage). The valid range is 0 through +100. This ratio is based on the number of bytes uploaded by the user +divided by the number of bytes downloaded. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Upload/Download Ratio (Percentage)" + ,str,3,K_NUMBER); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"UDR "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + case 10: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Upload/Download File Ratio: + +You are being prompted to enter the upload/download ratio to be used in +this requirement evaluation (percentage). The valid range is 0 through +100. This ratio is based on the number of files uploaded by the user +divided by the number of files downloaded. +*/ + uinput(WIN_MID|WIN_SAV,0,0 + ,"Upload/Download File Ratio (Percentage)" + ,str,3,K_NUMBER); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"UDFR "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + case 11: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=0; + strcpy(opt[0],"Before"); + strcpy(opt[1],"After"); + opt[2][0]=0; + if(savdepth) + savnum++; + i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Time Relationship",opt); + if(savdepth) + savnum--; + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Time of Day: + +You are being prompted to enter the time of day to be used in this +requirement evaluation (24 hour HH:MM format). The valid range is 0 +through 23:59. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Time of Day (HH:MM)",str,5,K_UPPER); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"TIME "); + if(!i) + strcat(ar,"NOT "); + strcat(ar,str); + break; + case 12: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + SETHELP(WHERE); +/* +Required Day of Week: + +You are being prompted to select a day of the week as an access +requirement value. +*/ + for(n=0;n<7;n++) + strcpy(opt[n],wday[n]); + opt[n][0]=0; + n=0; + if(savdepth) + savnum++; + n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0,"Select Day of Week",opt); + if(savdepth) + savnum--; + if(n==-1) + break; + strcpy(str,wday[n]); + strupr(str); + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"DAY "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + case 13: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Node: + +You are being prompted to enter the number of a node to be used in this +requirement evaluation. The valid range is 1 through 250. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Node Number",str,3,K_NUMBER); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"NODE "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + case 14: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required User Number: + +You are being prompted to enter the user's number to be used in this +requirement evaluation. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"User Number",str,5,K_NUMBER); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"USER "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + + case 15: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Time Remaining: + +You are being prompted to enter the time remaining to be used in this +requirement evaluation (in minutes). The valid range is 0 through 255. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Time Remaining (minutes)" + ,str,3,K_NUMBER); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"TLEFT "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + + case 16: + if(strlen(ar)>=30) { + umsg("Maximum string length reached"); + break; } + i=whichlogic(); + if(i==-1) + break; + str[0]=0; + SETHELP(WHERE); +/* +Required Days Till User Account Expiration: + +You are being prompted to enter the required number of days till the +user's account will expire. +*/ + uinput(WIN_MID|WIN_SAV,0,0,"Days Till Expiration" + ,str,5,K_NUMBER); + if(!str[0]) + break; + if(ar[0]) { + j=whichcond(); + if(j==-1) + break; + if(!j) + strcat(ar," AND "); + else + strcat(ar," OR "); } + strcat(ar,"EXPIRE "); + switch(i) { + case 1: + strcat(ar,"= "); + break; + case 2: + strcat(ar,"NOT = "); + break; + case 3: + strcat(ar,"NOT "); + break; } + strcat(ar,str); + break; + } } +sprintf(inar,"%.*s",LEN_ARSTR,ar); +} + +char code_ok(char *str) +{ + +if(!strlen(str)) + return(0); +if(strcspn(str," \\/.|<>*?+[]:=\";,")!=strlen(str)) + return(0); +return(1); +} + +/****************************************************************************/ +/* Functions from MISC.C */ +/****************************************************************************/ + +/****************************************************************************/ +/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ +/* number of times if the attempted file is already open or denying access */ +/* for some other reason. All files are opened in BINARY mode. */ +/****************************************************************************/ +int nopen(char *str, int access) +{ + int file,share,count=0; + +if(access==O_RDONLY) share=O_DENYWRITE; + else share=O_DENYALL; +while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1) + && errno==EACCES && count++>6&1)*9+val*16; +return(val); +} + +/****************************************************************************/ +/* Returns in 'string' a character representation of the number in l with */ +/* commas. Maximum value of l is 4 gigabytes. */ +/****************************************************************************/ +char *ultoac(ulong l, char *string) +{ + char str[81]; + char i,j; + +ultoa(l,str,10); +if(!(strlen(str)%3)) i=(strlen(str)/3)-1; + else i=strlen(str)/3; +j=strlen(str)+i; +string[j--]=0; +i=strlen(str)-1; +while(i!=-1) { + if(!((strlen(str)-i)%3)) { + string[j--]=str[i--]; + string[j--]=','; } + else string[j--]=str[i--]; } +return(string); +} + +/****************************************************************************/ +/* If the directory 'path' doesn't exist, create it. */ +/****************************************************************************/ +void md(char *inpath) +{ + char path[256],str[128]; + struct ffblk ff; + int curdisk,disk; + +if(!inpath[0] || no_dirchk) + return; +if(!strcmp(inpath+1,":\\")) { + curdisk=getdisk(); + disk=toupper(inpath[0])-'A'; + setdisk(disk); + if(getdisk()!=disk) { + sprintf(str,"Invalid drive %c:",toupper(inpath[0])); + umsg(str); } + setdisk(curdisk); + return; } +strcpy(path,inpath); +if(path[strlen(path)-1]=='\\') + path[strlen(path)-1]=0; +if(!strcmp(path,".")) /* Don't try to make '.' */ + return; +if(findfirst(path,&ff,FA_DIREC)) + if(mkdir(path)) { + sprintf(str,"Failed to create %s",path); + umsg(str); } +} + + +void bail(int code) +{ + char str[256]; + int i,x; + smbstatus_t status; + +if(code) { + cputs("\r\nHit a key..."); + getch(); } +else if(forcesave) { + upop("Loading Configs..."); + read_main_cfg(txt); + read_msgs_cfg(txt); + read_file_cfg(txt); + read_chat_cfg(txt); + read_xtrn_cfg(txt); + upop(0); + write_main_cfg(); + write_msgs_cfg(); + write_file_cfg(); + write_chat_cfg(); + write_xtrn_cfg(); } + +uifcbail(); + +exit(code); +} + +/****************************************************************************/ +/* Error handling routine. Prints to local and remote screens the error */ +/* information, function, action, object and access and then attempts to */ +/* write the error information into the file ERROR.LOG in the text dir. */ +/****************************************************************************/ +void errormsg(int line, char *source, char action, char *object, ulong access) +{ + char scrn_buf[8000]; + char actstr[256]; + +gettext(1,1,80,scrn_len,scrn_buf); +clrscr(); +switch(action) { + case ERR_OPEN: + strcpy(actstr,"opening"); + break; + case ERR_CLOSE: + strcpy(actstr,"closeing"); + break; + case ERR_FDOPEN: + strcpy(actstr,"fdopen"); + break; + case ERR_READ: + strcpy(actstr,"reading"); + break; + case ERR_WRITE: + strcpy(actstr,"writing"); + break; + case ERR_REMOVE: + strcpy(actstr,"removing"); + break; + case ERR_ALLOC: + strcpy(actstr,"allocating memory"); + break; + case ERR_CHK: + strcpy(actstr,"checking"); + break; + case ERR_LEN: + strcpy(actstr,"checking length"); + break; + case ERR_EXEC: + strcpy(actstr,"executing"); + break; + default: + strcpy(actstr,"UNKNOWN"); } +cprintf("ERROR - line: %d\r\n",line); +cprintf(" file: %s\r\n",source); +cprintf(" action: %s\r\n",actstr); +cprintf(" object: %s\r\n",object); +cprintf(" access: %ld (%lx)\r\n",access,access); +cputs("\r\n"); +getch(); +puttext(1,1,80,scrn_len,scrn_buf); +} + +/****************************************************************************/ +/* Puts a backslash on path strings */ +/****************************************************************************/ +void backslash(char *str) +{ + int i; + +i=strlen(str); +if(i && str[i-1]!='\\') { + str[i]='\\'; str[i+1]=0; } +} + +/****************************************************************************/ +/* Checks the disk drive for the existence of a file. Returns 1 if it */ +/* exists, 0 if it doesn't. */ +/* Called from upload */ +/****************************************************************************/ +char fexist(char *filespec) +{ + struct ffblk f; + +if(findfirst(filespec,&f,0)==0) + return(1); +return(0); +} + +/* End of SCFG.C */