SPECS/netmgmt/netmgmt-1.1.0-2.patch
53b177c5
 diff -uNr netmgmt-1.1.0/cli/netmgrcli.c netmgmt-1.1.0-2/cli/netmgrcli.c
 --- netmgmt-1.1.0/cli/netmgrcli.c	2017-03-11 11:58:08.000000000 +0000
 +++ netmgmt-1.1.0-2/cli/netmgrcli.c	2017-04-18 22:12:32.028012184 +0000
 @@ -1116,89 +1116,6 @@
  }
  
  
 -static struct option fwRuleOptions[] =
 -{
 -    {"add",          no_argument,          0,    'a'},
 -    {"del",          no_argument,          0,    'd'},
 -    {"get",          no_argument,          0,    'g'},
 -    {"rule",         required_argument,    0,    'r'},
 -    {0, 0, 0, 0}
 -};
 -
 -static uint32_t
 -cli_fw_rule(
 -    int argc,
 -    char **argv,
 -    PNETMGR_CMD pCmd
 -    )
 -{
 -    uint32_t err = 0, valid_rule = 0;
 -    int nOptionIndex = 0, nOption = 0;
 -    CMD_OP op = OP_INVALID;
 -
 -    opterr = 0;
 -    optind = 1;
 -    while (1)
 -    {
 -        nOption = getopt_long(argc,
 -                              argv,
 -                              "adgr:",
 -                              fwRuleOptions,
 -                              &nOptionIndex);
 -        if (nOption == -1)
 -            break;
 -
 -        switch(nOption)
 -        {
 -            case 'a':
 -                op = OP_ADD;
 -                break;
 -            case 'd':
 -                op = OP_DEL;
 -                break;
 -            case 'g':
 -                op = OP_GET;
 -                break;
 -            case 'r':
 -                if (strlen(optarg) > 0)
 -                {
 -                    err = netmgrcli_alloc_keyvalue("rule", optarg, pCmd);
 -                    valid_rule = 1;
 -                }
 -                break;
 -            case '?':
 -                /* Option not handled here. Ignore. */
 -                break;
 -        }
 -        bail_on_error(err);
 -    }
 -
 -    if ((op == OP_INVALID) ||
 -        (((op == OP_DEL) || (op == OP_ADD)) && (valid_rule == 0)))
 -    {
 -        err = EDOM;
 -        bail_on_error(err);
 -    }
 -
 -    pCmd->id = CMD_FW_RULE;
 -    pCmd->op = op;
 -
 -cleanup:
 -    return err;
 -
 -error:
 -    pCmd->op = OP_INVALID;
 -    if(err == EDOM)
 -    {
 -        fprintf(stderr,
 -                "Usage:\nfw_rule --get\n"
 -                 "fw_rule --add --rule <Firewall Rule>\n"
 -                 "fw_rule --del --rule <Firewall Rule>\n");
 -    }
 -    goto cleanup;
 -}
 -
 -
  static struct option hostnameOptions[] =
  {
      {"set",          no_argument,          0,    's'},
 @@ -1646,35 +1563,35 @@
       cli_link_info,
       "--set --interface <interface name> --mode <manual|auto> --state <up|down> "
       "--macaddr <mac_address> --mtu <mtu>",
 -     "get or set link mac addr, mtu, state, mode per interface"
 +     "get or set interface mac address, mtu, link state, or link mode"
      },
      {"ip4_address",
       cli_ip4_address,
       "--set --interface <interface name> --mode <dhcp|static|none> "
       "--addr <IPv4Address/prefix> --gateway <default gateway>",
 -     "get or set IPv4 address and default gateway for interface"
 +     "get or set interface IPv4 address and optionally default gateway"
      },
      {"ip6_address",
       cli_ip6_address,
       "--add|--del|--set --interface <interface name> --dhcp <1|0> --autoconf <1|0> "
       "--addrlist <IPv6 Address/Prefix list> --gateway <Default IPv6 gateway>",
 -     "add or delete IPv6 addresses and default gateway for interface"
 +     "add or delete IPv6 address(es) and optionally default gateway for interface"
      },
      {"ip_route",
       cli_ip_route,
       "--add|--del --interface <interface name> --destination <Dest Network/Prefix> "
       "--gateway <Gateway IP Addr> -- metric <Route Metric> --scope <scope>",
 -     "add or delete IP routes for the interface"
 +     "add or delete static IP route for the interface"
      },
      {"dns_servers",
       cli_dns_servers,
       "--set --mode <dhcp|static> --servers <DNS servers list>",
 -     "get or set DNS mode, DNS servers list"
 +     "get or set DNS mode, list of DNS servers"
      },
      {"dns_domains",
       cli_dns_domains,
       "--set --del --add --domains <Domains list>",
 -     "get or set DNS domains list"
 +     "get or set list of DNS domains"
      },
      {"dhcp_duid",
       cli_dhcp_duid,
 @@ -1691,26 +1608,21 @@
       "--set --del --add --servers <NTP servers list>",
       "get or set NTP servers list"
      },
 -    {"fw_rule",
 -     cli_fw_rule,
 -     "--add --del --rule <Firewall Rule>",
 -     "add or delete firewall rules"
 -    },
      {"hostname",
       cli_hostname,
 -     "--set --name <Hostname>",
 -     "get or set hostname"
 +     "--set --name <hostname>",
 +     "get or set system hostname"
      },
      {"wait_for_link",
       cli_wait_for_link,
       "--interface <interface name> --timeout <timeout>",
 -     "waits until timeout for the interface to up"
 +     "wait for the interface to come up"
      },
      {"wait_for_ip",
       cli_wait_for_ip,
       "--interface <interface name> --timeout <timeout> --addrtype <ipv4,ipv6,"
       "static_ipv4,static_ipv6,dhcp_ipv4,dhcp_ipv6,auto_ipv6,link_local_ipv6>",
 -     "waits until timeout for the interface to get a valid IP address"
 +     "wait for the interface to acquire a valid IP address"
      },
      {"error_info",
       cli_err_info,
 @@ -1721,7 +1633,7 @@
       cli_net_info,
       "--set --object <ifname or filename> --paramname <param name> "
       "--paramvalue <value>",
 -     "get or set network parameters"
 +     "get or set network configuration parameters"
      },
  };
  
 @@ -1736,14 +1648,13 @@
      fprintf(stdout, "For version: netmgr -v or netmgr --version\n");
      fprintf(stdout, "\n");
  
 -    fprintf(stdout, "List of commands\n");
 +    fprintf(stdout, "List of commands:\n");
      fprintf(stdout, "\n");
  
      for(i = 0; i < nCmdCount; ++i)
      {
 -        fprintf(stdout, "%s %s\t%s\n",
 +        fprintf(stdout, "%s \t%s\n",
                  cmdMap[i].pszCmdName,
 -                cmdMap[i].pszParams,
                  cmdMap[i].pszHelpMessage);
      }
      return 0;
 diff -uNr netmgmt-1.1.0/include/public/netmgr.h netmgmt-1.1.0-2/include/public/netmgr.h
 --- netmgmt-1.1.0/include/public/netmgr.h	2017-03-11 11:58:08.000000000 +0000
 +++ netmgmt-1.1.0-2/include/public/netmgr.h	2017-04-18 22:12:32.028012184 +0000
 @@ -15,6 +15,10 @@
  #ifndef __NETMGR_H__
  #define __NETMGR_H__
  
 +#ifdef __cplusplus
 +extern "C" {
 +#endif
 +
  #define SET_FLAG(v, f) (v) = ((v) | (f))
  #define CLEAR_FLAG(v, f) (v) = ((v) & ~(f))
  #define TEST_FLAG(v, f) (((v) & (f)) != 0)
 @@ -198,6 +202,10 @@
      uint32_t nmErrCode
  );
  
 +uint32_t
 +nm_touch_network_conf_file(
 +    const char *pszInterfaceName,
 +    char **ppszFilename);
  
  /*
   * Interface configuration APIs
 @@ -574,6 +582,9 @@
  uint32_t
  nm_reload_firewall_config();
  
 +#ifdef __cplusplus
 +}
 +#endif
  
  #endif /* __NETMGR_H__ */
  
 diff -uNr netmgmt-1.1.0/src/netmgr.c netmgmt-1.1.0-2/src/netmgr.c
 --- netmgmt-1.1.0/src/netmgr.c	2017-03-11 11:58:08.000000000 +0000
 +++ netmgmt-1.1.0-2/src/netmgr.c	2017-04-18 22:12:32.036012184 +0000
 @@ -608,6 +608,48 @@
      goto cleanup;
  }
  
 +uint32_t
 +nm_touch_network_conf_file(
 +    const char *pszInterfaceName,
 +    char **ppszFilename)
 +{
 +    uint32_t err = 0;
 +    char *pszCfgFileName = NULL;
 +    int lockId;
 +
 +    err = nm_acquire_write_lock(0, &lockId);
 +    bail_on_error(err);
 +
 +    if (!IS_VALID_INTERFACE_NAME(pszInterfaceName))
 +    {
 +        err = NM_ERR_INVALID_INTERFACE;
 +        bail_on_error(err);
 +    }
 +
 +    err = nm_get_network_conf_filename_for_update(pszInterfaceName,
 +                                                  &pszCfgFileName);
 +    bail_on_error(err);
 +
 +    if (ppszFilename != NULL)
 +    {
 +        *ppszFilename = pszCfgFileName;
 +    }
 +    else
 +    {
 +        netmgr_free(pszCfgFileName);
 +    }
 +
 +cleanup:
 +    nm_release_write_lock(lockId);
 +    return err;
 +error:
 +    if (ppszFilename != NULL)
 +    {
 +        *ppszFilename = NULL;
 +    }
 +    netmgr_free(pszCfgFileName);
 +    goto cleanup;
 +}
  
  /*
   * Interface configuration APIs
 @@ -1311,9 +1353,12 @@
          bail_on_error(err);
      }
  
 -    err = netmgr_alloc_string_printf(&pszArpingCmd, "%s %s -I %s %s",
 -                                     ARPING_COMMAND, pszCommandOptions,
 -                                     pszInterfaceName, pszDestIPv4Addr);
 +    err = netmgr_alloc_string_printf(&pszArpingCmd,
 +                                     "%s %s -I %s %s",
 +                                     ARPING_COMMAND,
 +                                     pszCommandOptions,
 +                                     pszInterfaceName,
 +                                     pszDestIPv4Addr);
      bail_on_error(err);
  
      err = nm_run_command(pszArpingCmd);
 @@ -2912,8 +2957,8 @@
      char **ppszIpAddrList = NULL, **ppszGwAddrList = NULL;
      size_t ipCount, gwCount;
  
 -    if (!IS_VALID_INTERFACE_NAME(pszInterfaceName) || !pMode ||
 -        !ppszIPv4AddrPrefix || !ppszIPv4Gateway)
 +    if (!IS_VALID_INTERFACE_NAME(pszInterfaceName) ||
 +        !(pMode || ppszIPv4AddrPrefix || ppszIPv4Gateway))
      {
          err = NM_ERR_INVALID_PARAMETER;
          bail_on_error(err);
 @@ -3001,9 +3046,18 @@
          bail_on_error(err);
      }
  
 -    *pMode = ip4Mode;
 -    *ppszIPv4AddrPrefix = pszIPv4AddrPrefix;
 -    *ppszIPv4Gateway = pszIPv4Gateway;
 +    if (pMode)
 +    {
 +        *pMode = ip4Mode;
 +    }
 +    if (ppszIPv4AddrPrefix)
 +    {
 +        *ppszIPv4AddrPrefix = pszIPv4AddrPrefix;
 +    }
 +    if (ppszIPv4Gateway)
 +    {
 +        *ppszIPv4Gateway = pszIPv4Gateway;
 +    }
  
  cleanup:
      netmgr_list_free(ipCount, (void **)ppszIpAddrList);
 diff -uNr netmgmt-1.1.0/tools/netmgr/main.c netmgmt-1.1.0-2/tools/netmgr/main.c
 --- netmgmt-1.1.0/tools/netmgr/main.c	2017-03-11 11:58:08.000000000 +0000
 +++ netmgmt-1.1.0-2/tools/netmgr/main.c	2017-04-18 22:12:32.048012185 +0000
 @@ -1342,8 +1342,11 @@
      netmgrcli_free_cmd(pCmd);
      return get_cli_error_code(err);
  error:
 -    pszErrMsg = nm_get_error_info(err);
 -    fprintf(stderr, "Error: %s\n", pszErrMsg);
 +    if (err != EDOM)
 +    {
 +        pszErrMsg = nm_get_error_info(err);
 +        fprintf(stderr, "Error: %s\n", pszErrMsg);
 +    }
      goto cleanup;
  }