diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
commit | 47e6e7c84f008a53061e661f31ae96629bc694ef (patch) | |
tree | 648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /src/pmdas/linux/devmapper.c | |
download | pcp-47e6e7c84f008a53061e661f31ae96629bc694ef.tar.gz |
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'src/pmdas/linux/devmapper.c')
-rw-r--r-- | src/pmdas/linux/devmapper.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/pmdas/linux/devmapper.c b/src/pmdas/linux/devmapper.c new file mode 100644 index 0000000..38f87d3 --- /dev/null +++ b/src/pmdas/linux/devmapper.c @@ -0,0 +1,86 @@ +/* + * Linux LVM Devices Cluster + * + * Copyright (c) 2013-2014 Red Hat. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +#include <sys/stat.h> +#include "pmapi.h" +#include "impl.h" +#include "pmda.h" +#include "indom.h" +#include "devmapper.h" + +int +refresh_dev_mapper(dev_mapper_t *lvs) +{ + int i; + DIR *dirp; + struct dirent *dentry; + struct stat statbuf; + char path[MAXPATHLEN]; + + snprintf(path, sizeof(path), "%s/dev/mapper", linux_statspath); + if ((dirp = opendir(path)) == NULL) + return 1; + + for (i = 0; i < lvs->nlv; i++) { + free(lvs->lv[i].dev_name); + free(lvs->lv[i].lv_name); + } + lvs->nlv = 0; + lvs->lv = NULL; + while ((dentry = readdir(dirp)) != NULL) { + char linkname[MAXPATHLEN]; + int linkname_len; + + snprintf(path, sizeof(path), + "%s/dev/mapper/%s", linux_statspath, dentry->d_name); + + if (stat(path, &statbuf) == -1) + continue; + if (!S_ISBLK(statbuf.st_mode)) + continue; + + if ((linkname_len = readlink(path, linkname, sizeof(linkname)-1)) < 0) + continue; + linkname[linkname_len] = '\0'; + + i = lvs->nlv; + lvs->nlv++; + + lvs->lv = (lv_entry_t *)realloc(lvs->lv, lvs->nlv * sizeof(lv_entry_t)); + lvs->lv[i].id = lvs->nlv; + + lvs->lv[i].dev_name = malloc(strlen(dentry->d_name)+1); + strcpy(lvs->lv[i].dev_name, dentry->d_name); + + lvs->lv[i].lv_name = malloc(linkname_len+1); + strcpy(lvs->lv[i].lv_name, linkname); + } + closedir(dirp); + + if (lvs->lv_indom->it_numinst != lvs->nlv) { + lvs->lv_indom->it_numinst = lvs->nlv; + lvs->lv_indom->it_set = (pmdaInstid *) + realloc(lvs->lv_indom->it_set, lvs->nlv * sizeof(pmdaInstid)); + } + for (i = 0; i < lvs->nlv; i++) { + int skip_prefix = 0; + lvs->lv_indom->it_set[i].i_inst = lvs->lv[i].id; + if (strncmp(lvs->lv[i].lv_name, "../", 3) == 0) + skip_prefix = 3; + lvs->lv_indom->it_set[i].i_name = lvs->lv[i].lv_name + skip_prefix; + } + return 0; +} |