[Asterisk-code-review] app_voicemail: Cleanup stale lock files on module load (...asterisk[13])
Sean Bright
asteriskteam at digium.com
Tue Apr 9 10:12:17 CDT 2019
Sean Bright has uploaded this change for review. ( https://gerrit.asterisk.org/c/asterisk/+/11246
Change subject: app_voicemail: Cleanup stale lock files on module load
......................................................................
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
---
M apps/app_voicemail.c
1 file changed, 51 insertions(+), 0 deletions(-)
git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/46/11246/1
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 64167d1..407afab 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -3795,6 +3795,54 @@
#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 ophaned 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 @@
/* 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");
}
--
To view, visit https://gerrit.asterisk.org/c/asterisk/+/11246
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings
Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-Change-Id: If40ccd508e2f6e5ade94dde2f0bcef99056d0aaf
Gerrit-Change-Number: 11246
Gerrit-PatchSet: 1
Gerrit-Owner: Sean Bright <sean.bright at gmail.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20190409/09b42019/attachment.html>
More information about the asterisk-code-review
mailing list