37 #include "analysis_listener_moduleStub.h"
39 #include <sys/types.h>
43 static pthread_mutex_t analysis_rpc_mutex = PTHREAD_MUTEX_INITIALIZER;
44 static int init_done = 0;
51 static int analysis_rpc_monitor_evloop_attach(
struct evloop *
evloop,
void *obj);
52 static int analysis_rpc_monitor_evloop_detach(
struct evloop *
evloop,
void *obj);
54 void *obj,
void *objstate,
55 int kill,
int kill_sig);
57 void *obj,
void *objstate);
58 static int analysis_rpc_monitor_evloop_is_attached(
struct evloop *
evloop,
61 static int analysis_rpc_monitor_fatal_error(
monitor_error_t error,
void *obj);
65 static int analysis_rpc_monitor_child_recv_msg(
struct monitor *
monitor,
72 .evloop_detach = NULL,
73 .close = analysis_rpc_monitor_close,
74 .fini = analysis_rpc_monitor_fini,
75 .evloop_is_attached = NULL,
76 .error = analysis_rpc_monitor_error,
77 .fatal_error = analysis_rpc_monitor_fatal_error,
78 .event = analysis_rpc_monitor_event,
79 .child_recv_msg = analysis_rpc_monitor_child_recv_msg,
80 .recv_msg = analysis_rpc_monitor_recv_msg,
87 pthread_mutex_lock(&analysis_rpc_mutex);
90 pthread_mutex_unlock(&analysis_rpc_mutex);
102 &analysis_rpc_monitor_objtype_ops,
103 &analysis_rpc_mutex);
107 pthread_mutex_unlock(&analysis_rpc_mutex);
117 pthread_mutex_lock(&analysis_rpc_mutex);
120 pthread_mutex_unlock(&analysis_rpc_mutex);
124 pthread_mutex_unlock(&analysis_rpc_mutex);
138 (
int)(uintptr_t)objid);
150 pthread_mutex_unlock(&analysis_rpc_mutex);
171 int is_owner,
void *data) {
181 rc = soap_call_vmi1__AnalysisResultNotification(&l->
soap,l->
url,NULL,
184 if (l->
soap.error == SOAP_EOF && l->
soap.errnum == 0) {
185 vwarn(
"timeout notifying %s; removing!",l->
url);
188 verrorc(
"AnalysisResult client call failure %s : ",
190 soap_print_fault(&l->
soap,stderr);
203 "notified authoritative listener %s (which returned %d)\n",
208 "notified non-authoritative listener %s (which returned %d)\n",
212 if (!l->
soap.keep_alive)
213 soap_closesock(&l->
soap);
218 soap_destroy(&l->
soap);
230 memset(&d,0,
sizeof(d));
240 d.
reftab = g_hash_table_new_full(g_direct_hash,g_direct_equal,NULL,NULL);
245 _analysis_rpc_notify_listener_result,&d);
250 g_hash_table_destroy(d.
reftab);
251 soap_destroy(&encoder);
258 #define _CB_SAVEBUF_INC 1024
265 char *result_value = NULL;
266 char *value_str = NULL;
279 char *token,*token_end,*token_middle;
309 "appending new input to existing buf; will process '''%s'''\n",
323 "enlarged existing buf with new input; will process '''%s'''\n",
336 "will process callback buf direct; input is '''%s'''\n",
340 ebuf = sbuf + remaining;
342 rbuf = strstr(pbuf,
"RESULT::");
344 pbuf_next = strstr(rbuf + 1,
"::RESULT\n");
364 "no tag pair in direct buf; saved;"
365 " next callback will start with '''%s'''\n",
370 "no tag pair in direct buf; already saved;"
371 " next callback will start with '''%s'''\n",
380 *(pbuf_next - 1) =
'\0';
383 msg = value_str = name = result_value = NULL;
385 rc = sscanf(rbuf,
"RESULT:: (%c:%d) %ms (%d) %ms \"%m[^\"]\" %n",
386 &rt,&
id,&name,&type,&result_value,&msg,&ccount);
404 value_str = rbuf + ccount;
405 while (*value_str !=
'\0') {
406 if (*value_str ==
'(') {
412 if (*value_str ==
'\0')
420 "trying to autoparse value_str '''%s'''\n",value_str);
428 while (*token !=
'\0') {
430 key_end = index(token,
'=');
433 "bad autoparse value token at '%s'; skipping!\n",
438 token_middle = key_end + 1;
441 switch (*token_middle) {
442 case '[': vo =
'['; vc =
']';
break;
443 case '{': vo =
'{'; vc =
'}';
break;
444 case '"': vo =
'"'; vc =
'"';
break;
445 case '\'': vo =
'\''; vc =
'\'';
break;
446 case '(': vo =
'('; vc =
')';
break;
447 case '`': vo =
'`'; vc =
'`';
break;
448 case '<': vo =
'<'; vc =
'>';
break;
449 case '|': vo =
'|'; vc =
'|';
break;
450 default: vo = vc = 0; depth = 0;
break;
460 token_end = token_middle;
465 while (*token_end !=
'\0') {
469 else if (*token_end ==
'\\'
471 && (*(token_end+1) == vo || *(token_end+1) == vc)) {
476 if ((token_end != token_middle)
477 && vc && *token_end == vc) {
482 int oldtoken_end = *token_end;
485 "found '%s' = '%s'\n",key,token_middle);
489 *token_end = oldtoken_end;
490 token_middle = token_end;
496 else if ((token_end != token_middle)
497 && vo && *token_end == vo)
499 else if (!vo && !vc && (*token_end ==
','
500 || *token_end ==
')')) {
502 int oldtoken_end = *token_end;
505 "found '%s' = '%s'\n",key,token_middle);
509 *token_end = oldtoken_end;
510 token_middle = token_end;
524 token = index(token_end,
',');
539 array_list_append(a->
results,datum);
545 pbuf_next += strlen(
"::RESULT\n");
546 remaining -= (pbuf_next - pbuf);
550 pbuf = pbuf_next = NULL;
554 pbuf_next = strstr(pbuf,
"RESULT::");
556 pbuf_next = strstr(pbuf_next + 1,
"::RESULT\n");
569 new_alen = remaining + 1;
579 "%d bytes remaining; saved; next callback will start with '''%s'''\n",
595 "%d bytes remaining; already saved; next callback will start with '''%s'''\n",
608 "0 bytes remaining; freeing buf!\n");
612 "0 bytes remaining; no preexisting buf to free!\n");
637 if (names && array_list_len(names) > 0) {
663 if (descs && array_list_len(descs) > 0) {
668 reftab = g_hash_table_new(g_direct_hash,g_direct_equal);
673 g_hash_table_destroy(reftab);
697 array_list_free(list);
702 reftab = g_hash_table_new_full(g_direct_hash,g_direct_equal,NULL,NULL);
707 g_hash_table_destroy(reftab);
708 array_list_free(list);
716 struct vmi1__AnalysisDescT *analysisDesc,
719 return soap_receiver_fault(soap,
"Not implemented!",
"Not implemented!");
723 struct vmi1__AnalysisSpecT *analysisSpec,
724 struct vmi1__TargetSpecT *targetSpec,
725 struct vmi1__ListenerT *ownerListener,
734 char *binarypath = NULL;
738 GHashTable *reftab = NULL;
745 char *err = NULL, *err_detail = NULL;
755 char *atmpdir = NULL;
760 int ex_unsw_argc = 0;
761 char **ex_sw_argv = NULL;
762 char **ex_unsw_argv = NULL;
766 err = err_detail =
"Request needed splitting but not split!";
775 if (!analysisSpec || !analysisSpec->name) {
776 err = err_detail =
"Must set an analysis spec name!";
781 if (ownerListener->url != NULL)
782 url = ownerListener->url;
783 else if (ownerListener->hostname != NULL
784 && ownerListener->port != NULL) {
785 urllen =
sizeof(
"http://") + strlen(ownerListener->hostname) \
786 +
sizeof(
":") + 11 +
sizeof(
":/vmi/1/analysisListener") + 1;
787 url =
malloc(urllen *
sizeof(
char));
788 snprintf(url,urllen,
"http://%s:%d/vmi/1/analysisListener",
789 ownerListener->hostname,*ownerListener->port);
792 return soap_receiver_fault(soap,
"Bad listener!",
"Bad listener!");
798 err = err_detail =
"Bad analysis spec!";
804 err = err_detail =
"Could not find analysis!";
810 err = err_detail =
"Could not load analysis description!";
836 err = err_detail =
"Malformed inputParam without name!";
850 ex_sw_argv =
realloc(ex_sw_argv,ex_sw_argc *
sizeof(
char *));
855 ex_sw_argv[ex_sw_argc - 2] =
malloc(len);
856 snprintf(ex_sw_argv[ex_sw_argc - 2],len,
860 len = strlen(ex_ap->
name) + 1 + 1;
861 ex_sw_argv[ex_sw_argc - 2] =
malloc(len);
862 snprintf(ex_sw_argv[ex_sw_argc - 2],len,
867 ex_sw_argv[ex_sw_argc - 1] = strdup(ex_nv->
value);
869 ex_sw_argv[ex_sw_argc - 1] = strdup(
"");
873 ex_unsw_argv =
realloc(ex_unsw_argv,ex_unsw_argc *
sizeof(
char *));
875 ex_unsw_argv[ex_unsw_argc - 1] = strdup(ex_nv->
value);
877 ex_unsw_argv[ex_unsw_argc - 1] = strdup(
"");
887 ex_sw_argv =
realloc(ex_sw_argv,ex_sw_argc *
sizeof(
char *));
889 if (strlen(ex_nv->
name) == 1) {
890 len = strlen(ex_nv->
name) + 1 + 1;
891 ex_sw_argv[ex_sw_argc - 2] =
malloc(len);
892 snprintf(ex_sw_argv[ex_sw_argc - 2],len,
"-%s",ex_nv->
name);
895 len = strlen(ex_nv->
name) + 1 + 2;
896 ex_sw_argv[ex_sw_argc - 2] =
malloc(len);
897 snprintf(ex_sw_argv[ex_sw_argc - 2],len,
"--%s",ex_nv->
name);
901 ex_sw_argv[ex_sw_argc - 1] = strdup(ex_nv->
value);
903 ex_sw_argv[ex_sw_argc - 1] = strdup(
"");
909 len = strlen(path) + 1 + strlen(d->
binary) + 1;
910 binarypath =
calloc(len,
sizeof(
char));
911 snprintf(binarypath,len,
"%s/%s",path,d->
binary);
918 + strlen(as->
name) +
sizeof(
".") + 11 + 1 + 11 + 1;
919 atmpdir =
malloc(len *
sizeof(
char));
920 snprintf(atmpdir,len,
"%s/vmi.analysis.%s.%d.%u",
922 if (stat(atmpdir,&statbuf) == 0)
923 vwarn(
"analysis tmpdir %s already exists!\n",atmpdir);
925 reftab = g_hash_table_new_full(g_direct_hash,g_direct_equal,NULL,NULL);
929 err = err_detail =
"Bad target spec!";
943 if (targetSpec->stdinBytes && targetSpec->stdinBytes->__size > 0) {
944 len = strlen(atmpdir) + 1 +
sizeof(
"target.stdin.") + 11 + 1;
951 len = strlen(atmpdir) + 1 +
sizeof(
"target.stdout.") + 11 + 1;
956 len = strlen(atmpdir) + 1 +
sizeof(
"target.stderr.") + 11 + 1;
965 err = err_detail =
"Could not create argv from target spec!";
970 fargc = targc + 3 - 1 + ex_sw_argc + ex_unsw_argc + 1;
971 fargv =
calloc(fargc,
sizeof(
char *));
973 fargv[1] = strdup(
"-a");
975 snprintf(fargv[2],11,
"%d",aid);
976 memcpy(&fargv[3],&targv[1],
sizeof(
char *) * (targc - 1));
982 fargc = targc + ex_sw_argc + ex_unsw_argc + 1;
983 fargv =
calloc(fargc,
sizeof(
char *));
984 memcpy(&fargv[0],&targv[0],
sizeof(
char *) * (targc));
990 memcpy(&fargv[targc],&ex_sw_argv[0],
sizeof(
char *) * ex_sw_argc);
996 memcpy(&fargv[targc + ex_sw_argc],&ex_unsw_argv[0],
sizeof(
char *) * ex_unsw_argc);
1001 fargv[targc + ex_sw_argc + ex_unsw_argc] = NULL;
1025 if (mkdir(a->
tmpdir,S_IRWXU | S_IRGRP | S_IXGRP)) {
1026 verror(
"could not create analysis tmpdir %s: %s!\n",
1027 a->
tmpdir,strerror(errno));
1028 err = err_detail =
"Could not create analysis tmpdir!";
1035 if (analysisSpec->supportFiles) {
1036 for (i = 0; i < analysisSpec->supportFiles->__sizesupportFile; ++
i) {
1037 len = strlen(a->
tmpdir) +
sizeof(
"/")
1038 + strlen(analysisSpec->supportFiles->supportFile[i].name) + 1;
1040 snprintf(pbuf,len,
"%s/%s",a->
tmpdir,
1041 analysisSpec->supportFiles->supportFile[i].name);
1042 fd = open(pbuf,O_CREAT | O_TRUNC | O_WRONLY,S_IRUSR | S_IWUSR);
1044 verror(
"could not open(%s) for write: %s!\n",
1045 pbuf,strerror(errno));
1046 err = err_detail =
"Could not write file!";
1051 len = analysisSpec->supportFiles->supportFile[
i].content.__size;
1052 wbuf = (
char *)analysisSpec->supportFiles->supportFile[i].content.__ptr;
1054 retval = write(fd,wbuf + rc,len - rc);
1059 verror(
"write(%s): %s\n",pbuf,strerror(errno));
1060 err = err_detail = \
1061 "Could not finish writing source file in tmpdir!";
1074 if (targetSpec->stdinBytes && targetSpec->stdinBytes->__size > 0) {
1075 len = strlen(a->
tmpdir) +
sizeof(
"/") + strlen(ts->
infile) + 1;
1080 fd = open(pbuf,O_CREAT | O_TRUNC | O_WRONLY,S_IRUSR | S_IWUSR | S_IRGRP);
1082 verror(
"open(%s): %s\n",pbuf,strerror(errno));
1083 err = err_detail =
"Could not save target stdin in tmpdir!";
1087 while (rc < targetSpec->stdinBytes->__size) {
1088 retval = write(fd,targetSpec->stdinBytes->__ptr + rc,
1089 targetSpec->stdinBytes->__size - rc);
1094 verror(
"write(%s): %s\n",pbuf,strerror(errno));
1095 err = err_detail = \
1096 "Could not finish writing target stdin in tmpdir!";
1128 err = err_detail =
"Could not create analysis monitor!";
1137 err = err_detail =
"Could not bind to analysis (monitor)!";
1155 if (analysisSpec->stdinBytes && analysisSpec->stdinBytes->__size > 0) {
1156 tmpbuf =
malloc(analysisSpec->stdinBytes->__size);
1157 memcpy(tmpbuf,analysisSpec->stdinBytes->__ptr,
1158 analysisSpec->stdinBytes->__size);
1163 if (analysisSpec->logStdout
1165 len = strlen(a->
tmpdir) +
sizeof(
"/analysis.stdout.") + 11 + 1;
1167 snprintf(as->
outfile,len,
"%s/analysis.stdout.%d",a->
tmpdir,aid);
1172 if (analysisSpec->logStderr
1174 len = strlen(a->
tmpdir) +
sizeof(
"/analysis.stderr.") + 11 + 1;
1176 snprintf(as->
errfile,len,
"%s/analysis.stderr.%d",a->
tmpdir,aid);
1186 verror(
"error spawning: %d (%s)\n",pid,strerror(errno));
1187 err = err_detail =
"Could not spawn analysis!";
1202 for (i = 0; i < ex_unsw_argc; ++
i)
1203 if (ex_unsw_argv[i])
1204 free(ex_unsw_argv[i]);
1208 for (i = 0; i < ex_sw_argc; ++
i)
1210 free(ex_sw_argv[i]);
1215 for (i = 0; i < fargc; ++
i)
1234 g_hash_table_destroy(reftab);
1249 return soap_receiver_fault(soap,err,err_detail);
1253 struct vmi1__AnalysisSpecT *analysisSpec,
1254 struct vmi1__TargetSpecT *targetSpec,
1255 struct vmi1__TargetSpecT *overlayTargetSpec,
1256 vmi1__ThreadIdT baseThid,
1257 char *baseThreadName,
1258 vmi1__ListenerT *ownerListener,
1267 char **targv = NULL;
1269 char **otargv = NULL;
1272 char *binarypath = NULL;
1276 GHashTable *reftab = NULL;
1280 char **fargv = NULL;
1282 struct stat statbuf;
1283 char *err = NULL, *err_detail = NULL;
1293 char *atmpdir = NULL;
1298 int ex_unsw_argc = 0;
1299 char **ex_sw_argv = NULL;
1300 char **ex_unsw_argv = NULL;
1304 err = err_detail =
"Request needed splitting but not split!";
1313 if (!analysisSpec || !analysisSpec->name) {
1314 err = err_detail =
"Must set an analysis spec name!";
1318 if (ownerListener) {
1319 if (ownerListener->url != NULL)
1320 url = ownerListener->url;
1321 else if (ownerListener->hostname != NULL
1322 && ownerListener->port != NULL) {
1323 urllen =
sizeof(
"http://") + strlen(ownerListener->hostname) \
1324 +
sizeof(
":") + 11 +
sizeof(
":/vmi/1/analysisListener") + 1;
1325 url =
malloc(urllen *
sizeof(
char));
1326 snprintf(url,urllen,
"http://%s:%d/vmi/1/analysisListener",
1327 ownerListener->hostname,*ownerListener->port);
1330 return soap_receiver_fault(soap,
"Bad listener!",
"Bad listener!");
1336 err = err_detail =
"Bad analysis spec!";
1342 err = err_detail =
"Could not find analysis!";
1348 err = err_detail =
"Could not load analysis description!";
1370 ex_unsw_argv = NULL;
1374 err = err_detail =
"Malformed inputParam without name!";
1388 ex_sw_argv =
realloc(ex_sw_argv,ex_sw_argc *
sizeof(
char *));
1393 ex_sw_argv[ex_sw_argc - 2] =
malloc(len);
1394 snprintf(ex_sw_argv[ex_sw_argc - 2],len,
1398 len = strlen(ex_ap->
name) + 1 + 1;
1399 ex_sw_argv[ex_sw_argc - 2] =
malloc(len);
1400 snprintf(ex_sw_argv[ex_sw_argc - 2],len,
1405 ex_sw_argv[ex_sw_argc - 1] = strdup(ex_nv->
value);
1407 ex_sw_argv[ex_sw_argc - 1] = strdup(
"");
1411 ex_unsw_argv =
realloc(ex_unsw_argv,ex_unsw_argc *
sizeof(
char *));
1413 ex_unsw_argv[ex_unsw_argc - 1] = strdup(ex_nv->
value);
1415 ex_unsw_argv[ex_unsw_argc - 1] = strdup(
"");
1425 ex_sw_argv =
realloc(ex_sw_argv,ex_sw_argc *
sizeof(
char *));
1427 if (strlen(ex_nv->
name) == 1) {
1428 len = strlen(ex_nv->
name) + 1 + 1;
1429 ex_sw_argv[ex_sw_argc - 2] =
malloc(len);
1430 snprintf(ex_sw_argv[ex_sw_argc - 2],len,
"-%s",ex_nv->
name);
1433 len = strlen(ex_nv->
name) + 1 + 2;
1434 ex_sw_argv[ex_sw_argc - 2] =
malloc(len);
1435 snprintf(ex_sw_argv[ex_sw_argc - 2],len,
"--%s",ex_nv->
name);
1439 ex_sw_argv[ex_sw_argc - 1] = strdup(ex_nv->
value);
1441 ex_sw_argv[ex_sw_argc - 1] = strdup(
"");
1447 len = strlen(path) + 1 + strlen(d->
binary) + 1;
1448 binarypath =
calloc(len,
sizeof(
char));
1449 snprintf(binarypath,len,
"%s/%s",path,d->
binary);
1456 + strlen(as->
name) +
sizeof(
".") + 11 + 1 + 11 + 1;
1457 atmpdir =
malloc(len *
sizeof(
char));
1458 snprintf(atmpdir,len,
"%s/vmi.analysis.%s.%d.%u",
1460 if (stat(atmpdir,&statbuf) == 0)
1461 vwarn(
"analysis tmpdir %s already exists!\n",atmpdir);
1463 reftab = g_hash_table_new_full(g_direct_hash,g_direct_equal,NULL,NULL);
1467 err = err_detail =
"Bad target spec!";
1473 err = err_detail =
"Bad overlay target spec!";
1487 if (targetSpec->stdinBytes && targetSpec->stdinBytes->__size > 0) {
1488 len = strlen(atmpdir) + 1 +
sizeof(
"target.stdin.") + 11 + 1;
1494 else if (overlayTargetSpec->stdinBytes
1495 && overlayTargetSpec->stdinBytes->__size > 0) {
1496 len = strlen(atmpdir) + 1 +
sizeof(
"target.stdin.") + 11 + 1;
1503 len = strlen(atmpdir) + 1 +
sizeof(
"target.stdout.") + 11 + 1;
1507 else if (overlayTargetSpec->logStdout
1509 len = strlen(atmpdir) + 1 +
sizeof(
"target.stdout.") + 11 + 1;
1514 len = strlen(atmpdir) + 1 +
sizeof(
"target.stderr.") + 11 + 1;
1518 else if (overlayTargetSpec->logStderr
1520 len = strlen(atmpdir) + 1 +
sizeof(
"target.stderr.") + 11 + 1;
1526 err = err_detail =
"Could not create argv from target spec!";
1530 err = err_detail =
"Could not create argv from overlay target spec!";
1538 fargc = targc + 2 + 3 - 1 + ex_sw_argc + ex_unsw_argc + 1;
1539 fargv =
calloc(fargc,
sizeof(
char *));
1540 fargv[0] = targv[0];
1541 fargv[1] = strdup(
"-a");
1543 snprintf(fargv[2],11,
"%d",aid);
1544 memcpy(&fargv[3],&targv[1],
sizeof(
char *) * (targc - 1));
1550 fargc = targc + 2 + ex_sw_argc + ex_unsw_argc + 1;
1551 fargv =
calloc(fargc,
sizeof(
char *));
1552 memcpy(&fargv[0],&targv[0],
sizeof(
char *) * (targc));
1557 fargv[targc++] = strdup(
"--overlay");
1562 otrc += snprintf(otbuf + otrc,
sizeof(otbuf) - otrc,
1563 "%s:",baseThreadName);
1565 otrc += snprintf(otbuf + otrc,
sizeof(otbuf) - otrc,
1567 for (i = 1; i < otargc; ++
i) {
1568 otrc += snprintf(otbuf + otrc,
sizeof(otbuf) - otrc,
" %s",otargv[i]);
1572 fargv[targc++] = strdup(otbuf);
1575 memcpy(&fargv[targc],&ex_sw_argv[0],
sizeof(
char *) * ex_sw_argc);
1581 memcpy(&fargv[targc + ex_sw_argc],&ex_unsw_argv[0],
sizeof(
char *) * ex_unsw_argc);
1583 ex_unsw_argv = NULL;
1586 fargv[targc + ex_sw_argc + ex_unsw_argc] = NULL;
1611 if (mkdir(a->
tmpdir,S_IRWXU | S_IRGRP | S_IXGRP)) {
1612 verror(
"could not create analysis tmpdir %s: %s!\n",
1613 a->
tmpdir,strerror(errno));
1614 err = err_detail =
"Could not create analysis tmpdir!";
1621 if (analysisSpec->supportFiles) {
1622 for (i = 0; i < analysisSpec->supportFiles->__sizesupportFile; ++
i) {
1623 len = strlen(a->
tmpdir) +
sizeof(
"/")
1624 + strlen(analysisSpec->supportFiles->supportFile[i].name) + 1;
1626 snprintf(pbuf,len,
"%s/%s",a->
tmpdir,
1627 analysisSpec->supportFiles->supportFile[i].name);
1628 fd = open(pbuf,O_CREAT | O_TRUNC | O_WRONLY,S_IRUSR | S_IWUSR);
1630 verror(
"could not open(%s) for write: %s!\n",
1631 pbuf,strerror(errno));
1632 err = err_detail =
"Could not write file!";
1637 len = analysisSpec->supportFiles->supportFile[
i].content.__size;
1638 wbuf = (
char *)analysisSpec->supportFiles->supportFile[i].content.__ptr;
1640 retval = write(fd,wbuf + rc,len - rc);
1645 verror(
"write(%s): %s\n",pbuf,strerror(errno));
1646 err = err_detail = \
1647 "Could not finish writing source file in tmpdir!";
1660 if (targetSpec->stdinBytes && targetSpec->stdinBytes->__size > 0) {
1661 len = strlen(a->
tmpdir) +
sizeof(
"/") + strlen(ts->
infile) + 1;
1666 fd = open(pbuf,O_CREAT | O_TRUNC | O_WRONLY,S_IRUSR | S_IWUSR | S_IRGRP);
1668 verror(
"open(%s): %s\n",pbuf,strerror(errno));
1669 err = err_detail =
"Could not save target stdin in tmpdir!";
1673 while (rc < targetSpec->stdinBytes->__size) {
1674 retval = write(fd,targetSpec->stdinBytes->__ptr + rc,
1675 targetSpec->stdinBytes->__size - rc);
1680 verror(
"write(%s): %s\n",pbuf,strerror(errno));
1681 err = err_detail = \
1682 "Could not finish writing target stdin in tmpdir!";
1692 else if (overlayTargetSpec->stdinBytes
1693 && overlayTargetSpec->stdinBytes->__size > 0) {
1694 len = strlen(a->
tmpdir) +
sizeof(
"/") + strlen(ts->
infile) + 1;
1699 fd = open(pbuf,O_CREAT | O_TRUNC | O_WRONLY,S_IRUSR | S_IWUSR | S_IRGRP);
1701 verror(
"open(%s): %s\n",pbuf,strerror(errno));
1702 err = err_detail =
"Could not save target stdin in tmpdir!";
1706 while (rc < overlayTargetSpec->stdinBytes->__size) {
1707 retval = write(fd,overlayTargetSpec->stdinBytes->__ptr + rc,
1708 overlayTargetSpec->stdinBytes->__size - rc);
1713 verror(
"write(%s): %s\n",pbuf,strerror(errno));
1714 err = err_detail = \
1715 "Could not finish writing target stdin in tmpdir!";
1747 err = err_detail =
"Could not create analysis monitor!";
1756 err = err_detail =
"Could not bind to analysis (monitor)!";
1774 if (analysisSpec->stdinBytes && analysisSpec->stdinBytes->__size > 0) {
1775 tmpbuf =
malloc(analysisSpec->stdinBytes->__size);
1776 memcpy(tmpbuf,analysisSpec->stdinBytes->__ptr,
1777 analysisSpec->stdinBytes->__size);
1782 if (analysisSpec->logStdout
1784 len = strlen(a->
tmpdir) +
sizeof(
"/analysis.stdout.") + 11 + 1;
1786 snprintf(as->
outfile,len,
"%s/analysis.stdout.%d",a->
tmpdir,aid);
1791 if (analysisSpec->logStderr
1793 len = strlen(a->
tmpdir) +
sizeof(
"/analysis.stderr.") + 11 + 1;
1795 snprintf(as->
errfile,len,
"%s/analysis.stderr.%d",a->
tmpdir,aid);
1805 verror(
"error spawning: %d (%s)\n",pid,strerror(errno));
1806 err = err_detail =
"Could not spawn analysis!";
1821 for (i = 0; i < ex_unsw_argc; ++
i)
1822 if (ex_unsw_argv[i])
1823 free(ex_unsw_argv[i]);
1827 for (i = 0; i < ex_sw_argc; ++
i)
1829 free(ex_sw_argv[i]);
1834 for (i = 0; i < fargc; ++
i)
1853 g_hash_table_destroy(reftab);
1868 return soap_receiver_fault(soap,err,err_detail);
1872 struct vmi1__AnalysisSpecT *analysisSpec,
1873 struct vmi1__TargetSpecT *targetSpec,
1874 struct vmi1__TargetSpecT *overlayTargetSpec,
1875 vmi1__ThreadIdT baseThid,
1876 vmi1__ListenerT *ownerListener,
1885 struct vmi1__AnalysisSpecT *analysisSpec,
1886 struct vmi1__TargetSpecT *targetSpec,
1887 struct vmi1__TargetSpecT *overlayTargetSpec,
1888 char *baseThreadName,
1889 vmi1__ListenerT *ownerListener,
1898 vmi1__AnalysisIdT aid,
1905 (
void **)&a,&monitor)) {
1906 return soap_receiver_fault(soap,
"Nonexistent analysis!",
1907 "Specified analysis does not exist!");
1920 errmsg =
"Analysis already paused!";
1924 errmsg =
"Analysis already done; cannot pause!";
1928 if (kill(monitor->
p.
pid,SIGSTOP) < 0) {
1929 if (errno == ESRCH) {
1930 errmsg =
"Analysis seems dead; cannot pause!";
1934 errmsg =
"Error pausing analysis!";
1948 return soap_receiver_fault(soap,errmsg,errmsg);
1952 vmi1__AnalysisIdT aid,
1959 (
void **)&a,&monitor)) {
1960 return soap_receiver_fault(soap,
"Nonexistent analysis!",
1961 "Specified analysis does not exist!");
1974 errmsg =
"Analysis already running!";
1978 errmsg =
"Analysis already done; cannot resume!";
1982 if (kill(monitor->
p.
pid,SIGCONT) < 0) {
1983 if (errno == ESRCH) {
1984 errmsg =
"Analysis seems dead; cannot resume!";
1988 errmsg =
"Error resuming analysis!";
2002 return soap_receiver_fault(soap,errmsg,errmsg);
2006 vmi1__AnalysisIdT aid,
2012 (
void **)&a,&monitor)) {
2013 return soap_receiver_fault(soap,
"Nonexistent analysis!",
2014 "Specified analysis does not exist!");
2037 vmi1__AnalysisIdT aid,
int kill_sig,
2043 (
void **)&a,&monitor)) {
2044 return soap_receiver_fault(soap,
"Nonexistent analysis!",
2045 "Specified analysis does not exist!");
2076 vmi1__AnalysisIdT aid,
2082 (
void **)&a,&monitor)) {
2083 return soap_receiver_fault(soap,
"Nonexistent analysis!",
2084 "Specified analysis does not exist!");
2107 vmi1__AnalysisIdT aid,
2114 (
void **)&a,&monitor)) {
2115 return soap_receiver_fault(soap,
"Nonexistent analysis!",
2116 "Specified analysis does not exist!");
2123 reftab = g_hash_table_new(g_direct_hash,g_direct_equal);
2125 g_hash_table_destroy(reftab);
2134 vmi1__AnalysisIdT aid,
2141 (
void **)&a,&monitor)) {
2142 return soap_receiver_fault(soap,
"Nonexistent analysis!",
2143 "Specified analysis does not exist!");
2146 reftab = g_hash_table_new(g_direct_hash,g_direct_equal);
2149 g_hash_table_destroy(reftab);
2157 vmi1__AnalysisIdT aid,
2164 (
void **)&a,&monitor)) {
2165 return soap_receiver_fault(soap,
"Nonexistent analysis!",
2166 "Specified analysis does not exist!");
2169 reftab = g_hash_table_new(g_direct_hash,g_direct_equal);
2172 g_hash_table_destroy(reftab);
2180 vmi1__AnalysisIdT aid,
int maxSize,
2187 return soap_receiver_fault(soap,
"Nonexistent analysis!",
2188 "Specified analysis does not exist!");
2219 vmi1__AnalysisIdT aid,vmi1__ListenerT *listener,
2226 return soap_receiver_fault(soap,
"Bad listener!",
"Bad listener!");
2227 else if (listener->url != NULL)
2228 url = listener->url;
2229 else if (listener->hostname != NULL && listener->port != NULL) {
2230 len =
sizeof(
"http://") + strlen(listener->hostname) \
2231 +
sizeof(
":") + 11 +
sizeof(
":/vmi/1/targetListener") + 1;
2232 url =
malloc(len *
sizeof(
char));
2233 sprintf(url,
"http://%s:%d/vmi/1/targetListener",
2234 listener->hostname,*listener->port);
2237 return soap_receiver_fault(soap,
"Bad listener!",
"Bad listener!");
2248 (
void **)&a,NULL)) {
2251 return soap_receiver_fault(soap,
"Nonexistent analysis!",
2252 "Specified analysis does not exist!");
2260 return soap_receiver_fault(soap,
2261 "Could not bind to analysis (monitor)!",
2262 "Could not bind to analysis (monitor)!");
2272 return soap_receiver_fault(soap,
"Could not bind to analysis!",
2273 "Could not bind to analysis!");
2283 vmi1__AnalysisIdT aid,vmi1__ListenerT *listener,
2290 return soap_receiver_fault(soap,
"Bad listener!",
"Bad listener!");
2291 else if (listener->url != NULL)
2292 url = listener->url;
2293 else if (listener->hostname != NULL && listener->port != NULL) {
2294 len =
sizeof(
"http://") + strlen(listener->hostname) \
2295 +
sizeof(
":") + 11 +
sizeof(
":/vmi/1/targetListener") + 1;
2296 url =
malloc(len *
sizeof(
char));
2297 sprintf(url,
"http://%s:%d/vmi/1/targetListener",
2298 listener->hostname,*listener->port);
2301 return soap_receiver_fault(soap,
"Bad listener!",
"Bad listener!");
2312 (
void **)&a,NULL)) {
2315 return soap_receiver_fault(soap,
"Nonexistent analysis!",
2316 "Specified analysis does not exist!");
2324 return soap_receiver_fault(soap,
2325 "Could not bind to analysis (monitor)!",
2326 "Could not bind to analysis (monitor)!");
2336 return soap_receiver_fault(soap,
"Could not bind to analysis!",
2337 "Could not bind to analysis!");
2349 static int analysis_rpc_monitor_evloop_attach(
struct evloop *
evloop,
void *obj) {
2359 static int analysis_rpc_monitor_evloop_detach(
struct evloop *evloop,
void *obj) {
2370 void *obj,
void *objstate,
2371 int dokill,
int kill_sig) {
2374 int rsig = kill_sig;
2375 int apid = monitor->
p.
pid;
2386 "killing analysis pgid %d with signal %d\n",apid,rsig);
2387 if (kill(-apid,rsig) < 0) {
2388 vwarn(
"kill(%d,%d): %s\n",apid,rsig,strerror(errno));
2393 verror(
"could not close analysis %d (error %d)!\n",analysis->
id,retval);
2399 static int analysis_rpc_monitor_fini(
struct monitor *monitor,
2400 void *obj,
void *objstate) {
2401 struct analysis *analysis = (
struct analysis *)obj;
2416 static int analysis_rpc_monitor_evloop_is_attached(
struct evloop *evloop,
2423 static int analysis_rpc_monitor_error(
monitor_error_t error,
void *obj) {
2425 ((
struct analysis *)obj)->
id,error);
2429 static int analysis_rpc_monitor_fatal_error(
monitor_error_t error,
void *obj) {
2431 ((
struct analysis *)obj)->
id,error);
2443 int is_owner,
void *data) {
2449 rc = soap_call_vmi1__AnalysisEventNotification(&l->
soap,l->
url,NULL,
2451 if (rc != SOAP_OK) {
2452 if (l->
soap.error == SOAP_EOF && l->
soap.errnum == 0) {
2453 vwarn(
"timeout notifying %s; removing!",l->
url);
2456 verrorc(
"AnalysisEvent client call failure %s : ",
2458 soap_print_fault(&l->
soap,stderr);
2471 "notified authoritative listener %s (which returned %d)\n",
2476 "notified non-authoritative listener %s (which returned %d)\n",
2480 if (!l->
soap.keep_alive)
2481 soap_closesock(&l->
soap);
2486 soap_destroy(&l->
soap);
2494 enum _vmi1__analysisEventType type) {
2495 struct soap encoder;
2498 memset(&d,0,
sizeof(d));
2506 soap_init(&encoder);
2507 d.
reftab = g_hash_table_new_full(g_direct_hash,g_direct_equal,NULL,NULL);
2509 d.
event.analysisEventType = type;
2510 d.
event.analysisId = analysis->
id;
2515 _analysis_rpc_notify_listener_event,&d);
2520 g_hash_table_destroy(d.
reftab);
2521 soap_destroy(&encoder);
2523 soap_done(&encoder);
2528 static int analysis_rpc_monitor_event(
struct monitor *monitor,
2530 int objid,
void *obj) {
2531 struct analysis *a = (
struct analysis *)obj;
2547 static int analysis_rpc_monitor_child_recv_msg(
struct monitor *monitor,
2549 struct analysis *analysis = (
struct analysis *)monitor->
obj;
2557 static int analysis_rpc_monitor_recv_msg(
struct monitor *monitor,
2559 struct analysis *analysis = (
struct analysis *)monitor->
obj;
void target_rpc_fini(void)
int monitor_del_objid(struct monitor *monitor, int objid)
struct vmi1__AnalysisEventT event
struct vmi1__DebugFileOptsT defDebugFileOpts
int analysis_rpc_handle_request(struct soap *soap)
struct xsd__hexBinary * stderrLog
int proxyreq_recv_request(struct monitor *monitor, struct monitor_msg *msg)
int vmi1__UploadAnalysis(struct soap *soap, struct vmi1__AnalysisDescT *analysisDesc, struct xsd__hexBinary *inputFileContents, struct vmi1__NoneResponse *r)
int vmi1__ResumeAnalysis(struct soap *soap, vmi1__AnalysisIdT aid, struct vmi1__NoneResponse *r)
struct target_spec * target_spec
struct vmi1__AnalysisResultT * a_analysis_datum_to_x_AnalysisResultT(struct soap *soap, struct analysis_datum *in, struct analysis *analysis, GHashTable *reftab, struct vmi1__AnalysisResultT *out)
struct monitor_objtype_ops analysis_rpc_monitor_objtype_ops
int monitor_lookup_objid_lock_objtype(int objid, int objtype, void **obj, struct monitor **monitor)
int analysis_rpc_notify_listeners_event(struct analysis *analysis, enum _vmi1__analysisEventType type)
void analysis_spec_free(struct analysis_spec *spec)
int analysis_rpc_stdout_callback(int fd, char *buf, int len, void *state)
struct vmi1__AnalysisDescT * a_analysis_desc_to_x_AnalysisDescT(struct soap *soap, struct analysis_desc *in, GHashTable *reftab, struct vmi1__AnalysisDescT *out)
GHashTable * in_params_long
struct vmi1__AnalysisResultNotificationResponse r
enum vmi1__ResultT result
#define SOAP_CALLOC(soap, nmemb, size)
int monitor_register_objtype(int objtype, struct monitor_objtype_ops *ops, pthread_mutex_t *objtype_mutex)
int analysis_detach_evloop(struct analysis *analysis)
int analysis_datum_add_simple_value(struct analysis_datum *datum, char *name, char *value, int no_copy)
int generic_rpc_unbind_dynlistener_objid(rpc_svctype_t svctype, char *listener_url, int objid)
struct array_list * results
enum vmi1__AnalysisStatusT analysisStatus
int monitor_get_unique_objid(void)
static uint64_t unsigned int i
struct target_spec * overlay_target_spec
void generic_rpc_init(void)
int vmi1__PauseAnalysis(struct soap *soap, vmi1__AnalysisIdT aid, struct vmi1__NoneResponse *r)
int vmi1__AnalysisUnbindListener(struct soap *soap, vmi1__AnalysisIdT aid, vmi1__ListenerT *listener, struct vmi1__NoneResponse *r)
struct vmi1__AnalysisResultsT analysisResults
struct vmi1__AnalysisT * a_analysis_to_x_AnalysisT(struct soap *soap, struct analysis *in, GHashTable *reftab, struct vmi1__AnalysisT *out)
int generic_rpc_unbind_all_listeners_objid(rpc_svctype_t svctype, int objid)
int monitor_setup_stderr(struct monitor *monitor, int maxbufsiz, char *stderr_logfile, monitor_stdio_callback_t stderr_callback, void *callback_state)
struct vmi1__AnalysisResultsT * a_analysis_datum_list_to_x_AnalysisResultsT(struct soap *soap, struct array_list *in, struct analysis *analysis, GHashTable *reftab, struct vmi1__AnalysisResultsT *out)
struct analysis * analysis_create(int id, struct analysis_spec *spec, struct analysis_desc *desc, int target_id, struct target *target)
void analysis_rpc_fini(void)
int target_close(struct target *target)
struct vmi1__AnalysisResultT result
#define verror(format,...)
int vmi1__InstantiateAnalysis(struct soap *soap, struct vmi1__AnalysisSpecT *analysisSpec, struct vmi1__TargetSpecT *targetSpec, struct vmi1__ListenerT *ownerListener, struct vmi1__AnalysisResponse *r)
#define verrorc(format,...)
int analysis_attach_evloop(struct analysis *analysis, struct evloop *evloop)
struct analysis_desc * desc
int vmi1__GetAnalysisStatus(struct soap *soap, vmi1__AnalysisIdT aid, struct vmi1__AnalysisStatusResponse *r)
void target_rpc_init(void)
int proxyreq_attach_new_objid(struct proxyreq *pr, int objid, struct monitor *monitor)
struct xsd__hexBinary * targetStdoutLog
int vmi1__InstantiateOverlayAnalysisByThreadName(struct soap *soap, struct vmi1__AnalysisSpecT *analysisSpec, struct vmi1__TargetSpecT *targetSpec, struct vmi1__TargetSpecT *overlayTargetSpec, char *baseThreadName, vmi1__ListenerT *ownerListener, struct vmi1__AnalysisResponse *r)
#define vwarn(format,...)
result_t x_ResultT_to_t_result_t(struct soap *soap, enum vmi1__ResultT in)
struct target_spec * x_TargetSpecT_to_t_target_spec(struct soap *soap, struct vmi1__TargetSpecT *spec, GHashTable *reftab, struct target_spec *out)
int vmi1__GetAnalysis(struct soap *soap, vmi1__AnalysisIdT aid, struct vmi1__AnalysisResponse *r)
int monitor_lock_objtype(int objtype)
struct vmi1__AnalysisDescT * analysisDesc
struct xsd__hexBinary * stdoutLog
void analysis_set_status(struct analysis *analysis, analysis_status_t status)
#define array_list_foreach(alist, lpc, placeholder)
int vmi1__FinalizeAnalysis(struct soap *soap, vmi1__AnalysisIdT aid, struct vmi1__NoneResponse *r)
struct analysis_spec * spec
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)
uint32_t supports_external_control
struct analysis_spec * x_AnalysisSpecT_to_a_analysis_spec(struct soap *soap, struct vmi1__AnalysisSpecT *in, GHashTable *reftab, struct analysis_spec *out)
void target_free_spec(struct target_spec *spec)
int target_spec_to_argv(struct target_spec *spec, char *arg0, int *argc, char ***argv)
int monitor_close_obj(struct monitor *monitor, void *obj, int kill, int kill_sig)
int monitor_del_obj(struct monitor *monitor, void *obj)
int monitor_unlock_objtype_unsafe(int objtype)
#define MONITOR_OBJTYPE_ANALYSIS
analysis_status_t analysis_close(struct analysis *analysis)
int __vmi1__InstantiateOverlayAnalysis(struct soap *soap, struct vmi1__AnalysisSpecT *analysisSpec, struct vmi1__TargetSpecT *targetSpec, struct vmi1__TargetSpecT *overlayTargetSpec, vmi1__ThreadIdT baseThid, char *baseThreadName, vmi1__ListenerT *ownerListener, struct vmi1__AnalysisResponse *r)
int analysis_is_evloop_attached(struct analysis *analysis, struct evloop *evloop)
int analysis_rpc_notify_listeners_result(struct analysis *analysis, struct analysis_datum *datum)
struct xsd__hexBinary * generic_rpc_read_file_into_hexBinary(struct soap *soap, char *filename, int max_size)
enum vmi1__AnalysisStatusT a_analysis_status_t_to_x_AnalysisStatusT(struct soap *soap, analysis_status_t status, GHashTable *reftab, enum vmi1__AnalysisStatusT *out)
void generic_rpc_register_svctype(rpc_svctype_t svctype)
int monitor_setup_stdin(struct monitor *monitor, char *stdin_buf, int stdin_buflen)
int generic_rpc_bind_dynlistener_objid(rpc_svctype_t svctype, char *listener_url, int objid, int owns)
int vmi1__KillAnalysis(struct soap *soap, vmi1__AnalysisIdT aid, int kill_sig, struct vmi1__NoneResponse *r)
#define vdebug(devel, areas, flags, format,...)
void * realloc(void *ptr, size_t size)
enum vmi1__ResultT result
int vmi1__ListAnalysisDescNames(struct soap *soap, void *_, struct vmi1__AnalysisDescNamesResponse *r)
uint32_t supports_autoparse_simple_results
$int __size_analysisDescName
void analysis_datum_free(struct analysis_datum *datum)
void * calloc(size_t nmemb, size_t size)
struct array_list * monitor_list_objids_by_objtype_lock_objtype(int objtype, int include_null)
uint8_t is_command_line_switched
struct xsd__hexBinary * targetStderrLog
struct array_list * monitor_list_objs_by_objtype_lock_objtype(int objtype, int include_null)
struct vmi1__AnalysisT * analysis
struct vmi1__AnalysisT * analysis
int monitor_setup_stdout(struct monitor *monitor, int maxbufsiz, char *stdout_logfile, monitor_stdio_callback_t stdout_callback, void *callback_state)
void generic_rpc_fini(void)
void analysis_desc_free(struct analysis_desc *desc)
struct array_list * analysis_load_all(void)
void analysis_rpc_init(void)
struct analysis_desc * analysis_load_pathname(const char *path)
struct vmi1__AnalysisEventNotificationResponse r
struct array_list * analysis_list_names(void)
int proxyreq_handle_request(struct soap *soap, char *svc_name)
int vmi1__CloseAnalysis(struct soap *soap, vmi1__AnalysisIdT aid, struct vmi1__NoneResponse *r)
int generic_rpc_listener_notify_all(rpc_svctype_t svctype, int objid, generic_rpc_listener_notifier_t *notifier, void *data)
void analysis_free(struct analysis *analysis)
int(* evloop_attach)(struct evloop *evloop, void *obj)
int monitor_lookup_objid(int objid, int *objtype, void **obj, struct monitor **monitor)
int proxyreq_recv_response(struct monitor *monitor, struct monitor_msg *msg)
struct target_spec * spec
int vmi1__ListAnalysisDescs(struct soap *soap, void *_, struct vmi1__AnalysisDescsResponse *r)
int vmi1__GetAnalysisLogs(struct soap *soap, vmi1__AnalysisIdT aid, int maxSize, struct vmi1__AnalysisLogsResponse *r)
int analysis_rpc_stderr_callback(int fd, char *buf, int len, void *state)
void * malloc(size_t size)
void generic_rpc_unregister_svctype(rpc_svctype_t svctype)
#define SOAP_STRCPY(soap, d, s)
#define PROXY_REQUEST_LOCKED(soap, mobjid, mutex)
int generic_rpc_count_listeners(rpc_svctype_t svctype, int objid)
int monitor_spawn(struct monitor *monitor, char *filename, char *const argv[], char *const envp[], char *dir)
int vmi1__AnalysisBindListener(struct soap *soap, vmi1__AnalysisIdT aid, vmi1__ListenerT *listener, struct vmi1__NoneResponse *r)
struct array_list * in_params
int vmi1__GetAnalysisResults(struct soap *soap, vmi1__AnalysisIdT aid, struct vmi1__AnalysisResultsResponse *r)
struct monitor * monitor_create(monitor_type_t type, monitor_flags_t flags, int objid, int objtype, void *obj, void *objstate)
int vmi1__ListAnalyses(struct soap *soap, void *_, struct vmi1__AnalysesResponse *r)
int vmi1__InstantiateOverlayAnalysis(struct soap *soap, struct vmi1__AnalysisSpecT *analysisSpec, struct vmi1__TargetSpecT *targetSpec, struct vmi1__TargetSpecT *overlayTargetSpec, vmi1__ThreadIdT baseThid, vmi1__ListenerT *ownerListener, struct vmi1__AnalysisResponse *r)