Print this page
OS-161: Integrate IPMP changes (lint)
OS-161: Integrate IPMP changes

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libipadm/common/ipadm_persist.c
          +++ new/usr/src/lib/libipadm/common/ipadm_persist.c
↓ open down ↓ 12 lines elided ↑ open up ↑
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
       23 + * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
  23   24   */
  24   25  
  25   26  /*
  26   27   * This file contains routines to read/write formatted entries from/to
  27   28   * libipadm data store /etc/ipadm/ipadm.conf. Each entry in the DB is a
  28   29   * series of IPADM_NVPAIR_SEP separated (name, value) pairs, as shown
  29   30   * below:
  30   31   *              name=value[;...]
  31   32   *
  32   33   * The 'name' determines how to interpret 'value'. The supported names are:
↓ open down ↓ 11 lines elided ↑ open up ↑
  44   45   *                      interface_id: DATA_TYPE_UINT8_ARRAY
  45   46   *                      prefixlen: DATA_TYPE_UINT32
  46   47   *                      stateless: DATA_TYPE_STRING
  47   48   *                      stateful: DATA_TYPE_STRING
  48   49   *
  49   50   *  IPADM_NVP_DHCP - value holds wait time and primary info and when converted
  50   51   *             to nvlist, will contain following nvpairs
  51   52   *                      wait:   DATA_TYPE_INT32
  52   53   *                      primary: DATA_TYPE_BOOLEAN
  53   54   *
       55 + *  IPADM_NVP_FAMILIES - value holds interface families and when converted
       56 + *              to nvlist, will be a DATA_TYPE_UINT16_ARRAY
       57 + *
       58 + *  IPADM_NVP_MIFNAMES - value holds IPMP group members and when converted
       59 + *          to nvlist, will be a DATA_TYPE_STRING_ARRAY
       60 + *
  54   61   *  default  - value is a single entity and when converted to nvlist, will
  55   62   *             contain nvpair of type DATA_TYPE_STRING. nvpairs private to
  56   63   *             ipadm are of this type. Further the property name and property
  57   64   *             values are stored as nvpairs of this type.
  58   65   *
  59   66   * The syntax for each line is described above the respective functions below.
  60   67   */
  61   68  
  62   69  #include <stdlib.h>
  63   70  #include <strings.h>
↓ open down ↓ 3 lines elided ↑ open up ↑
  67   74  #include <sys/stat.h>
  68   75  #include <sys/dld.h>
  69   76  #include <fcntl.h>
  70   77  #include <dirent.h>
  71   78  #include <unistd.h>
  72   79  #include <assert.h>
  73   80  #include <sys/socket.h>
  74   81  #include <netinet/in.h>
  75   82  #include <arpa/inet.h>
  76   83  #include <sys/sockio.h>
       84 +#include <sys/note.h>
  77   85  #include "libipadm_impl.h"
  78   86  
  79   87  #define MAXLINELEN              1024
  80   88  #define IPADM_NVPAIR_SEP        ";"
  81   89  #define IPADM_NAME_SEP          ","
  82   90  
  83   91  static char ipadm_rootdir[MAXPATHLEN] = "/";
  84   92  
  85   93  static int ipadm_process_db_line(db_wfunc_t *, void *, FILE *fp, FILE *nfp,
  86   94      ipadm_db_op_t);
