1eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/************************************************************************ 2eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinCopyright (c) 2015, The Linux Foundation. All rights reserved. 3eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 4eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinRedistribution and use in source and binary forms, with or without 5eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinmodification, are permitted provided that the following conditions are 6eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinmet: 7eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Redistributions of source code must retain the above copyright 8eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin notice, this list of conditions and the following disclaimer. 9eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Redistributions in binary form must reproduce the above 10eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin copyright notice, this list of conditions and the following 11eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin disclaimer in the documentation and/or other materials provided 12eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin with the distribution. 13eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Neither the name of The Linux Foundation nor the names of its 14eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin contributors may be used to endorse or promote products derived 15eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin from this software without specific prior written permission. 16eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 17eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick TjinIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin************************************************************************/ 29eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 30eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/** 31eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @file datatop_gen_poll.c 32eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @brief Contains functions which add ability to scan directories for data points. 33eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 34eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Contains functions that search through a directory and create dpg's for any 35eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * important data values found which can then be polled for data collection. 36eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin */ 37eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 38eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include <unistd.h> 39eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include <stdio.h> 40eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include <dirent.h> 41eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include <string.h> 42eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include <stdlib.h> 43eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include <errno.h> 44eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include <sys/stat.h> 45eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include <sys/types.h> 46eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 47eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include "datatop_interface.h" 48eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include "datatop_fileops.h" 49eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include "datatop_str.h" 50eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#include "datatop_gen_poll.h" 51eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 52eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_GEN_SIZE 8192 53eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin#define DTOP_GEN_LINE (DTOP_GEN_SIZE>>2) 54eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 55eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/** 56eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @brief Searches a file to find the number of data values it contains. 57eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 58eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @param dpg The struct which contains the file to search. 59eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @return Number of datapoints found in the file. 60eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin */ 61eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinstatic int get_number_of_values(struct dtop_data_point_gatherer *dpg) 62eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin{ 63eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char *data; 64eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int read; 65eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char line[DTOP_GEN_LINE]; 66eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int line_len; 67eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int i, num; 68eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 69eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin read = dt_read_file(dpg->file, &data, DTOP_GEN_SIZE); 70eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin line_len = dt_read_line(line, DTOP_GEN_LINE, data, DTOP_GEN_SIZE, 0); 71eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 72eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin if (read == 0) { 73eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin return 0; 74eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 75eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 76eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin if (line_len < 1) { 77eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dt_free(&data); 78eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin return 0; 79eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 80eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 81eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin num = 1; 82eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin for (i = 0; i < line_len; i++) { 83eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin if ((line[i] == ' ' || line[i] == ',' 84eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin || line[i] == ' ') &&line[i+1] != 0) 85eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin num++; 86eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 87eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 88eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dt_free(&data); 89eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin return num; 90eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin} 91eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 92eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/** 93eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @brief Stores the data collected from a dpg that was constructed during dtop_search. 94eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 95eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @param dpg Struct that polled data is added to. 96eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @return DTOP_POLL_IO_ERR - Poll of dpg unsuccessful. 97eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @return DTOP_POLL_OK - Poll of dpg successful. 98eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin */ 99eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinint dtop_gen_poll(struct dtop_data_point_gatherer *dpg) 100eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin{ 101eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char *data; 102eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int read; 103eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char line[DTOP_GEN_LINE]; 104eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int line_len; 105eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin struct dt_procdict dict; 106eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int i; 107eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 108eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin read = dt_read_file(dpg->file, &data, DTOP_GEN_SIZE); 109eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin line_len = dt_read_line(line, DTOP_GEN_LINE, data, DTOP_GEN_SIZE, 0); 110eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 111eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin if (read == 0 || data == 0) 112eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin return DTOP_POLL_IO_ERR; 113eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 114eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dt_single_line_parse(line, line_len, &dict); 115eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 116eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin for (i = 0; i < dpg->data_points_len; i++) { 117eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin if (dict.val[i][0] == '-') 118eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dpg->data_points[i].type = DTOP_LONG; 119eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dtop_store_dp(&(dpg->data_points[i]), dict.val[i]); 120eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 121eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 122eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dt_free(&data); 123eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin return DTOP_POLL_OK; 124eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin} 125eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 126eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/** 127eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @brief Frees dynamically allocated dpg's. 128eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 129eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Frees the memory of dpg variables and the dpg for all dynamically allocated 130eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * dpgs. 131eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 132eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @param dpg Dpg to deconstruct and deallocate memory for. 133eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin */ 134eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinstatic void dtop_gen_dpg_deconstructor(struct dtop_data_point_gatherer *dpset) 135eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin{ 136eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int i; 137eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin for (i = 0; i < dpset->data_points_len; i++) 138eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin free(dpset->data_points[i].name); 139eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin free(dpset->data_points); 140eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin free(dpset->file); 141eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin free(dpset->prefix); 142eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin free(dpset); 143eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin} 144eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 145eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/** 146eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @brief Creates a dpg and all necessary dp's corresponding to it. 147eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 148eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Dynamically allocates memory for dpg and dp structs which are then 149eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * created and added to a linked_list of dpgs through the dtop_register 150eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * function. 151eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 152eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @param dir Directory which file is located in, assigned to the dpg prefix. 153eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @param name Name of file that dpg represents, assigned to a dp name. 154eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin */ 155eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinstatic void dpg_construction(char *dir, char *name) 156eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin{ 157eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int num, i; 158eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int both_len = strlen(dir) + strlen(name) + 1; 159eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char *both = malloc(both_len); 160eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char *maindir; 161eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin struct dtop_data_point_gatherer *dpg = malloc 162eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin (sizeof(struct dtop_data_point_gatherer)); 163eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strlcpy(both, dir, both_len); 164eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strlcat(both, name, both_len); 165eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin maindir = malloc(strlen(dir) + 1); 166eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strlcpy(maindir, dir, strlen(dir) + 1); 167eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 168eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dpg->prefix = maindir; 169eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dpg->file = both; 170eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dpg->poll = dtop_gen_poll; 171eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dpg->deconstruct = dtop_gen_dpg_deconstructor; 172eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin num = get_number_of_values(dpg); 173eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 174eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin if (num != 0) { 175eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin struct dtop_data_point *dp = malloc 176eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin (num * sizeof(struct dtop_data_point)); 177eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin for (i = 0; i < num; i++) { 178eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin if (num == 1) { 179eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dp[i].name = malloc(strlen(name) + 1); 180eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strlcpy(dp[i].name, name, strlen(name) + 1); 181eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } else { 182eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char *add = malloc(7 * sizeof(char)); 183eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char *newname; 184eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int nn_len, dpn_len; 185eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin snprintf(add, 7 * sizeof(char), "[%d]:", i); 186eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin nn_len = strlen(name) + strlen(add) + 1; 187eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin newname = malloc(nn_len); 188eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strlcpy(newname, name, nn_len); 189eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strlcat(newname, add, nn_len); 190eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dpn_len = strlen(newname) + 1; 191eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dp[i].name = malloc(dpn_len); 192eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strlcpy(dp[i].name, newname, dpn_len); 193eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin free(add); 194eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin free(newname); 195eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 196eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dp[i].prefix = NULL; 197eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dp[i].type = DTOP_ULONG; 198eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dp[i].skip = DO_NOT_SKIP; 199eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dp[i].initial_data_populated = NOT_POPULATED; 200eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 201eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 202eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dpg->data_points = dp; 203eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dpg->data_points_len = num; 204eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 205eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dtop_register(dpg); 206eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } else { 207eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin free(dpg->prefix); 208eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin free(dpg->file); 209eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin free(dpg); 210eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 211eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin} 212eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 213eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/** 214eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @brief Scans a directory for all important datapoints to be collected. 215eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 216eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * Recursively scans a directory and locates all files which data will be 217eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * collected from. 218eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 219eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @param dir Directory to search. 220eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin */ 221eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinstatic int dtop_search(char *dir) 222eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin{ 223eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin DIR *dp; 224eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin struct dirent *entry; 225eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin struct stat s; 226eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char cwd[1024]; 227eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 228eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin if (!getcwd(cwd, sizeof(cwd))) { 229eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin fprintf(stderr, "Failed to get current working dir\n"); 230eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin return -1; 231eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 232eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 233eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dp = opendir(dir); 234eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin if (dp == NULL) { 235eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin fprintf(stderr, "err=%d: %s\n", errno, strerror(errno)); 236eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin fprintf(stderr, "Cannot open directory: %s\n", dir); 237eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin return DIR_FAILURE; 238eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 239eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 240eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin chdir(dir); 241eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 242eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin while ((entry = readdir(dp))) { 243eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin if (stat(entry->d_name, &s)) { 244eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin printf("stat err=%d: %s\n", errno, strerror(errno)); 245eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin return DIR_FAILURE; 246eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 247eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 248eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin if (strcmp(".", entry->d_name) != 0 && 249eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strcmp("..", entry->d_name) != 0 && 250eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin S_ISREG(s.st_mode)) { 251eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 252eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dpg_construction(dir, entry->d_name); 253eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 254eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } else if (strcmp(".", entry->d_name) != 0 && 255eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strcmp("..", entry->d_name) != 0 && 256eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin S_ISDIR(s.st_mode)) { 257eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin int nd_len = strlen(dir) + strlen(entry->d_name) + 2; 258eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin char *newdir = malloc(nd_len); 259eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strlcpy(newdir, dir, nd_len); 260eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strlcat(newdir, entry->d_name, nd_len); 261eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin strlcat(newdir, "/", nd_len); 262eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dtop_search(newdir); 263eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin free(newdir); 264eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 265eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin } 266eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 267eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin closedir(dp); 268eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin chdir(cwd); 269eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin return DIR_SUCCESS; 270eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin} 271eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin 272eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin/** 273eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @brief Calls dtop_search for any specified directory. 274eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * 275eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin * @param dir Directory to search. 276eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin */ 277eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjinvoid dtop_gen_init(char *dir) 278eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin{ 279eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin dtop_search(dir); 280eb0c8d15824517b481b1ddc191b8c00ee7a9d70dPatrick Tjin} 281