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