[PATCH] lib + tests: modify fwts_pipe_exec to return the child exit status

Keng-Yu Lin kengyu at canonical.com
Wed Dec 12 03:14:12 UTC 2012


On Fri, Dec 7, 2012 at 10:08 PM, Colin King <colin.king at canonical.com> wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Fix bug that has been in the fwts s3, s4 and s3power tests. Originally the
> semantics to fwts_pipe_exec() was that was meant to return the child exit status
> but this got changed to return FWTS_OK if successful and FWTS_EXEC_FAILED if
> the child exec failed.  Thus we no longer passed back the child exit status which
> the s3, s4 and s4power tests relied on to check the suspend or hibernate pm script
> exit status.
>
> This patch adds an extra child exit status parameter to fwts_pipe_exec() which can
> be checked if required.  However, for most use cases, one can ignore this and just
> check for FWTS_OK or FWTS_EXEC_FAILED if you don't care about the child exit status.
>
> The patch fixes up all the calls to fwts_pipe_exec and also changes the way errors
> are detected assuming anything that is not a FWTS_OK return is a failure.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>  src/acpi/mcfg/mcfg.c            |  3 ++-
>  src/acpi/s3/s3.c                |  2 +-
>  src/acpi/s3power/s3power.c      |  3 +--
>  src/acpi/s4/s4.c                |  2 +-
>  src/bios/mtrr/mtrr.c            |  3 ++-
>  src/hotkey/hotkey/hotkey.c      |  3 ++-
>  src/lib/include/fwts_pipeio.h   |  2 +-
>  src/lib/src/fwts_efi_module.c   |  8 ++++++--
>  src/lib/src/fwts_hwinfo.c       | 20 +++++++++++---------
>  src/lib/src/fwts_pipeio.c       | 12 ++++++------
>  src/pci/aspm/aspm.c             |  6 ++++--
>  src/pci/maxreadreq/maxreadreq.c |  4 +++-
>  12 files changed, 40 insertions(+), 28 deletions(-)
>
> diff --git a/src/acpi/mcfg/mcfg.c b/src/acpi/mcfg/mcfg.c
> index 331c24f..39ae697 100644
> --- a/src/acpi/mcfg/mcfg.c
> +++ b/src/acpi/mcfg/mcfg.c
> @@ -40,6 +40,7 @@ static void compare_config_space(
>  {
>         fwts_list *lspci_output;
>         fwts_list_link *item;
> +       int status;
>
>         char command[PATH_MAX];
>         char compare_line[50];
> @@ -54,7 +55,7 @@ static void compare_config_space(
>         snprintf(command, sizeof(command), "%s -vxxx -s %" PRIu16 ":%" PRIu32,
>                 fw->lspci, segment, device);
>
> -       if (fwts_pipe_exec(command, &lspci_output) == FWTS_EXEC_ERROR) {
> +       if (fwts_pipe_exec(command, &lspci_output, &status) != FWTS_OK) {
>                 fwts_log_warning(fw, "Could not execute %s", command);
>                 return;
>         }
> diff --git a/src/acpi/s3/s3.c b/src/acpi/s3/s3.c
> index a1b7848..182db43 100644
> --- a/src/acpi/s3/s3.c
> +++ b/src/acpi/s3/s3.c
> @@ -106,7 +106,7 @@ static int s3_do_suspend_resume(fwts_framework *fw,
>         /* Do S3 here */
>         fwts_progress_message(fw, percent, "(Suspending)");
>         time(&t_start);
> -       status = fwts_pipe_exec(command, &output);
> +       (void)fwts_pipe_exec(command, &output, &status);
>         time(&t_end);
>         fwts_progress_message(fw, percent, "(Resumed)");
>         fwts_text_list_free(output);
> diff --git a/src/acpi/s3power/s3power.c b/src/acpi/s3power/s3power.c
> index a8a7c25..0b98df1 100644
> --- a/src/acpi/s3power/s3power.c
> +++ b/src/acpi/s3power/s3power.c
> @@ -191,8 +191,7 @@ static int s3power_test(fwts_framework *fw)
>         /* Do S3 here */
>         fwts_progress_message(fw, 100, "(Suspending)");
>         time(&t_start);
> -       status = 0;
> -       status = fwts_pipe_exec(PM_SUSPEND, &output);
> +       (void)fwts_pipe_exec(PM_SUSPEND, &output, &status);
>         time(&t_end);
>         fwts_progress_message(fw, 100, "(Resumed)");
>         fwts_text_list_free(output);
> diff --git a/src/acpi/s4/s4.c b/src/acpi/s4/s4.c
> index 728062d..bea7fce 100644
> --- a/src/acpi/s4/s4.c
> +++ b/src/acpi/s4/s4.c
> @@ -137,7 +137,7 @@ static int s4_hibernate(fwts_framework *fw,
>
>         /* Do s4 here */
>         fwts_progress_message(fw, percent, "(Hibernating)");
> -       status = fwts_pipe_exec(command, &output);
> +       (void)fwts_pipe_exec(command, &output, &status);
>         fwts_progress_message(fw, percent, "(Resumed)");
>         fwts_text_list_free(output);
>         free(command);
> diff --git a/src/bios/mtrr/mtrr.c b/src/bios/mtrr/mtrr.c
> index 6dbc8e2..62a91c7 100644
> --- a/src/bios/mtrr/mtrr.c
> +++ b/src/bios/mtrr/mtrr.c
> @@ -199,11 +199,12 @@ static bool is_prefetchable(fwts_framework *fw, char *device, uint64_t address)
>         char line[4096];
>         fwts_list *lspci_output;
>         fwts_list_link *item;
> +       int status;
>
>         memset(line,0,4096);
>
>         snprintf(line, sizeof(line), "%s -v -s %s", fw->lspci, device);
> -       fwts_pipe_exec(line, &lspci_output);
> +       fwts_pipe_exec(line, &lspci_output, &status);
>         if (lspci_output == NULL)
>                 return pref;
>
> diff --git a/src/hotkey/hotkey/hotkey.c b/src/hotkey/hotkey/hotkey.c
> index 267b69e..59a6829 100644
> --- a/src/hotkey/hotkey/hotkey.c
> +++ b/src/hotkey/hotkey/hotkey.c
> @@ -182,9 +182,10 @@ static char *hotkey_find_keymap(char *device)
>
>         char buffer[1024];
>         char *keymap = NULL;
> +       int status;
>
>         snprintf(buffer, sizeof(buffer), "udevadm test /class/%s 2>&1", device);
> -       if (fwts_pipe_exec(buffer, &output) != FWTS_OK)
> +       if (fwts_pipe_exec(buffer, &output, &status) != FWTS_OK)
>                 return NULL;
>
>         snprintf(buffer, sizeof(buffer), "keymap %s", device);
> diff --git a/src/lib/include/fwts_pipeio.h b/src/lib/include/fwts_pipeio.h
> index f1875da..04f4dea 100644
> --- a/src/lib/include/fwts_pipeio.h
> +++ b/src/lib/include/fwts_pipeio.h
> @@ -31,6 +31,6 @@
>  int   fwts_pipe_open(const char *command, pid_t *childpid);
>  char *fwts_pipe_read(const int fd, ssize_t *length);
>  int   fwts_pipe_close(const int fd, const pid_t pid);
> -int   fwts_pipe_exec(const char *command, fwts_list **list);
> +int   fwts_pipe_exec(const char *command, fwts_list **list, int *status);
>
>  #endif
> diff --git a/src/lib/src/fwts_efi_module.c b/src/lib/src/fwts_efi_module.c
> index 26e5740..c92a091 100644
> --- a/src/lib/src/fwts_efi_module.c
> +++ b/src/lib/src/fwts_efi_module.c
> @@ -57,7 +57,9 @@ int fwts_lib_efi_runtime_load_module(fwts_framework *fw)
>         }
>
>         if (!module_already_loaded) {
> -               if (fwts_pipe_exec("modprobe efi_runtime", &output) != FWTS_OK) {
> +               int status;
> +
> +               if (fwts_pipe_exec("modprobe efi_runtime", &output, &status) != FWTS_OK) {
>                         fwts_log_error(fw, "Load efi_runtime module error.");
>                         return FWTS_ERROR;
>                 } else {
> @@ -94,7 +96,9 @@ int fwts_lib_efi_runtime_unload_module(fwts_framework *fw)
>                 return FWTS_ERROR;
>         }
>         if (module_already_loaded) {
> -               if (fwts_pipe_exec("modprobe -r efi_runtime", &output) != FWTS_OK) {
> +               int status;
> +
> +               if (fwts_pipe_exec("modprobe -r efi_runtime", &output, &status) != FWTS_OK) {
>                         fwts_log_error(fw, "Unload efi_runtime module error.");
>                         return FWTS_ERROR;
>                 } else {
> diff --git a/src/lib/src/fwts_hwinfo.c b/src/lib/src/fwts_hwinfo.c
> index 4365c64..3fcac80 100644
> --- a/src/lib/src/fwts_hwinfo.c
> +++ b/src/lib/src/fwts_hwinfo.c
> @@ -33,15 +33,17 @@ int fwts_hwinfo_get(fwts_framework *fw, fwts_hwinfo *hwinfo)
>  {
>         FWTS_UNUSED(fw);
>
> -       fwts_pipe_exec("lspci | grep Network", &hwinfo->network);
> -       fwts_pipe_exec("lspci | grep Ethernet", &hwinfo->ethernet);
> -       fwts_pipe_exec("ifconfig -a | grep -A1 '^\\w'", &hwinfo->ifconfig);
> -       fwts_pipe_exec("iwconfig | grep -A1 '^\\w'", &hwinfo->iwconfig);
> -       fwts_pipe_exec("hciconfig -a | grep -A2 '^\\w", &hwinfo->hciconfig);
> -       fwts_pipe_exec("lspci | grep VGA", &hwinfo->videocard);
> -       fwts_pipe_exec("xinput list", &hwinfo->xinput);
> -       fwts_pipe_exec("pactl list | grep Sink | grep -v Latency", &hwinfo->pactl);
> -       fwts_pipe_exec("pactl list | grep Source | grep -v Latency", &hwinfo->pactl);
> +       int status;
> +
> +       fwts_pipe_exec("lspci | grep Network", &hwinfo->network, &status);
> +       fwts_pipe_exec("lspci | grep Ethernet", &hwinfo->ethernet, &status);
> +       fwts_pipe_exec("ifconfig -a | grep -A1 '^\\w'", &hwinfo->ifconfig, &status);
> +       fwts_pipe_exec("iwconfig | grep -A1 '^\\w'", &hwinfo->iwconfig, &status);
> +       fwts_pipe_exec("hciconfig -a | grep -A2 '^\\w", &hwinfo->hciconfig, &status);
> +       fwts_pipe_exec("lspci | grep VGA", &hwinfo->videocard, &status);
> +       fwts_pipe_exec("xinput list", &hwinfo->xinput, &status);
> +       fwts_pipe_exec("pactl list | grep Sink | grep -v Latency", &hwinfo->pactl, &status);
> +       fwts_pipe_exec("pactl list | grep Source | grep -v Latency", &hwinfo->pactl, &status);
>
>         return FWTS_OK;
>  }
> diff --git a/src/lib/src/fwts_pipeio.c b/src/lib/src/fwts_pipeio.c
> index 68abee9..5af817b 100644
> --- a/src/lib/src/fwts_pipeio.c
> +++ b/src/lib/src/fwts_pipeio.c
> @@ -133,14 +133,15 @@ int fwts_pipe_close(const int fd, const pid_t pid)
>   *  fwts_pipe_exec()
>   *     execute a command, return a list containing lines
>   *     of the stdout output from the command.
> + *     Return FWTS_OK if the exec worked, FWTS_EXEC_ERROR if
> + *     it failed.  status contains the child exit status.
>   */
> -int fwts_pipe_exec(const char *command, fwts_list **list)
> +int fwts_pipe_exec(const char *command, fwts_list **list, int *status)
>  {
>         pid_t   pid;
>         int     fd;
>         ssize_t len;
>         char    *text;
> -       int     ret;
>
>         if ((fd = fwts_pipe_open(command, &pid)) < 0)
>                 return FWTS_ERROR;
> @@ -149,12 +150,11 @@ int fwts_pipe_exec(const char *command, fwts_list **list)
>         *list = fwts_list_from_text(text);
>         free(text);
>
> -       ret = fwts_pipe_close(fd, pid);
> -
> -       if (ret == FWTS_EXEC_ERROR) {
> +       *status = fwts_pipe_close(fd, pid);
> +       if (*status) {
>                 fwts_list_free(*list, free);
>                 *list = NULL;
> -               return FWTS_ERROR;
> +               return FWTS_EXEC_ERROR;
>         }
>         return FWTS_OK;
>  }
> diff --git a/src/pci/aspm/aspm.c b/src/pci/aspm/aspm.c
> index 1a6cc27..a2cda8c 100644
> --- a/src/pci/aspm/aspm.c
> +++ b/src/pci/aspm/aspm.c
> @@ -229,10 +229,11 @@ static int pcie_check_aspm_registers(fwts_framework *fw)
>         struct pci_device *head = NULL, *cur = NULL, *device = NULL;
>         char command[PATH_MAX];
>         int ret = FWTS_OK;
> +       int status;
>
>         snprintf(command, sizeof(command), "%s", fw->lspci);
>
> -       if (fwts_pipe_exec(command, &lspci_output) == FWTS_EXEC_ERROR) {
> +       if (fwts_pipe_exec(command, &lspci_output, &status) != FWTS_OK) {
>                 fwts_log_warning(fw, "Could not execute %s", command);
>                 return FWTS_ERROR;
>         }
> @@ -267,10 +268,11 @@ static int pcie_check_aspm_registers(fwts_framework *fw)
>         for (cur = head; cur; cur = cur->next) {
>                 int reg_loc = 0, reg_val = 0;
>                 int i;
> +               int status;
>
>                 snprintf(command, sizeof(command), "%s -s %02X:%02X.%02X -xxx",
>                         fw->lspci, cur->bus, cur->dev, cur->func);
> -               if (fwts_pipe_exec(command, &lspci_output) == FWTS_EXEC_ERROR) {
> +               if (fwts_pipe_exec(command, &lspci_output, &status) != FWTS_OK) {
>                         fwts_log_warning(fw, "Could not execute %s", command);
>                         pci_device_list_free(head);
>                         return FWTS_ERROR;
> diff --git a/src/pci/maxreadreq/maxreadreq.c b/src/pci/maxreadreq/maxreadreq.c
> index e5ace46..92af83f 100644
> --- a/src/pci/maxreadreq/maxreadreq.c
> +++ b/src/pci/maxreadreq/maxreadreq.c
> @@ -37,10 +37,12 @@ static fwts_list *lspci_text;
>
>  static int maxreadreq_init(fwts_framework *fw)
>  {
> +       int status;
> +
>         if (fwts_check_executable(fw, fw->lspci, "lspci"))
>                 return FWTS_ERROR;
>
> -       if (fwts_pipe_exec("lspci -vvv", &lspci_text)) {
> +       if (fwts_pipe_exec("lspci -vvv", &lspci_text, &status) != FWTS_OK) {
>                 fwts_log_error(fw, "Failed to execute lspci -vvv.");
>                 return FWTS_ERROR;
>         }
> --
> 1.8.0
>
Acked-by: Keng-Yu Lin <kengyu at canonical.com>



More information about the fwts-devel mailing list