27 #include <sys/types.h>
38 #include "analysis_xml_moduleH.h"
42 static char *DEFAULT_ANALYSIS_PATH[] = {
43 INSTALL_LIBEXECDIR
"/analysis",
46 static char *DEFAULT_ANNOTATION_PATH[] = {
47 INSTALL_SHAREDIR
"/annotation",
50 static char *DEFAULT_SCHEMA_PATH[] = {
51 INSTALL_SHAREDIR
"/schema",
57 static char **ANALYSIS_PATH = (
char **)DEFAULT_ANALYSIS_PATH;
58 static char **ANNOTATION_PATH = (
char **)DEFAULT_ANNOTATION_PATH;
59 static char **SCHEMA_PATH = (
char **)DEFAULT_SCHEMA_PATH;
61 static GHashTable *cache = NULL;
63 static int next_analysis_id = 1;
65 static int init_done = 0;
75 gettimeofday(&tv,NULL);
91 struct array_list *retval = array_list_create(8);
97 for (i = 0; (dirname = ANALYSIS_PATH[
i]) != NULL; ++
i) {
98 dir = opendir(dirname);
104 while ((dirp = readdir(dir)))
105 array_list_append(retval,strdup(dirp->d_name));
113 struct array_list *retval = array_list_create(8);
123 for (i = 0; (dirname = ANALYSIS_PATH[
i]) != NULL; ++
i) {
124 dir = opendir(dirname);
132 path_base_len = snprintf(pbuf,PATH_MAX,
"%s/",dirname);
133 pbuf_base_ptr = pbuf + path_base_len;
135 while ((dirp = readdir(dir))) {
136 if (dirp->d_name[0] ==
'.')
139 strncpy(pbuf_base_ptr,dirp->d_name,PATH_MAX - path_base_len);
140 newpath = strdup(pbuf);
142 array_list_append(retval,newpath);
158 for (i = 0; (dirname = ANALYSIS_PATH[
i]) != NULL; ++
i) {
159 dir = opendir(dirname);
165 while ((dirp = readdir(dir))) {
166 if (strcmp(dirp->d_name,name) == 0) {
167 len = strlen(dirp->d_name) + strlen(dirname) + 2;
168 retval =
malloc(
sizeof(
char) * len);
169 snprintf(retval,len,
"%s/%s",dirname,dirp->d_name);
182 const char *desc_file_path) {
188 const char *desc_file_path) {
189 struct vmi1__AnalysisDescT *analysisDesc;
195 if ((fd = open(desc_file_path,O_RDONLY)) < 0) {
196 verror(
"open(%s): %s\n",desc_file_path,strerror(errno));
204 soap_begin_recv(&soap);
205 reftab = g_hash_table_new(g_direct_hash,g_direct_equal);
207 analysisDesc = soap_get_vmi1__AnalysisDescT(&soap,NULL,
"analysisDesc",NULL);
209 verror(
"could not read AnalysisDesc element from %s!\n",
211 g_hash_table_destroy(reftab);
212 soap_end_recv(&soap);
219 soap_end_recv(&soap);
229 g_hash_table_destroy(reftab);
254 if (stat(path,&statbuf))
255 vwarn(
"stat(%s): %s (not using cache)\n",path,strerror(errno));
257 mtime = statbuf.st_mtime;
275 int path_base_len = 0;
279 name = rindex(path,
'/');
287 if (stat(path,&statbuf))
288 vwarn(
"stat(%s): %s (not using cache)\n",path,strerror(errno));
290 mtime = statbuf.st_mtime;
293 path_base_len = snprintf(pbuf,PATH_MAX,
"%s/",path);
294 pbuf_base_ptr = pbuf + path_base_len;
304 strncpy(pbuf_base_ptr,
"description.xml",PATH_MAX - path_base_len);
305 if (stat(pbuf,&statbuf) == 0)
310 strncpy(pbuf_base_ptr,
"description.txt",PATH_MAX - path_base_len);
311 if (stat(pbuf,&statbuf)) {
313 verror(
"could not read description.{xml,txt} in %s!\n",path);
320 retval = analysis_load_xml(path,pbuf);
339 if (!pnlist || array_list_len(pnlist) <= 0)
342 i = array_list_len(pnlist);
343 retval = array_list_create(i);
351 verror(
"could not load analysis in %s %p %i; skipping!\n",pathname,pathname,i);
357 array_list_append(retval,desc);
360 array_list_free(pnlist);
401 retval->
results = array_list_create(0);
413 datum =
calloc(1,
sizeof(*datum));
416 datum->
values = array_list_create(1);
422 datum->
name = strdup(name);
427 datum->
value = strdup(value);
431 datum->
msg = strdup(msg);
442 if (name && !no_copy)
443 v->
name = strdup(name);
446 if (value && !no_copy)
447 v->
value = strdup(value);
451 array_list_append(datum->
values,v);
463 if (name && !no_copy)
464 v->
name = strdup(name);
467 if (value && !no_copy) {
469 memcpy(v->
value,value,len);
474 array_list_append(datum->
values,v);
494 array_list_free(datum->
values);
499 array_list_free(datum->
values);
524 analysis->
status = status;
546 dir = opendir(analysis->
tmpdir);
549 while ((dirp = readdir(dir))) {
550 if (!strcmp(dirp->d_name,
".") || !strcmp(dirp->d_name,
".."))
553 if (unlinkat(dfd,dirp->d_name,0))
554 vwarn(
"could not remove %s in dir %s: %s\n",
555 dirp->d_name,analysis->
tmpdir,strerror(errno));
559 if (rmdir(analysis->
tmpdir))
560 vwarn(
"could not remove dir %s: %s\n",
561 analysis->
tmpdir,strerror(errno));
579 array_list_free(analysis->
results);
610 g_hash_table_iter_init(&iter,desc->
in_params);
611 while (g_hash_table_iter_next(&iter,NULL,&value))
618 g_hash_table_iter_init(&iter,desc->
out_params);
619 while (g_hash_table_iter_next(&iter,NULL,&value))
664 return ANALYSIS_PATH;
679 while (*ptr !=
'\0') {
685 bpath =
calloc(pathlen + 1,
sizeof(*bpath));
691 for (i = 0; nptr && *nptr !=
'\0'; ++
i) {
692 nptr = index(nptr,
':');
695 bpath[
i] = strdup(ptr);
701 bpath[
i] =
malloc(
sizeof(
char)*(nptr - ptr + 1));
702 strncpy(bpath[i],ptr,nptr - ptr);
703 bpath[
i][nptr - ptr] =
'\0';
717 char **ptr = (
char **)path;
727 ANALYSIS_PATH =
calloc(pathlen + 1,
sizeof(
char *));
728 for (i = 0; i < pathlen; ++
i)
729 ANALYSIS_PATH[i] = strdup(path[i]);
739 ANALYSIS_PATH = bpath;
745 char **ptr = (
char **)path;
755 ANNOTATION_PATH =
calloc(pathlen + 1,
sizeof(
char *));
756 for (i = 0; i < pathlen; ++
i)
757 ANNOTATION_PATH[i] = strdup(path[i]);
767 ANNOTATION_PATH = bpath;
773 char **ptr = (
char **)path;
783 SCHEMA_PATH =
calloc(pathlen + 1,
sizeof(
char *));
784 for (i = 0; i < pathlen; ++
i)
785 SCHEMA_PATH[i] = strdup(path[i]);
#define vwarnopt(level, area, flags, format,...)
void analysis_spec_free(struct analysis_spec *spec)
GHashTable * in_params_long
int analysis_detach_evloop(struct analysis *analysis)
int analysis_datum_add_simple_value(struct analysis_datum *datum, char *name, char *value, int no_copy)
struct array_list * results
struct analysis_desc * x_AnalysisDescT_to_a_analysis_desc(struct soap *soap, struct vmi1__AnalysisDescT *in, GHashTable *reftab, struct analysis_desc *out)
char ** analysis_get_path(void)
static uint64_t unsigned int i
int target_is_evloop_attached(struct target *target, struct evloop *evloop)
struct analysis * analysis_create(int id, struct analysis_spec *spec, struct analysis_desc *desc, int target_id, struct target *target)
int target_close(struct target *target)
#define verror(format,...)
int analysis_attach_evloop(struct analysis *analysis, struct evloop *evloop)
struct analysis_desc * desc
analysis_status_t analysis_status_from_target_status(target_status_t status)
#define vwarn(format,...)
int target_attach_evloop(struct target *target, struct evloop *evloop)
void analysis_set_status(struct analysis *analysis, analysis_status_t status)
#define array_list_foreach(alist, lpc, placeholder)
struct analysis_spec * spec
void analysis_cleanup(struct analysis *analysis)
struct analysis_datum * analysis_create_simple_datum(struct analysis *analysis, int id, char *name, int type, char *value, char *msg, int no_copy)
char * analysis_find(const char *name)
void analysis_set_path_string(const char *path)
void analysis_set_annotation_path(const char **path)
analysis_status_t analysis_close(struct analysis *analysis)
int analysis_is_evloop_attached(struct analysis *analysis, struct evloop *evloop)
void analysis_datum_simple_value_free(struct analysis_datum_simple_value *v)
void analysis_param_free(struct analysis_param *param)
#define vdebug(devel, areas, flags, format,...)
REFCNT target_free(struct target *target, int force)
int target_detach_evloop(struct target *target)
void analysis_datum_free(struct analysis_datum *datum)
void * calloc(size_t nmemb, size_t size)
struct analysis_desc * analysis_load_txt(const char *path, const char *desc_file_path)
void analysis_desc_free(struct analysis_desc *desc)
struct array_list * analysis_load_all(void)
GHashTable * out_params_long
struct analysis_desc * analysis_load_pathname(const char *path)
struct array_list * analysis_list_names(void)
struct array_list * analysis_list_pathnames(void)
void analysis_free(struct analysis *analysis)
struct array_list * values
int target_id(struct target *target)
void analysis_set_path(const char **path)
char ** __path_string_to_vec(const char *path)
void analysis_set_schema_path_string(const char *path)
void * malloc(size_t size)
int analysis_datum_add_typed_value(struct analysis_datum *datum, char *name, void *value, int len, int datatype_id, int no_copy)
void analysis_set_annotation_path_string(const char *path)
struct analysis_desc * analysis_load(const char *name)
void analysis_datum_typed_value_free(struct analysis_datum_typed_value *v)
void analysis_set_schema_path(const char **path)