* Assign a node a name. */
| 855 | * Assign a node a name. |
| 856 | */ |
| 857 | int |
| 858 | ng_name_node(node_p node, const char *name) |
| 859 | { |
| 860 | uint32_t hash; |
| 861 | node_p node2; |
| 862 | int i; |
| 863 | |
| 864 | /* Check the name is valid */ |
| 865 | for (i = 0; i < NG_NODESIZ; i++) { |
| 866 | if (name[i] == '\0' || name[i] == '.' || name[i] == ':') |
| 867 | break; |
| 868 | } |
| 869 | if (i == 0 || name[i] != '\0') { |
| 870 | TRAP_ERROR(); |
| 871 | return (EINVAL); |
| 872 | } |
| 873 | if (ng_decodeidname(name) != 0) { /* valid IDs not allowed here */ |
| 874 | TRAP_ERROR(); |
| 875 | return (EINVAL); |
| 876 | } |
| 877 | |
| 878 | NAMEHASH_WLOCK(); |
| 879 | if (V_ng_named_nodes * 2 > V_ng_name_hmask) |
| 880 | ng_name_rehash(); |
| 881 | |
| 882 | hash = hash32_str(name, HASHINIT) & V_ng_name_hmask; |
| 883 | /* Check the name isn't already being used. */ |
| 884 | LIST_FOREACH(node2, &V_ng_name_hash[hash], nd_nodes) |
| 885 | if (NG_NODE_IS_VALID(node2) && |
| 886 | (strcmp(NG_NODE_NAME(node2), name) == 0)) { |
| 887 | NAMEHASH_WUNLOCK(); |
| 888 | return (EADDRINUSE); |
| 889 | } |
| 890 | |
| 891 | if (NG_NODE_HAS_NAME(node)) |
| 892 | LIST_REMOVE(node, nd_nodes); |
| 893 | else |
| 894 | V_ng_named_nodes++; |
| 895 | /* Copy it. */ |
| 896 | strlcpy(NG_NODE_NAME(node), name, NG_NODESIZ); |
| 897 | /* Update name hash. */ |
| 898 | LIST_INSERT_HEAD(&V_ng_name_hash[hash], node, nd_nodes); |
| 899 | NAMEHASH_WUNLOCK(); |
| 900 | |
| 901 | return (0); |
| 902 | } |
| 903 | |
| 904 | /* |
| 905 | * Find a node by absolute name. The name should NOT end with ':' |
no test coverage detected