]> git.proxmox.com Git - mirror_ovs.git/blame - vswitchd/xenserver.c
Merge branch 'dpdk_merge' of https://github.com/istokes/ovs into HEAD
[mirror_ovs.git] / vswitchd / xenserver.c
CommitLineData
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 29VLOG_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. */
33static char *host_uuid;
34
35static void
064af421
BP
36read_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
72const char *
73xenserver_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