Message ID | 1433780269.8893.5.camel@midnight (mailing list archive) |
---|---|
State | Rejected |
Delegated to: | Takashi Iwai |
Headers | show |
At Mon, 08 Jun 2015 09:17:49 -0700, Dan Nicholson wrote: > > On Mon, 2015-06-08 at 15:22 +0200, Takashi Iwai wrote: > > At Mon, 08 Jun 2015 15:03:21 +0200, > > Takashi Iwai wrote: > > > > > > At Mon, 8 Jun 2015 05:52:18 -0700, > > > Dan Nicholson wrote: > > > > > > > > On Jun 8, 2015 4:38 AM, "Takashi Iwai" <tiwai@suse.de> wrote: > > > > > > > > > > At Fri, 5 Jun 2015 15:00:47 -0700, > > > > > Dan Nicholson wrote: > > > > > > > > > > > > Try to create the directory for the state file when saving so we don't > > > > > > depend on it being created ahead of time. This only checks for failures > > > > > > on existing directories and doesn't try to create the leading > > > > > > directories or workaround any other errors. This should catch the common > > > > > > case where /var/lib exists, but /var/lib/alsa doesn't. > > > > > > > > > > I don't think it's the role of alsactl. It saves a file on the > > > > > certain directory. If it doesn't exist, it's a failure of the > > > > > installed package. > > > > > > > > Sure, that's understandable, but there's a couple reasons I think this is > > > > helpful addition. > > > > > > > > First, if no path is supplied, store will save to /var/lib/alsa. So, it's > > > > not as of the user has supplied a path it didn't setup correctly. It would > > > > be nice if alsactl worked out of the box without additional integration by > > > > packagers. > > > > > > For that, a safer way would be to create /var/lib/alsa in the > > > installation.'s > > Sure, as I said, we can do that if necessary. It's just another custom > thing to maintain, and I think it would be nice if alsactl could manage > this on its own. Well, it can show a different face depending on the perspective. Imagine if you pass a wrong path (e.g. /vat/lib/alsa/asound.state). Then it creates the whole wrong directories. So, it might be nice, but it might be dangerous. And, as it's a tool mostly used by root, I'd like to vote for safety. thanks, Takashi
diff --git a/alsactl/state.c b/alsactl/state.c index 3908ec4..10b3567 100644 --- a/alsactl/state.c +++ b/alsactl/state.c @@ -27,6 +27,9 @@ #include <stdio.h> #include <assert.h> #include <errno.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> #include <alsa/asoundlib.h> #include "alsactl.h" @@ -1536,6 +1539,41 @@ static int set_controls(int card, snd_config_t *top, int doit) return err; } +static int create_directories(const char *file) +{ + int err = 0; + char *filedir, *cur; + + filedir = strdup(file); + if (filedir == NULL) { + error("Not enough memory..."); + err = -ENOMEM; + goto out; + } + + cur = filedir; + /* skip leading /s */ + while (*cur && *cur == '/') + cur++; + while ((cur = strchr(cur, '/')) != NULL) { + mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; + + *cur = '\0'; + if (mkdir(filedir, mode) != 0 && errno != EEXIST) { + error("Could not create directory %s: %s", + filedir, strerror(errno)); + err = -errno; + goto out; + } + /* restore path element */ + *cur++ = '/'; + } + +out: + free(filedir); + return err; +} + int save_state(const char *file, const char *cardname) {