int main(int argc, char *argv[]) { IDirectFBDisplayLayer *layer; DFBWindowDescription dwsc; DFBSurfaceDescription dsc; DFBDisplayLayerConfig config; IDirectFBWindow *window_mic, *window_camera, *window_case, *window_tp; IDirectFBSurface *surface_case, *surface_tp, *surface_camera; IDirectFBSurface *surface_mic, *primary, *surface_button; IDirectFBFont *font; DFBRectangle rect; DFBFontDescription font_desc; DirectThread *thread_camera, *thread_music, *thread_mic, *thread_tp, *thread_flashlight, *thread_case[case_num]; DirectThread *thread_button; // int font_size = 24; // int camera_frame = 0; int i; char font_file[50] = "/misc/font/wqy-zenhei.ttc"; char conf_file[50] = "/misc/pcba.conf"; bool overflow = false; case_t *case_x; case_x = malloc((case_num + 3) * sizeof(case_t)); //20 case,11 auto case,gps is the last autocase init_case(case_x, case_num + 3, gps + 1); if(parser_config_file(conf_file, case_x)) { printf("config file open error, use default\n"); } parse_global_config(case_x); printf("camera_frame = %d\n", camera_frame); printf("font_size = %d\n", font_size); printf("camera pixel [%d*%d]\n", camera_pixel_width, camera_pixel_height); #ifndef __GS900A__ ion_open_alc(); #endif //define window size int screen_width, screen_height; int mic_width, camera_window_width, camera_window_height; int case_width, case_name_align, case_result_align; int font_height; //change env char event_path[100]; char env_gsensor[256]; //enable gsensor i = get_input_event_name(case_x[gsensor].dev_name, event_path); if(i != -1) { sprintf(env_gsensor, "echo 1 > /sys/class/input/input%d/enable", i); system(env_gsensor); } else { printf("----error! gsensor not found\n"); } //vibrate test for 3 second test_vibrate(3); //dfb init DFBCHECK(DirectFBInit(&argc, &argv)); DFBCHECK(DirectFBCreate(&dfb)); font_desc.flags = DFDESC_HEIGHT; font_desc.height = font_size; DFBCHECK(dfb->CreateFont( dfb, font_file, &font_desc, &font)); DFBCHECK(font->GetHeight(font, &font_height)); DFBCHECK(dfb->GetDisplayLayer(dfb, DLID_PRIMARY, &layer)); DFBCHECK(layer->GetConfiguration( layer, &config )); // DFBCHECK(layer->SetRotation( layer, 180 )); //set window size screen_width = config.width; screen_height = config.height; mic_width = screen_width / 20; camera_window_width = (screen_width - mic_width) / 2; camera_window_height = screen_height / 2; case_width = screen_width - mic_width - camera_window_width; case_name_align = font_size; case_result_align = 7 * font_size; //create tp window dwsc.flags = DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS; dwsc.posx = 0; dwsc.posy = 0; dwsc.width = screen_width; dwsc.height = screen_height; dwsc.caps = DWCAPS_ALPHACHANNEL; DFBCHECK(layer->CreateWindow(layer, &dwsc, &window_tp)); DFBCHECK(window_tp->GetSurface(window_tp, &surface_tp)); DFBCHECK(window_tp->SetOptions(window_tp, DWOP_ALPHACHANNEL)); DFBCHECK(window_tp->SetStackingClass(window_tp, DWSC_UPPER)); DFBCHECK(window_tp->RaiseToTop(window_tp)); DFBCHECK(surface_tp->Clear(surface_tp, 0, 0, 0, 0)); DFBCHECK(surface_tp->SetColor(surface_tp, 0, 0xff, 0, 0xff)); DFBCHECK(window_tp->SetOpacity(window_tp, 0xff)); //config camera window dwsc.flags = DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT; dwsc.posx = case_width + mic_width; dwsc.posy = 0; dwsc.width = camera_window_width; dwsc.height = screen_height; DFBCHECK(layer->CreateWindow( layer, &dwsc, &window_camera )); DFBCHECK(window_camera->GetSurface(window_camera, &windowsurface)); DFBCHECK(windowsurface->SetColor(windowsurface, 0, 0, 0, 0xff)); DFBCHECK(windowsurface->FillRectangle(windowsurface, 0, 0, camera_window_width , screen_height)); DFBCHECK(windowsurface->Flip(windowsurface, NULL, 0)); DFBCHECK(window_camera->SetOpacity( window_camera, 0xff )); drawRGB(windowsurface, 0, screen_height / 2, camera_window_width, screen_height /2); rect.x = 0; rect.y = 0; rect.w = camera_window_width; rect.h = camera_window_height; DFBCHECK(windowsurface->GetSubSurface(windowsurface, &rect, &surface_camera)); rect.x = 0; rect.y = screen_height / 4 * 3; rect.w = camera_window_width; rect.h = screen_height - rect.y; DFBCHECK(windowsurface->GetSubSurface(windowsurface, &rect, &surface_button)); //create camera surface dsc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT; dsc.pixelformat = DSPF_NV12; dsc.width = camera_pixel_width; dsc.height = camera_pixel_height; DFBCHECK(dfb->CreateSurface(dfb, &dsc, &camera_source)); //config mic window dwsc.flags = DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT; dwsc.posx = case_width; dwsc.posy = 0; dwsc.width = mic_width; dwsc.height = screen_height; DFBCHECK(layer->CreateWindow(layer, &dwsc, &window_mic)); DFBCHECK(window_mic->GetSurface(window_mic, &surface_mic)); DFBCHECK(surface_mic->SetColor(surface_mic, 0, 0, 0, 0xff)); DFBCHECK(surface_mic->FillRectangle(surface_mic, 0, 0, mic_width , screen_height)); DFBCHECK(surface_mic->Flip(surface_mic, NULL, 0)); DFBCHECK(window_mic->SetOpacity( window_mic, 0xff)); //config case window dwsc.posx = 0; dwsc.posy = 0; dwsc.width = case_width; dwsc.height = screen_height; DFBCHECK(layer->CreateWindow(layer, &dwsc, &window_case)); DFBCHECK(window_case->GetSurface(window_case, &surface_case)); DFBCHECK(surface_case->SetColor(surface_case, 0xff, 0xff, 0xff, 0xff)); DFBCHECK(surface_case->SetFont(surface_case, font)); DFBCHECK(surface_case->FillRectangle(surface_case, 0, 0, case_width, screen_height)); //draw headline DFBCHECK(surface_case->SetColor(surface_case, 0xff, 0xff, 0, 0xff)); DFBCHECK(surface_case->FillRectangle(surface_case, 0, 0, case_width, font_size + 2)); DFBCHECK(surface_case->FillRectangle(surface_case, 0, screen_height / 2, case_width, font_size + 2)); DFBCHECK(surface_case->SetColor(surface_case, 0, 0, 0, 0xff)); DFBCHECK(surface_case->DrawString(surface_case, "自动测试选项", -1, case_width / 2, 0, DSTF_TOPCENTER)); DFBCHECK(surface_case->DrawString(surface_case, "手动测试选项", -1, case_width / 2, screen_height / 2, DSTF_TOPCENTER)); int auto_skip = 0; int manu_skip = 0; int skip_height = 0; bool double_line = false; //draw string for(i = 0; i < case_num; i++) { double_line = false; if(overflow) { case_x[i].enable = 0; continue; } if(!case_x[i].enable) { if(case_x[i].type) manu_skip++; else auto_skip++; //case_x[i].position = -1; continue; } if(case_x[i].doubleline == 1) { double_line = true; } if(case_x[i].type) skip_height = manu_skip * (font_height); else skip_height = auto_skip * (font_height); case_x[i].position = case_x[i].type * screen_height / 2 + (case_x[i].index + 1) * (font_height); case_x[i].position -= skip_height; // printf("name_h = %d\n", case_x[i].position); DFBCHECK(surface_case->SetColor(surface_case, 0, 0, 0, 0xff)); DFBCHECK(surface_case->DrawString(surface_case, case_x[i].name, -1, case_name_align, case_x[i].position, DSTF_TOPLEFT)); DFBCHECK(surface_case->SetColor(surface_case, 0xc0, 0xc0, 0xc0, 0xff)); DFBCHECK(surface_case->DrawString(surface_case, case_x[i].init_string, -1, case_result_align, case_x[i].position, DSTF_TOPLEFT)); rect.x = case_result_align; rect.y = case_x[i].position; rect.w = case_width - case_result_align; rect.h = font_height; if((rect.y + rect.h) > screen_height) { overflow = true; case_x[i].enable = 0; printf("case %d overflow, disable all case after it\n", i); continue; } if(double_line) { // case_x[i].position = -2; rect.h *= 2; if(case_x[i].type) manu_skip--; else auto_skip--; } DFBCHECK(surface_case->GetSubSurface(surface_case, &rect, &case_x[i].surface)); DFBCHECK(case_x[i].surface->SetFont(case_x[i].surface, font)); } DFBCHECK(window_case->SetOpacity(window_case, 0xff )); #ifdef __GS900A__ system("echo 1 > /sys/devices/e0250000.hdmi/enable"); #endif //start case thread for(i = 0; i < case_num; i++) { char thread_name[10]; sprintf(thread_name,"thread_%d", i); if(case_x[i].enable) { thread_case[i] = direct_thread_create(DTT_DEFAULT, case_thread, &case_x[i], thread_name); } } case_x[tp].surface = surface_tp; //start thread #ifdef __GS702C__ thread_music = direct_thread_create(DTT_DEFAULT, music_thread, NULL, "music"); thread_mic = direct_thread_create(DTT_DEFAULT, mic_thread, surface_mic, "mic"); #else thread_music = direct_thread_create(DTT_DEFAULT, tinyalsa_music_thread, NULL, "tinyalsa_music"); thread_mic = direct_thread_create(DTT_DEFAULT, tinyalsa_mic_thread, surface_mic, "tinyalsa_mic"); #endif thread_tp = direct_thread_create(DTT_DEFAULT, tp_thread, &case_x[tp], "tp"); thread_flashlight = direct_thread_create(DTT_DEFAULT, flashlight_thread, &case_x[flashlight], "flashlight"); thread_camera = direct_thread_create(DTT_DEFAULT, camera_thread, &camera_frame, "camera" ); //thread_mic = direct_thread_create(DTT_DEFAULT, mic_thread, surface_mic, "mic"); thread_button = direct_thread_create(DTT_DEFAULT, handle_record_button, surface_button, "button"); sleep(1); DFBCHECK(surface_case->Flip(surface_case, NULL, 0)); if(iio_read(info, case_x[gsensor].enable, case_x[gyro].enable, case_x[comp].enable) == -1) printf("get iio device error\n"); //block in iio_read //useless statement for(i = 0; i < case_num; i++) { if(case_x[i].enable) { direct_thread_join(thread_case[i]); case_x[i].surface->Release(case_x[i].surface); direct_thread_destroy(thread_case[i]); printf("thread %d destroyed\n", i); } } direct_thread_join(thread_camera); direct_thread_destroy(thread_camera); direct_thread_join(thread_music); direct_thread_destroy(thread_music); direct_thread_join(thread_mic); direct_thread_destroy(thread_mic); surface_button->Release(surface_button); surface_camera->Release(surface_camera); camera_source->Release(camera_source); windowsurface->Release(windowsurface); window_camera->Release(window_camera); surface_case->Release(surface_case); window_case->Release(window_case); layer->Release(layer); font->Release(font); dfb->Release(dfb); #ifndef __GS900A__ ion_close_alc(); #endif }
static void ExecuteStatement(GNode* node, gpointer data) { Statement* stmt = (Statement*) node->data; Verbose("* Visiting GNode at level %d", g_node_depth(node)); if (parseOnly && (stmt->type < STMT_REPEAT)) return; switch (stmt->type) { case STMT_ASSIGN: { ExpressionStatus status[2]; ParameterList* paramList = stmt->parameters; gchar* varident = param_string_get(paramList, 0, &status[0]); Expression* expression = param_index_get(paramList, 1); // evaluator error check if (status[0] != STATUS_EVAL_OK) { Error("Malicious assign parameters! (status = %s)", expr_status_to_string(status[0])); } switch (expression->type) { case EXPR_RICH_INT: case EXPR_CONSTANT_INT: { Verbose("~ Executing STMT_ASSIGN: variable = %s, type = INT", varident); glong result = param_int_get(paramList, 1, &status[1]); // evaluator error check if (status[1] != STATUS_EVAL_OK) { Error("Malicious assign parameters! (status = %s)", expr_status_to_string(status[1])); } var_set_value(varident, VAR_INT, &result); break; } case EXPR_RICH_STRING: case EXPR_CONSTANT_STRING: { Verbose("~ Executing STMT_ASSIGN: variable = %s, type = STRING", varident); gchar* result_raw = param_string_get(paramList, 1, &status[1]); // evaluator error check if (status[1] != STATUS_EVAL_OK) { Error("Malicious assign parameters! (status = %s)", expr_status_to_string(status[1])); } gchar* result = var_replace_substrings(result_raw); var_set_value(varident, VAR_STRING, result); g_free(result_raw); g_free(result); break; } default: Error("Expression type %d not supported in assign statement!\n", expression->type); } g_free(varident); break; } case STMT_REPEAT: { ExpressionStatus status[2]; ParameterList* paramList = stmt->parameters; gchar* varident = param_string_get(paramList, 0, &status[0]); glong i, loopCount = param_int_get(paramList, 1, &status[1]); Verbose("~ Executing STMT_REPEAT: variable = %s, loopCount = %ld", varident, loopCount); g_assert(loopCount >= 0); // evaluator error check if (!expr_status_assert(status, 2)) { backtrace(stmt); Error("Malicious repeat parameters! (%s:%d)", __FILE__, __LINE__); } for (i=0; i<loopCount; i++) { var_set_value(varident, VAR_INT, &i); g_node_children_foreach(node, G_TRAVERSE_ALL, &ExecuteStatement, NULL); } var_destroy(varident); g_free(varident); break; } case STMT_TIME: { Verbose("~ Executing STMT_TIME: label = %s", stmt->label); static gint timeId = 0; gdouble time; GTimer* timer = g_timer_new(); g_node_children_foreach(node, G_TRAVERSE_ALL, &ExecuteStatement, NULL); g_timer_stop(timer); time = g_timer_elapsed(timer, NULL); g_timer_destroy(timer); gchar* label = var_replace_substrings(stmt->label); timeList = g_slist_prepend(timeList, timeevent_new(timeId++, label, time)); g_free(label); break; } case STMT_CTIME: { Verbose("~ Executing STMT_CTIME: label = %s", stmt->label); static gint coreTimeId = 0; gchar* label = var_replace_substrings(stmt->label); CoreTimeEvent* coreTimeEvent = coretime_event_new(coreTimeId++, label, coretime_new(0, 0)); coreTimeStack = g_list_prepend(coreTimeStack, coreTimeEvent); g_node_children_foreach(node, G_TRAVERSE_ALL, &ExecuteStatement, NULL); coreTimeList = g_slist_prepend(coreTimeList, coreTimeEvent); coreTimeStack = g_list_remove_link(coreTimeStack, g_list_first(coreTimeStack)); g_free(label); break; } #ifdef HAVE_MPI case STMT_GROUP: { Verbose("~ Executing STMT_GROUP: group = %s", stmt->label); GroupBlock* groupBlock = g_hash_table_lookup(groupMap, stmt->label); if(groupBlock && groupBlock->member) { groupStack = g_list_prepend(groupStack, groupBlock); g_node_children_foreach(node, G_TRAVERSE_ALL, &ExecuteStatement, NULL); groupStack = g_list_remove_link(groupStack, g_list_first(groupStack)); } else if(!groupBlock) { backtrace(stmt); Error("Group \"%s\" doesn't exist!", stmt->label); } break; } case STMT_MASTER: { GroupBlock* groupBlock; MPI_Comm comm = MPI_COMM_WORLD; if(groupStack) { groupBlock = (GroupBlock*) g_list_first(groupStack)->data; comm = groupBlock->mpicomm; } gint groupRank; MPI_ASSERT(MPI_Comm_rank(comm, &groupRank), "Master Statement", TRUE) if(groupStack) Verbose("~ Executing STMT_MASTER: rank = %d, type = implicit group", groupRank); else Verbose("~ Executing STMT_MASTER: rank = %d, type = world", groupRank); if(groupRank == MASTER) { g_node_children_foreach(node, G_TRAVERSE_ALL, &ExecuteStatement, NULL); } else Verbose("Im not the master here... groupRank = %d", groupRank); break; } case STMT_BARRIER: { ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; gchar* groupName = param_string_get_optional(paramList, 0, &status[0], NULL); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } GroupBlock* groupBlock = groupblock_get(groupName); if(groupName) Verbose("~ Executing STMT_BARRIER: type = explicit group, name = %s", groupName); else Verbose("~ Executing STMT_BARRIER: type = implicit active group"); MPI_ASSERT(MPI_Barrier(groupBlock->mpicomm), "Barrier Statement", TRUE) g_free(groupName); break; } #endif case STMT_SLEEP: { if (agileMode) return; Verbose("~ Executing STMT_SLEEP"); ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; glong time = param_int_get(paramList, 0, &status[0]); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } g_usleep(time); //sleep(time); break; } case STMT_BLOCK: { Verbose("~ Executing STMT_BLOCK"); g_node_children_foreach(node, G_TRAVERSE_ALL, &ExecuteStatement, NULL); break; } case STMT_PRINT: { Verbose("~ Executing STMT_PRINT"); ParameterList* paramList = stmt->parameters; GString* buffer = g_string_new(""); ExpressionStatus status; gint i; for (i=0; i<paramList->len; i++) { gchar* string = param_string_get(paramList, i, &status); if (status == STATUS_EVAL_OK) { g_string_append(buffer, string); g_free(string); if (i < (paramList->len-1)) g_string_append(buffer, " "); } else { backtrace(stmt); Error("Error during print parameter evaluation (index=%d, status=%s).\n", i, expr_status_to_string(status)); } } gchar* processed = var_replace_substrings(buffer->str); g_printf("[%d] %s\n", rank, processed); g_free(processed); g_string_free(buffer, TRUE); break; } case STMT_FCREAT: { ExpressionStatus status[2]; ParameterList* paramList = stmt->parameters; gchar* fhname = param_string_get(paramList, 0, &status[0]); gchar* fname_raw = param_string_get(paramList, 1, &status[1]); Verbose("~ Executing STMT_FCREAT: fhname = %s, fname = %s", fhname, fname_raw); // evaluator error check if (!expr_status_assert(status, 2)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); File* file; IOStatus ioStatus = iio_fcreat(fname, &file); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) { Verbose(" > file = %p", file); var_set_value(fhname, VAR_FILE, &file); statementsSucceed[STMT_FCREAT]++; } else statementsFail[STMT_FCREAT]++; g_free(fhname); g_free(fname_raw); g_free(fname); break; } case STMT_FOPEN: { ExpressionStatus status[3]; ParameterList* paramList = stmt->parameters; gchar* fhname = param_string_get(paramList, 0, &status[0]); gchar* fname_raw = param_string_get(paramList, 1, &status[1]); gint flags = param_int_get(paramList, 2, &status[2]); Verbose("~ Executing STMT_FOPEN: fhname = %s, fname = %s, flags = %d", fhname, fname_raw, flags); // evaluator error check if (!expr_status_assert(status, 3)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); File* file; IOStatus ioStatus = iio_fopen(fname, flags, &file); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) { Verbose(" > file = %p", file); var_set_value(fhname, VAR_FILE, &file); statementsSucceed[STMT_FOPEN]++; } else statementsFail[STMT_FOPEN]++; g_free(fhname); g_free(fname_raw); g_free(fname); break; } case STMT_FCLOSE: { ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; File* file = param_file_get(paramList, 0, &status[0]); Verbose("~ Executing STMT_FCLOSE: file = %p", file); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } g_assert(file); IOStatus ioStatus = iio_fclose(file); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) { gchar* fhname = (gchar*) param_value_get(paramList, 0); var_destroy(fhname); statementsSucceed[STMT_FCLOSE]++; } else statementsFail[STMT_FCLOSE]++; break; } case STMT_FREAD: { ExpressionStatus status[3]; ParameterList* paramList = stmt->parameters; File* file = param_file_get(paramList, 0, &status[0]); glong dataSize = param_int_get_optional(paramList, 1, &status[1], READALL); glong offset = param_int_get_optional(paramList, 2, &status[2], OFFSET_CUR); Verbose("~ Executing STMT_FREAD: file = %p, dataSize = %ld, offset = %ld", file, dataSize, offset); // evaluator error check if (!expr_status_assert(status, 3)) { backtrace(stmt); Error("Malicious statement parameters!"); } IOStatus ioStatus = iio_fread(file, dataSize, offset); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_FREAD]++; else statementsFail[STMT_FREAD]++; break; } case STMT_FWRITE: { ExpressionStatus status[3]; ParameterList* paramList = stmt->parameters; File* file = param_file_get(paramList, 0, &status[0]); glong dataSize = param_int_get(paramList, 1, &status[1]); glong offset = param_int_get_optional(paramList, 2, &status[2], -1); Verbose("~ Executing STMT_FWRITE: file = %p, dataSize = %ld, offset = %ld", file, dataSize, offset); // evaluator error check if (!expr_status_assert(status, 3)) { backtrace(stmt); Error("Malicious statement parameters!"); } IOStatus ioStatus = iio_fwrite(file, dataSize, offset); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_FWRITE]++; else statementsFail[STMT_FWRITE]++; break; } case STMT_FSEEK: { ExpressionStatus status[3]; ParameterList* paramList = stmt->parameters; File* file = param_file_get(paramList, 0, &status[0]); glong offset = param_int_get(paramList, 1, &status[1]); gint whence = param_int_get_optional(paramList, 2, &status[2], SEEK_SET); Verbose("~ Executing STMT_FSEEK: file = %p, offset = %ld, whence = %d", file, offset, whence); // evaluator error check if (!expr_status_assert(status, 3)) { backtrace(stmt); Error("Malicious statement parameters!"); } IOStatus ioStatus = iio_fseek(file, offset, whence); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_FSEEK]++; else statementsFail[STMT_FSEEK]++; break; } case STMT_FSYNC: { ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; File* file = param_file_get(paramList, 0, &status[0]); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } IOStatus ioStatus = iio_fsync(file); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_FSYNC]++; else { statementsFail[STMT_FSYNC]++; } break; } case STMT_WRITE: { ExpressionStatus status[3]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); glong dataSize = param_int_get(paramList, 1, &status[1]); glong offset = param_int_get_optional(paramList, 2, &status[2], 0); Verbose("~ Executing STMT_WRITE: file = %s, dataSize = %ld, offset = %ld", fname_raw, dataSize, offset); // evaluator error check if (!expr_status_assert(status, 3)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); IOStatus ioStatus = iio_write(fname, dataSize, offset); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_WRITE]++; else statementsFail[STMT_WRITE]++; g_free(fname_raw); g_free(fname); break; } case STMT_APPEND: { ExpressionStatus status[2]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); glong dataSize = param_int_get(paramList, 1, &status[1]); Verbose("~ Executing STMT_APPEND: file = %s, dataSize = %ld", fname_raw, dataSize); // evaluator error check if (!expr_status_assert(status, 2)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); IOStatus ioStatus = iio_append(fname, dataSize); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_APPEND]++; else statementsFail[STMT_APPEND]++; g_free(fname_raw); g_free(fname); break; } case STMT_READ: { ExpressionStatus status[3]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); glong dataSize = param_int_get_optional(paramList, 1, &status[1], READALL); glong offset = param_int_get_optional(paramList, 2, &status[2], 0); Verbose("~ Executing STMT_READ: file = %s, dataSize = %ld, offset = %ld", fname_raw, dataSize, offset); // evaluator error check if (!expr_status_assert(status, 2)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); IOStatus ioStatus = iio_read(fname, dataSize, offset); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_READ]++; else statementsFail[STMT_READ]++; g_free(fname_raw); g_free(fname); break; } case STMT_LOOKUP: { ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); Verbose("~ Executing STMT_LOOKUP: file = %s", fname_raw); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); IOStatus ioStatus = iio_lookup(fname); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_LOOKUP]++; else statementsFail[STMT_LOOKUP]++; g_free(fname_raw); g_free(fname); break; } case STMT_DELETE: { ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); Verbose("~ Executing STMT_DELETE: file = %s", fname_raw); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); IOStatus ioStatus = iio_delete(fname); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_DELETE]++; else statementsFail[STMT_DELETE]++; g_free(fname_raw); g_free(fname); break; } case STMT_MKDIR: { ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); Verbose("~ Executing STMT_MKDIR: file = %s", fname_raw); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); IOStatus ioStatus = iio_mkdir(fname); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_MKDIR]++; else statementsFail[STMT_MKDIR]++; g_free(fname_raw); g_free(fname); break; } case STMT_RMDIR: { ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); Verbose("~ Executing STMT_RMDIR: file = %s", fname_raw); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); IOStatus ioStatus = iio_rmdir(fname); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_RMDIR]++; else statementsFail[STMT_RMDIR]++; g_free(fname_raw); g_free(fname); break; } case STMT_CREATE: { ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); Verbose("~ Executing STMT_CREATE: file = %s", fname_raw); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); IOStatus ioStatus = iio_create(fname); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_CREATE]++; else statementsFail[STMT_CREATE]++; g_free(fname_raw); g_free(fname); break; } case STMT_STAT: { ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); Verbose("~ Executing STMT_STAT: file = %s", fname_raw); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); IOStatus ioStatus = iio_stat(fname); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_STAT]++; else statementsFail[STMT_STAT]++; g_free(fname_raw); g_free(fname); break; } case STMT_RENAME: { ExpressionStatus status[2]; ParameterList* paramList = stmt->parameters; gchar* oldname_raw = param_string_get(paramList, 0, &status[0]); gchar* newname_raw = param_string_get(paramList, 1, &status[1]); Verbose("~ Executing STMT_RENAME: oldname = %s, newname = %s", oldname_raw, oldname_raw); // evaluator error check if (!expr_status_assert(status, 2)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* oldname = var_replace_substrings(oldname_raw); gchar* newname = var_replace_substrings(newname_raw); IOStatus ioStatus = iio_rename(oldname, newname); dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_RENAME]++; else statementsFail[STMT_RENAME]++; g_free(oldname_raw); g_free(newname_raw); g_free(oldname); g_free(newname); break; } #ifdef HAVE_MPI case STMT_PFOPEN: { ExpressionStatus status[3]; ParameterList* paramList = stmt->parameters; gchar* fhname = param_string_get(paramList, 0, &status[0]); gchar* fname_raw = param_string_get(paramList, 1, &status[1]); gchar* mode = param_string_get(paramList, 2, &status[2]); Verbose("~ Executing STMT_FOPEN: fhname = %s, fname = %s mode = %s", fhname, fname_raw, mode); // evaluator error check if (!expr_status_assert(status, 3)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); MPI_Comm comm = MPI_COMM_WORLD; if(groupStack) comm = ((GroupBlock*) g_list_first(groupStack)->data)->mpicomm; File* file; if (iio_pfopen(fname, mode, comm, &file)) { Verbose(" > file = %p", file); var_set_value(fhname, VAR_FILE, &file); statementsSucceed[STMT_PFOPEN]++; } else statementsFail[STMT_PFOPEN]++; g_free(fhname); g_free(fname_raw); g_free(fname); g_free(mode); break; } case STMT_PFCLOSE: { ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; File* file = param_file_get(paramList, 0, &status[0]); Verbose("~ Executing STMT_FCLOSE: file = %p", file); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } if (file && iio_pfclose(file)) { gchar* fhname = (gchar*) param_value_get(paramList, 0); var_destroy(fhname); statementsSucceed[STMT_PFCLOSE]++; } else statementsFail[STMT_PFCLOSE]++; break; } case STMT_PFWRITE: { ExpressionStatus status[2]; ParameterList* paramList = stmt->parameters; File* file = param_file_get(paramList, 0, &status[0]); gchar* pname = param_string_get(paramList, 1, &status[1]); Verbose("~ Executing STMT_PFWRITE: file = %p, pattern = %s", file, pname); // evaluator error check if (!expr_status_assert(status, 2)) { backtrace(stmt); Error("Malicious statement parameters!"); } Pattern* pattern = g_hash_table_lookup(patternMap, pname); if (!pattern) { g_printf("Invalid pattern parameter in statement pfwrite.\n"); Error("Malicious statement parameters!"); break; } MPI_Comm comm = MPI_COMM_WORLD; if(groupStack) comm = ((GroupBlock*) g_list_first(groupStack)->data)->mpicomm; IOStatus ioStatus; switch(pattern->level) { /* Level 0: non-collective, contiguous */ case 0: Verbose(" > level = 0"); ioStatus = iio_pfwrite_level0(file, pattern); break; /* Level 1: collective, contiguous */ case 1: Verbose(" > level = 1"); ioStatus = iio_pfwrite_level1(file, pattern); break; /* Level 2: non-collective, non-contiguous */ case 2: Verbose(" > level = 2"); ioStatus = iio_pfwrite_level2(file, pattern); break; /* Level 3: collective, non-contiguous */ case 3: Verbose(" > level = 3"); ioStatus = iio_pfwrite_level3(file, pattern); break; default: Error("Invalid level (%d) for statement pfwrite!", pattern->level); } dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_PFWRITE]++; else statementsFail[STMT_PFWRITE]++; g_free(pname); break; } case STMT_PFREAD: { ExpressionStatus status[2]; ParameterList* paramList = stmt->parameters; File* file = param_file_get(paramList, 0, &status[0]); gchar* pname = param_string_get(paramList, 1, &status[1]); Verbose("~ Executing STMT_PFREAD: file = %p, pattern = %s", file, pname); // evaluator error check if (!expr_status_assert(status, 2)) { backtrace(stmt); Error("Malicious statement parameters!"); } Pattern* pattern = g_hash_table_lookup(patternMap, pname); if (!pattern) { g_printf("Invalid pattern parameter in statement pread.\n"); Error("Malicious statement parameters!"); break; } MPI_Comm comm = MPI_COMM_WORLD; if(groupStack) comm = ((GroupBlock*) g_list_first(groupStack)->data)->mpicomm; IOStatus ioStatus; switch(pattern->level) { /* Level 0: non-collective, contiguous */ case 0: Verbose(" > level = 0"); ioStatus = iio_pfread_level0(file, pattern); break; /* Level 1: collective, contiguous */ case 1: Verbose(" > level = 1"); ioStatus = iio_pfread_level1(file, pattern); break; /* Level 2: non-collective, non-contiguous */ case 2: Verbose(" > level = 2"); ioStatus = iio_pfread_level2(file, pattern); break; /* Level 3: collective, non-contiguous */ case 3: Verbose(" > level = 3"); ioStatus = iio_pfread_level3(file, pattern); break; default: Error("Invalid level (%d) for statement pfread!", pattern->level); } dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_PFREAD]++; else statementsFail[STMT_PFREAD]++; g_free(pname); break; } case STMT_PWRITE: { ExpressionStatus status[2]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); gchar* pname = param_string_get(paramList, 1, &status[1]); Verbose("~ Executing STMT_PWRITE: file = %s, pattern = %s", fname_raw, pname); // evaluator error check if (!expr_status_assert(status, 2)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); Pattern* pattern = g_hash_table_lookup(patternMap, pname); if (!pattern) { g_printf("Invalid pattern parameter in statement pwrite.\n"); Error("Malicious statement parameters!"); break; } MPI_Comm comm = MPI_COMM_WORLD; if(groupStack) comm = ((GroupBlock*) g_list_first(groupStack)->data)->mpicomm; IOStatus ioStatus; switch(pattern->level) { /* Level 0: non-collective, contiguous */ case 0: Verbose(" > level = 0"); ioStatus = iio_pwrite_level0(fname, pattern, comm); break; /* Level 1: collective, contiguous */ case 1: Verbose(" > level = 1"); ioStatus = iio_pwrite_level1(fname, pattern, comm); break; /* Level 2: non-collective, non-contiguous */ case 2: Verbose(" > level = 2"); ioStatus = iio_pwrite_level2(fname, pattern, comm); break; /* Level 3: collective, non-contiguous */ case 3: Verbose(" > level = 3"); ioStatus = iio_pwrite_level3(fname, pattern, comm); break; default: Error("Invalid level (%d) for statement pwrite!", pattern->level); } dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_PWRITE]++; else statementsFail[STMT_PWRITE]++; g_free(fname_raw); g_free(fname); g_free(pname); break; } case STMT_PREAD: { ExpressionStatus status[2]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); gchar* pname = param_string_get(paramList, 1, &status[1]); Verbose("~ Executing STMT_PREAD: file = %s, pattern = %s", fname_raw, pname); // evaluator error check if (!expr_status_assert(status, 2)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); Pattern* pattern = g_hash_table_lookup(patternMap, pname); if (!pattern) { g_printf("Invalid pattern parameter in statement pread.\n"); g_free(fname); Error("Malicious statement parameters!"); break; } MPI_Comm comm = MPI_COMM_WORLD; if(groupStack) comm = ((GroupBlock*) g_list_first(groupStack)->data)->mpicomm; IOStatus ioStatus; switch(pattern->level) { /* Level 0: non-collective, contiguous */ case 0: Verbose(" > level = 0"); ioStatus = iio_pread_level0(fname, pattern, comm); break; /* Level 1: collective, contiguous */ case 1: Verbose(" > level = 1"); ioStatus = iio_pread_level1(fname, pattern, comm); break; /* Level 2: non-collective, non-contiguous */ case 2: Verbose(" > level = 2"); ioStatus = iio_pread_level2(fname, pattern, comm); break; /* Level 3: collective, non-contiguous */ case 3: Verbose(" > level = 3"); ioStatus = iio_pread_level3(fname, pattern, comm); break; default: Error("Invalid level (%d) for statement pread!", pattern->level); } dump_coretime(coreTimeStack, ioStatus.coreTime); if (ioStatus.success) statementsSucceed[STMT_PREAD]++; else statementsFail[STMT_PREAD]++; g_free(fname_raw); g_free(fname); g_free(pname); break; } case STMT_PDELETE: { ExpressionStatus status[1]; ParameterList* paramList = stmt->parameters; gchar* fname_raw = param_string_get(paramList, 0, &status[0]); Verbose("~ Executing STMT_PDELETE: file = %s", fname_raw); // evaluator error check if (!expr_status_assert(status, 1)) { backtrace(stmt); Error("Malicious statement parameters!"); } gchar* fname = var_replace_substrings(fname_raw); if (iio_pdelete(fname)) statementsSucceed[STMT_PDELETE]++; else statementsFail[STMT_PDELETE]++; g_free(fname_raw); g_free(fname); break; } #endif /* ![ModuleHook] statement_exec */ default: Error("Invalid statement! (id=%d)\n", stmt->type); } }