Skip to content

Commit 6867689

Browse files
committed
app_ccsa: Allow greater control at runtime.
* Allow outgoing Caller ID to be set at runtime. * Add CDR variable for storing outgoing number. * Allow disabling FRL upgrades at runtime.
1 parent 6fe10b1 commit 6867689

File tree

1 file changed

+113
-13
lines changed

1 file changed

+113
-13
lines changed

apps/app_ccsa.c

Lines changed: 113 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
<syntax>
6363
<parameter name="exten" required="true">
6464
<para>Destination to be called over CCSA (typically a 7 digit on-net or 11-digit off-net number).</para>
65+
<para>This will be made available as the variable <literal>CCSA_EXTEN</literal>, which can be used in configuration.</para>
6566
</parameter>
6667
<parameter name="ccsa" required="true">
6768
<para>CCSA profile to use for call.</para>
@@ -89,6 +90,17 @@
8990
<para>The caller will not be allowed to use routes with a minimum FRL exceeding this FRL, unless an
9091
authorization code is provided that has an FRL of at least the FRL required by the facility.</para>
9192
</option>
93+
<option name="i">
94+
<para>Force outgoing Caller ID to this value.</para>
95+
<para>This can be used to set the Caller ID on any outgoing attempts to a specific value.
96+
To always set the Caller ID to a specific value for a given route, the 'f' Dial option should
97+
instead be included in the <literal>dialstr</literal>configuration option.</para>
98+
<para>This option is mainly useful when the outgoing Caller ID for certain calls will sometimes,
99+
but not always, be forced to a particular value, avoiding the need to define two routes,
100+
one with the f option and one without.</para>
101+
<para>This option is incompatible with including a URL in the <literal>dialstr</literal> option,
102+
since this will simply append the f option to the dial string for each route.</para>
103+
</option>
92104
<option name="m">
93105
<para>Music on hold class for use with Off Hook Queuing.</para>
94106
</option>
@@ -108,6 +120,12 @@
108120
<para>Should be A (Flash Override), B (Flash), C (Immediate), or D (Priority), if specified.</para>
109121
<para>Default is no MLPP priority (Routine).</para>
110122
</option>
123+
<option name="u">
124+
<para>Disable FRL upgrades for this call. Normally, FRL may be upgraded if <literal>frl_allow_upgrade</literal>
125+
is set to yes. However, on certain calls, particularly for users without authorization codes,
126+
it may be pointless to allow for an FRL upgrade mid-call, in which case this can be disabled, and all routes
127+
with an FRL exceeding the callers will be silently skipped.</para>
128+
</option>
111129
</optionlist>
112130
</parameter>
113131
</syntax>
@@ -173,6 +191,15 @@
173191
<para>Hence, if TCM is required on an outgoing call, the dial string for a route should contain
174192
the TCM as the last routing digit as appropriate.</para>
175193
</variable>
194+
<variable name="CCSA_EXTEN">
195+
<para>The provided extension argument will be used to set this variable, which can then be used
196+
in configuration for the <literal>dialstr</literal> setting. Don't provide this as the extension
197+
argument itself!</para>
198+
</variable>
199+
<variable name="CCSA_CHANNEL">
200+
<para>Will be set to the current channel name, with inheritance, so that spawned channels can refer to it,
201+
if needed, for setting CDR variables.</para>
202+
</variable>
176203
</variablelist>
177204
</description>
178205
</application>
@@ -199,6 +226,16 @@
199226
<para>If provided, this (custom) CDR field will be filled with the effective (upgraded) FRL used for a call.</para>
200227
</description>
201228
</configOption>
229+
<configOption name="cdrvar_aiod">
230+
<synopsis>CDR field in which to store the Automatic Identified Outward Dialing number, if overridden</synopsis>
231+
<description>
232+
<para>If provided, this (custom) CDR field will be filled with the AIOD of a call, if overridden.
233+
This includes if the <literal>aiod</literal> option is set for a route or if the <literal>i</literal>
234+
option is used at runtime.</para>
235+
<para>This option is incompatible with including a URL in the <literal>dialstr</literal> option,
236+
since this will simply append the f option to the dial string for each route.</para>
237+
</description>
238+
</configOption>
202239
<configOption name="cdrvar_mlpp">
203240
<synopsis>CDR field in which to store the MLPP precedence for a call</synopsis>
204241
<description>
@@ -276,6 +313,20 @@
276313
for the facility, etc. The CCSA module does not inherently do any of this for you.</para>
277314
</description>
278315
</configOption>
316+
<configOption name="aiod">
317+
<synopsis>Override the Automatic Identified Outward Dialing</synopsis>
318+
<description>
319+
<para>Set the outgoing Caller ID on all calls using this route to this value, by default.
320+
This is useful if all calls using a particular facility are expected to have a certain number,
321+
as opposed to inheriting the caller's number, or for routes where the outgoing number
322+
cannot be set dynamically, such as a POTS line. In that case, you can set this to whatever
323+
the outgoing number will be, so that your CDRs can reflect that in the appropriate field.</para>
324+
<para>This functionality can also be accomplished by including the <literal>f</literal> dial option
325+
in the <literal>dialstr</literal> setting.
326+
However, this option will also set the <literal>cdrvar_aiod</literal> CDR variable to this value.</para>
327+
<para>This option can be overridden at runtime using the <literal>i</literal> option to <literal>CCSA</literal>.</para>
328+
</description>
329+
</configOption>
279330
<configOption name="threshold" default="0">
280331
<synopsis>Threshold of queued priority 3 calls at which it is unlikely an additional call would be able to queue successfully at priority 3 without timing out.</synopsis>
281332
<description>
@@ -367,6 +418,8 @@
367418
<synopsis>FRL Upgrades Allowed</synopsis>
368419
<description>
369420
<para>Whether callers can upgrade the FRL (Facility Restriction Level) for a call using an authorization code.</para>
421+
<para>The <literal>dialrecall</literal> indications frequencies are used by default for this prompt.
422+
This can be overridden, if desired, by defining the <literal>authcodeprompt</literal> indication in <literal>indications.conf</literal>.</para>
370423
</description>
371424
</configOption>
372425
<configOption name="auth_code_remote_allowed" default="no">
@@ -451,6 +504,7 @@ enum facility_type {
451504
static char cdrvar_frl[AST_MAX_CONTEXT];
452505
static char cdrvar_frl_req[AST_MAX_CONTEXT];
453506
static char cdrvar_frl_eff[AST_MAX_CONTEXT];
507+
static char cdrvar_aiod[AST_MAX_CONTEXT];
454508
static char cdrvar_mlpp[AST_MAX_CONTEXT];
455509
static char cdrvar_authcode[AST_MAX_CONTEXT];
456510
static char cdrvar_facility[AST_MAX_CONTEXT];
@@ -465,6 +519,7 @@ static void reset_cdr_var_names(void)
465519
CHRARRAY_ZERO(cdrvar_frl);
466520
CHRARRAY_ZERO(cdrvar_frl_req);
467521
CHRARRAY_ZERO(cdrvar_frl_eff);
522+
CHRARRAY_ZERO(cdrvar_aiod);
468523
CHRARRAY_ZERO(cdrvar_mlpp);
469524
CHRARRAY_ZERO(cdrvar_authcode);
470525
CHRARRAY_ZERO(cdrvar_facility);
@@ -479,6 +534,7 @@ struct route {
479534
char facility[AST_MAX_CONTEXT]; /*!< Facility Name */
480535
enum facility_type factype; /*!< Facility Type */
481536
char dialstr[PATH_MAX]; /*!< Dial string */
537+
char aiod[AST_MAX_CONTEXT]; /*!< AIOD override */
482538
char *devstate; /*!< Device state */
483539
unsigned int threshold; /*!< Threshold at which facility is "saturated" */
484540
unsigned int limit; /*!< Concurrent call limit */
@@ -1518,7 +1574,7 @@ static int get_auth_code(struct ast_channel *chan, char *buf, size_t len)
15181574
* This "PIN prompt tone" is 800/300/800 on/off/on of appx. 345+440 Hz (according to Audacity spectrum plot)
15191575
* However, the striking closeness to dial tone (350+440), plus the documentation of RDT,
15201576
* makes me suspect maybe it was 350+440 for 800/300/800, as opposed to 345+440 (recording could've had distortion).
1521-
* In fact, I'm quite positive it is 350+444.
1577+
* In fact, I'm quite positive it is 350+440.
15221578
*/
15231579
ts = ast_get_indication_tone(ast_channel_zone(chan), "authcodeprompt"); /* Doesn't exist by default. */
15241580
if (!ts) {
@@ -1644,13 +1700,26 @@ static int set_tcm(struct ast_channel *chan, int frl)
16441700

16451701
#define ccsa_set_result_val(chan, disp) if (chan) pbx_builtin_setvar_helper(chan, "CCSA_RESULT", disp)
16461702

1647-
static enum facility_disp ccsa_try_route(struct ast_channel *chan, int fd, int *have_mer, char try_preempt, const char *exten, const char *route, int *callerfrl, int *frl_upgraded, int mer_tone, int frl_allow_upgrade, int auth_code_remote_allowed, int remote, const char *auth_sub_context)
1703+
static int comma_count(const char *s)
1704+
{
1705+
int c = 0;
1706+
while (*s) {
1707+
if (*s == ',') {
1708+
c++;
1709+
}
1710+
s++;
1711+
}
1712+
return c;
1713+
}
1714+
1715+
static enum facility_disp ccsa_try_route(struct ast_channel *chan, int fd, int *have_mer, char try_preempt, const char *exten, const char *route, int *callerfrl, int *frl_upgraded, int mer_tone, int frl_allow_upgrade, int auth_code_remote_allowed, int remote, const char *auth_sub_context, const char *outgoing_clid)
16481716
{
16491717
int res;
16501718
struct route *f;
1651-
char dialstr[PATH_MAX];
1719+
char dialstr[PATH_MAX + 84]; /* Minimum needed to avoid snprintf truncation warnings */
16521720
char time[PATH_MAX];
16531721
char facility[AST_MAX_CONTEXT];
1722+
const char *aiod;
16541723
int frl, mer, busyiscongestion, limit;
16551724

16561725
dialstr[0] = time[0] = '\0';
@@ -1666,15 +1735,25 @@ static enum facility_disp ccsa_try_route(struct ast_channel *chan, int fd, int *
16661735
mer = f->mer;
16671736
busyiscongestion = f->busyiscongestion;
16681737
limit = f->limit;
1669-
ast_copy_string(dialstr, f->dialstr, sizeof(dialstr));
1738+
16701739
ast_copy_string(time, f->time, sizeof(time));
16711740
ast_copy_string(facility, f->facility, sizeof(facility));
16721741
AST_RWLIST_UNLOCK(&routes);
16731742

1674-
if (ast_strlen_zero(dialstr)) {
1743+
if (ast_strlen_zero(f->dialstr)) {
16751744
ast_log(LOG_WARNING, "Route %s has no dial string?\n", route);
16761745
return FACILITY_DISP_FAILURE;
16771746
}
1747+
aiod = S_OR(outgoing_clid, f->aiod);
1748+
if (!ast_strlen_zero(aiod)) {
1749+
int commas = comma_count(f->dialstr);
1750+
/* This is concatenated to the dial string, so it is assumed a URL is not present in the dialstr */
1751+
cdr_set_var(chan, cdrvar_aiod, aiod);
1752+
snprintf(dialstr, sizeof(dialstr), "%s%s%sf(%s)", f->dialstr, commas <= 0 ? "," : "", commas <= 1 ? "," : "", aiod);
1753+
} else {
1754+
cdr_set_var(chan, cdrvar_aiod, ""); /* Reset in case it was already set */
1755+
ast_copy_string(dialstr, f->dialstr, sizeof(dialstr));
1756+
}
16781757

16791758
ast_debug(4, "Route %s: Limit: %d, FRL: %d, MER: %d, Busy Is Cong.: %d, DSTR: %s, Time: %s\n", route, limit, frl, mer, busyiscongestion, dialstr, time);
16801759

@@ -1690,7 +1769,7 @@ static enum facility_disp ccsa_try_route(struct ast_channel *chan, int fd, int *
16901769
cdr_set_var(chan, cdrvar_route, route);
16911770
}
16921771

1693-
if (frl > *callerfrl && *frl_upgraded == -2) { /* If FRL upgraded allowed (and haven't done yet), prompt for authorization code. Otherwise, skip. */
1772+
if (frl > *callerfrl && *frl_upgraded == -2) { /* If FRL upgrade allowed (and haven't done yet), prompt for authorization code. Otherwise, skip. */
16941773
*frl_upgraded = -1; /* At this point, mark that we've tried, at least, as we shouldn't prompt for authorization code more than once. */
16951774
cdr_set_var_int(chan, cdrvar_frl_req, frl);
16961775
cdr_set_var_int(chan, cdrvar_frl, *callerfrl);
@@ -1801,6 +1880,7 @@ static enum facility_disp ccsa_try_route(struct ast_channel *chan, int fd, int *
18011880
ast_log(LOG_ERROR, "Failed to add call to call list, aborting\n");
18021881
return FACILITY_DISP_FAILURE;
18031882
}
1883+
pbx_builtin_setvar_helper(chan, "CCSA_EXTEN", exten);
18041884
res = ast_pbx_exec_application(chan, "Dial", dialstr); /* This performs variable substitution, so we're good. */
18051885
preempted = call->preempted;
18061886
call_free(call, 1); /* Pop from call queue */
@@ -1853,7 +1933,8 @@ static enum facility_disp ccsa_try_route(struct ast_channel *chan, int fd, int *
18531933
/*! \param chan Channel, if running for real */
18541934
/*! \param fd CLI fd, if simulating */
18551935
/*! \param exten Destination, if running for real */
1856-
static int ccsa_run(struct ast_channel *chan, int fd, const char *exten, const char *ccsa, const char *faclist, const char *musicclass, int remote, int cbq, int ohq, int priority, char preempt, int callerfrl)
1936+
static int ccsa_run(struct ast_channel *chan, int fd, const char *exten, const char *ccsa, const char *faclist, const char *musicclass, int remote, int cbq, int ohq, int priority, char preempt,
1937+
int callerfrl, int no_frl_upgrade, const char *outgoing_clid)
18571938
{
18581939
enum facility_disp fres;
18591940
char *route, *routes;
@@ -1891,6 +1972,9 @@ static int ccsa_run(struct ast_channel *chan, int fd, const char *exten, const c
18911972
if (remote && auth_code_remote_allowed) {
18921973
frl_allow_upgrade = 0; /* If upgrades not allowed for remote access, don't allow FRL upgrades */
18931974
}
1975+
if (no_frl_upgrade) {
1976+
frl_allow_upgrade = 0;
1977+
}
18941978

18951979
extension_len = c->extension_len;
18961980
queue_promo_timer = c->queue_promo_timer;
@@ -1968,7 +2052,7 @@ static int ccsa_run(struct ast_channel *chan, int fd, const char *exten, const c
19682052
continue; /* Allow for empty routes so that using IFTIME in dialplan resolving to empty route is OK. */
19692053
}
19702054
total_attempted++;
1971-
fres = ccsa_try_route(chan, fd, &have_mer, try_preempt, exten, route, &callerfrl, &frl_upgraded, mer_tone, frl_allow_upgrade, auth_code_remote_allowed, remote, auth_sub_context);
2055+
fres = ccsa_try_route(chan, fd, &have_mer, try_preempt, exten, route, &callerfrl, &frl_upgraded, mer_tone, frl_allow_upgrade, auth_code_remote_allowed, remote, auth_sub_context, outgoing_clid);
19722056
switch (fres) {
19732057
case FACILITY_DISP_HANGUP:
19742058
return -1;
@@ -2027,7 +2111,7 @@ static int ccsa_run(struct ast_channel *chan, int fd, const char *exten, const c
20272111
continue; /* Allow for empty facilities so that using IFTIME in dialplan resolving to empty route is OK. */
20282112
}
20292113
total_attempted++;
2030-
fres = ccsa_try_route(chan, fd, &have_mer, try_preempt, exten, route, &callerfrl, &frl_upgraded, mer_tone, frl_allow_upgrade, auth_code_remote_allowed, remote, auth_sub_context);
2114+
fres = ccsa_try_route(chan, fd, &have_mer, try_preempt, exten, route, &callerfrl, &frl_upgraded, mer_tone, frl_allow_upgrade, auth_code_remote_allowed, remote, auth_sub_context, outgoing_clid);
20312115
switch (fres) {
20322116
case FACILITY_DISP_HANGUP:
20332117
return -1;
@@ -2149,7 +2233,7 @@ static int ccsa_run(struct ast_channel *chan, int fd, const char *exten, const c
21492233
}
21502234
if (res) {
21512235
/* Hopefully, we didn't lose our spot just now due to a race condition... */
2152-
fres = ccsa_try_route(chan, fd, &have_mer, try_preempt, exten, route, &callerfrl, &frl_upgraded, mer_tone, frl_allow_upgrade, auth_code_remote_allowed, remote, auth_sub_context);
2236+
fres = ccsa_try_route(chan, fd, &have_mer, try_preempt, exten, route, &callerfrl, &frl_upgraded, mer_tone, frl_allow_upgrade, auth_code_remote_allowed, remote, auth_sub_context, outgoing_clid);
21532237
switch (fres) {
21542238
case FACILITY_DISP_HANGUP:
21552239
return -1;
@@ -2183,7 +2267,7 @@ static int ccsa_run(struct ast_channel *chan, int fd, const char *exten, const c
21832267
continue; /* Allow for empty facilities so that using IFTIME in dialplan resolving to empty route is OK. */
21842268
}
21852269
total_attempted++;
2186-
fres = ccsa_try_route(chan, fd, &have_mer, try_preempt, exten, route, &callerfrl, &frl_upgraded, mer_tone, frl_allow_upgrade, auth_code_remote_allowed, remote, auth_sub_context);
2270+
fres = ccsa_try_route(chan, fd, &have_mer, try_preempt, exten, route, &callerfrl, &frl_upgraded, mer_tone, frl_allow_upgrade, auth_code_remote_allowed, remote, auth_sub_context, outgoing_clid);
21872271
switch (fres) {
21882272
case FACILITY_DISP_HANGUP:
21892273
return -1;
@@ -2346,6 +2430,8 @@ enum {
23462430
OPT_MUSICCLASS = (1 << 4), /* Music On Hold */
23472431
OPT_FRL = (1 << 5), /* Facility Restriction Level */
23482432
OPT_REMOTE_ACCESS = (1 << 6), /* Remote Access */
2433+
OPT_FORCE_CALLERID = (1 << 7), /* Force outgoing Caller ID */
2434+
OPT_NO_FRL_UPGRADE = (1 << 8), /* Disallow FRL upgrades */
23492435
};
23502436

23512437
enum {
@@ -2355,6 +2441,7 @@ enum {
23552441
OPT_ARG_PREEMPT,
23562442
OPT_ARG_MUSICCLASS,
23572443
OPT_ARG_FRL,
2444+
OPT_ARG_FORCE_CALLERID,
23582445
/* note: this entry _MUST_ be the last one in the enum */
23592446
OPT_ARG_ARRAY_SIZE,
23602447
};
@@ -2363,10 +2450,12 @@ AST_APP_OPTIONS(app_opts,{
23632450
AST_APP_OPTION('a', OPT_REMOTE_ACCESS),
23642451
AST_APP_OPTION_ARG('c', OPT_CBQ, OPT_ARG_CBQ),
23652452
AST_APP_OPTION_ARG('f', OPT_FRL, OPT_ARG_FRL),
2453+
AST_APP_OPTION_ARG('i', OPT_FORCE_CALLERID, OPT_ARG_FORCE_CALLERID),
23662454
AST_APP_OPTION_ARG('m', OPT_MUSICCLASS, OPT_ARG_MUSICCLASS),
23672455
AST_APP_OPTION_ARG('o', OPT_OHQ, OPT_ARG_OHQ),
23682456
AST_APP_OPTION_ARG('p', OPT_PRIORITY, OPT_ARG_PRIORITY),
23692457
AST_APP_OPTION_ARG('r', OPT_PREEMPT, OPT_ARG_PREEMPT),
2458+
AST_APP_OPTION('u', OPT_NO_FRL_UPGRADE),
23702459
});
23712460

23722461
#define CCSA_ARG_REQUIRE(var, name) { \
@@ -2394,6 +2483,8 @@ static int ccsa_exec(struct ast_channel *chan, const char *data)
23942483
int remote = 0, priority = 1, callerfrl = 0;
23952484
const char *faclist;
23962485
const char *musicclass = NULL;
2486+
const char *outgoing_clid = NULL;
2487+
int no_frl_upgrade = 0;
23972488

23982489
CCSA_ARG_REQUIRE(data, "an argument");
23992490

@@ -2447,12 +2538,16 @@ static int ccsa_exec(struct ast_channel *chan, const char *data)
24472538
callerfrl = 0;
24482539
}
24492540
}
2541+
if (ast_test_flag(&opts, OPT_FORCE_CALLERID) && !ast_strlen_zero(opt_args[OPT_ARG_FORCE_CALLERID])) {
2542+
outgoing_clid = opt_args[OPT_ARG_FORCE_CALLERID];
2543+
}
24502544
if (ast_test_flag(&opts, OPT_PREEMPT) && !ast_strlen_zero(opt_args[OPT_ARG_PREEMPT])) {
24512545
preempt = *opt_args[OPT_ARG_PREEMPT];
24522546
}
24532547
if (ast_test_flag(&opts, OPT_MUSICCLASS) && !ast_strlen_zero(opt_args[OPT_ARG_MUSICCLASS])) {
24542548
musicclass = opt_args[OPT_ARG_MUSICCLASS];
24552549
}
2550+
no_frl_upgrade = ast_test_flag(&opts, OPT_NO_FRL_UPGRADE) ? 1 : 0;
24562551
}
24572552

24582553
res = 0;
@@ -2462,7 +2557,8 @@ static int ccsa_exec(struct ast_channel *chan, const char *data)
24622557
return -1;
24632558
}
24642559

2465-
return ccsa_run(chan, -1, args.exten, args.ccsa, faclist, musicclass, remote, cbq, ohq, priority, preempt, callerfrl);
2560+
pbx_builtin_setvar_helper(chan, "__CCSA_CHANNEL", ast_channel_name(chan));
2561+
return ccsa_run(chan, -1, args.exten, args.ccsa, faclist, musicclass, remote, cbq, ohq, priority, preempt, callerfrl, no_frl_upgrade, outgoing_clid);
24662562
}
24672563

24682564
static char *handle_simulate_route(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
@@ -2525,7 +2621,7 @@ static char *handle_simulate_route(struct ast_cli_entry *e, int cmd, struct ast_
25252621
return CLI_FAILURE;
25262622
}
25272623

2528-
ccsa_run(NULL, a->fd, NULL, a->argv[3], faclist, NULL, 0, cbq, ohq, 1, 0, callerfrl);
2624+
ccsa_run(NULL, a->fd, NULL, a->argv[3], faclist, NULL, 0, cbq, ohq, 1, 0, callerfrl, 0, NULL);
25292625

25302626
return CLI_SUCCESS;
25312627
#undef FORMAT
@@ -2951,6 +3047,8 @@ static int ccsa_reload(int reload)
29513047
ast_copy_string(cdrvar_frl_req, var->value, sizeof(cdrvar_frl_req));
29523048
} else if (!strcasecmp(var->name, "cdrvar_frl_eff") && !ast_strlen_zero(var->value)) {
29533049
ast_copy_string(cdrvar_frl_eff, var->value, sizeof(cdrvar_frl_eff));
3050+
} else if (!strcasecmp(var->name, "cdrvar_aiod") && !ast_strlen_zero(var->value)) {
3051+
ast_copy_string(cdrvar_aiod, var->value, sizeof(cdrvar_aiod));
29543052
} else if (!strcasecmp(var->name, "cdrvar_mlpp") && !ast_strlen_zero(var->value)) {
29553053
ast_copy_string(cdrvar_mlpp, var->value, sizeof(cdrvar_mlpp));
29563054
} else if (!strcasecmp(var->name, "cdrvar_authcode") && !ast_strlen_zero(var->value)) {
@@ -3027,6 +3125,8 @@ static int ccsa_reload(int reload)
30273125
f->busyiscongestion = ast_true(var->value);
30283126
} else if (!strcasecmp(var->name, "frl") && !ast_strlen_zero(var->value)) {
30293127
f->frl = atoi(var->value);
3128+
} else if (!strcasecmp(var->name, "aiod") && !ast_strlen_zero(var->value)) {
3129+
ast_copy_string(f->aiod, var->value, sizeof(f->aiod));
30303130
} else if (!strcasecmp(var->name, "time") && !ast_strlen_zero(var->value)) {
30313131
ast_copy_string(f->time, var->value, sizeof(f->time));
30323132
} else if (!strcasecmp(var->name, "threshold") && !ast_strlen_zero(var->value)) {

0 commit comments

Comments
 (0)