home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / SCFGLIB1.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  22.7 KB  |  875 lines

  1. #line 1 "SCFGLIB1.C"
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. #include "sbbs.h"
  6. #include "scfglib.h"
  7.  
  8. void prep_path(char *path)
  9. {
  10.     char str[LEN_DIR*2];
  11.     int i;
  12.  
  13. if(!path[0])
  14.     return;
  15. if(path[0]!='\\' && path[1]!=':')           /* Relative to NODE directory */
  16.     sprintf(str,"%s%s",node_dir,path);
  17. else
  18.     strcpy(str,path);
  19. i=strlen(str);
  20. if(str[i-1]!=':' && str[i-1]!='\\')
  21.     strcat(str,"\\");
  22. strcat(str,".");                // Change C: to C:. and C:\SBBS\ to C:\SBBS\.
  23. _fullpath(path,str,LEN_DIR+1);    // Change C:\SBBS\NODE1\..\EXEC to C:\SBBS\EXEC
  24. i=strlen(path);
  25. if(i && path[i-1]!='\\')
  26.     strcat(path,"\\");
  27. }
  28.  
  29. char *get_alloc(long *offset, char *outstr, int maxlen, FILE *instream)
  30. {
  31.  
  32. #ifdef SCFG
  33.     fread(outstr,1,maxlen+1,instream);
  34.     (*offset)+=maxlen+1;
  35. #else
  36.     char str[257];
  37.  
  38.     fread(str,1,maxlen+1,instream);
  39. //      lprintf("%s %d %p\r\n",__FILE__,__LINE__,offset);
  40.     (*offset)+=maxlen+1;    // this line was commented out (04/12/97) why?
  41.     if(!str[0])             /* Save memory */
  42.         return(scfgnulstr);
  43.     if((outstr=(char *)MALLOC(strlen(str)+1))==NULL)
  44.         return(NULL);
  45.     strcpy(outstr,str);
  46. #endif
  47.  
  48. return(outstr);
  49. }
  50.  
  51. #ifdef SCFG     /* SCFG allocate max length */
  52.     #define readline_alloc(l,s,m,i) readline(l,s,m,i)
  53. #else
  54.     char *readline_alloc(long *offset, char *outstr, int maxline
  55.         , FILE *instream);
  56.     #define readline_alloc(l,s,m,i) s=readline_alloc(l,s,m,i)
  57.     #define get_alloc(o,s,l,i) s=get_alloc(o,s,l,i)
  58. #endif
  59.  
  60. /***********************************************************/
  61. /* These functions are called from here and must be linked */
  62. /***********************************************************/
  63. /***
  64.     nopen()
  65.     truncsp()
  66. ***/
  67.  
  68. void allocerr(read_cfg_text_t txt, long offset, char *fname, uint size)
  69. {
  70. lprintf(txt.error,offset,fname);
  71. lprintf(txt.allocerr,size);
  72. bail(1);
  73. }
  74.  
  75. #ifndef NO_NODE_CFG
  76.  
  77. /****************************************************************************/
  78. /* Reads in NODE.CNF and initializes the associated variables                */
  79. /****************************************************************************/
  80. void read_node_cfg(read_cfg_text_t txt)
  81. {
  82.     char    c,str[256],cmd[64],fname[13],*p;
  83.     int     i;
  84.     short    n;
  85.     long    offset=0;
  86.     FILE    *instream;
  87.  
  88. strcpy(fname,"NODE.CNF");
  89. sprintf(str,"%s%s",node_dir,fname);
  90. if((instream=fnopen(&i,str,O_RDONLY))==NULL) {
  91.     lprintf(txt.openerr,str);
  92. #ifdef SBBS
  93.     lprintf("\r\nSBBS must be run from a NODE directory (e.g. ");
  94.     lclatr(WHITE);
  95.     lprintf("C:\\SBBS\\NODE1");
  96.     lclatr(LIGHTGRAY);
  97.     lprintf(").\r\n");
  98. #endif
  99.     bail(1); }
  100.  
  101. lprintf(txt.reading,fname);
  102. get_int(node_num,instream);
  103. if(!node_num) {
  104.     lprintf(txt.error,offset,fname);
  105.     lprintf("Node number must be non-zero\r\n");
  106.     bail(1); }
  107. get_str(node_name,instream);
  108. get_str(node_phone,instream);
  109. get_str(node_comspec,instream);
  110. if(!node_comspec[0])
  111.     strcpy(node_comspec,"C:\\OS2\\MDOS\\COMMAND.COM");
  112. get_int(node_misc,instream);
  113. get_int(node_ivt,instream);
  114. get_int(node_swap,instream);
  115. get_str(node_swapdir,instream);
  116. #ifndef SCFG
  117. if(!node_swapdir[0])
  118.     strcpy(node_swapdir,node_dir);
  119. else
  120.     prep_path(node_swapdir);
  121. #endif
  122. get_int(node_valuser,instream);
  123. get_int(node_minbps,instream);
  124. #ifdef SCFG
  125. get_str(node_ar,instream);
  126. #else
  127. fread(str,1,LEN_ARSTR+1,instream);
  128. offset+=LEN_ARSTR+1;
  129. node_ar=arstr(0,str);
  130. #endif
  131. get_int(node_dollars_per_call,instream);
  132. get_str(node_editor,instream);
  133. get_str(node_viewer,instream);
  134. get_str(node_daily,instream);
  135. get_int(c,instream);
  136. if(c) node_scrnlen=c;
  137. get_int(node_scrnblank,instream);
  138. get_str(ctrl_dir,instream);                 /* ctrl directory */
  139. get_str(text_dir,instream);                 /* text directory */
  140. get_str(temp_dir,instream);                 /* temp directory */
  141. if(!temp_dir[0])
  142.     strcpy(temp_dir,"TEMP");
  143.  
  144. #ifndef SCFG
  145. prep_path(ctrl_dir);
  146. prep_path(text_dir);
  147. prep_path(temp_dir);
  148. #endif
  149.  
  150. for(i=0;i<10;i++) {                         /* WFC 0-9 DOS commands */
  151.     get_alloc(&offset,wfc_cmd[i],LEN_CMD,instream); }
  152. for(i=0;i<12;i++) {                         /* WFC F1-F12 shrinking DOS cmds */
  153.     get_alloc(&offset,wfc_scmd[i],LEN_CMD,instream); }
  154. get_str(mdm_hang,instream);
  155. get_int(node_sem_check,instream);
  156. if(!node_sem_check) node_sem_check=60;
  157. get_int(node_stat_check,instream);
  158. if(!node_stat_check) node_stat_check=10;
  159. get_str(scfg_cmd,instream);
  160. if(!scfg_cmd[0])
  161.     strcpy(scfg_cmd,"%!scfg %k");
  162. get_int(sec_warn,instream);
  163. if(!sec_warn)
  164.     sec_warn=180;
  165. get_int(sec_hangup,instream);
  166. if(!sec_hangup)
  167.     sec_hangup=300;
  168. for(i=0;i<188;i++) {                /* Unused - initialized to NULL */
  169.     fread(&n,1,2,instream);
  170.     offset+=2; }
  171. for(i=0;i<256;i++) {                /* Unused - initialized to 0xff */
  172.     fread(&n,1,2,instream);
  173.     offset+=2; }
  174.  
  175. /***************/
  176. /* Modem Stuff */
  177. /***************/
  178.  
  179. get_int(com_port,instream);
  180. get_int(com_irq,instream);
  181. get_int(com_base,instream);
  182. get_int(com_rate,instream);
  183. get_int(mdm_misc,instream);
  184. get_str(mdm_init,instream);
  185. get_str(mdm_spec,instream);
  186. get_str(mdm_term,instream);
  187. get_str(mdm_dial,instream);
  188. get_str(mdm_offh,instream);
  189. get_str(mdm_answ,instream);
  190. get_int(mdm_reinit,instream);
  191. get_int(mdm_ansdelay,instream);
  192. get_int(mdm_rings,instream);
  193.  
  194. get_int(mdm_results,instream);
  195.  
  196. if(mdm_results) {
  197.     if((mdm_result=(mdm_result_t *)MALLOC(sizeof(mdm_result_t)*mdm_results))
  198.         ==NULL)
  199.     allocerr(txt,offset,fname,sizeof(mdm_result_t *)*mdm_results); }
  200. else
  201.     mdm_result=NULL;
  202.  
  203. for(i=0;i<mdm_results;i++) {
  204.     if(feof(instream)) break;
  205.     get_int(mdm_result[i].code,instream);
  206.     get_int(mdm_result[i].rate,instream);
  207.     get_int(mdm_result[i].cps,instream);
  208.     get_alloc(&offset,mdm_result[i].str,LEN_MODEM,instream); }
  209. mdm_results=i;
  210. fclose(instream);
  211. lprintf(txt.readit,fname);
  212. }
  213.  
  214. #endif
  215.  
  216. #ifndef NO_MAIN_CFG
  217.  
  218. /****************************************************************************/
  219. /* Reads in MAIN.CNF and initializes the associated variables                */
  220. /****************************************************************************/
  221. void read_main_cfg(read_cfg_text_t txt)
  222. {
  223.     char    str[256],fname[13],*p,c;
  224.     int     file;
  225.     short    i,j,n;
  226.     long    offset=0;
  227.     FILE    *instream;
  228.  
  229. strcpy(fname,"MAIN.CNF");
  230. sprintf(str,"%s%s",ctrl_dir,fname);
  231. if((instream=fnopen(&file,str,O_RDONLY))==NULL) {
  232.     lprintf(txt.openerr,str);
  233.     bail(1); }
  234.  
  235. lprintf(txt.reading,fname);
  236. get_str(sys_name,instream);
  237. get_str(sys_id,instream);
  238. get_str(sys_location,instream);
  239. get_str(sys_phonefmt,instream);
  240. get_str(sys_op,instream);
  241. get_str(sys_guru,instream);
  242. get_str(sys_pass,instream);
  243. get_int(sys_nodes,instream);
  244.  
  245. if(!sys_nodes || sys_nodes<node_num || sys_nodes>MAX_NODES) {
  246.     lprintf(txt.error,offset,fname);
  247.     if(!sys_nodes)
  248.         lprintf("Total nodes on system must be non-zero.\r\n");
  249.     else if(sys_nodes>MAX_NODES)
  250.         lprintf("Total nodes exceeds %u.\r\n",MAX_NODES);
  251.     else
  252.         lprintf("Total nodes (%u) < node number in NODE.CNF (%u)\r\n"
  253.             ,sys_nodes,node_num);
  254.     bail(1); }
  255.  
  256. if((node_path=(char **)MALLOC(sizeof(char *)*sys_nodes))==NULL)
  257.     allocerr(txt,offset,fname,sizeof(char *)*sys_nodes);
  258.  
  259. for(i=0;i<sys_nodes;i++) {
  260.     if(feof(instream)) break;
  261.     fread(str,LEN_DIR+1,1,instream);
  262.     offset+=LEN_DIR+1;
  263.     if((node_path[i]=(char *)MALLOC(strlen(str)+1))==NULL)
  264.         allocerr(txt,offset,fname,strlen(str)+1);
  265.     strcpy(node_path[i],str); }
  266.  
  267. get_str(data_dir,instream);               /* data directory */
  268. get_str(exec_dir,instream);               /* exec directory */
  269.  
  270. #ifndef SCFG
  271. prep_path(data_dir);
  272. prep_path(exec_dir);
  273. #endif
  274.  
  275. get_str(sys_logon,instream);
  276. get_str(sys_logout,instream);
  277. get_str(sys_daily,instream);
  278. get_int(sys_timezone,instream);
  279. get_int(sys_misc,instream);
  280. get_int(sys_lastnode,instream);
  281. get_int(sys_autonode,instream);
  282. get_int(uq,instream);
  283. get_int(sys_pwdays,instream);
  284. get_int(sys_deldays,instream);
  285. get_int(sys_exp_warn,instream);     /* Days left till expiration warning */
  286. get_int(sys_autodel,instream);
  287. get_int(sys_def_stat,instream);     /* default status line */
  288.  
  289. #ifdef SCFG
  290. get_str(sys_chat_ar,instream);
  291. #else
  292. fread(str,1,LEN_ARSTR+1,instream);
  293. offset+=LEN_ARSTR+1;
  294. sys_chat_ar=arstr(0,str);
  295. #endif
  296.  
  297. get_int(cdt_min_value,instream);
  298. get_int(max_minutes,instream);
  299. get_int(cdt_per_dollar,instream);
  300. get_str(new_pass,instream);
  301. get_str(new_magic,instream);
  302. get_str(new_sif,instream);
  303. get_str(new_sof,instream);
  304. if(!new_sof[0])        /* if output not specified, use input file */
  305.     strcpy(new_sof,new_sif);
  306.  
  307. /*********************/
  308. /* New User Settings */
  309. /*********************/
  310.  
  311. get_int(new_level,instream);
  312. get_int(new_flags1,instream);
  313. get_int(new_flags2,instream);
  314. get_int(new_flags3,instream);
  315. get_int(new_flags4,instream);
  316. get_int(new_exempt,instream);
  317. get_int(new_rest,instream);
  318. get_int(new_cdt,instream);
  319. get_int(new_min,instream);
  320. get_str(new_xedit,instream);
  321. get_int(new_expire,instream);
  322. get_int(new_shell,instream);
  323. get_int(new_misc,instream);
  324. get_int(new_prot,instream);
  325. if(new_prot<SP)
  326.     new_prot=SP;
  327. get_int(c,instream);
  328. for(i=0;i<7;i++)
  329.     get_int(n,instream);
  330.  
  331. /*************************/
  332. /* Expired User Settings */
  333. /*************************/
  334.  
  335. get_int(expired_level,instream);
  336. get_int(expired_flags1,instream);
  337. get_int(expired_flags2,instream);
  338. get_int(expired_flags3,instream);
  339. get_int(expired_flags4,instream);
  340. get_int(expired_exempt,instream);
  341. get_int(expired_rest,instream);
  342.  
  343. get_str(logon_mod,instream);
  344. get_str(logoff_mod,instream);
  345. get_str(newuser_mod,instream);
  346. get_str(login_mod,instream);
  347. if(!login_mod[0]) strcpy(login_mod,"LOGIN");
  348. get_str(logout_mod,instream);
  349. get_str(sync_mod,instream);
  350. get_str(expire_mod,instream);
  351. get_int(c,instream);
  352.  
  353. for(i=0;i<224;i++)                    /* unused - initialized to NULL */
  354.     get_int(n,instream);
  355. for(i=0;i<256;i++)                    /* unused - initialized to 0xff */
  356.     get_int(n,instream);
  357.  
  358. /*******************/
  359. /* Validation Sets */
  360. /*******************/
  361.  
  362. for(i=0;i<10 && !feof(instream);i++) {
  363.     get_int(val_level[i],instream);
  364.     get_int(val_expire[i],instream);
  365.     get_int(val_flags1[i],instream);
  366.     get_int(val_flags2[i],instream);
  367.     get_int(val_flags3[i],instream);
  368.     get_int(val_flags4[i],instream);
  369.     get_int(val_cdt[i],instream);
  370.     get_int(val_exempt[i],instream);
  371.     get_int(val_rest[i],instream);
  372.     for(j=0;j<8;j++)
  373.         get_int(n,instream); }
  374.  
  375. /***************************/
  376. /* Security Level Settings */
  377. /***************************/
  378.  
  379. for(i=0;i<100 && !feof(instream);i++) {
  380.     get_int(level_timeperday[i],instream);
  381.     if(level_timeperday[i]>500)
  382.         level_timeperday[i]=500;
  383.     get_int(level_timepercall[i],instream);
  384.     if(level_timepercall[i]>500)
  385.         level_timepercall[i]=500;
  386.     get_int(level_callsperday[i],instream);
  387.     get_int(level_freecdtperday[i],instream);
  388.     get_int(level_linespermsg[i],instream);
  389.     get_int(level_postsperday[i],instream);
  390.     get_int(level_emailperday[i],instream);
  391.     get_int(level_misc[i],instream);
  392.     get_int(level_expireto[i],instream);
  393.     get_int(c,instream);
  394.     for(j=0;j<5;j++)
  395.         get_int(n,instream); }
  396. if(i!=100) {
  397.     lprintf(txt.error,offset,fname);
  398.     lprintf("Insufficient User Level Information\r\n"
  399.         "%d user levels read, 100 needed.\r\n",i);
  400.     bail(1); }
  401.  
  402. get_int(total_shells,instream);
  403. #ifdef SBBS
  404. if(!total_shells) {
  405.     lprintf(txt.error,offset,fname);
  406.     lprintf("At least one command shell must be configured.\r\n");
  407.     bail(1); }
  408. #endif
  409.  
  410. if(total_shells) {
  411.     if((shell=(shell_t **)MALLOC(sizeof(shell_t *)*total_shells))==NULL)
  412.         allocerr(txt,offset,fname,sizeof(shell_t *)*total_shells); }
  413. else
  414.     shell=NULL;
  415.  
  416. for(i=0;i<total_shells;i++) {
  417.     if(feof(instream)) break;
  418.     if((shell[i]=(shell_t *)MALLOC(sizeof(shell_t)))==NULL)
  419.         allocerr(txt,offset,fname,sizeof(shell_t));
  420.     memset(shell[i],0,sizeof(shell_t));
  421.  
  422.     get_alloc(&offset,shell[i]->name,40,instream);
  423.     get_str(shell[i]->code,instream);
  424. #ifdef SCFG
  425.     get_str(shell[i]->ar,instream);
  426. #else
  427.     fread(str,1,LEN_ARSTR+1,instream);
  428.     offset+=LEN_ARSTR+1;
  429.     shell[i]->ar=arstr(0,str);
  430. #endif
  431.     get_int(shell[i]->misc,instream);
  432.     for(j=0;j<8;j++)
  433.         get_int(n,instream);
  434.     }
  435. total_shells=i;
  436.  
  437.  
  438. fclose(instream);
  439. lprintf(txt.readit,fname);
  440. }
  441.  
  442. #endif
  443.  
  444. #ifndef NO_MSGS_CFG
  445.  
  446.  
  447. /****************************************************************************/
  448. /* Reads in MSGS.CNF and initializes the associated variables                */
  449. /****************************************************************************/
  450. void read_msgs_cfg(read_cfg_text_t txt)
  451. {
  452.     char    str[256],fname[13],tmp[128],c;
  453.     int     file;
  454.     short    i,j,k,l,n;
  455.     long    offset=0;
  456.     FILE    *instream;
  457.  
  458. #ifndef SCFG
  459.  
  460. sprintf(data_dir_subs,"%sSUBS\\",data_dir);
  461. prep_path(data_dir_subs);
  462.  
  463. #endif
  464.  
  465. strcpy(fname,"MSGS.CNF");
  466. sprintf(str,"%s%s",ctrl_dir,fname);
  467. if((instream=fnopen(&file,str,O_RDONLY))==NULL) {
  468.     lprintf(txt.openerr,str);
  469.     bail(1); }
  470.  
  471. lprintf(txt.reading,fname);
  472.  
  473. /*************************/
  474. /* General Message Stuff */
  475. /*************************/
  476.  
  477. get_int(max_qwkmsgs,instream);
  478. get_int(mail_maxcrcs,instream);
  479. get_int(mail_maxage,instream);
  480. #ifdef SCFG
  481.     get_str(preqwk_ar,instream);
  482. #else
  483.     fread(str,1,LEN_ARSTR+1,instream);
  484.     offset+=LEN_ARSTR+1;
  485.     preqwk_ar=arstr(0,str);
  486. #endif
  487. get_int(smb_retry_time,instream);     /* odd byte */
  488. if(!smb_retry_time)
  489.     smb_retry_time=30;
  490. for(i=0;i<235;i++)    /* NULL */
  491.     get_int(n,instream);
  492. for(i=0;i<256;i++)    /* 0xff */
  493.     get_int(n,instream);
  494.  
  495.  
  496. /******************/
  497. /* Message Groups */
  498. /******************/
  499.  
  500. get_int(total_grps,instream);
  501.  
  502.  
  503. if(total_grps) {
  504.     if((grp=(grp_t **)MALLOC(sizeof(grp_t *)*total_grps))==NULL)
  505.         allocerr(txt,offset,fname,sizeof(grp_t *)*total_grps); }
  506. else
  507.     grp=NULL;
  508.  
  509.  
  510. #ifdef SBBS
  511.  
  512. if(total_grps) {
  513.  
  514.     if((cursub=(uint *)MALLOC(sizeof(uint)*total_grps))==NULL)
  515.         allocerr(txt,offset,fname,sizeof(uint)*total_grps);
  516.  
  517.     if((usrgrp=(uint *)MALLOC(sizeof(uint)*total_grps))==NULL)
  518.         allocerr(txt,offset,fname,sizeof(uint)*total_grps);
  519.  
  520.     if((usrsubs=(uint *)MALLOC(sizeof(uint)*total_grps))==NULL)
  521.         allocerr(txt,offset,fname,sizeof(uint)*total_grps);
  522.  
  523.     if((usrsub=(uint **)MALLOC(sizeof(uint *)*total_grps))==NULL)
  524.         allocerr(txt,offset,fname,sizeof(uint *)*total_grps); }
  525.  
  526. #endif
  527.  
  528. for(i=0;i<total_grps;i++) {
  529.  
  530.     if(feof(instream)) break;
  531.     if((grp[i]=(grp_t *)MALLOC(sizeof(grp_t)))==NULL)
  532.         allocerr(txt,offset,fname,sizeof(grp_t));
  533.     memset(grp[i],0,sizeof(grp_t));
  534.  
  535.     get_alloc(&offset,grp[i]->lname,LEN_GLNAME,instream);
  536.     get_alloc(&offset,grp[i]->sname,LEN_GSNAME,instream);
  537.  
  538. #if !defined(SCFG) && defined(SAVE_MEMORY)      /* Save memory */
  539.     if(!strcmp(grp[i]->lname,grp[i]->sname) && grp[i]->sname!=scfgnulstr) {
  540.         FREE(grp[i]->sname);
  541.         grp[i]->sname=grp[i]->lname; }
  542. #endif
  543.  
  544. #ifdef SCFG
  545.     get_str(grp[i]->ar,instream);
  546. #else
  547.     fread(str,1,LEN_ARSTR+1,instream);
  548.     offset+=LEN_ARSTR+1;
  549.     grp[i]->ar=arstr(0,str);
  550. #endif
  551.     for(j=0;j<48;j++)
  552.         get_int(n,instream);
  553.     }
  554. total_grps=i;
  555.  
  556. /**********************/
  557. /* Message Sub-boards */
  558. /**********************/
  559.  
  560. get_int(total_subs,instream);
  561.  
  562. if(total_subs) {
  563.     if((sub=(sub_t **)MALLOC(sizeof(sub_t *)*total_subs))==NULL)
  564.         allocerr(txt,offset,fname,sizeof(sub_t *)*total_subs); }
  565. else
  566.     sub=NULL;
  567.  
  568. #ifdef SBBS
  569.  
  570. if(total_subs) {
  571.  
  572.     if((sub_misc=(char *)MALLOC(sizeof(char)*total_subs))==NULL)
  573.         allocerr(txt,offset,fname,sizeof(char)*total_subs);
  574.  
  575.     if((sub_ptr=(ulong *)MALLOC(sizeof(ulong)*total_subs))==NULL)
  576.         allocerr(txt,offset,fname,sizeof(ulong)*total_subs);
  577.  
  578.     if((sub_last=(ulong *)MALLOC(sizeof(ulong)*total_subs))==NULL)
  579.         allocerr(txt,offset,fname,sizeof(ulong)*total_subs); }
  580.  
  581. #endif
  582.  
  583. for(i=0;i<total_subs;i++) {
  584.     if(feof(instream)) break;
  585.     if((sub[i]=(sub_t *)MALLOC(sizeof(sub_t)))==NULL)
  586.         allocerr(txt,offset,fname,sizeof(sub_t));
  587.     memset(sub[i],0,sizeof(sub_t));
  588.  
  589.     get_int(sub[i]->grp,instream);
  590.     get_alloc(&offset,sub[i]->lname,LEN_SLNAME,instream);
  591.     get_alloc(&offset,sub[i]->sname,LEN_SSNAME,instream);
  592.  
  593. #if !defined(SCFG) && defined(SAVE_MEMORY) /* Save memory */
  594.     if(!strcmp(sub[i]->lname,sub[i]->sname) && sub[i]->sname!=scfgnulstr) {
  595.         FREE(sub[i]->sname);
  596.         sub[i]->sname=sub[i]->lname; }
  597. #endif
  598.  
  599.     get_alloc(&offset,sub[i]->qwkname,10,instream);
  600.  
  601. #if !defined(SCFG) && defined(SAVE_MEMORY)    /* Save memory */
  602.     if(!strcmp(sub[i]->qwkname,sub[i]->sname) && sub[i]->qwkname!=scfgnulstr) {
  603.         FREE(sub[i]->qwkname);
  604.         sub[i]->qwkname=sub[i]->sname; }
  605. #endif
  606.  
  607.     get_str(sub[i]->code,instream);
  608.  
  609. #ifdef SCFG
  610.     get_str(sub[i]->data_dir,instream);
  611. #else
  612.     fread(str,LEN_DIR+1,1,instream);   /* substitute data dir */
  613.     offset+=LEN_DIR+1;
  614.     if(str[0]) {
  615.         prep_path(str);
  616.         if((sub[i]->data_dir=(char *)MALLOC(strlen(str)+1))==NULL)
  617.             allocerr(txt,offset,fname,strlen(str)+1);
  618.         strcpy(sub[i]->data_dir,str); }
  619.     else
  620.         sub[i]->data_dir=data_dir_subs;
  621. #endif
  622.  
  623.  
  624. #ifdef SCFG
  625.     get_str(sub[i]->ar,instream);
  626.     get_str(sub[i]->read_ar,instream);
  627.     get_str(sub[i]->post_ar,instream);
  628.     get_str(sub[i]->op_ar,instream);
  629. #else
  630.     fread(str,1,LEN_ARSTR+1,instream);
  631.     offset+=LEN_ARSTR+1;
  632.     sub[i]->ar=arstr(0,str);
  633.     fread(str,1,LEN_ARSTR+1,instream);
  634.     offset+=LEN_ARSTR+1;
  635.     sub[i]->read_ar=arstr(0,str);
  636.     fread(str,1,LEN_ARSTR+1,instream);
  637.     offset+=LEN_ARSTR+1;
  638.     sub[i]->post_ar=arstr(0,str);
  639.     fread(str,1,LEN_ARSTR+1,instream);
  640.     offset+=LEN_ARSTR+1;
  641.     sub[i]->op_ar=arstr(0,str);
  642. #endif
  643.     get_int(sub[i]->misc,instream);
  644.  
  645.  
  646. #ifdef SCFG
  647.     get_str(sub[i]->tagline,instream);
  648. #else
  649.     fread(str,81,1,instream);    /* substitute tagline */
  650.     offset+=81;
  651.     if(str[0]) {
  652.         if((sub[i]->tagline=(char *)MALLOC(strlen(str)+1))==NULL)
  653.             allocerr(txt,offset,fname,strlen(str)+1);
  654.         strcpy(sub[i]->tagline,str); }
  655.     else
  656.         sub[i]->tagline=qnet_tagline;
  657. #endif
  658.  
  659. #ifdef SCFG
  660.     get_str(sub[i]->origline,instream);
  661. #else
  662.     fread(str,1,51,instream);    /* substitute origin line */
  663.     offset+=51;
  664.     if(str[0]) {
  665.         if((sub[i]->origline=(char *)MALLOC(strlen(str)+1))==NULL)
  666.             allocerr(txt,offset,fname,strlen(str)+1);
  667.         strcpy(sub[i]->origline,str); }
  668.     else
  669.         sub[i]->origline=origline;
  670. #endif
  671.  
  672. #ifdef SCFG
  673.     get_str(sub[i]->echomail_sem,instream);
  674. #else
  675.     fread(str,1,LEN_DIR+1,instream);   /* substitute echomail semaphore */
  676.     offset+=LEN_DIR+1;
  677.     if(str[0]) {
  678.         if((sub[i]->echomail_sem=(char *)MALLOC(strlen(str)+1))==NULL)
  679.             allocerr(txt,offset,fname,strlen(str)+1);
  680.         strcpy(sub[i]->echomail_sem,str); }
  681.     else
  682.         sub[i]->echomail_sem=echomail_sem;
  683. #endif
  684.     fread(str,1,LEN_DIR+1,instream);   /* substitute EchoMail path */
  685.     offset+=LEN_DIR+1;
  686. #ifndef SBBS
  687.     backslash(str);
  688.     strcpy(sub[i]->echopath,str);
  689. #endif
  690.     get_int(sub[i]->faddr,instream);            /* FidoNet address */
  691.  
  692.     get_int(sub[i]->maxmsgs,instream);
  693.     get_int(sub[i]->maxcrcs,instream);
  694.     get_int(sub[i]->maxage,instream);
  695.     get_int(sub[i]->ptridx,instream);
  696. #ifdef SBBS
  697.     for(j=0;j<i;j++)
  698.         if(sub[i]->ptridx==sub[j]->ptridx) {
  699.             lprintf(txt.error,offset,fname);
  700.             lprintf("Duplicate pointer index for subs #%d and #%d\r\n"
  701.                 ,i+1,j+1);
  702.             bail(1); }
  703. #endif
  704.  
  705. #ifdef SCFG
  706.     get_str(sub[i]->mod_ar,instream);
  707. #else
  708.     fread(str,1,LEN_ARSTR+1,instream);
  709.     offset+=LEN_ARSTR+1;
  710.     sub[i]->mod_ar=arstr(0,str);
  711. #endif
  712.     get_int(sub[i]->qwkconf,instream);
  713.     get_int(c,instream);
  714.     for(j=0;j<26;j++)
  715.         get_int(n,instream);
  716.     }
  717. total_subs=i;
  718.  
  719. #ifdef SBBS
  720. for(i=l=0;i<total_grps;i++) {
  721.     for(j=k=0;j<total_subs;j++)
  722.         if(sub[j]->grp==i)
  723.             k++;    /* k = number of subs per grp[i] */
  724.     if(k>l) l=k; }    /* l = the largest number of subs per grp */
  725. if(l)
  726.     for(i=0;i<total_grps;i++)
  727.         if((usrsub[i]=(uint *)MALLOC(sizeof(uint)*l))==NULL)
  728.             allocerr(txt,offset,fname,sizeof(uint)*l);
  729.  
  730. if(sys_status&SS_INITIAL) {
  731.     fclose(instream);
  732.     lprintf(txt.readit,fname);
  733.     return; }
  734. #endif
  735.  
  736. /***********/
  737. /* FidoNet */
  738. /***********/
  739.  
  740. get_int(total_faddrs,instream);
  741.  
  742. if(total_faddrs) {
  743.     if((faddr=(faddr_t *)MALLOC(sizeof(faddr_t)*total_faddrs))==NULL)
  744.         allocerr(txt,offset,fname,sizeof(faddr_t)*total_faddrs); }
  745. else
  746.     faddr=NULL;
  747.  
  748. for(i=0;i<total_faddrs;i++)
  749.     get_int(faddr[i],instream);
  750.  
  751. get_str(origline,instream);
  752. get_str(netmail_sem,instream);
  753. get_str(echomail_sem,instream);
  754. get_str(netmail_dir,instream);
  755. get_str(echomail_dir,instream);
  756. get_str(fidofile_dir,instream);
  757. get_int(netmail_misc,instream);
  758. get_int(netmail_cost,instream);
  759. get_int(dflt_faddr,instream);
  760. for(i=0;i<28;i++)
  761.     get_int(n,instream);
  762.  
  763.  
  764. /**********/
  765. /* QWKnet */
  766. /**********/
  767.  
  768. get_str(qnet_tagline,instream);
  769.  
  770. get_int(total_qhubs,instream);
  771.  
  772. if(total_qhubs) {
  773.     if((qhub=(qhub_t **)MALLOC(sizeof(qhub_t *)*total_qhubs))==NULL)
  774.         allocerr(txt,offset,fname,sizeof(qhub_t*)*total_qhubs); }
  775. else
  776.     qhub=NULL;
  777.  
  778. for(i=0;i<total_qhubs;i++) {
  779.     if(feof(instream)) break;
  780.     if((qhub[i]=(qhub_t *)MALLOC(sizeof(qhub_t)))==NULL)
  781.         allocerr(txt,offset,fname,sizeof(qhub_t));
  782.     memset(qhub[i],0,sizeof(qhub_t));
  783.  
  784.     get_str(qhub[i]->id,instream);
  785.     get_int(qhub[i]->time,instream);
  786.     get_int(qhub[i]->freq,instream);
  787.     get_int(qhub[i]->days,instream);
  788.     get_int(qhub[i]->node,instream);
  789.     get_alloc(&offset,qhub[i]->call,LEN_CMD,instream);
  790.     get_alloc(&offset,qhub[i]->pack,LEN_CMD,instream);
  791.     get_alloc(&offset,qhub[i]->unpack,LEN_CMD,instream);
  792.     get_int(k,instream);
  793.  
  794.     if(k) {
  795.         if((qhub[i]->sub=(ushort *)MALLOC(sizeof(ushort)*k))==NULL)
  796.             allocerr(txt,offset,fname,sizeof(uint)*k);
  797.         if((qhub[i]->conf=(ushort *)MALLOC(sizeof(ushort)*k))==NULL)
  798.             allocerr(txt,offset,fname,sizeof(ushort)*k);
  799.         if((qhub[i]->mode=(uchar *)MALLOC(sizeof(uchar)*k))==NULL)
  800.             allocerr(txt,offset,fname,sizeof(uchar)*k); }
  801.  
  802.     for(j=0;j<k;j++) {
  803.         if(feof(instream)) break;
  804.         get_int(qhub[i]->conf[qhub[i]->subs],instream);
  805.         get_int(qhub[i]->sub[qhub[i]->subs],instream);
  806.         get_int(qhub[i]->mode[qhub[i]->subs],instream);
  807.         if(qhub[i]->sub[qhub[i]->subs]<total_subs)
  808.             sub[qhub[i]->sub[qhub[i]->subs]]->misc|=SUB_QNET;
  809.         else
  810.             continue;
  811.         if(qhub[i]->sub[qhub[i]->subs]!=INVALID_SUB)
  812.             qhub[i]->subs++; }
  813.     for(j=0;j<32;j++)
  814.         get_int(n,instream); }
  815.  
  816. total_qhubs=i;
  817.  
  818. for(j=0;j<32;j++)
  819.     get_int(n,instream);
  820.  
  821. /************/
  822. /* PostLink */
  823. /************/
  824.  
  825. fread(str,11,1,instream);        /* Unused - used to be Site Name */
  826. offset+=11;
  827. get_int(sys_psnum,instream);    /* Site Number */
  828. get_int(total_phubs,instream);
  829.  
  830. if(total_phubs) {
  831.     if((phub=(phub_t **)MALLOC(sizeof(phub_t *)*total_phubs))==NULL)
  832.         allocerr(txt,offset,fname,sizeof(phub_t*)*total_phubs); }
  833. else
  834.     phub=NULL;
  835.  
  836. for(i=0;i<total_phubs;i++) {
  837.     if(feof(instream)) break;
  838.     if((phub[i]=(phub_t *)MALLOC(sizeof(phub_t)))==NULL)
  839.         allocerr(txt,offset,fname,sizeof(phub_t));
  840.     memset(phub[i],0,sizeof(phub_t));
  841. #ifdef SCFG
  842.     get_str(phub[i]->name,instream);
  843. #else
  844.     fread(str,11,1,instream);
  845.     offset+=11;
  846. #endif
  847.     get_int(phub[i]->time,instream);
  848.     get_int(phub[i]->freq,instream);
  849.     get_int(phub[i]->days,instream);
  850.     get_int(phub[i]->node,instream);
  851.     get_alloc(&offset,phub[i]->call,LEN_CMD,instream);
  852.     for(j=0;j<32;j++)
  853.         get_int(n,instream); }
  854.  
  855. total_phubs=i;
  856.  
  857. get_str(sys_psname,instream);    /* Site Name */
  858.  
  859. for(j=0;j<32;j++)
  860.     get_int(n,instream);
  861.  
  862. /* Internet */
  863.  
  864. get_str(sys_inetaddr,instream); /* Internet address */
  865. get_str(inetmail_sem,instream);
  866. get_int(inetmail_misc,instream);
  867. get_int(inetmail_cost,instream);
  868.  
  869. fclose(instream);
  870. lprintf(txt.readit,fname);
  871. }
  872.  
  873. #endif
  874.  
  875.