]>
Commit | Line | Data |
---|---|---|
10a89ef0 | 1 | /* Copyright (c) 2009, 2010, 2013 Nicira, Inc. |
064af421 | 2 | * |
a14bc59f BP |
3 | * Licensed under the Apache License, Version 2.0 (the "License"); |
4 | * you may not use this file except in compliance with the License. | |
5 | * You may obtain a copy of the License at: | |
064af421 | 6 | * |
a14bc59f | 7 | * http://www.apache.org/licenses/LICENSE-2.0 |
064af421 | 8 | * |
a14bc59f BP |
9 | * Unless required by applicable law or agreed to in writing, software |
10 | * distributed under the License is distributed on an "AS IS" BASIS, | |
11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 | * See the License for the specific language governing permissions and | |
13 | * limitations under the License. | |
064af421 BP |
14 | */ |
15 | ||
16 | #include <config.h> | |
17 | #include "xenserver.h" | |
18 | #include <ctype.h> | |
19 | #include <errno.h> | |
d3aa3710 | 20 | #include <pthread.h> |
064af421 BP |
21 | #include <stdlib.h> |
22 | #include <string.h> | |
23 | #include <unistd.h> | |
3e8a2ad1 | 24 | #include "openvswitch/dynamic-string.h" |
064af421 | 25 | #include "process.h" |
e6211adc TG |
26 | #include "util.h" |
27 | #include "openvswitch/vlog.h" | |
5136ce49 | 28 | |
d98e6007 | 29 | VLOG_DEFINE_THIS_MODULE(xenserver); |
064af421 | 30 | |
d3aa3710 BP |
31 | /* If running on a XenServer, the XenServer host UUID as a 36-character string, |
32 | * otherwise null. */ | |
33 | static char *host_uuid; | |
34 | ||
35 | static void | |
064af421 BP |
36 | read_host_uuid(void) |
37 | { | |
38 | static const char filename[] = "/etc/xensource-inventory"; | |
39 | char line[128]; | |
40 | FILE *file; | |
41 | ||
42 | file = fopen(filename, "r"); | |
43 | if (!file) { | |
44 | if (errno == ENOENT) { | |
11f8bde3 | 45 | VLOG_DBG("not running on a XenServer"); |
064af421 | 46 | } else { |
10a89ef0 | 47 | VLOG_INFO("%s: open: %s", filename, ovs_strerror(errno)); |
064af421 | 48 | } |
d3aa3710 | 49 | return; |
064af421 BP |
50 | } |
51 | ||
52 | while (fgets(line, sizeof line, file)) { | |
53 | static const char leader[] = "INSTALLATION_UUID='"; | |
54 | const int leader_len = strlen(leader); | |
55 | const int uuid_len = 36; | |
56 | static const char trailer[] = "'\n"; | |
57 | const int trailer_len = strlen(trailer); | |
58 | ||
59 | if (strlen(line) == leader_len + uuid_len + trailer_len | |
60 | && !memcmp(line, leader, leader_len) | |
61 | && !memcmp(line + leader_len + uuid_len, trailer, trailer_len)) { | |
d3aa3710 | 62 | host_uuid = xmemdup0(line + leader_len, uuid_len); |
064af421 BP |
63 | VLOG_INFO("running on XenServer, host-uuid %s", host_uuid); |
64 | fclose(file); | |
d3aa3710 | 65 | return; |
064af421 BP |
66 | } |
67 | } | |
68 | fclose(file); | |
69 | VLOG_ERR("%s: INSTALLATION_UUID not found", filename); | |
064af421 BP |
70 | } |
71 | ||
72 | const char * | |
73 | xenserver_get_host_uuid(void) | |
74 | { | |
d3aa3710 BP |
75 | static pthread_once_t once = PTHREAD_ONCE_INIT; |
76 | pthread_once(&once, read_host_uuid); | |
064af421 BP |
77 | return host_uuid; |
78 | } | |
79 |