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