Skip to content
Snippets Groups Projects
Commit 18a9e5cc authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Add support for AreaFix -R, -L, and -Q options in subject of AreaMgr requests

(these options follow the password by one or more spaces)

I implemented these based on AreaFix v1.10 User's Guide, at Ragnarok's
suggestion/request. I didn't test them, so looking forward to getting some
test results.

The -L and -Q options are functionally identically to the %LIST and %QUERY
AreaManager commands, while -R ads a little efficiency by combining +areatag
(add) and %RESCAN <areatag> requests in a single command.
parent cc5e086b
No related branches found
No related tags found
No related merge requests found
Pipeline #7009 passed
Address all Area Management requests to 'AreaFix' (without quotes). Address all Area Management requests to 'AreaFix' (without quotes).
Your Area Manager password goes in the message subject. Your Area Manager password goes in the message subject followed optionally
by -R, -L, or -Q for Rescan, List, or Query functions, respectively.
In the body of the message, one or more: In the body of the message, one or more:
......
...@@ -1557,7 +1557,7 @@ int check_elists(const char *areatag, fidoaddr_t addr) ...@@ -1557,7 +1557,7 @@ int check_elists(const char *areatag, fidoaddr_t addr)
/****************************************************************************** /******************************************************************************
Used by AREAFIX to add/remove/change areas in the areas file Used by AREAFIX to add/remove/change areas in the areas file
******************************************************************************/ ******************************************************************************/
void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, const char* to) void alter_areas(str_list_t add_area, str_list_t del_area, nodecfg_t* nodecfg, const char* to, bool rescan)
{ {
FILE *nmfile,*afilein,*afileout,*fwdfile; FILE *nmfile,*afilein,*afileout,*fwdfile;
char str[1024],fields[1024],code[LEN_EXTCODE+1],echotag[FIDO_AREATAG_LEN+1],comment[256] char str[1024],fields[1024],code[LEN_EXTCODE+1],echotag[FIDO_AREATAG_LEN+1],comment[256]
...@@ -1569,6 +1569,7 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons ...@@ -1569,6 +1569,7 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons
size_t add_count, added = 0; size_t add_count, added = 0;
size_t del_count, deleted = 0; size_t del_count, deleted = 0;
struct stat st = {0}; struct stat st = {0};
faddr_t addr = nodecfg->addr;
add_count = strListCount(add_area); add_count = strListCount(add_area);
del_count = strListCount(del_area); del_count = strListCount(del_area);
...@@ -1705,6 +1706,11 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons ...@@ -1705,6 +1706,11 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons
return; return;
} }
memcpy(&cfg.area[u].link[cfg.area[u].links-1],&addr,sizeof(fidoaddr_t)); memcpy(&cfg.area[u].link[cfg.area[u].links-1],&addr,sizeof(fidoaddr_t));
bool rescanned = false;
if(rescan && is_valid_subnum(&scfg, cfg.area[u].sub)) {
rescanned = true;
export_echomail(scfg.sub[cfg.area[u].sub]->code, nodecfg, true);
}
fprintf(afileout,"%-*s %-*s " fprintf(afileout,"%-*s %-*s "
,LEN_EXTCODE, code ,LEN_EXTCODE, code
...@@ -1715,7 +1721,7 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons ...@@ -1715,7 +1721,7 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons
if(comment[0]) if(comment[0])
fprintf(afileout,"%s",comment); fprintf(afileout,"%s",comment);
fprintf(afileout,"\n"); fprintf(afileout,"\n");
fprintf(nmfile,"%s added.\r\n",echotag); fprintf(nmfile,"%s added%s.\r\n",echotag, rescanned ? " and rescanned" : "");
added++; added++;
break; break;
} }
...@@ -1730,8 +1736,6 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons ...@@ -1730,8 +1736,6 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons
} }
fclose(afilein); fclose(afilein);
if(nomatch || (add_count && stricmp(add_area[0],"+ALL") == 0)) { if(nomatch || (add_count && stricmp(add_area[0],"+ALL") == 0)) {
nodecfg_t* nodecfg=findnodecfg(&cfg, addr, /* exact: */false);
if(nodecfg != NULL) {
for(j=0;j<cfg.listcfgs;j++) { for(j=0;j<cfg.listcfgs;j++) {
match=0; match=0;
for(k=0; cfg.listcfg[j].keys[k] ;k++) { for(k=0; cfg.listcfg[j].keys[k] ;k++) {
...@@ -1803,7 +1807,6 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons ...@@ -1803,7 +1807,6 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons
} }
} }
} }
}
if(add_count && stricmp(add_area[0],"+ALL")) { if(add_count && stricmp(add_area[0],"+ALL")) {
for(u=0;add_area[u]!=NULL;u++) for(u=0;add_area[u]!=NULL;u++)
if(add_area[u][0]) { if(add_area[u][0]) {
...@@ -1917,7 +1920,7 @@ bool alter_config(nodecfg_t* nodecfg, const char* key, const char* value) ...@@ -1917,7 +1920,7 @@ bool alter_config(nodecfg_t* nodecfg, const char* key, const char* value)
/****************************************************************************** /******************************************************************************
Used by AREAFIX to process any '%' commands that come in via netmail Used by AREAFIX to process any '%' commands that come in via netmail
******************************************************************************/ ******************************************************************************/
bool areafix_command(char* instr, nodecfg_t* nodecfg, const char* to) bool areafix_command(char* instr, nodecfg_t* nodecfg, const char* to, bool rescan)
{ {
FILE *stream,*tmpf; FILE *stream,*tmpf;
char str[MAX_PATH+1]; char str[MAX_PATH+1];
...@@ -2175,7 +2178,7 @@ bool areafix_command(char* instr, nodecfg_t* nodecfg, const char* to) ...@@ -2175,7 +2178,7 @@ bool areafix_command(char* instr, nodecfg_t* nodecfg, const char* to)
if(stricmp(instr, "+ALL") == 0) { if(stricmp(instr, "+ALL") == 0) {
str_list_t add_area=strListInit(); str_list_t add_area=strListInit();
strListPush(&add_area, instr); strListPush(&add_area, instr);
alter_areas(add_area,NULL,addr,to); alter_areas(add_area,NULL,nodecfg,to,rescan);
strListFree(&add_area); strListFree(&add_area);
return true; return true;
} }
...@@ -2183,7 +2186,7 @@ bool areafix_command(char* instr, nodecfg_t* nodecfg, const char* to) ...@@ -2183,7 +2186,7 @@ bool areafix_command(char* instr, nodecfg_t* nodecfg, const char* to)
if(stricmp(instr, "-ALL") == 0) { if(stricmp(instr, "-ALL") == 0) {
str_list_t del_area=strListInit(); str_list_t del_area=strListInit();
strListPush(&del_area, instr); strListPush(&del_area, instr);
alter_areas(NULL,del_area,addr,to); alter_areas(NULL,del_area,nodecfg,to,rescan);
strListFree(&del_area); strListFree(&del_area);
return true; return true;
} }
...@@ -2202,6 +2205,9 @@ char* process_areafix(fidoaddr_t addr, char* inbuf, const char* subj, const char ...@@ -2202,6 +2205,9 @@ char* process_areafix(fidoaddr_t addr, char* inbuf, const char* subj, const char
char *p,*tp,action,cmds=0; char *p,*tp,action,cmds=0;
ulong l,m; ulong l,m;
str_list_t add_area,del_area; str_list_t add_area,del_area;
bool rescan = false;
bool list = false;
bool query = false;
lprintf(LOG_INFO,"AreaFix (for %s) Request received from %s" lprintf(LOG_INFO,"AreaFix (for %s) Request received from %s"
,smb_faddrtoa(&addr,NULL), name); ,smb_faddrtoa(&addr,NULL), name);
...@@ -2211,7 +2217,20 @@ char* process_areafix(fidoaddr_t addr, char* inbuf, const char* subj, const char ...@@ -2211,7 +2217,20 @@ char* process_areafix(fidoaddr_t addr, char* inbuf, const char* subj, const char
SAFECOPY(password, subj); SAFECOPY(password, subj);
p = password; p = password;
FIND_WHITESPACE(p); FIND_WHITESPACE(p);
if(*p != '\0') {
*p = '\0'; *p = '\0';
++p;
while(*p != '\0') {
SKIP_WHITESPACE(p);
if(stricmp(p, "-R") == 0 || strnicmp(p, "-R ", 3) == 0)
rescan = true;
if(stricmp(p, "-L") == 0 || strnicmp(p, "-L ", 3) == 0)
list = true;
if(stricmp(p, "-Q") == 0 || strnicmp(p, "-Q ", 3) == 0)
query = true;
FIND_WHITESPACE(p);
}
}
p=(char *)inbuf; p=(char *)inbuf;
...@@ -2284,7 +2303,7 @@ char* process_areafix(fidoaddr_t addr, char* inbuf, const char* subj, const char ...@@ -2284,7 +2303,7 @@ char* process_areafix(fidoaddr_t addr, char* inbuf, const char* subj, const char
strListPush(&del_area, str); strListPush(&del_area, str);
break; break;
case '%': /* Process Command */ case '%': /* Process Command */
if(areafix_command(str, nodecfg, name)) if(areafix_command(str, nodecfg, name, rescan))
cmds++; cmds++;
break; break;
} }
...@@ -2302,10 +2321,16 @@ char* process_areafix(fidoaddr_t addr, char* inbuf, const char* subj, const char ...@@ -2302,10 +2321,16 @@ char* process_areafix(fidoaddr_t addr, char* inbuf, const char* subj, const char
return(body); return(body);
} }
if(!strListIsEmpty(add_area) || !strListIsEmpty(del_area)) if(!strListIsEmpty(add_area) || !strListIsEmpty(del_area))
alter_areas(add_area,del_area,addr,name); alter_areas(add_area,del_area,nodecfg,name,rescan);
strListFree(&add_area); strListFree(&add_area);
strListFree(&del_area); strListFree(&del_area);
if(list)
netmail_arealist(AREALIST_ALL,addr,name);
if(query)
netmail_arealist(AREALIST_CONNECTED,addr,name);
return(NULL); return(NULL);
} }
/****************************************************************************** /******************************************************************************
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include "ini_file.h" #include "ini_file.h"
#define SBBSECHO_VERSION_MAJOR 3 #define SBBSECHO_VERSION_MAJOR 3
#define SBBSECHO_VERSION_MINOR 20 #define SBBSECHO_VERSION_MINOR 21
#define SBBSECHO_PRODUCT_CODE 0x12FF /* from http://ftsc.org/docs/ftscprod.013 */ #define SBBSECHO_PRODUCT_CODE 0x12FF /* from http://ftsc.org/docs/ftscprod.013 */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment