summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2014-05-07 11:13:41 +0200
committerJaroslav Kysela <perex@perex.cz>2014-05-07 11:20:16 +0200
commit158a67f6f5058bec0ac27086a1c6206bfd2ff414 (patch)
treeaed4b683708eabb8a7948b904e8a4e8fb6954a02
parent504348cb527aa4b557eb4087ee1e8dd9532f9ef9 (diff)
downloadalsa-utils-158a67f6f5058bec0ac27086a1c6206bfd2ff414.tar.gz
alsactl: add -L (no-lock) and change -D (lock-dir) to -O (state-lock-file)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r--alsactl/Makefile.am2
-rw-r--r--alsactl/alsactl.116
-rw-r--r--alsactl/alsactl.c15
-rw-r--r--alsactl/alsactl.h2
-rw-r--r--alsactl/lock.c18
5 files changed, 29 insertions, 24 deletions
diff --git a/alsactl/Makefile.am b/alsactl/Makefile.am
index 5ec3b80..b862412 100644
--- a/alsactl/Makefile.am
+++ b/alsactl/Makefile.am
@@ -12,7 +12,7 @@ alsactl_SOURCES=alsactl.c state.c lock.c utils.c init_parse.c daemon.c \
alsactl_CFLAGS=$(AM_CFLAGS) -D__USE_GNU \
-DSYS_ASOUNDRC=\"$(ASOUND_STATE_DIR)/asound.state\" \
- -DSYS_LOCKPATH=\"$(ASOUND_LOCK_DIR)\" \
+ -DSYS_LOCKFILE=\"$(ASOUND_LOCK_DIR)/asound.state.lock\" \
-DSYS_PIDFILE=\"$(ALSACTL_PIDFILE_DIR)/alsactl.pid\"
noinst_HEADERS=alsactl.h list.h init_sysdeps.c init_utils_string.c \
diff --git a/alsactl/alsactl.1 b/alsactl/alsactl.1
index b1e1794..c515fdd 100644
--- a/alsactl/alsactl.1
+++ b/alsactl/alsactl.1
@@ -1,4 +1,4 @@
-.TH ALSACTL 1 "05 Apr 2013"
+.TH ALSACTL 1 "07 May 2014"
.SH NAME
alsactl \- advanced controls for ALSA soundcard driver
@@ -61,6 +61,20 @@ Print alsactl version number.
Select the configuration file to use. The default is /var/lib/alsa/asound.state.
.TP
+\fI\-l, \-\-lock\fP
+Use the file locking to serialize the concurrent access to the state file (this
+option is default for the global state file).
+
+.TP
+\fI\-L, \-\-no-lock\fP
+Do not use the file locking to serialize the concurrent access to the state
+file (including the global state file).
+
+.TP
+\fI\-O, \-\-lock-state-file\fP
+Select the state lock file path.
+
+.TP
\fI\-F, \-\-force\fP
Used with restore command. Try to restore the matching control elements
as much as possible. This option is set as default now.
diff --git a/alsactl/alsactl.c b/alsactl/alsactl.c
index 415dfb8..bcbc187 100644
--- a/alsactl/alsactl.c
+++ b/alsactl/alsactl.c
@@ -49,7 +49,7 @@ int do_lock = 0;
int use_syslog = 0;
char *command;
char *statefile = NULL;
-char *lockpath = SYS_LOCKPATH;
+char *lockfile = SYS_LOCKFILE;
#define TITLE 0x0100
#define HEADER 0x0200
@@ -75,7 +75,8 @@ 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 ")" },
+{ 'L', "no-lock", "do not use file locking to serialize concurrent access" },
+{ FILEARG | 'O', "lock-state-file", "state lock file path (default " SYS_LOCKFILE ")" },
{ 'F', "force", "try to restore the matching controls as much as possible" },
{ 0, NULL, " (default mode)" },
{ 'g', "ignore", "ignore 'No soundcards found' error" },
@@ -237,8 +238,12 @@ int main(int argc, char *argv[])
case 'l':
do_lock = 1;
break;
- case 'D':
- lockpath = optarg;
+ case 'L':
+ do_lock = -1;
+ break;
+ case 'O':
+ lockfile = optarg;
+ break;
case 'F':
force_restore = 1;
break;
@@ -331,7 +336,7 @@ int main(int argc, char *argv[])
}
/* the global system file should be always locked */
- if (strcmp(cfgfile, SYS_ASOUNDRC) == 0)
+ if (strcmp(cfgfile, SYS_ASOUNDRC) == 0 && do_lock >= 0)
do_lock = 1;
/* when running in background, use syslog for reports */
diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h
index 6c6bee5..76e8c36 100644
--- a/alsactl/alsactl.h
+++ b/alsactl/alsactl.h
@@ -5,7 +5,7 @@ extern int do_lock;
extern int use_syslog;
extern char *command;
extern char *statefile;
-extern char *lockpath;
+extern char *lockfile;
void info_(const char *fcn, long line, const char *fmt, ...);
void error_(const char *fcn, long line, const char *fmt, ...);
diff --git a/alsactl/lock.c b/alsactl/lock.c
index c69e285..6f85f20 100644
--- a/alsactl/lock.c
+++ b/alsactl/lock.c
@@ -36,24 +36,11 @@ static int state_lock_(const char *file, int lock, int timeout)
struct flock lck;
struct stat st;
char lcktxt[12];
- char *filename;
- char *nfile;
+ char *nfile = lockfile;
- if (!do_lock)
+ if (do_lock <= 0)
return 0;
- /* 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;
- }
-
- sprintf(nfile, "%s/%s.lock", lockpath, filename);
lck.l_type = lock ? F_WRLCK : F_UNLCK;
lck.l_whence = SEEK_SET;
lck.l_start = 0;
@@ -114,7 +101,6 @@ static int state_lock_(const char *file, int lock, int timeout)
goto out;
}
out:
- free(nfile);
return err;
}