static void get_lib_file(size_t addr, size_t base_elf) { char maps[256]; int fd; snprintf(maps, sizeof(maps) - 1, "/proc/%u/maps", g_pid); if ((fd = open(maps, O_RDONLY)) < 0) return ; get_lib(fd, addr, base_elf); close(fd); }
int criticity_init(void) { char *fname; xmlDocPtr doc; xmlNodePtr root; xmlNodePtr node; /* Clear old criticity level definitions */ criticity_destroy(); /* Get criticity level definition file name */ fname = get_lib("criticity.xml"); if ( fname == NULL ) { fprintf(stderr, "*WARNING* Unable to find criticity definition file 'criticity.xml'\n"); return -1; } fprintf(stderr, "Criticity Levels definition file: %s\n", fname); /* Parse criticity level definitions */ doc = xmlParseFile(fname); if ( doc != NULL ) { root = xmlDocGetRootElement(doc); if ( root != NULL ) { node = root->children; while ( node != NULL ) { if ( node->type == XML_ELEMENT_NODE ) { if ( strcmp((char *) node->name, "CRITICITY") == 0 ) { xmlChar *id = xmlGetProp(node, (xmlChar *) "id"); xmlChar *color = xmlGetProp(node, (xmlChar *) "color"); xmlChar *level = xmlGetProp(node, (xmlChar *) "level"); int i; i = atoi((char *) level); if ( i >= criticity_nb ) { int nb = i + 5; criticity_tab = (criticity_item_t *) realloc(criticity_tab, nb * sizeof(criticity_item_t)); while ( criticity_nb < nb ) { criticity_tab[criticity_nb].id = NULL; criticity_tab[criticity_nb].id_uc = NULL; criticity_tab[criticity_nb].color = NULL; criticity_nb++; } } criticity_tab[i].id = strdup((char *) id); criticity_tab[i].id_uc = strupper(strdup((char *) id)); criticity_tab[i].color = strdup((char *) color); xmlFree(level); xmlFree(color); xmlFree(id); } } node = node->next; } } xmlFreeDoc(doc); } xmlCleanupParser(); free(fname); /* Set CRITICITY_NONE entry */ if ( criticity_nb > 0 ) { criticity_tab[0].id = strdup(""); criticity_tab[0].id_uc = strdup(""); criticity_tab[0].color = strdup("black"); } return 0; }