From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: [PATCH] alsactl: Try to create state file directory Date: Mon, 08 Jun 2015 13:38:46 +0200 Message-ID: References: <1433541647-300-1-git-send-email-nicholson@endlessm.com> Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by alsa0.perex.cz (Postfix) with ESMTP id 9A5DD260599 for ; Mon, 8 Jun 2015 13:38:46 +0200 (CEST) In-Reply-To: <1433541647-300-1-git-send-email-nicholson@endlessm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: Dan Nicholson Cc: alsa-devel@alsa-project.org List-Id: alsa-devel@alsa-project.org 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. thanks, Takashi > > Signed-off-by: Dan Nicholson > --- > alsactl/state.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/alsactl/state.c b/alsactl/state.c > index 3908ec4..8ca3d6e 100644 > --- a/alsactl/state.c > +++ b/alsactl/state.c > @@ -27,6 +27,9 @@ > #include > #include > #include > +#include > +#include > +#include > #include > #include "alsactl.h" > > @@ -1544,6 +1547,7 @@ int save_state(const char *file, const char *cardname) > snd_output_t *out; > int stdio; > char *nfile = NULL; > + char *filedir = NULL; > int lock_fd = -EINVAL; > > err = snd_config_top(&config); > @@ -1553,6 +1557,9 @@ int save_state(const char *file, const char *cardname) > } > stdio = !strcmp(file, "-"); > if (!stdio) { > + char *tmp; > + mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; > + > nfile = malloc(strlen(file) + 5); > if (nfile == NULL) { > error("No enough memory..."); > @@ -1561,6 +1568,21 @@ int save_state(const char *file, const char *cardname) > } > strcpy(nfile, file); > strcat(nfile, ".new"); > + filedir = strdup(file); > + if (filedir == NULL) { > + error("Not enough memory..."); > + err = -ENOMEM; > + goto out; > + } > + tmp = strrchr(filedir, '/'); > + if (tmp && tmp != filedir) { > + *tmp = '\0'; > + if (mkdir(filedir, mode) != 0 && errno != EEXIST) { > + error("Could not create directory %s: %s", > + filedir, strerror(errno)); > + goto out; > + } > + } > lock_fd = state_lock(file, 10); > if (lock_fd < 0) { > err = lock_fd; > @@ -1640,6 +1662,7 @@ out: > if (!stdio && lock_fd >= 0) > state_unlock(lock_fd, file); > free(nfile); > + free(filedir); > snd_config_delete(config); > snd_config_update_free_global(); > return err; > -- > 1.8.1.2 > > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@alsa-project.org > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel >