]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ofed/management/opensm/complib/cl_nodenamemap.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / ofed / management / opensm / complib / cl_nodenamemap.c
1 /*
2  * Copyright (c) 2008 Voltaire, Inc. All rights reserved.
3  * Copyright (c) 2007 Lawrence Livermore National Lab
4  *
5  * This software is available to you under a choice of one of two
6  * licenses.  You may choose to be licensed under the terms of the GNU
7  * General Public License (GPL) Version 2, available from the file
8  * COPYING in the main directory of this source tree, or the
9  * OpenIB.org BSD license below:
10  *
11  *     Redistribution and use in source and binary forms, with or
12  *     without modification, are permitted provided that the following
13  *     conditions are met:
14  *
15  *      - Redistributions of source code must retain the above
16  *        copyright notice, this list of conditions and the following
17  *        disclaimer.
18  *
19  *      - Redistributions in binary form must reproduce the above
20  *        copyright notice, this list of conditions and the following
21  *        disclaimer in the documentation and/or other materials
22  *        provided with the distribution.
23  *
24  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31  * SOFTWARE.
32  *
33  */
34
35 #define _GNU_SOURCE
36 #include <stdio.h>
37 #include <errno.h>
38 #include <string.h>
39 #include <stdlib.h>
40 #include <stdarg.h>
41 #include <sys/types.h>
42 #include <sys/stat.h>
43 #include <unistd.h>
44 #include <ctype.h>
45 #ifdef HAVE_CONFIG_H
46 #include <config.h>
47 #endif
48
49 #include <complib/cl_nodenamemap.h>
50
51 static int map_name(void *cxt, uint64_t guid, char *p)
52 {
53         cl_qmap_t *map = cxt;
54         name_map_item_t *item;
55
56         p = strtok(p, "\"#");
57         if (!p)
58                 return 0;
59
60         item = malloc(sizeof(*item));
61         if (!item)
62                 return -1;
63         item->guid = guid;
64         item->name = strdup(p);
65         cl_qmap_insert(map, item->guid, (cl_map_item_t *)item);
66         return 0;
67 }
68
69 nn_map_t *
70 open_node_name_map(char *node_name_map)
71 {
72         nn_map_t *map;
73
74         if (!node_name_map) {
75 #ifdef HAVE_DEFAULT_NODENAME_MAP
76                 struct stat buf;
77                 node_name_map = HAVE_DEFAULT_NODENAME_MAP;
78                 if (stat(node_name_map, &buf))
79                         return NULL;
80 #else
81                 return NULL;
82 #endif /* HAVE_DEFAULT_NODENAME_MAP */
83         }
84
85         map = malloc(sizeof(*map));
86         if (!map)
87                 return NULL;
88         cl_qmap_init(map);
89
90         if (parse_node_map(node_name_map, map_name, map)) {
91                 fprintf(stderr,
92                         "WARNING failed to open node name map \"%s\" (%s)\n",
93                         node_name_map, strerror(errno));
94                         close_node_name_map(map);
95                         return NULL;
96         }
97
98         return map;
99 }
100
101 void
102 close_node_name_map(nn_map_t *map)
103 {
104         name_map_item_t *item = NULL;
105
106         if (!map)
107                 return;
108
109         item = (name_map_item_t *)cl_qmap_head(map);
110         while (item != (name_map_item_t *)cl_qmap_end(map)) {
111                 item = (name_map_item_t *)cl_qmap_remove(map, item->guid);
112                 free(item->name);
113                 free(item);
114                 item = (name_map_item_t *)cl_qmap_head(map);
115         }
116         free(map);
117 }
118
119 char *
120 remap_node_name(nn_map_t *map, uint64_t target_guid, char *nodedesc)
121 {
122         char *rc = NULL;
123         name_map_item_t *item = NULL;
124
125         if (!map)
126                 goto done;
127
128         item = (name_map_item_t *)cl_qmap_get(map, target_guid);
129         if (item != (name_map_item_t *)cl_qmap_end(map))
130                 rc = strdup(item->name);
131
132 done:
133         if (rc == NULL)
134                 rc = strdup(clean_nodedesc(nodedesc));
135         return (rc);
136 }
137
138 char *
139 clean_nodedesc(char *nodedesc)
140 {
141         int i = 0;
142
143         nodedesc[63] = '\0';
144         while (nodedesc[i]) {
145                 if (!isprint(nodedesc[i]))
146                         nodedesc[i] = ' ';
147                 i++;
148         }
149
150         return (nodedesc);
151 }
152
153 int parse_node_map(const char *file_name,
154                    int (*create)(void *, uint64_t, char *), void *cxt)
155 {
156         char line[256];
157         FILE *f;
158
159         if (!(f = fopen(file_name, "r")))
160                 return -1;
161
162         while (fgets(line, sizeof(line), f)) {
163                 uint64_t guid;
164                 char *p, *e;
165
166                 p = line;
167                 while (isspace(*p))
168                         p++;
169                 if (*p == '\0' || *p == '\n' || *p == '#')
170                         continue;
171
172                 guid = strtoull(p, &e, 0);
173                 if (e == p || (!isspace(*e) && *e != '#' && *e != '\0')) {
174                         fclose(f);
175                         return -1;
176                 }
177
178                 p = e;
179                 while (isspace(*p))
180                         p++;
181
182                 e = strpbrk(p, "\n");
183                 if (e)
184                         *e = '\0';
185
186                 if (create(cxt, guid, p)) {
187                         fclose(f);
188                         return -1;
189                 }
190         }
191
192         fclose(f);
193         return 0;
194 }