net/failsafe: fix missing pclose after popen
[dpdk.git] / drivers / net / failsafe / failsafe_args.c
index ec3db55..3f92a77 100644 (file)
@@ -115,7 +115,7 @@ fs_execute_cmd(struct sub_device *sdev, char *cmdline)
        char output[DEVARGS_MAXLEN + 1];
        size_t len;
        int old_err;
-       int ret;
+       int ret, pclose_ret;
 
        RTE_ASSERT(cmdline != NULL || sdev->cmdline != NULL);
        if (sdev->cmdline == NULL) {
@@ -145,7 +145,8 @@ fs_execute_cmd(struct sub_device *sdev, char *cmdline)
        /* We only read one line */
        if (fgets(output, sizeof(output) - 1, fp) == NULL) {
                DEBUG("Could not read command output");
-               return -ENODEV;
+               ret = -ENODEV;
+               goto ret_pclose;
        }
        fs_sanitize_cmdline(output);
        ret = fs_parse_device(sdev, output);
@@ -154,12 +155,12 @@ fs_execute_cmd(struct sub_device *sdev, char *cmdline)
                goto ret_pclose;
        }
 ret_pclose:
-       ret = pclose(fp);
-       if (ret) {
-               ret = errno;
+       pclose_ret = pclose(fp);
+       if (pclose_ret) {
+               pclose_ret = errno;
                ERROR("pclose: %s", strerror(errno));
                errno = old_err;
-               return ret;
+               return pclose_ret;
        }
        return ret;
 }
@@ -436,6 +437,17 @@ failsafe_args_count_subdevice(struct rte_eth_dev *dev,
                                    dev, params);
 }
 
+static int
+fs_parse_sub_device(struct sub_device *sdev)
+{
+       struct rte_devargs *da;
+       char devstr[DEVARGS_MAXLEN] = "";
+
+       da = &sdev->devargs;
+       snprintf(devstr, sizeof(devstr), "%s,%s", da->name, da->args);
+       return fs_parse_device(sdev, devstr);
+}
+
 int
 failsafe_args_parse_subs(struct rte_eth_dev *dev)
 {
@@ -448,6 +460,8 @@ failsafe_args_parse_subs(struct rte_eth_dev *dev)
                        continue;
                if (sdev->cmdline)
                        ret = fs_execute_cmd(sdev, sdev->cmdline);
+               else
+                       ret = fs_parse_sub_device(sdev);
                if (ret == 0)
                        sdev->state = DEV_PARSED;
        }