diff --git a/apps/app_disa.c b/apps/app_disa.c index 1377adc736dad505d0c2db144226b042426d8864..cb43a45e84103aaf6512a1c64a76f05de767ac81 100755 --- a/apps/app_disa.c +++ b/apps/app_disa.c @@ -7,6 +7,8 @@ * * Jim Dixon <jim@lambdatel.com> * + * Made only slightly more sane by Mark Spencer <markster@digium.com> + * * This program is free software, distributed under the terms of * the GNU General Public License */ @@ -179,7 +181,7 @@ static int disa_exec(struct ast_channel *chan, void *data) { ast_log(LOG_DEBUG,"DISA %s entry timeout on chan %s\n", ((k) ? "extension" : "password"),chan->name); - goto reorder; + break; } if ((res = ast_waitfor(chan, -1) < 0)) { ast_log(LOG_DEBUG, "Waitfor returned %d\n", res); @@ -296,66 +298,71 @@ static int disa_exec(struct ast_channel *chan, void *data) exten[i] = 0; if (!k) continue; /* if getting password, continue doing it */ /* if this exists */ - if (ast_exists_extension(chan,ourcontext,exten,1, chan->callerid)) - { - if (ourcallerid && *ourcallerid) - { - if (chan->callerid) free(chan->callerid); - chan->callerid = strdup(ourcallerid); - } - strcpy(chan->exten,exten); - strcpy(chan->context,ourcontext); - strcpy(chan->accountcode,acctcode); - chan->priority = 0; - ast_cdr_init(chan->cdr,chan); - LOCAL_USER_REMOVE(u); - return 0; - } + /* if can do some more, do it */ - if (ast_canmatch_extension(chan,ourcontext,exten,1, chan->callerid)) continue; + if (!ast_matchmore_extension(chan,ourcontext,exten,1, chan->callerid)) + break; + } + } + + if (k && ast_exists_extension(chan,ourcontext,exten,1, chan->callerid)) + { + /* We're authenticated and have a valid extension */ + if (ourcallerid && *ourcallerid) + { + if (chan->callerid) free(chan->callerid); + chan->callerid = strdup(ourcallerid); } + strcpy(chan->exten,exten); + strcpy(chan->context,ourcontext); + strcpy(chan->accountcode,acctcode); + chan->priority = 0; + ast_cdr_init(chan->cdr,chan); + LOCAL_USER_REMOVE(u); + return 0; + } + reorder: - /* something is invalid, give em reorder forever */ - x = 0; - k = 0; /* k = 0 means busy tone, k = 1 means silence) */ - i = 0; /* Number of samples we've done */ - for(;;) - { - if (ast_waitfor(chan, -1) < 0) - break; - f = ast_read(chan); - if (!f) - break; - if (f->frametype == AST_FRAME_VOICE) { - wf.frametype = AST_FRAME_VOICE; - wf.subclass = AST_FORMAT_ULAW; - wf.offset = AST_FRIENDLY_OFFSET; - wf.mallocd = 0; - wf.data = tone_block; - wf.datalen = f->datalen; - wf.samples = wf.datalen; - if (k) - memset(tone_block, 0x7f, wf.datalen); - else - make_tone_block(tone_block,480.0, 620.0,wf.datalen, &x); - i += wf.datalen / 8; - if (i > 250) { - i = 0; - k = !k; - } - if (ast_write(chan, &wf)) - { - ast_log(LOG_WARNING, "DISA Failed to write frame on %s\n",chan->name); - LOCAL_USER_REMOVE(u); - return -1; - } + /* something is invalid, give em reorder forever */ + x = 0; + k = 0; /* k = 0 means busy tone, k = 1 means silence) */ + i = 0; /* Number of samples we've done */ + for(;;) + { + if (ast_waitfor(chan, -1) < 0) + break; + f = ast_read(chan); + if (!f) + break; + if (f->frametype == AST_FRAME_VOICE) { + wf.frametype = AST_FRAME_VOICE; + wf.subclass = AST_FORMAT_ULAW; + wf.offset = AST_FRIENDLY_OFFSET; + wf.mallocd = 0; + wf.data = tone_block; + wf.datalen = f->datalen; + wf.samples = wf.datalen; + if (k) + memset(tone_block, 0x7f, wf.datalen); + else + make_tone_block(tone_block,480.0, 620.0,wf.datalen, &x); + i += wf.datalen / 8; + if (i > 250) { + i = 0; + k = !k; + } + if (ast_write(chan, &wf)) + { + ast_log(LOG_WARNING, "DISA Failed to write frame on %s\n",chan->name); + LOCAL_USER_REMOVE(u); + return -1; } - ast_frfree(f); } - LOCAL_USER_REMOVE(u); - return -1; + ast_frfree(f); } + LOCAL_USER_REMOVE(u); + return -1; } int unload_module(void) @@ -381,7 +388,7 @@ int usecount(void) return res; } -char *key() +char *key(void) { return ASTERISK_GPL_KEY; } diff --git a/apps/app_voicemail2.c b/apps/app_voicemail2.c index 9f7a4ff4fb26b344c52dfef6369965a6d09509d7..bba7b31d2197400fb32898ec879ed7ab053b295d 100755 --- a/apps/app_voicemail2.c +++ b/apps/app_voicemail2.c @@ -1894,11 +1894,13 @@ static void close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu) if (vms->lastmsg > -1) { /* Get the deleted messages fixed */ vms->curmsg = -1; - for (x=0;x<=vms->lastmsg;x++) { + for (x=0;x < MAXMSG;x++) { if (!vms->deleted[x] && (strcasecmp(vms->curbox, "INBOX") || !vms->heard[x])) { /* Save this message. It's not in INBOX or hasn't been heard */ - vms->curmsg++; make_file(vms->fn, sizeof(vms->fn), vms->curdir, x); + if (ast_fileexists(vms->fn, NULL, NULL) < 1) + break; + vms->curmsg++; make_file(vms->fn2, sizeof(vms->fn2), vms->curdir, vms->curmsg); if (strcmp(vms->fn, vms->fn2)) { snprintf(txt, sizeof(txt), "%s.txt", vms->fn); @@ -1911,8 +1913,10 @@ static void close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu) save_to_folder(vms->curdir, x, vmu->context, vms->username, 1); } } - for (x = vms->curmsg + 1; x<=vms->lastmsg; x++) { + for (x = vms->curmsg + 1; x <= MAXMSG; x++) { make_file(vms->fn, sizeof(vms->fn), vms->curdir, x); + if (ast_fileexists(vms->fn, NULL, NULL) < 1) + break; snprintf(txt, sizeof(txt), "%s.txt", vms->fn); ast_filedelete(vms->fn, NULL); unlink(txt);