↓ open down ↓ 4 lines elided ↑ open up ↑
  91   99  typedef size_t  ipadm_wfunc_t(nvpair_t *, char *, size_t);
  92  100  
  93  101  /*
  94  102   * ipadm_rfunc_t takes (`name', `value') and adds the appropriately typed
  95  103   * nvpair to the nvlist.
  96  104   */
  97  105  typedef void  ipadm_rfunc_t(nvlist_t *, char *name, char *value);
  98  106  
  99  107  static ipadm_rfunc_t    i_ipadm_str_dbline2nvl, i_ipadm_ip4_dbline2nvl,
 100  108                          i_ipadm_ip6_dbline2nvl, i_ipadm_intfid_dbline2nvl,
 101      -                        i_ipadm_dhcp_dbline2nvl;
      109 +                        i_ipadm_dhcp_dbline2nvl, i_ipadm_families_dbline2nvl,
      110 +                        i_ipadm_groupmembers_dbline2nvl;
 102  111  
 103  112  static ipadm_wfunc_t    i_ipadm_str_nvp2dbline, i_ipadm_ip4_nvp2dbline,
 104  113                          i_ipadm_ip6_nvp2dbline, i_ipadm_intfid_nvp2dbline,
 105      -                        i_ipadm_dhcp_nvp2dbline;
      114 +                        i_ipadm_dhcp_nvp2dbline, i_ipadm_families_nvp2dbline,
      115 +                        i_ipadm_groupmembers_nvp2dbline;
 106  116  
 107  117  /*
 108  118   * table of function pointers to read/write formatted entries from/to
 109  119   * ipadm.conf.
 110  120   */
 111  121  typedef struct ipadm_conf_ent_s {
 112  122          const char              *ipent_type_name;
 113  123          ipadm_wfunc_t           *ipent_wfunc;
 114  124          ipadm_rfunc_t           *ipent_rfunc;
 115  125  } ipadm_conf_ent_t;
 116  126  
 117  127  static ipadm_conf_ent_t ipadm_conf_ent[] = {
 118  128          { IPADM_NVP_IPV6ADDR, i_ipadm_ip6_nvp2dbline, i_ipadm_ip6_dbline2nvl },
 119  129          { IPADM_NVP_IPV4ADDR, i_ipadm_ip4_nvp2dbline, i_ipadm_ip4_dbline2nvl },
 120  130          { IPADM_NVP_INTFID, i_ipadm_intfid_nvp2dbline,
 121  131              i_ipadm_intfid_dbline2nvl },
 122  132          { IPADM_NVP_DHCP, i_ipadm_dhcp_nvp2dbline, i_ipadm_dhcp_dbline2nvl },
      133 +        { IPADM_NVP_FAMILIES, i_ipadm_families_nvp2dbline,
      134 +            i_ipadm_families_dbline2nvl },
      135 +        { IPADM_NVP_MIFNAMES, i_ipadm_groupmembers_nvp2dbline,
      136 +            i_ipadm_groupmembers_dbline2nvl},
 123  137          { NULL, i_ipadm_str_nvp2dbline, i_ipadm_str_dbline2nvl }
 124  138  };
 125  139  
 126  140  static ipadm_conf_ent_t *
 127  141  i_ipadm_find_conf_type(const char *type)
 128  142  {
 129  143          int     i;
 130  144  
 131  145          for (i = 0; ipadm_conf_ent[i].ipent_type_name != NULL; i++)
 132  146                  if (strcmp(type, ipadm_conf_ent[i].ipent_type_name) == 0)
↓ open down ↓ 475 lines elided ↑ open up ↑
 608  622          assert(cp != NULL);
 609  623          *cp++ = '\0';
 610  624          errno = 0;
 611  625          wait_time = strtol(value, &endp, 10);
 612  626          if (*endp != '\0' || errno != 0)
 613  627                  return;
 614  628          primary = (strcmp(cp, "yes") == 0);
 615  629          (void) i_ipadm_add_dhcp2nvl(nvl, primary, (int32_t)wait_time);
 616  630  }
 617  631  
      632 +/*
      633 + * Input 'nvp': name = IPADM_NVP_FAMILIES and value = array of 'uint16_t'
      634 + *
      635 + *
      636 + */
      637 +static size_t
      638 +i_ipadm_families_nvp2dbline(nvpair_t *nvp, char *buf, size_t buflen)
      639 +{
      640 +        uint_t nelem = 0;
      641 +        uint16_t *elem;
      642 +
      643 +        assert(nvpair_type(nvp) == DATA_TYPE_UINT16_ARRAY);
      644 +
      645 +        if (nvpair_value_uint16_array(nvp,
      646 +            &elem, &nelem) != 0) {
      647 +                buf[0] = '\0';
      648 +                return (0);
      649 +        }
      650 +
      651 +        assert(nelem != 0 || nelem > 2);
      652 +
      653 +        if (nelem == 1) {
      654 +                return (snprintf(buf, buflen, "%s=%d",
      655 +                    nvpair_name(nvp), elem[0]));
      656 +        } else {
      657 +                return (snprintf(buf, buflen, "%s=%d,%d",
      658 +                    nvpair_name(nvp), elem[0], elem[1]));
      659 +        }
      660 +}
      661 +
      662 +/*
      663 + * name = IPADM_NVP_FAMILIES and value = <FAMILY>[,FAMILY]
      664 + *
      665 + * output nvp: name = IPADM_NVP_FAMILIES and value = array of 'uint16_t'
      666 + *
      667 + */
      668 +static void
      669 +i_ipadm_families_dbline2nvl(nvlist_t *nvl, char *name, char *value)
      670 +{
      671 +        _NOTE(ARGUNUSED(name))
      672 +        uint16_t        families[2];
      673 +        uint_t  nelem = 0;
      674 +        char    *val, *lasts;
      675 +
      676 +        if ((val = strtok_r(value,
      677 +            ",", &lasts)) != NULL) {
      678 +                families[0] = atoi(val);
      679 +                nelem++;
      680 +                if ((val = strtok_r(NULL,
      681 +                    ",", &lasts)) != NULL) {
      682 +                        families[1] = atoi(val);
      683 +                        nelem++;
      684 +                }
      685 +                (void) nvlist_add_uint16_array(nvl,
      686 +                    IPADM_NVP_FAMILIES, families, nelem);
      687 +        }
      688 +}
      689 +
      690 +/*
      691 + * input nvp: name = IPADM_NVP_MIFNAMES and value = array of 'char *'
      692 + *
      693 + *
      694 + */
      695 +static size_t
      696 +i_ipadm_groupmembers_nvp2dbline(nvpair_t *nvp, char *buf, size_t buflen)
      697 +{
      698 +        uint_t nelem = 0;
      699 +        char **elem;
      700 +        size_t n;
      701 +
      702 +        assert(nvpair_type(nvp) == DATA_TYPE_STRING_ARRAY);
      703 +
      704 +        if (nvpair_value_string_array(nvp,
      705 +            &elem, &nelem) != 0) {
      706 +                buf[0] = '\0';
      707 +                return (0);
      708 +        }
      709 +
      710 +        assert(nelem != 0);
      711 +
      712 +        n = snprintf(buf, buflen, "%s=", IPADM_NVP_MIFNAMES);
      713 +        if (n >= buflen)
      714 +                return (n);
      715 +
      716 +        while (nelem-- > 0) {
      717 +                n = strlcat(buf, elem[nelem], buflen);
      718 +                if (nelem > 0)
      719 +                        n = strlcat(buf, ",", buflen);
      720 +
      721 +                if (n > buflen)
      722 +                        return (n);
      723 +        }
      724 +
      725 +        return (n);
      726 +}
      727 +
      728 +/*
      729 + * name = IPADM_NVP_MIFNAMES and value = <if_name>[,if_name]
      730 + *
      731 + * output nvp: name = IPADM_NVP_MIFNAMES and value = array of 'char *'
      732 + */
      733 +static void
      734 +i_ipadm_groupmembers_dbline2nvl(nvlist_t *nvl, char *name, char *value)
      735 +{
      736 +        char    *members[256];
      737 +        char    *member;
      738 +        char    *val, *lasts;
      739 +        uint_t  m_cnt = 0;
      740 +
      741 +        assert(strcmp(name, IPADM_NVP_MIFNAMES) == 0 && value != NULL);
      742 +
      743 +        if ((val = strtok_r(value, ",", &lasts)) != NULL) {
      744 +                if ((member = calloc(1, LIFNAMSIZ)) == NULL)
      745 +                        return;
      746 +
      747 +                (void) strlcpy(member, val, LIFNAMSIZ);
      748 +                members[m_cnt++] = member;
      749 +
      750 +                while ((val = strtok_r(NULL, ",", &lasts)) != NULL) {
      751 +                        if ((member = calloc(1, LIFNAMSIZ)) == NULL)
      752 +                                goto fail;
      753 +
      754 +                        (void) strlcpy(member, val, LIFNAMSIZ);
      755 +                        members[m_cnt++] = member;
      756 +                }
      757 +
      758 +                (void) nvlist_add_string_array(nvl, IPADM_NVP_MIFNAMES,
      759 +                    members, m_cnt);
      760 +        }
      761 +
      762 +fail:
      763 +        while (m_cnt-- > 0) {
      764 +                free(members[m_cnt]);
      765 +        }
      766 +}
      767 +
 618  768  /*
 619  769   * Parses the buffer, for name-value pairs and creates nvlist. The value
 620  770   * is always considered to be a string.
 621  771   */
 622  772  int
 623  773  ipadm_str2nvlist(const char *inbuf, nvlist_t **ipnvl, uint_t flags)
 624  774  {
 625  775          char    *nv, *name, *val, *buf, *cp, *sep;
 626  776          int     err;
 627  777  
↓ open down ↓ 206 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX