diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c index a991a9340e43b354d3cebc944683b1b41cd24b9a..e4ea8372f708f538e98b720c1bd8b33f47b9baf4 100644 --- a/src/sbbs3/sbbsecho.c +++ b/src/sbbs3/sbbsecho.c @@ -995,113 +995,140 @@ void alter_areas(area_t* add_area, area_t* del_area, faddr_t addr, char* to) void alter_config(faddr_t addr, char *old, char *new, int option) { FILE *outfile,*cfgfile; - char str[257],outpath[MAX_PATH+1],tmp[257],tmp2[257],*outname,*p,*tp + char outpath[MAX_PATH+1],cmd[32],arcname[32],*outname,*p,*tp ,match=0; - int i,j,k; + char *afline=NULL; + size_t afline_size; + int cfgnum; + int j,k; faddr_t taddr; - i=matchnode(addr,0); /* i = config number from here on */ + cfgnum=matchnode(addr,0); SAFECOPY(outpath,cfg.cfgfile); *getfname(outpath)=0; if((outname=tempname(outpath,"CFG"))==NULL) { lprintf(LOG_ERR,"ERROR tempnam(%s,CFG)",outpath); - return; } + return; + } if((outfile=fopen(outname,"w+"))==NULL) { lprintf(LOG_ERR,"ERROR %u (%s) line %d opening %s",errno,strerror(errno),__LINE__,outname); free(outname); - return; } + return; + } if((cfgfile=fopen(cfg.cfgfile,"r"))==NULL) { lprintf(LOG_ERR,"ERROR %u (%s) line %d opening %s",errno,strerror(errno),__LINE__,cfg.cfgfile); fclose(outfile); free(outname); - return; } + return; + } while(!feof(cfgfile)) { - if(!fgets(str,sizeof(str),cfgfile)) + if(getdelim(&afline, &afline_size, '\n', cfgfile)==-1) break; - truncsp(str); - p=str; + truncsp(afline); + p=afline; SKIP_WHITESPACE(p); if(*p==';') { - fprintf(outfile,"%s\n",str); - continue; } - sprintf(tmp,"%-.25s",p); - tp=strchr(tmp,' '); + fprintf(outfile,"%s\n",afline); + continue; + } + sprintf(cmd,"%-.25s",p); + tp=strchr(cmd,' '); if(tp) *tp=0; /* Chop off at space */ - strupr(tmp); /* Convert code to uppercase */ + strupr(cmd); /* Convert code to uppercase */ FIND_WHITESPACE(p); /* Skip code */ SKIP_WHITESPACE(p); /* Skip white space */ - if(option==0 && !strcmp(tmp,"USEPACKER")) { /* Change Compression */ - if(!*p) - continue; - strcpy(tmp2,p); - p=tmp2; - FIND_WHITESPACE(p); - *p=0; - p++; - if(!stricmp(new,tmp2)) { /* Add to new definition */ - fprintf(outfile,"%-10s %s %s %s\n",tmp,tmp2 - ,smb_faddrtoa(&cfg.nodecfg[i].faddr,NULL) - ,(*p) ? p : ""); - match=1; - continue; } - else if(!stricmp(old,tmp2)) { /* Remove from old def */ - for(j=k=0;j<cfg.nodecfgs;j++) { - if(j==i) - continue; - if(cfg.nodecfg[j].arctype < cfg.arcdefs) - tp = cfg.arcdef[cfg.nodecfg[j].arctype].name; - else - tp = "NONE"; - if(!stricmp(tp,tmp2)) { - if(!k) { - fprintf(outfile,"%-10s %s",tmp,tmp2); - k++; } - fprintf(outfile," %s" - ,smb_faddrtoa(&cfg.nodecfg[j].faddr,NULL)); } } - fprintf(outfile,"\n"); - continue; } } - - if(option==1 && !strcmp(tmp,"AREAFIX")) { /* Change Password */ - if(!*p) - continue; - taddr=smb_atofaddr(&sys_faddr,p); - if(!memcmp(&cfg.nodecfg[i].faddr,&taddr,sizeof(faddr_t))) { - FIND_WHITESPACE(p); /* Skip over address */ - SKIP_WHITESPACE(p); /* Skip over whitespace */ - FIND_WHITESPACE(p); /* Skip over password */ - SKIP_WHITESPACE(p); /* Skip over whitespace */ - fprintf(outfile,"%-10s %s %s %s\n",tmp - ,smb_faddrtoa(&cfg.nodecfg[i].faddr,NULL),new,p); - continue; } } - - if(option>1 && !strcmp(tmp,"PASSIVE")) { /* Toggle Passive Areas */ + if(option==0 && !strcmp(cmd,"USEPACKER")) { /* Change Compression */ + if(*p) { + sprintf(arcname, "%-.25s", p); + tp=strchr(arcname,' '); + if(tp) + *tp = 0; + strupr(arcname); + FIND_WHITESPACE(p); + if(*p) + p++; + if(!stricmp(new,arcname)) { /* Add to new definition */ + if(!match) { + fprintf(outfile,"%-10s %s %s %s\n",cmd,arcname + ,smb_faddrtoa(&cfg.nodecfg[cfgnum].faddr,NULL) + ,p); + match=1; + } + } + else if(!stricmp(old,arcname)) { /* Remove from old def */ + for(j=k=0;j<cfg.nodecfgs;j++) { + if(j==cfgnum) + continue; + if(cfg.nodecfg[j].arctype < cfg.arcdefs) + tp = cfg.arcdef[cfg.nodecfg[j].arctype].name; + else + tp = "NONE"; + if(!stricmp(tp,arcname)) { + if(!k) { + fprintf(outfile,"%-10s %s",cmd,arcname); + k++; + } + fprintf(outfile," %s" + ,smb_faddrtoa(&cfg.nodecfg[j].faddr,NULL)); + } + } + fprintf(outfile,"\n"); + } + } + } + else if(option==1 && !strcmp(cmd,"AREAFIX")) { /* Change Password */ + if(*p) { + taddr=smb_atofaddr(&sys_faddr,p); + if(!memcmp(&cfg.nodecfg[cfgnum].faddr,&taddr,sizeof(faddr_t))) { + FIND_WHITESPACE(p); /* Skip over address */ + SKIP_WHITESPACE(p); /* Skip over whitespace */ + FIND_WHITESPACE(p); /* Skip over password */ + SKIP_WHITESPACE(p); /* Skip over whitespace */ + fprintf(outfile,"%-10s %s %s %s\n",cmd + ,smb_faddrtoa(&cfg.nodecfg[cfgnum].faddr,NULL),new,p); + } + } + } + else if(option>1 && !strcmp(cmd,"PASSIVE")) { /* Toggle Passive Areas */ match=1; for(j=k=0;j<cfg.nodecfgs;j++) { - if(option==2 && j==i) { - if(!k) fprintf(outfile,"%-10s",tmp); + if(option==2 && j==cfgnum) { + if(!k) + fprintf(outfile,"%-10s",cmd); fprintf(outfile," %s",smb_faddrtoa(&cfg.nodecfg[j].faddr,NULL)); k++; - continue; } - if(option==3 && j==i) + continue; + } + if(option==3 && j==cfgnum) continue; if(cfg.nodecfg[j].attr&ATTR_PASSIVE) { - if(!k) fprintf(outfile,"%-10s",tmp); + if(!k) + fprintf(outfile,"%-10s",cmd); fprintf(outfile," %s",smb_faddrtoa(&cfg.nodecfg[j].faddr,NULL)); - k++; } } - if(k) fprintf(outfile,"\n"); - continue; } - fprintf(outfile,"%s\n",str); } + k++; + } + } + if(k) + fprintf(outfile,"\n"); + } + else + fprintf(outfile,"%s\n",afline); + } if(!match) { if(option==0) fprintf(outfile,"%-10s %s %s\n","USEPACKER",new - ,smb_faddrtoa(&cfg.nodecfg[i].faddr,NULL)); + ,smb_faddrtoa(&cfg.nodecfg[cfgnum].faddr,NULL)); if(option==2) fprintf(outfile,"%-10s %s\n","PASSIVE" - ,smb_faddrtoa(&cfg.nodecfg[i].faddr,NULL)); } + ,smb_faddrtoa(&cfg.nodecfg[cfgnum].faddr,NULL)); + } + + if(afline != NULL) + free(afline); fclose(cfgfile); fclose(outfile); @@ -1112,6 +1139,7 @@ void alter_config(faddr_t addr, char *old, char *new, int option) lprintf(LOG_ERR,"ERROR line %d renaming %s to %s",__LINE__,outname,cfg.cfgfile); free(outname); } + /****************************************************************************** Used by AREAFIX to process any '%' commands that come in via netmail ******************************************************************************/