]> git.alsa-project.org Git - alsa-utils.git/commitdiff
alsactl: Store lockfile in /var/lock, add -D option to specify the lock dir
authorJulian Scheel <julian@jusst.de>
Tue, 6 May 2014 19:32:19 +0000 (21:32 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 7 May 2014 08:55:51 +0000 (10:55 +0200)
It can not be generally assumed that the directories in which asound.state
resides are writable. Use /var/lock and allow users to alter this path.

Signed-off-by: Julian Scheel <julian@jusst.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
alsactl/alsactl.c
alsactl/alsactl.h
alsactl/lock.c

index 6bc013f467d05887d07d1c2dacb61123fc20e35f..415dfb8fe2219bac2873bb66958fdb3406bc9821 100644 (file)
@@ -38,6 +38,9 @@
 #ifndef SYS_PIDFILE
 #define SYS_PIDFILE "/var/run/alsactl.pid"
 #endif
+#ifndef SYS_LOCKPATH
+#define SYS_LOCKPATH "/var/lock"
+#endif
 
 int debugflag = 0;
 int force_restore = 1;
@@ -46,6 +49,7 @@ int do_lock = 0;
 int use_syslog = 0;
 char *command;
 char *statefile = NULL;
+char *lockpath = SYS_LOCKPATH;
 
 #define TITLE  0x0100
 #define HEADER 0x0200
@@ -71,6 +75,7 @@ static struct arg args[] = {
 { HEADER, NULL, "Available state options:" },
 { FILEARG | 'f', "file", "configuration file (default " SYS_ASOUNDRC ")" },
 { 'l', "lock", "use file locking to serialize concurrent access" },
+{ FILEARG | 'D', "lock-dir", "directory to use for lock files (default " SYS_LOCKPATH ")" },
 { 'F', "force", "try to restore the matching controls as much as possible" },
 { 0, NULL, "  (default mode)" },
 { 'g', "ignore", "ignore 'No soundcards found' error" },
@@ -232,6 +237,8 @@ int main(int argc, char *argv[])
                case 'l':
                        do_lock = 1;
                        break;
+               case 'D':
+                       lockpath = optarg;
                case 'F':
                        force_restore = 1;
                        break;
index 9109a709e73c876d2d5bd178ae4871e97761b3f6..6c6bee58e51826b43f0c54a97bf0bc92a5a33c2d 100644 (file)
@@ -5,6 +5,7 @@ extern int do_lock;
 extern int use_syslog;
 extern char *command;
 extern char *statefile;
+extern char *lockpath;
 
 void info_(const char *fcn, long line, const char *fmt, ...);
 void error_(const char *fcn, long line, const char *fmt, ...);
index 587a10970d6dd3916cadb25590c57b42a1654af2..c69e285c20e04b37000346113c7a0cdcd6233516 100644 (file)
@@ -36,17 +36,24 @@ static int state_lock_(const char *file, int lock, int timeout)
        struct flock lck;
        struct stat st;
        char lcktxt[12];
+       char *filename;
        char *nfile;
 
        if (!do_lock)
                return 0;
-       nfile = malloc(strlen(file) + 6);
+
+       /* only use the actual filename, not the path */
+       filename = strrchr(file, '/');
+       if (!filename)
+               filename = file;
+
+       nfile = malloc(strlen(lockpath) + strlen(filename) + 7);
        if (nfile == NULL) {
                error("No enough memory...");
                return -ENOMEM;
        }
-       strcpy(nfile, file);
-       strcat(nfile, ".lock");
+
+       sprintf(nfile, "%s/%s.lock", lockpath, filename);
        lck.l_type = lock ? F_WRLCK : F_UNLCK;
        lck.l_whence = SEEK_SET;
        lck.l_start = 0;