Stackdb
Stackdb is a stackable, multi-target and -level source debugger and memory forensics library.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
analysis.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 The University of Utah
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of
7  * the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18 
19 #include "config.h"
20 
21 #include "common.h"
22 #include "log.h"
23 #include "alist.h"
24 #include "analysis.h"
25 
26 #include <errno.h>
27 #include <sys/types.h>
28 #include <dirent.h>
29 #include <sys/stat.h>
30 #include <unistd.h>
31 #include <strings.h>
32 #include <stdlib.h>
33 #include <sys/time.h>
34 
35 #include <glib.h>
36 
37 #ifdef ENABLE_SOAP
38 #include "analysis_xml_moduleH.h"
39 #include "analysis_xml.h"
40 #endif
41 
42 static char *DEFAULT_ANALYSIS_PATH[] = {
43  INSTALL_LIBEXECDIR "/analysis",
44  NULL,
45 };
46 static char *DEFAULT_ANNOTATION_PATH[] = {
47  INSTALL_SHAREDIR "/annotation",
48  NULL,
49 };
50 static char *DEFAULT_SCHEMA_PATH[] = {
51  INSTALL_SHAREDIR "/schema",
52  NULL,
53 };
54 
55 char *ANALYSIS_TMPDIR = "/var/tmp/";
56 
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;
60 
61 static GHashTable *cache = NULL;
62 
63 static int next_analysis_id = 1;
64 
65 static int init_done = 0;
66 
67 void analysis_init(void) {
68  struct timeval tv;
69 
70  if (init_done)
71  return;
72 
73  target_init();
74 
75  gettimeofday(&tv,NULL);
76  srand(tv.tv_usec);
77 
78  init_done = 1;
79 }
80 
81 void analysis_fini(void) {
82  if (!init_done)
83  return;
84 
85  target_fini();
86 
87  init_done = 0;
88 }
89 
91  struct array_list *retval = array_list_create(8);
92  DIR *dir;
93  struct dirent *dirp;
94  char *dirname;
95  int i;
96 
97  for (i = 0; (dirname = ANALYSIS_PATH[i]) != NULL; ++i) {
98  dir = opendir(dirname);
99  if (!dir) {
100  vwarnopt(5,LA_ANL,LF_ANL,"could not open ANALYSIS_PATH dir '%s'\n",
101  dirname);
102  continue;
103  }
104  while ((dirp = readdir(dir)))
105  array_list_append(retval,strdup(dirp->d_name));
106  closedir(dir);
107  }
108 
109  return retval;
110 }
111 
113  struct array_list *retval = array_list_create(8);
114  DIR *dir;
115  struct dirent *dirp;
116  char *dirname;
117  int i;
118  char pbuf[PATH_MAX];
119  int path_base_len;
120  char *pbuf_base_ptr;
121  char *newpath;
122 
123  for (i = 0; (dirname = ANALYSIS_PATH[i]) != NULL; ++i) {
124  dir = opendir(dirname);
125  if (!dir) {
126  vwarnopt(5,LA_ANL,LF_ANL,"could not open ANALYSIS_PATH dir '%s'\n",
127  dirname);
128  continue;
129  }
130 
131  /* Get our base path ready to go; we'll just append to it. */
132  path_base_len = snprintf(pbuf,PATH_MAX,"%s/",dirname);
133  pbuf_base_ptr = pbuf + path_base_len;
134 
135  while ((dirp = readdir(dir))) {
136  if (dirp->d_name[0] == '.')
137  continue;
138 
139  strncpy(pbuf_base_ptr,dirp->d_name,PATH_MAX - path_base_len);
140  newpath = strdup(pbuf);
141  vdebug(5,LA_ANL,LF_ANL,"adding path %s (%p)\n",newpath,newpath);
142  array_list_append(retval,newpath);
143  }
144  closedir(dir);
145  }
146 
147  return retval;
148 }
149 
150 char *analysis_find(const char *name) {
151  char *retval = NULL;
152  DIR *dir;
153  struct dirent *dirp;
154  char *dirname;
155  int i;
156  int len;
157 
158  for (i = 0; (dirname = ANALYSIS_PATH[i]) != NULL; ++i) {
159  dir = opendir(dirname);
160  if (!dir) {
161  vwarnopt(5,LA_ANL,LF_ANL,"could not open ANALYSIS_PATH dir '%s'\n",
162  dirname);
163  continue;
164  }
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);
170  break;
171  }
172  }
173  closedir(dir);
174  if (retval)
175  break;
176  }
177 
178  return retval;
179 }
180 
182  const char *desc_file_path) {
183 
184 }
185 
186 #ifdef ENABLE_SOAP
187 struct analysis_desc *analysis_load_xml(const char *path,
188  const char *desc_file_path) {
189  struct vmi1__AnalysisDescT *analysisDesc;
190  struct analysis_desc *retval;
191  GHashTable *reftab;
192  struct soap soap;
193  int fd;
194 
195  if ((fd = open(desc_file_path,O_RDONLY)) < 0) {
196  verror("open(%s): %s\n",desc_file_path,strerror(errno));
197  return NULL;
198  }
199 
200  soap_init(&soap);
201  //soap_imode(&soap, flags);
202  soap_begin(&soap);
203  soap.recvfd = fd;
204  soap_begin_recv(&soap);
205  reftab = g_hash_table_new(g_direct_hash,g_direct_equal);
206 
207  analysisDesc = soap_get_vmi1__AnalysisDescT(&soap,NULL,"analysisDesc",NULL);
208  if (!analysisDesc) {
209  verror("could not read AnalysisDesc element from %s!\n",
210  desc_file_path);
211  g_hash_table_destroy(reftab);
212  soap_end_recv(&soap);
213  soap_destroy(&soap);
214  soap_end(&soap);
215  soap_done(&soap);
216  close(fd);
217  return NULL;
218  }
219  soap_end_recv(&soap);
220 
221  /*
222  * Safe to use object now... (soap_end_recv checks id/href consistency).
223  */
224  retval = x_AnalysisDescT_to_a_analysis_desc(&soap,analysisDesc,reftab,NULL);
225 
226  /*
227  * Cannot use deserialized data after this...
228  */
229  g_hash_table_destroy(reftab);
230  soap_destroy(&soap);
231  soap_end(&soap);
232  soap_done(&soap);
233  close(fd);
234 
235  return retval;
236 }
237 #endif
238 
239 struct analysis_desc *analysis_load(const char *name) {
240  struct analysis_desc *retval;
241  char *path;
242  struct stat statbuf;
243  time_t mtime = 0;
244 
245  /* Find it first by scanning the path. */
246  path = analysis_find(name);
247  if (!path) {
248  vwarnopt(4,LA_ANL,LA_ANL,"could not find analysis '%s'\n",name);
249  errno = ENOENT;
250  return NULL;
251  }
252 
253  /* Stat its dir to get the mtime. */
254  if (stat(path,&statbuf))
255  vwarn("stat(%s): %s (not using cache)\n",path,strerror(errno));
256  else
257  mtime = statbuf.st_mtime;
258 
259  /*
260  * XXX: cache!
261  */
262 
263  retval = analysis_load_pathname(path);
264  free(path);
265 
266  return retval;
267 }
268 
269 struct analysis_desc *analysis_load_pathname(const char *path) {
270  struct analysis_desc *retval;
271  char *name;
272  char pbuf[PATH_MAX];
273  struct stat statbuf;
274  time_t mtime = 0;
275  int path_base_len = 0;
276  char *pbuf_base_ptr;
277  int isxml = 0;
278 
279  name = rindex(path,'/');
280  if (!name) {
281  errno = EINVAL;
282  return NULL;
283  }
284  ++name;
285 
286  /* Stat its dir to get the mtime. */
287  if (stat(path,&statbuf))
288  vwarn("stat(%s): %s (not using cache)\n",path,strerror(errno));
289  else
290  mtime = statbuf.st_mtime;
291 
292  /* Get our base path ready to go; we'll just append to it. */
293  path_base_len = snprintf(pbuf,PATH_MAX,"%s/",path);
294  pbuf_base_ptr = pbuf + path_base_len;
295 
296  vdebug(5,LA_ANL,LF_ANL,"trying to load description.* in %s (%s/%p)\n",
297  pbuf,path,path);
298 
299  /*
300  * Figure out if it is an XML analysis; if we have XML support, load
301  * it, if not skip it; if not an XML analysis, load by text.
302  */
303 #ifdef ENABLE_SOAP
304  strncpy(pbuf_base_ptr,"description.xml",PATH_MAX - path_base_len);
305  if (stat(pbuf,&statbuf) == 0)
306  isxml = 1;
307 #endif
308 
309  if (!isxml) {
310  strncpy(pbuf_base_ptr,"description.txt",PATH_MAX - path_base_len);
311  if (stat(pbuf,&statbuf)) {
312  vwarnopt(5,LA_ANL,LA_ANL,"could not stat %s\n",pbuf);
313  verror("could not read description.{xml,txt} in %s!\n",path);
314  return NULL;
315  }
316  }
317 
318 #ifdef ENABLE_SOAP
319  if (isxml) {
320  retval = analysis_load_xml(path,pbuf);
321  }
322  else
323 #endif
324  {
325  retval = analysis_load_txt(path,pbuf);
326  }
327 
328  return retval;
329 }
330 
332  struct array_list *retval;
333  struct array_list *pnlist;
334  char *pathname;
335  struct analysis_desc *desc;
336  int i;
337 
338  pnlist = analysis_list_pathnames();
339  if (!pnlist || array_list_len(pnlist) <= 0)
340  return NULL;
341 
342  i = array_list_len(pnlist);
343  retval = array_list_create(i);
344  i = 0;
345  array_list_foreach(pnlist,i,pathname) {
346  vdebug(5,LA_ANL,LF_ANL,"trying to load pathname %s (%p)\n",
347  pathname,pathname);
348 
349  desc = analysis_load_pathname(pathname);
350  if (!desc) {
351  verror("could not load analysis in %s %p %i; skipping!\n",pathname,pathname,i);
352  free(pathname);
353  continue;
354  }
355  else {
356  free(pathname);
357  array_list_append(retval,desc);
358  }
359  }
360  array_list_free(pnlist);
361 
362  return retval;
363 }
364 
365 
367  if (status <= 0xf)
368  return status;
369  else if (status == TSTATUS_DEAD)
370  return ASTATUS_ERROR;
371  else if (status == TSTATUS_STOPPED)
372  return ASTATUS_PAUSED;
373  else
374  return ASTATUS_UNKNOWN;
375 }
376 
378  return target_attach_evloop(analysis->target,evloop);
379 }
380 
382  return target_detach_evloop(analysis->target);
383 }
384 
386  struct evloop *evloop) {
387  return target_is_evloop_attached(analysis->target,evloop);
388 }
389 
391  struct analysis_desc *desc,
392  int target_id,struct target *target) {
393  struct analysis *retval = calloc(1,sizeof(*retval));
394 
395  retval->id = id;
396  retval->spec = spec;
397  retval->desc = desc;
398  retval->target_id = target_id;
399  retval->target = target;
400 
401  retval->results = array_list_create(0);
402  retval->result_idx = 0;
403 
404  return retval;
405 }
406 
408  int id,char *name,int type,
409  char *value,char *msg,
410  int no_copy) {
411  struct analysis_datum *datum;
412 
413  datum = calloc(1,sizeof(*datum));
414 
415  datum->is_simple = 1;
416  datum->values = array_list_create(1);
417 
418  datum->id = id;
419  if (no_copy)
420  datum->name = name;
421  else if (name)
422  datum->name = strdup(name);
423  datum->type = type;
424  if (no_copy)
425  datum->value = value;
426  else if (value)
427  datum->value = strdup(value);
428  if (no_copy)
429  datum->msg = msg;
430  else if (msg)
431  datum->msg = strdup(msg);
432 
433  return datum;
434 }
435 
437  char *name,char *value,
438  int no_copy) {
439  struct analysis_datum_simple_value *v =
440  calloc(1,sizeof(*v));
441 
442  if (name && !no_copy)
443  v->name = strdup(name);
444  else
445  v->name = name;
446  if (value && !no_copy)
447  v->value = strdup(value);
448  else
449  v->value = value;
450 
451  array_list_append(datum->values,v);
452 
453  return 0;
454 }
455 
457  char *name,void *value,int len,int datatype_id,
458  int no_copy) {
459  struct analysis_datum_typed_value *v =
460  calloc(1,sizeof(*v));
461 
463  if (name && !no_copy)
464  v->name = strdup(name);
465  else
466  v->name = name;
467  if (value && !no_copy) {
468  v->value = malloc(len);
469  memcpy(v->value,value,len);
470  }
471  else
472  v->value = value;
473 
474  array_list_append(datum->values,v);
475 
476  return 0;
477 }
478 
479 void analysis_datum_free(struct analysis_datum *datum) {
480  int i;
481  struct analysis_datum_simple_value *sv;
482  struct analysis_datum_typed_value *tv;
483 
484  if (datum->name)
485  free(datum->name);
486  if (datum->value)
487  free(datum->value);
488  if (datum->msg)
489  free(datum->msg);
490 
491  if (datum->is_simple && datum->values) {
492  array_list_foreach(datum->values,i,sv)
494  array_list_free(datum->values);
495  }
496  else if (datum->is_typed && datum->values) {
497  array_list_foreach(datum->values,i,tv)
499  array_list_free(datum->values);
500  }
501 
502  free(datum);
503 }
504 
506  if (v->name)
507  free(v->name);
508  if (v->value)
509  free(v->value);
510  free(v);
511 }
512 
514  if (v->name)
515  free(v->name);
516  if (v->value)
517  free(v->value);
518  free(v);
519 }
520 
522  vdebug(8,LA_ANL,LF_ANL,"analysis %d %s -> %s\n",
523  analysis->id,ASTATUS(analysis->status),ASTATUS(status));
524  analysis->status = status;
525 }
526 
528  if ((analysis->status == ASTATUS_RUNNING
529  || analysis->status == ASTATUS_PAUSED)
530  && analysis->target)
531  analysis_set_status(analysis,target_close(analysis->target));
532  else
534 
535  return analysis->status;
536 }
537 
539  DIR *dir;
540  int dfd;
541  struct dirent *dirp;
542 
543  if (!analysis->tmpdir)
544  return;
545 
546  dir = opendir(analysis->tmpdir);
547  if (dir) {
548  dfd = dirfd(dir);
549  while ((dirp = readdir(dir))) {
550  if (!strcmp(dirp->d_name,".") || !strcmp(dirp->d_name,".."))
551  continue;
552 
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));
556  }
557  }
558  closedir(dir);
559  if (rmdir(analysis->tmpdir))
560  vwarn("could not remove dir %s: %s\n",
561  analysis->tmpdir,strerror(errno));
562 }
563 
565  struct analysis_datum *datum;
566  int i;
567 
568  analysis_close(analysis);
569 
570  if (analysis->target) {
571  target_free(analysis->target);
572  analysis->target = NULL;
573  }
574 
575  if (analysis->results) {
576  array_list_foreach(analysis->results,i,datum) {
577  analysis_datum_free(datum);
578  }
579  array_list_free(analysis->results);
580  }
581 
582  /*
583  * Cleanup @analysis->tmpdir if it exists; just remove everything.
584  */
585  if (analysis->tmpdir) {
586  analysis_cleanup(analysis);
587  free(analysis->tmpdir);
588  }
589 
590  analysis_spec_free(analysis->spec);
591  analysis_desc_free(analysis->desc);
592 }
593 
594 void analysis_desc_free(struct analysis_desc *desc) {
595  GHashTableIter iter;
596  gpointer value;
597 
598  if (desc->name)
599  free(desc->name);
600  if (desc->description)
601  free(desc->description);
602  if (desc->author)
603  free(desc->author);
604  if (desc->author_contact)
605  free(desc->author_contact);
606  if (desc->binary)
607  free(desc->binary);
608 
609  if (desc->in_params) {
610  g_hash_table_iter_init(&iter,desc->in_params);
611  while (g_hash_table_iter_next(&iter,NULL,&value))
612  analysis_param_free((struct analysis_param *)value);
613  g_hash_table_destroy(desc->in_params);
614  }
615  if (desc->in_params_long)
616  g_hash_table_destroy(desc->in_params_long);
617  if (desc->out_params) {
618  g_hash_table_iter_init(&iter,desc->out_params);
619  while (g_hash_table_iter_next(&iter,NULL,&value))
620  analysis_param_free((struct analysis_param *)value);
621  g_hash_table_destroy(desc->out_params);
622  }
623  if (desc->out_params_long)
624  g_hash_table_destroy(desc->out_params_long);
625 
626 
627  free(desc);
628 }
629 
630 void analysis_spec_free(struct analysis_spec *spec) {
631  if (spec->stdin_bytes)
632  free(spec->stdin_bytes);
633 
634  if (spec->infile) {
635  free(spec->infile);
636  spec->infile = NULL;
637  }
638  if (spec->outfile) {
639  free(spec->outfile);
640  spec->outfile = NULL;
641  }
642  if (spec->errfile) {
643  free(spec->errfile);
644  spec->errfile = NULL;
645  }
646 
647  free(spec);
648 }
649 
650 void analysis_param_free(struct analysis_param *param) {
651  if (param->name)
652  free(param->name);
653  if (param->long_name)
654  free(param->long_name);
655  if (param->description)
656  free(param->description);
657  if (param->default_value)
658  free(param->default_value);
659 
660  free(param);
661 }
662 
663 char **analysis_get_path(void) {
664  return ANALYSIS_PATH;
665 }
666 
667 char **__path_string_to_vec(const char *path) {
668  int i;
669  int pathlen = 0;
670  char *ptr;
671  char *nptr;
672  char **bpath;
673 
674  if (!path)
675  return NULL;
676 
677  ptr = (char *)path;
678  pathlen = 1;
679  while (*ptr != '\0') {
680  if (*ptr == ':')
681  ++pathlen;
682  ++ptr;
683  }
684 
685  bpath = calloc(pathlen + 1,sizeof(*bpath));
686 
687  i = 0;
688  ptr = (char *)path;
689  nptr = (char *)path;
690 
691  for (i = 0; nptr && *nptr != '\0'; ++i) {
692  nptr = index(nptr,':');
693  if (nptr == NULL) {
694  if (*ptr != '\0') {
695  bpath[i] = strdup(ptr);
696  }
697  else
698  continue; /* terminate on next pass too */
699  }
700  else {
701  bpath[i] = malloc(sizeof(char)*(nptr - ptr + 1));
702  strncpy(bpath[i],ptr,nptr - ptr);
703  bpath[i][nptr - ptr] = '\0';
704 
705  ++nptr;
706  ptr = nptr;
707  }
708  }
709  bpath[i] = NULL;
710 
711  return bpath;
712 }
713 
714 void analysis_set_path(const char **path) {
715  int i;
716  int pathlen = 0;
717  char **ptr = (char **)path;
718 
719  if (!path)
720  return;
721 
722  while (*ptr) {
723  ++pathlen;
724  ++ptr;
725  }
726 
727  ANALYSIS_PATH = calloc(pathlen + 1,sizeof(char *));
728  for (i = 0; i < pathlen; ++i)
729  ANALYSIS_PATH[i] = strdup(path[i]);
730 }
731 
732 void analysis_set_path_string(const char *path) {
733  char **bpath;
734 
735  if (!path)
736  return;
737 
738  if ((bpath = __path_string_to_vec(path)))
739  ANALYSIS_PATH = bpath;
740 }
741 
742 void analysis_set_annotation_path(const char **path) {
743  int i;
744  int pathlen = 0;
745  char **ptr = (char **)path;
746 
747  if (!path)
748  return;
749 
750  while (*ptr) {
751  ++pathlen;
752  ++ptr;
753  }
754 
755  ANNOTATION_PATH = calloc(pathlen + 1,sizeof(char *));
756  for (i = 0; i < pathlen; ++i)
757  ANNOTATION_PATH[i] = strdup(path[i]);
758 }
759 
760 void analysis_set_annotation_path_string(const char *path) {
761  char **bpath;
762 
763  if (!path)
764  return;
765 
766  if ((bpath = __path_string_to_vec(path)))
767  ANNOTATION_PATH = bpath;
768 }
769 
770 void analysis_set_schema_path(const char **path) {
771  int i;
772  int pathlen = 0;
773  char **ptr = (char **)path;
774 
775  if (!path)
776  return;
777 
778  while (*ptr) {
779  ++pathlen;
780  ++ptr;
781  }
782 
783  SCHEMA_PATH = calloc(pathlen + 1,sizeof(char *));
784  for (i = 0; i < pathlen; ++i)
785  SCHEMA_PATH[i] = strdup(path[i]);
786 }
787 
788 void analysis_set_schema_path_string(const char *path) {
789  char **bpath;
790 
791  if (!path)
792  return;
793 
794  if ((bpath = __path_string_to_vec(path)))
795  SCHEMA_PATH = bpath;
796 }
797 
798 /*
799  * Util stuff.
800  */
801 char *ASTATUS_STRINGS[] = {
802  "UNKNOWN",
803  "RUNNING",
804  "PAUSED",
805  "ERROR",
806  "DONE",
807 };
#define ASTATUS(n)
Definition: analysis.h:61
uint32_t is_typed
Definition: analysis.h:331
#define vwarnopt(level, area, flags, format,...)
Definition: log.h:37
Definition: log.h:212
char * errfile
Definition: analysis.h:313
void analysis_spec_free(struct analysis_spec *spec)
Definition: analysis.c:630
char * binary
Definition: analysis.h:261
char * name
Definition: analysis.h:341
Definition: log.h:74
GHashTable * in_params_long
Definition: analysis.h:278
int analysis_detach_evloop(struct analysis *analysis)
Definition: analysis.c:381
target_status_t
Definition: target_api.h:197
int analysis_datum_add_simple_value(struct analysis_datum *datum, char *name, char *value, int no_copy)
Definition: analysis.c:436
struct array_list * results
Definition: analysis.h:248
struct analysis_desc * x_AnalysisDescT_to_a_analysis_desc(struct soap *soap, struct vmi1__AnalysisDescT *in, GHashTable *reftab, struct analysis_desc *out)
Definition: analysis_xml.c:46
char ** analysis_get_path(void)
Definition: analysis.c:663
analysis_status_t
Definition: analysis.h:50
static uint64_t unsigned int i
char * name
Definition: analysis.h:256
void target_init(void)
Definition: target.c:69
char * path
int target_is_evloop_attached(struct target *target, struct evloop *evloop)
Definition: target_api.c:863
struct analysis * analysis_create(int id, struct analysis_spec *spec, struct analysis_desc *desc, int target_id, struct target *target)
Definition: analysis.c:390
char * tmpdir
Definition: analysis.h:216
int target_close(struct target *target)
Definition: target_api.c:1511
#define verror(format,...)
Definition: log.h:30
char * default_value
Definition: analysis.h:322
char * author
Definition: analysis.h:258
int target_id
Definition: analysis.h:228
int analysis_attach_evloop(struct analysis *analysis, struct evloop *evloop)
Definition: analysis.c:377
Definition: evloop.h:66
void target_fini(void)
Definition: target.c:91
struct analysis_desc * desc
Definition: analysis.h:219
char * outfile
Definition: analysis.h:312
analysis_status_t analysis_status_from_target_status(target_status_t status)
Definition: analysis.c:366
#define vwarn(format,...)
Definition: log.h:33
void free(void *ptr)
Definition: debugserver.c:207
uint32_t is_simple
Definition: analysis.h:331
struct target * target
Definition: analysis.h:234
int target_attach_evloop(struct target *target, struct evloop *evloop)
Definition: target_api.c:834
void analysis_set_status(struct analysis *analysis, analysis_status_t status)
Definition: analysis.c:521
#define array_list_foreach(alist, lpc, placeholder)
Definition: alist.h:371
analysis_status_t status
Definition: analysis.h:221
int id
Definition: analysis.h:214
struct analysis_spec * spec
Definition: analysis.h:218
void analysis_cleanup(struct analysis *analysis)
Definition: analysis.c:538
struct analysis_datum * analysis_create_simple_datum(struct analysis *analysis, int id, char *name, int type, char *value, char *msg, int no_copy)
Definition: analysis.c:407
char * analysis_find(const char *name)
Definition: analysis.c:150
char * infile
Definition: analysis.h:311
void analysis_set_path_string(const char *path)
Definition: analysis.c:732
void analysis_set_annotation_path(const char **path)
Definition: analysis.c:742
analysis_status_t analysis_close(struct analysis *analysis)
Definition: analysis.c:527
char * value
Definition: analysis.h:348
char * author_contact
Definition: analysis.h:259
void analysis_init(void)
Definition: analysis.c:67
int analysis_is_evloop_attached(struct analysis *analysis, struct evloop *evloop)
Definition: analysis.c:385
int len
Definition: dumptarget.c:52
void analysis_fini(void)
Definition: analysis.c:81
void analysis_datum_simple_value_free(struct analysis_datum_simple_value *v)
Definition: analysis.c:505
char * long_name
Definition: analysis.h:320
void analysis_param_free(struct analysis_param *param)
Definition: analysis.c:650
#define vdebug(devel, areas, flags, format,...)
Definition: log.h:302
REFCNT target_free(struct target *target, int force)
Definition: target.c:1636
char * stdin_bytes
Definition: analysis.h:293
char * ASTATUS_STRINGS[]
Definition: analysis.c:801
int target_detach_evloop(struct target *target)
Definition: target_api.c:846
void analysis_datum_free(struct analysis_datum *datum)
Definition: analysis.c:479
void * calloc(size_t nmemb, size_t size)
Definition: debugserver.c:200
struct analysis_desc * analysis_load_txt(const char *path, const char *desc_file_path)
Definition: analysis.c:181
char * name
Definition: analysis.h:319
char * description
Definition: analysis.h:257
void analysis_desc_free(struct analysis_desc *desc)
Definition: analysis.c:594
struct array_list * analysis_load_all(void)
Definition: analysis.c:331
GHashTable * out_params_long
Definition: analysis.h:280
struct analysis_desc * analysis_load_pathname(const char *path)
Definition: analysis.c:269
struct array_list * analysis_list_names(void)
Definition: analysis.c:90
struct array_list * analysis_list_pathnames(void)
Definition: analysis.c:112
void analysis_free(struct analysis *analysis)
Definition: analysis.c:564
struct array_list * values
Definition: analysis.h:353
int target_id(struct target *target)
Definition: target_api.c:509
void analysis_set_path(const char **path)
Definition: analysis.c:714
char ** __path_string_to_vec(const char *path)
Definition: analysis.c:667
int result_idx
Definition: analysis.h:249
GHashTable * in_params
Definition: analysis.h:277
void analysis_set_schema_path_string(const char *path)
Definition: analysis.c:788
void * malloc(size_t size)
Definition: debugserver.c:214
char * ANALYSIS_TMPDIR
Definition: analysis.c:55
char * msg
Definition: analysis.h:349
int analysis_datum_add_typed_value(struct analysis_datum *datum, char *name, void *value, int len, int datatype_id, int no_copy)
Definition: analysis.c:456
void analysis_set_annotation_path_string(const char *path)
Definition: analysis.c:760
struct analysis_desc * analysis_load(const char *name)
Definition: analysis.c:239
char * description
Definition: analysis.h:321
void analysis_datum_typed_value_free(struct analysis_datum_typed_value *v)
Definition: analysis.c:513
void analysis_set_schema_path(const char **path)
Definition: analysis.c:770
GHashTable * out_params
Definition: analysis.h:279