From 63ff35280893f84fca60ea5944659edadb21334f Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Thu, 30 Jan 2003 15:03:20 +0000 Subject: Version 0.3.0 from FTP git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@593 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_voicemail.c | 322 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 221 insertions(+), 101 deletions(-) (limited to 'apps/app_voicemail.c') diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 2d77f891b..0646b0601 100755 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,7 @@ #include #include "../asterisk.h" +#include "../astconf.h" #define COMMAND_TIMEOUT 5000 @@ -95,8 +97,10 @@ static char *synopsis_vmain = "Enter voicemail system"; static char *descrip_vmain = -" VoiceMailMain(): Enters the main voicemail system for the checking of voicemail. Returns\n" -" -1 if the user hangs up or 0 otherwise.\n"; +" VoiceMailMain(): Enters the main voicemail system for the checking of voicemail. The mailbox\n" +"can be passed as the option, which will stop the voicemail system from prompting the user\n" +"for the mailbox. If the mailbox is preceeded by 's' then the passsword check will be skipped.\n" +"Returns -1 if the user hangs up or 0 otherwise.\n"; /* Leave a message */ static char *app = "VoiceMail"; @@ -110,7 +114,7 @@ LOCAL_USER_DECL; static int make_dir(char *dest, int len, char *ext, char *mailbox) { - return snprintf(dest, len, "%s/%s/%s", VM_SPOOL_DIR, ext, mailbox); + return snprintf(dest, len, "%s/%s/%s/%s", (char *)ast_config_AST_SPOOL_DIR,"vm", ext, mailbox); } static int make_file(char *dest, int len, char *dir, int num) @@ -127,9 +131,13 @@ static int vm_change_password(char *username, char *password, char *newpassword) FILE *configout; char inbuf[256]; char orig[256]; + char tmpin[AST_CONFIG_MAX_PATH]; + char tmpout[AST_CONFIG_MAX_PATH]; char *user, *pass, *rest, *trim; - configin = fopen("/etc/asterisk/voicemail.conf","r"); - configout = fopen("/etc/asterisk/voicemail.conf.new","w+"); + snprintf((char *)tmpin, sizeof(tmpin)-1, "%s/voicemail.conf",(char *)ast_config_AST_CONFIG_DIR); + snprintf((char *)tmpout, sizeof(tmpout)-1, "%s/voicemail.conf.new",(char *)ast_config_AST_CONFIG_DIR); + configin = fopen((char *)tmpin,"r"); + configout = fopen((char *)tmpout,"w+"); while (!feof(configin)) { /* Read in the line */ @@ -185,38 +193,11 @@ static int vm_change_password(char *username, char *password, char *newpassword) fclose(configin); fclose(configout); - unlink("/etc/asterisk/voicemail.conf"); - rename("/etc/asterisk/voicemail.conf.new","/etc/asterisk/voicemail.conf"); + unlink((char *)tmpin); + rename((char *)tmpout,(char *)tmpin); return(1); } -#if 0 - -static int announce_message(struct ast_channel *chan, char *dir, int msgcnt) -{ - char *fn; - int res; - - res = ast_streamfile(chan, "vm-message", chan->language); - if (!res) { - res = ast_waitstream(chan, AST_DIGIT_ANY); - if (!res) { - res = ast_say_number(chan, msgcnt+1, chan->language); - if (!res) { - fn = get_fn(dir, msgcnt); - if (fn) { - res = ast_streamfile(chan, fn, chan->language); - free(fn); - } - } - } - } - if (res < 0) - ast_log(LOG_WARNING, "Unable to announce message\n"); - return res; -} -#endif - static int inbuf(FILE *fi) { @@ -351,13 +332,17 @@ static int sendmail(char *srcemail, char *email, char *name, int msgnum, char *m char dur[256]; time_t t; struct tm *tm; + char *astattach; + struct ast_config *cfg; p = popen(SENDMAIL, "w"); - + cfg = ast_load(VOICEMAIL_CONFIG); + if (!(astattach = ast_variable_retrieve(cfg, "general", "attach"))) + astattach = "yes"; if (p) { + gethostname(host, sizeof(host)); if (strchr(srcemail, '@')) strncpy(who, srcemail, sizeof(who)-1); else { - gethostname(host, sizeof(host)); snprintf(who, sizeof(who), "%s@%s", srcemail, host); } snprintf(dur, sizeof(dur), "%ld:%02ld", duration / 60, duration % 60); @@ -370,30 +355,32 @@ static int sendmail(char *srcemail, char *email, char *name, int msgnum, char *m fprintf(p, "Subject: [PBX]: New message %d in mailbox %s\n", msgnum, mailbox); fprintf(p, "Message-ID: \n", msgnum, mailbox, getpid(), host); fprintf(p, "MIME-Version: 1.0\n"); + if (ast_true(astattach)) { + // Something unique. + snprintf(bound, sizeof(bound), "Boundary=%d%s%d", msgnum, mailbox, getpid()); - // Something unique. - snprintf(bound, sizeof(bound), "Boundary=%d%s%d", msgnum, mailbox, getpid()); + fprintf(p, "Content-Type: MULTIPART/MIXED; BOUNDARY=\"%s\"\n\n\n", bound); - fprintf(p, "Content-Type: MULTIPART/MIXED; BOUNDARY=\"%s\"\n\n\n", bound); - - fprintf(p, "--%s\n", bound); - fprintf(p, "Content-Type: TEXT/PLAIN; charset=US-ASCII\n\n"); - strftime(date, sizeof(date), "%A, %B %d, %Y at %r", tm); - fprintf(p, "Dear %s:\n\n\tJust wanted to let you know you were just left a %s long message (number %d)\n" + fprintf(p, "--%s\n", bound); + } + fprintf(p, "Content-Type: TEXT/PLAIN; charset=US-ASCII\n\n"); + strftime(date, sizeof(date), "%A, %B %d, %Y at %r", tm); + fprintf(p, "Dear %s:\n\n\tJust wanted to let you know you were just left a %s long message (number %d)\n" "in mailbox %s from %s, on %s so you might\n" "want to check it when you get a chance. Thanks!\n\n\t\t\t\t--Asterisk\n\n", name, - dur, msgnum, mailbox, (callerid ? callerid : "an unknown caller"), date); - - fprintf(p, "--%s\n", bound); - fprintf(p, "Content-Type: audio/x-wav; name=\"msg%04d\"\n", msgnum); - fprintf(p, "Content-Transfer-Encoding: BASE64\n"); - fprintf(p, "Content-Description: Voicemail sound attachment.\n"); - fprintf(p, "Content-Disposition: attachment; filename=\"msg%04d.%s\"\n\n", msgnum, format); - - snprintf(fname, sizeof(fname), "%s.%s", attach, format); - base_encode(fname, p); - fprintf(p, "\n\n--%s--\n.\n", bound); + dur, msgnum, mailbox, (callerid ? callerid : "an unknown caller"), date); + if (ast_true(astattach)) { + fprintf(p, "--%s\n", bound); + fprintf(p, "Content-Type: audio/x-wav; name=\"msg%04d.%s\"\n", msgnum, format); + fprintf(p, "Content-Transfer-Encoding: BASE64\n"); + fprintf(p, "Content-Description: Voicemail sound attachment.\n"); + fprintf(p, "Content-Disposition: attachment; filename=\"msg%04d.%s\"\n\n", msgnum, format); + + snprintf(fname, sizeof(fname), "%s.%s", attach, format); + base_encode(fname, p); + fprintf(p, "\n\n--%s--\n.\n", bound); + } pclose(p); } else { ast_log(LOG_WARNING, "Unable to launch '%s'\n", SENDMAIL); @@ -411,7 +398,7 @@ static int get_date(char *s, int len) return strftime(s, len, "%a %b %e %r %Z %Y", tm); } -static int invent_message(struct ast_channel *chan, char *ext, int busy) +static int invent_message(struct ast_channel *chan, char *ext, int busy, char *ecodes) { int res; char fn[256]; @@ -420,17 +407,17 @@ static int invent_message(struct ast_channel *chan, char *ext, int busy) res = ast_streamfile(chan, fn, chan->language); if (res) return -1; - res = ast_waitstream(chan, "#"); + res = ast_waitstream(chan, ecodes); if (res) return res; } else { res = ast_streamfile(chan, "vm-theperson", chan->language); if (res) return -1; - res = ast_waitstream(chan, "#"); + res = ast_waitstream(chan, ecodes); if (res) return res; - res = ast_say_digit_str(chan, ext, "#", chan->language); + res = ast_say_digit_str(chan, ext, ecodes, chan->language); if (res) return res; } @@ -440,7 +427,7 @@ static int invent_message(struct ast_channel *chan, char *ext, int busy) res = ast_streamfile(chan, "vm-isunavail", chan->language); if (res) return -1; - res = ast_waitstream(chan, "#"); + res = ast_waitstream(chan, ecodes); return res; } @@ -457,12 +444,15 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int int msgnum; int outmsg=0; int wavother=0; + int maxmessage=0; struct ast_frame *f; char date[256]; char dir[256]; char fn[256]; char prefile[256]=""; char *astemail; + char *ecodes = "#"; + char *s; time_t start; time_t end; @@ -473,7 +463,15 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int } if (!(astemail = ast_variable_retrieve(cfg, "general", "serveremail"))) astemail = ASTERISK_USERNAME; + if ((s = ast_variable_retrieve(cfg, "general", "maxmessage"))) { + if (sscanf(s, "%d", &x) == 1) { + maxmessage = x; + } else { + ast_log(LOG_WARNING, "Invalid max message time length\n"); + } + } if ((copy = ast_variable_retrieve(cfg, NULL, ext))) { + char *stringp=NULL; /* Setup pre-file if appropriate */ if (busy) snprintf(prefile, sizeof(prefile), "vm/%s/busy", ext); @@ -481,9 +479,10 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int snprintf(prefile, sizeof(prefile), "vm/%s/unavail", ext); /* Make sure they have an entry in the config */ copy = strdup(copy); - passwd = strtok(copy, ","); - name = strtok(NULL, ","); - email = strtok(NULL, ","); + stringp=copy; + passwd = strsep(&stringp, ","); + name = strsep(&stringp, ","); + email = strsep(&stringp, ","); make_dir(dir, sizeof(dir), ext, ""); /* It's easier just to try to make it than to check for its existence */ if (mkdir(dir, 0700) && (errno != EEXIST)) @@ -491,14 +490,16 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int make_dir(dir, sizeof(dir), ext, "INBOX"); if (mkdir(dir, 0700) && (errno != EEXIST)) ast_log(LOG_WARNING, "mkdir '%s' failed: %s\n", dir, strerror(errno)); + if (ast_exists_extension(chan, chan->context, "o", 1, chan->callerid)) + ecodes = "#0"; /* Play the beginning intro if desired */ if (strlen(prefile)) { if (ast_fileexists(prefile, NULL, NULL) > 0) { if (ast_streamfile(chan, prefile, chan->language) > -1) - silent = ast_waitstream(chan, "#"); + silent = ast_waitstream(chan, "#0"); } else { ast_log(LOG_DEBUG, "%s doesn't exist, doing what we can\n", prefile); - silent = invent_message(chan, ext, busy); + silent = invent_message(chan, ext, busy, ecodes); } if (silent < 0) { ast_log(LOG_DEBUG, "Hang up during prefile playback\n"); @@ -515,15 +516,29 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int free(copy); return -1; } + } else if (silent == '0') { + strncpy(chan->exten, "0", sizeof(chan->exten) - 1); + chan->priority = 0; + free(copy); + return 0; } /* Stream an info message */ if (silent || !ast_streamfile(chan, INTRO, chan->language)) { /* Wait for the message to finish */ if (silent || !ast_waitstream(chan, "")) { + if (!ast_streamfile(chan, "beep", chan->language) < 0) + silent = 1; + if (ast_waitstream(chan, "") <0) { + ast_log(LOG_DEBUG, "Hangup during beep\n"); + free(copy); + return -1; + } fmt = ast_variable_retrieve(cfg, "general", "format"); if (fmt) { + char *stringp=NULL; fmts = strdup(fmt); - fmt = strtok(fmts, "|"); + stringp=fmts; + fmt = strsep(&stringp, "|"); msgnum = 0; do { make_file(fn, sizeof(fn), dir, msgnum); @@ -540,6 +555,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int msgnum++; } while(!writer && (msgnum < MAXMSG)); if (writer) { + char *stringp=NULL; /* Store information */ snprintf(txtfile, sizeof(txtfile), "%s.txt", fn); txt = fopen(txtfile, "w+"); @@ -573,8 +589,9 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int free(fmts); fmt = ast_variable_retrieve(cfg, "general", "format"); fmts = strdup(fmt); - strtok(fmts, "|"); - while((fmt = strtok(NULL, "|"))) { + stringp=fmts; + strsep(&stringp, "|"); + while((fmt = strsep(&stringp, "|"))) { if (fmtcnt > MAX_OTHER_FORMATS - 1) { ast_log(LOG_WARNING, "Please increase MAX_OTHER_FORMATS in app_voicemail.c\n"); break; @@ -604,8 +621,13 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int for(;;) { res = ast_waitfor(chan, 2000); if (!res) { - ast_log(LOG_WARNING, "No audio available on %s??\n", chan->name); - res = -1; + ast_log(LOG_DEBUG, "One waitfor failed, trying another\n"); + /* Try one more time in case of masq */ + res = ast_waitfor(chan, 2000); + if (!res) { + ast_log(LOG_WARNING, "No audio available on %s??\n", chan->name); + res = -1; + } } if (res < 0) { @@ -639,10 +661,19 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int ast_verbose( VERBOSE_PREFIX_3 "User ended message by pressing %c\n", f->subclass); outmsg=2; ast_frfree(f); + res = 0; break; } } ast_frfree(f); + time(&end); + if (maxmessage && (end - start > maxmessage)) { + if (option_verbose > 2) + ast_verbose( VERBOSE_PREFIX_3 "Message is too long, ending it now...\n"); + outmsg = 2; + res = 0; + break; + } } if (!f) { if (option_verbose > 2) @@ -674,6 +705,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int fclose(txt); } /* Send e-mail if applicable */ + if (email) sendmail(astemail, email, name, msgnum, ext, chan->callerid, fn, wavother ? "wav" : fmts, end - start); } } else { @@ -1069,8 +1101,10 @@ static void adsi_message(struct ast_channel *chan, char *folder, int msg, int la while(!feof(f)) { fgets(buf, sizeof(buf), f); if (!feof(f)) { - strtok(buf, "="); - val = strtok(NULL, "="); + char *stringp=NULL; + stringp=buf; + strsep(&stringp, "="); + val = strsep(&stringp, "="); if (val && strlen(val)) { if (!strcmp(buf, "callerid")) strncpy(cid, val, sizeof(cid) - 1); @@ -1326,7 +1360,7 @@ forward_message(struct ast_channel *chan, struct ast_config *cfg, char *dir, int if (play_and_wait(chan, "vm-savedto")) break; - snprintf(todir, sizeof(todir), "%s/%s/INBOX", VM_SPOOL_DIR, username); + snprintf(todir, sizeof(todir), "%s/%s/%s/INBOX", (char *)ast_config_AST_SPOOL_DIR,"vm", username); snprintf(sys, sizeof(sys), "mkdir -p %s\n", todir); puts(sys); system(sys); @@ -1434,7 +1468,7 @@ forward_message(struct ast_channel *chan, struct ast_config *cfg, char *dir, int snprintf(vmbox, sizeof(vmbox), "vm-%s", curbox); \ } while (0) -static int play_and_record(struct ast_channel *chan, char *playfile, char *recordfile) +static int play_and_record(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime) { char d, *fmt, *fmts; char comment[256]; @@ -1443,6 +1477,9 @@ static int play_and_record(struct ast_channel *chan, char *playfile, char *recor struct ast_config *cfg; struct ast_filestream *others[MAX_OTHER_FORMATS]; char *sfmt[MAX_OTHER_FORMATS]; + char *stringp=NULL; + time_t start, end; + ast_log(LOG_DEBUG,"play_and_record: %s, %s\n", playfile, recordfile); snprintf(comment,sizeof(comment),"Playing %s, Recording to: %s on %s\n", playfile, recordfile, chan->name); @@ -1461,11 +1498,12 @@ static int play_and_record(struct ast_channel *chan, char *playfile, char *recor ast_destroy(cfg); - strtok(fmts, "|"); + stringp=fmts; + strsep(&stringp, "|"); ast_log(LOG_DEBUG,"Recording Formats: sfmts=%s\n", fmts); sfmt[0] = strdup(fmts); - while((fmt = strtok(NULL, "|"))) { + while((fmt = strsep(&stringp, "|"))) { if (fmtcnt > MAX_OTHER_FORMATS - 1) { ast_log(LOG_WARNING, "Please increase MAX_OTHER_FORMATS in app_voicemail.c\n"); break; @@ -1473,6 +1511,8 @@ static int play_and_record(struct ast_channel *chan, char *playfile, char *recor sfmt[fmtcnt++] = strdup(fmt); } + if (maxtime) + time(&start); for (x=0;xname); - res = -1; + ast_log(LOG_DEBUG, "One waitfor failed, trying another\n"); + /* Try one more time in case of masq */ + res = ast_waitfor(chan, 2000); + if (!res) { + ast_log(LOG_WARNING, "No audio available on %s??\n", chan->name); + res = -1; } + } if (res < 0) { f = NULL; break; - } + } f = ast_read(chan); if (!f) @@ -1527,6 +1572,15 @@ static int play_and_record(struct ast_channel *chan, char *playfile, char *recor break; } } + if (maxtime) { + time(&end); + if (maxtime < (end - start)) { + if (option_verbose > 2) + ast_verbose( VERBOSE_PREFIX_3 "Took too long, cutting it short...\n"); + outmsg=2; + break; + } + } ast_frfree(f); } if (!f) { @@ -1567,9 +1621,12 @@ static int vm_execmain(struct ast_channel *chan, void *data) like I'm back in my GWBASIC days. XXX */ int res=-1; int valid = 0; + int prefix = 0; char d; struct localuser *u; char username[80] =""; + char prefixstr[80] =""; + char empty[80] = ""; char password[80] = "", *copy; char newpassword[80] = ""; char newpassword2[80] = ""; @@ -1592,6 +1649,10 @@ static int vm_execmain(struct ast_channel *chan, void *data) int starting = 1; int box; int useadsi = 0; + int skipuser = 0; + char *s; + int maxgreet = 0; + char tmp[256], *ext; struct ast_config *cfg; LOCAL_USER_ADD(u); @@ -1600,26 +1661,63 @@ static int vm_execmain(struct ast_channel *chan, void *data) ast_log(LOG_WARNING, "No voicemail configuration\n"); goto out; } + if ((s = ast_variable_retrieve(cfg, "general", "maxgreet"))) { + if (sscanf(s, "%d", &x) == 1) { + maxgreet = x; + } else { + ast_log(LOG_WARNING, "Invalid max message greeting length\n"); + } + } if (chan->_state != AST_STATE_UP) ast_answer(chan); + if (strlen(data)) { + strncpy(tmp, data, sizeof(tmp) - 1); + ext = tmp; + + switch (*ext) { + case 's': + /* We should skip the user's password */ + valid++; + ext++; + break; + case 'p': + /* We should prefix the mailbox with the supplied data */ + prefix++; + ext++; + break; + } + + + if (prefix) + strncpy(prefixstr, ext, sizeof(prefixstr) - 1); + else + strncpy(username, ext, sizeof(username) - 1); + /* make sure username passed as an option is valid */ + if (ast_variable_retrieve(cfg, NULL, username)) + skipuser++; + else + valid = 0; + + } + /* If ADSI is supported, setup login screen */ adsi_begin(chan, &useadsi); - if (useadsi) + if (!skipuser && useadsi) adsi_login(chan); - if (ast_streamfile(chan, "vm-login", chan->language)) { + if (!skipuser && ast_streamfile(chan, "vm-login", chan->language)) { ast_log(LOG_WARNING, "Couldn't stream login file\n"); goto out; } /* Authenticate them and get their mailbox/password */ - do { + while (!valid) { /* Prompt for, and read in the username */ - if (ast_readstring(chan, username, sizeof(username) - 1, 2000, 10000, "#") < 0) { + if (!skipuser && ast_readstring(chan, username, sizeof(username) - 1, 2000, 10000, "#") < 0) { ast_log(LOG_WARNING, "Couldn't read username\n"); goto out; - } + } if (!strlen(username)) { if (option_verbose > 2) ast_verbose(VERBOSE_PREFIX_3 "Username not entered\n"); @@ -1636,17 +1734,32 @@ static int vm_execmain(struct ast_channel *chan, void *data) ast_log(LOG_WARNING, "Unable to read password\n"); goto out; } + if (prefix) { + char fullusername[80] = ""; + strncpy(fullusername, prefixstr, sizeof(fullusername) - 1); + strncat(fullusername, username, sizeof(fullusername) - 1); + strncpy(username, fullusername, sizeof(username) - 1); + } copy = ast_variable_retrieve(cfg, NULL, username); if (copy) { + char *stringp=NULL; copy = strdup(copy); - strtok(copy, ","); + stringp=copy; + strsep(&stringp, ","); if (!strcmp(password,copy)) valid++; - else if (option_verbose > 2) - ast_verbose( VERBOSE_PREFIX_3 "Incorrect password '%s' for user '%s'\n", password, username); + else { + if (option_verbose > 2) + ast_verbose( VERBOSE_PREFIX_3 "Incorrect password '%s' for user '%s'\n", password, username); + if (prefix) + strncpy(username, empty, sizeof(username) -1); + } free(copy); - } else if (option_verbose > 2) - ast_verbose( VERBOSE_PREFIX_3 "No such user '%s' in config file\n", username); + } else { + skipuser = 0; + if (option_verbose > 2) + ast_verbose( VERBOSE_PREFIX_3 "No such user '%s' in config file\n", username); + } if (!valid) { if (useadsi) adsi_login(chan); @@ -1657,9 +1770,11 @@ static int vm_execmain(struct ast_channel *chan, void *data) break; #endif } - } while (!valid); + } if (valid) { + snprintf(curdir, sizeof(curdir), "%s/%s/%s", (char *)ast_config_AST_SPOOL_DIR,"vm", username); + mkdir(curdir, 0700); OPEN_MAILBOX(1); oldmessages = lastmsg + 1; /* Start in INBOX */ @@ -1879,15 +1994,15 @@ vm_options: case '1': snprintf(prefile,sizeof(prefile),"vm/%s/unavail",username); - play_and_record(chan,"vm-rec-unv",prefile); + play_and_record(chan,"vm-rec-unv",prefile, maxgreet); break; case '2': snprintf(prefile,sizeof(prefile),"vm/%s/busy",username); - play_and_record(chan,"vm-rec-busy",prefile); + play_and_record(chan,"vm-rec-busy",prefile, maxgreet); break; case '3': snprintf(prefile,sizeof(prefile),"vm/%s/greet",username); - play_and_record(chan,"vm-rec-name",prefile); + play_and_record(chan,"vm-rec-name",prefile, maxgreet); break; case '4': newpassword[1] = '\0'; @@ -1930,14 +2045,21 @@ static int vm_exec(struct ast_channel *chan, void *data) { int res=0, silent=0, busy=0, unavail=0; struct localuser *u; - char *ext = (char *)data; + char tmp[256], *ext; - - if (!data) { - ast_log(LOG_WARNING, "vm requires an argument (extension)\n"); - return -1; - } LOCAL_USER_ADD(u); + if (chan->_state != AST_STATE_UP) + ast_answer(chan); + if (data) + strncpy(tmp, data, sizeof(tmp) - 1); + else { + res = ast_app_getdata(chan, "vm-whichbox", tmp, sizeof(tmp) - 1, 0); + if (res < 0) + return res; + if (!strlen(tmp)) + return 0; + } + ext = tmp; if (*ext == 's') { silent++; ext++; @@ -1948,8 +2070,6 @@ static int vm_exec(struct ast_channel *chan, void *data) unavail++; ext++; } - if (chan->_state != AST_STATE_UP) - ast_answer(chan); res = leave_voicemail(chan, ext, silent, busy, unavail); LOCAL_USER_REMOVE(u); return res; -- cgit v1.2.3