diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/app.c | 10 | ||||
-rw-r--r-- | main/channel.c | 21 |
2 files changed, 20 insertions, 11 deletions
diff --git a/main/app.c b/main/app.c index 757df2155..56ddff438 100644 --- a/main/app.c +++ b/main/app.c @@ -108,7 +108,7 @@ int ast_app_dtget(struct ast_channel *chan, const char *context, char *collect, * \param maxlen How many digits to read (maximum) * \param timeout set timeout to 0 for "standard" timeouts. Set timeout to -1 for * "ludicrous time" (essentially never times out) */ -int ast_app_getdata(struct ast_channel *c, const char *prompt, char *s, int maxlen, int timeout) +enum ast_getdata_result ast_app_getdata(struct ast_channel *c, const char *prompt, char *s, int maxlen, int timeout) { int res = 0, to, fto; char *front, *filename; @@ -145,10 +145,14 @@ int ast_app_getdata(struct ast_channel *c, const char *prompt, char *s, int maxl to = c->pbx ? c->pbx->dtimeout * 1000 : 2000; } res = ast_readstring(c, s, maxlen, to, fto, "#"); - if (!ast_strlen_zero(s)) + if (res == AST_GETDATA_EMPTY_END_TERMINATED) { return res; + } + if (!ast_strlen_zero(s)) { + return res; + } } - + return res; } diff --git a/main/channel.c b/main/channel.c index d788e79a2..e7b2c8626 100644 --- a/main/channel.c +++ b/main/channel.c @@ -3692,20 +3692,25 @@ int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, in d = ast_waitfordigit_full(c, to, audiofd, ctrlfd); } if (d < 0) - return -1; + return AST_GETDATA_FAILED; if (d == 0) { - s[pos]='\0'; - return 1; + s[pos] = '\0'; + return AST_GETDATA_TIMEOUT; } if (d == 1) { - s[pos]='\0'; - return 2; + s[pos] = '\0'; + return AST_GETDATA_INTERRUPTED; + } + if (strchr(enders, d) && (pos == 0)) { + s[pos] = '\0'; + return AST_GETDATA_EMPTY_END_TERMINATED; } - if (!strchr(enders, d)) + if (!strchr(enders, d)) { s[pos++] = d; + } if (strchr(enders, d) || (pos >= len)) { - s[pos]='\0'; - return 0; + s[pos] = '\0'; + return AST_GETDATA_COMPLETE; } to = timeout; } |