app_voicemail: Cleanup stale lock files on module load
If Asterisk crashes while a VM directory is locked, lock files in the VM spool directory will not get properly cleaned up. We now clear them on module load. ASTERISK-20207 #close Reported by: Steven Wheeler Change-Id: If40ccd508e2f6e5ade94dde2f0bcef99056d0aaf
This commit is contained in:
parent
6531f8b2ea
commit
fd2e8d0da7
|
@ -3795,6 +3795,54 @@ static void check_quota(struct vm_state *vms, char *mailbox) {
|
|||
|
||||
#endif /* IMAP_STORAGE */
|
||||
|
||||
static void cleanup_orphaned_lock_files(const char *base)
|
||||
{
|
||||
DIR *dir;
|
||||
struct dirent *e;
|
||||
|
||||
dir = opendir(base);
|
||||
if (!dir) {
|
||||
/* Don't complain about this too loudly */
|
||||
ast_debug(2, "Unable to open `%s': %s\n", base, strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
while ((e = readdir(dir))) {
|
||||
char *fullpath;
|
||||
struct stat s;
|
||||
|
||||
/* Always skip . and .. */
|
||||
if (!strcmp(e->d_name, ".") || !strcmp(e->d_name, "..")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Build up the full path (using dynamic memory because PATH_MAX is crap) */
|
||||
if (ast_asprintf(&fullpath, "%s/%s", base, e->d_name) == -1) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (lstat(fullpath, &s) < 0) {
|
||||
ast_free(fullpath);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* This is exposing an implementation detail of ast_lock_path, but it makes
|
||||
* our life a bit easier */
|
||||
if (!strcmp(e->d_name, ".lock") && S_ISLNK(s.st_mode)) {
|
||||
if (!ast_unlock_path(base)) {
|
||||
ast_log(AST_LOG_NOTICE, "Cleaned up orphaned lock file: %s/.lock\n", base);
|
||||
}
|
||||
} else if (S_ISDIR(s.st_mode)) {
|
||||
/* If it is a directory, let's dive down */
|
||||
cleanup_orphaned_lock_files(fullpath);
|
||||
}
|
||||
|
||||
ast_free(fullpath);
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
}
|
||||
|
||||
/*! \brief Lock file path
|
||||
* only return failure if ast_lock_path returns 'timeout',
|
||||
* not if the path does not exist or any other reason
|
||||
|
@ -15306,6 +15354,9 @@ static int load_module(void)
|
|||
/* compute the location of the voicemail spool directory */
|
||||
snprintf(VM_SPOOL_DIR, sizeof(VM_SPOOL_DIR), "%s/voicemail/", ast_config_AST_SPOOL_DIR);
|
||||
|
||||
/* Now that we have a spool directory, clean up old lock files */
|
||||
cleanup_orphaned_lock_files(VM_SPOOL_DIR);
|
||||
|
||||
if (!(mwi_subscription_tps = ast_taskprocessor_get("app_voicemail", 0))) {
|
||||
ast_log(AST_LOG_WARNING, "failed to reference mwi subscription taskprocessor. MWI will not work\n");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue