mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-11-10 03:35:42 +01:00
alsactl: add -L (no-lock) and change -D (lock-dir) to -O (state-lock-file)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
504348cb52
commit
158a67f6f5
5 changed files with 29 additions and 24 deletions
|
@ -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 \
|
alsactl_CFLAGS=$(AM_CFLAGS) -D__USE_GNU \
|
||||||
-DSYS_ASOUNDRC=\"$(ASOUND_STATE_DIR)/asound.state\" \
|
-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\"
|
-DSYS_PIDFILE=\"$(ALSACTL_PIDFILE_DIR)/alsactl.pid\"
|
||||||
|
|
||||||
noinst_HEADERS=alsactl.h list.h init_sysdeps.c init_utils_string.c \
|
noinst_HEADERS=alsactl.h list.h init_sysdeps.c init_utils_string.c \
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.TH ALSACTL 1 "05 Apr 2013"
|
.TH ALSACTL 1 "07 May 2014"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
alsactl \- advanced controls for ALSA soundcard driver
|
alsactl \- advanced controls for ALSA soundcard driver
|
||||||
|
|
||||||
|
@ -60,6 +60,20 @@ Print alsactl version number.
|
||||||
\fI\-f, \-\-file\fP
|
\fI\-f, \-\-file\fP
|
||||||
Select the configuration file to use. The default is /var/lib/alsa/asound.state.
|
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
|
.TP
|
||||||
\fI\-F, \-\-force\fP
|
\fI\-F, \-\-force\fP
|
||||||
Used with restore command. Try to restore the matching control elements
|
Used with restore command. Try to restore the matching control elements
|
||||||
|
|
|
@ -49,7 +49,7 @@ int do_lock = 0;
|
||||||
int use_syslog = 0;
|
int use_syslog = 0;
|
||||||
char *command;
|
char *command;
|
||||||
char *statefile = NULL;
|
char *statefile = NULL;
|
||||||
char *lockpath = SYS_LOCKPATH;
|
char *lockfile = SYS_LOCKFILE;
|
||||||
|
|
||||||
#define TITLE 0x0100
|
#define TITLE 0x0100
|
||||||
#define HEADER 0x0200
|
#define HEADER 0x0200
|
||||||
|
@ -75,7 +75,8 @@ static struct arg args[] = {
|
||||||
{ HEADER, NULL, "Available state options:" },
|
{ HEADER, NULL, "Available state options:" },
|
||||||
{ FILEARG | 'f', "file", "configuration file (default " SYS_ASOUNDRC ")" },
|
{ FILEARG | 'f', "file", "configuration file (default " SYS_ASOUNDRC ")" },
|
||||||
{ 'l', "lock", "use file locking to serialize concurrent access" },
|
{ '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" },
|
{ 'F', "force", "try to restore the matching controls as much as possible" },
|
||||||
{ 0, NULL, " (default mode)" },
|
{ 0, NULL, " (default mode)" },
|
||||||
{ 'g', "ignore", "ignore 'No soundcards found' error" },
|
{ 'g', "ignore", "ignore 'No soundcards found' error" },
|
||||||
|
@ -237,8 +238,12 @@ int main(int argc, char *argv[])
|
||||||
case 'l':
|
case 'l':
|
||||||
do_lock = 1;
|
do_lock = 1;
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'L':
|
||||||
lockpath = optarg;
|
do_lock = -1;
|
||||||
|
break;
|
||||||
|
case 'O':
|
||||||
|
lockfile = optarg;
|
||||||
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
force_restore = 1;
|
force_restore = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -331,7 +336,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the global system file should be always locked */
|
/* 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;
|
do_lock = 1;
|
||||||
|
|
||||||
/* when running in background, use syslog for reports */
|
/* when running in background, use syslog for reports */
|
||||||
|
|
|
@ -5,7 +5,7 @@ extern int do_lock;
|
||||||
extern int use_syslog;
|
extern int use_syslog;
|
||||||
extern char *command;
|
extern char *command;
|
||||||
extern char *statefile;
|
extern char *statefile;
|
||||||
extern char *lockpath;
|
extern char *lockfile;
|
||||||
|
|
||||||
void info_(const char *fcn, long line, const char *fmt, ...);
|
void info_(const char *fcn, long line, const char *fmt, ...);
|
||||||
void error_(const char *fcn, long line, const char *fmt, ...);
|
void error_(const char *fcn, long line, const char *fmt, ...);
|
||||||
|
|
|
@ -36,24 +36,11 @@ static int state_lock_(const char *file, int lock, int timeout)
|
||||||
struct flock lck;
|
struct flock lck;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char lcktxt[12];
|
char lcktxt[12];
|
||||||
char *filename;
|
char *nfile = lockfile;
|
||||||
char *nfile;
|
|
||||||
|
|
||||||
if (!do_lock)
|
if (do_lock <= 0)
|
||||||
return 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_type = lock ? F_WRLCK : F_UNLCK;
|
||||||
lck.l_whence = SEEK_SET;
|
lck.l_whence = SEEK_SET;
|
||||||
lck.l_start = 0;
|
lck.l_start = 0;
|
||||||
|
@ -114,7 +101,6 @@ static int state_lock_(const char *file, int lock, int timeout)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
free(nfile);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue