Merge "app_voicemail: Cleanup stale lock files on module load"

pull/13/head
Friendly Automation 6 years ago committed by Gerrit Code Review
commit 61567ee4e8

@ -3812,6 +3812,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
@ -15355,6 +15403,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…
Cancel
Save