mirror of https://github.com/wb2osz/direwolf.git
Make Budlist and type filter look into 3rd party
This commit is contained in:
parent
55969617ea
commit
2a7bc246f2
|
@ -153,7 +153,7 @@ static void next_token (pfstate_t *pf);
|
||||||
static void print_error (pfstate_t *pf, char *msg);
|
static void print_error (pfstate_t *pf, char *msg);
|
||||||
|
|
||||||
static int filt_bodgu (pfstate_t *pf, char *pattern);
|
static int filt_bodgu (pfstate_t *pf, char *pattern);
|
||||||
static int filt_t (pfstate_t *pf);
|
static int filt_t (pfstate_t *pf, char * typeChar);
|
||||||
static int filt_r (pfstate_t *pf, char *sdist);
|
static int filt_r (pfstate_t *pf, char *sdist);
|
||||||
static int filt_s (pfstate_t *pf);
|
static int filt_s (pfstate_t *pf);
|
||||||
static int filt_i (pfstate_t *pf);
|
static int filt_i (pfstate_t *pf);
|
||||||
|
@ -200,7 +200,6 @@ int pfilter (int from_chan, int to_chan, char *filter, packet_t pp, int is_aprs)
|
||||||
pfstate_t pfstate;
|
pfstate_t pfstate;
|
||||||
char *p;
|
char *p;
|
||||||
int result;
|
int result;
|
||||||
char * infop = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
assert (from_chan >= 0 && from_chan <= MAX_CHANS);
|
assert (from_chan >= 0 && from_chan <= MAX_CHANS);
|
||||||
|
@ -233,21 +232,6 @@ int pfilter (int from_chan, int to_chan, char *filter, packet_t pp, int is_aprs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) ax25_get_info (pp, (unsigned char **)(&infop));
|
|
||||||
assert (infop != NULL);
|
|
||||||
if (*infop == '}') {
|
|
||||||
// We have a 3d party packet, dig inside it to get the actual type.
|
|
||||||
packet_t pp_payload = ax25_from_text ((char*)infop+1, 0);
|
|
||||||
if (pp_payload == NULL) {
|
|
||||||
print_error (&pfstate, "Invalid third party payload\n");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
result = pfilter(from_chan, to_chan, filter, pp_payload, is_aprs);
|
|
||||||
ax25_delete(pp_payload);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
pfstate.pp = pp;
|
pfstate.pp = pp;
|
||||||
pfstate.is_aprs = is_aprs;
|
pfstate.is_aprs = is_aprs;
|
||||||
|
|
||||||
|
@ -564,13 +548,11 @@ static int parse_filter_spec (pfstate_t *pf)
|
||||||
|
|
||||||
else if (pf->token_str[0] == 'b' && ispunct(pf->token_str[1])) {
|
else if (pf->token_str[0] == 'b' && ispunct(pf->token_str[1])) {
|
||||||
/* Budlist - source address */
|
/* Budlist - source address */
|
||||||
char addr[AX25_MAX_ADDR_LEN];
|
result = filt_bodgu (pf, pf->decoded.g_src);
|
||||||
ax25_get_addr_with_ssid (pf->pp, AX25_SOURCE, addr);
|
|
||||||
result = filt_bodgu (pf, addr);
|
|
||||||
|
|
||||||
if (s_debug >= 2) {
|
if (s_debug >= 2) {
|
||||||
text_color_set(DW_COLOR_DEBUG);
|
text_color_set(DW_COLOR_DEBUG);
|
||||||
dw_printf (" %s returns %s for %s\n", pf->token_str, bool2text(result), addr);
|
dw_printf (" %s returns %s for %s\n", pf->token_str, bool2text(result), pf->decoded.g_src);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -688,15 +670,12 @@ static int parse_filter_spec (pfstate_t *pf)
|
||||||
/* t - type: position, weather, etc. */
|
/* t - type: position, weather, etc. */
|
||||||
|
|
||||||
else if (pf->token_str[0] == 't' && ispunct(pf->token_str[1])) {
|
else if (pf->token_str[0] == 't' && ispunct(pf->token_str[1])) {
|
||||||
|
char typeChar = 0;
|
||||||
result = filt_t (pf);
|
result = filt_t (pf, &typeChar);
|
||||||
|
|
||||||
if (s_debug >= 2) {
|
if (s_debug >= 2) {
|
||||||
char *infop = NULL;
|
|
||||||
(void) ax25_get_info (pf->pp, (unsigned char **)(&infop));
|
|
||||||
|
|
||||||
text_color_set(DW_COLOR_DEBUG);
|
text_color_set(DW_COLOR_DEBUG);
|
||||||
dw_printf (" %s returns %s for %c data type indicator\n", pf->token_str, bool2text(result), *infop);
|
dw_printf (" %s returns %s for %c data type indicator\n", pf->token_str, bool2text(result), typeChar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -874,18 +853,33 @@ int is_telem_metadata (char *infop)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int filt_t (pfstate_t *pf)
|
static int filt_t (pfstate_t *pf, char * typeChar)
|
||||||
{
|
{
|
||||||
char src[AX25_MAX_ADDR_LEN];
|
char src[AX25_MAX_ADDR_LEN];
|
||||||
char *infop = NULL;
|
char *infop = NULL;
|
||||||
char *f;
|
char *f;
|
||||||
|
int isThirdParty = 0;
|
||||||
|
|
||||||
memset (src, 0, sizeof(src));
|
memset (src, 0, sizeof(src));
|
||||||
ax25_get_addr_with_ssid (pf->pp, AX25_SOURCE, src);
|
ax25_get_addr_with_ssid (pf->pp, AX25_SOURCE, src);
|
||||||
(void) ax25_get_info (pf->pp, (unsigned char **)(&infop));
|
(void) ax25_get_info (pf->pp, (unsigned char **)(&infop));
|
||||||
|
|
||||||
|
if (*infop == '}') {
|
||||||
|
// We have a 3d party packet, dig inside it to get the actual type.
|
||||||
|
packet_t pp_payload = ax25_from_text ((char*)infop+1, 0);
|
||||||
|
if (pp_payload == NULL) {
|
||||||
|
print_error (pf, "Invalid third party payload\n");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
(void) ax25_get_info (pf->pp, (unsigned char **)(&infop));
|
||||||
|
ax25_delete(pp_payload);
|
||||||
|
isThirdParty = 1;
|
||||||
|
}
|
||||||
|
|
||||||
assert (infop != NULL);
|
assert (infop != NULL);
|
||||||
|
|
||||||
|
*typeChar = *infop;
|
||||||
|
|
||||||
for (f = pf->token_str + 2; *f != '\0'; f++) {
|
for (f = pf->token_str + 2; *f != '\0'; f++) {
|
||||||
switch (*f) {
|
switch (*f) {
|
||||||
|
|
||||||
|
@ -937,7 +931,8 @@ static int filt_t (pfstate_t *pf)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'h': /* third party Header - my extension */
|
case 'h': /* third party Header - my extension */
|
||||||
if (*infop == '}') return (1);
|
*typeChar = '}';
|
||||||
|
return (isThirdParty);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'w': /* Weather */
|
case 'w': /* Weather */
|
||||||
|
|
Loading…
Reference in New Issue