示例#1
0
int get_mat_data(const struct Parameter *para, int *col, int *ptr, double *val, double *bvec, double *xvec, const int N, const int NNZ)
{
  FILE *in1, *in2, *in3;
  int i, getint, skip1, skip2, skip3;
  double getdouble, getdouble2;

  if((in1 = fopen(para->col_path, "r")) == NULL)
  {
    warning_log((char*)"open file failed");
    return -1;
  }
  if((in2 = fopen(para->ptr_path, "r")) == NULL)
  {
    warning_log((char*)"open file failed");
    return -1;
  }
  if((in3 = fopen(para->bx_path, "r")) == NULL)
  {
    warning_log((char*)"open file failed");
    return -1;
  }

  fscanf(in1, "%d %d %d\n", &skip1, &skip2, &skip3);
  fscanf(in2, "%d %d %d\n", &skip1, &skip2, &skip3);
  fscanf(in3, "%d %d %d\n", &skip1, &skip2, &skip3);

  for(i=0;i<NNZ;i++)
  {
    fscanf(in1, "%d %le\n", &getint, &getdouble);
    col[i] = getint;
    val[i] = getdouble;
  }
  
  for(i=0;i<N+1;i++)
  {
    fscanf(in2, "%d\n", &getint);
    ptr[i] = getint;
  }

  for(i=0;i<N;i++)
  {
    fscanf(in3, "%le %le\n", &getdouble, &getdouble2);
    bvec[i] = getdouble;
    xvec[i] = getdouble2;
  }

  fclose(in1);
  fclose(in2);
  fclose(in3);
#ifdef EBUG
  normal_log((char*)"done get Mat data");
#endif

  return 0;
}
示例#2
0
int check_opt(struct Parameter *para)
{
  if(strncmp(para->c_matrix, "", 128)==0)
  {
    warning_log((char*)"Must set Matrix name");
    return -1;
  }
  if(para->c_outer_solver==NONE)
  {
    warning_log((char*)"Must set a Solver name");
    return -1;
  }
  if(para->i_outer_maxloop <=0 || para->i_inner_maxloop <=0)
  {
    warning_log((char*)"Maxloop must larger than 0");
    return -1;
  }
  if(para->d_outer_eps <=0.0 || para->d_inner_eps <=0.0)
  {
    warning_log((char*)"EPS must larger than 0.0");
    return -1;
  }
  if(para->i_outer_restart <0 || para->i_inner_restart <0)
  {
    warning_log((char*)"Restart can not smaller than 0");
    return -1;
  }
  if(para->i_outer_kskip <0 || para->i_inner_kskip <0)
  {
    warning_log((char*)"Kskip can not smaller than 0");
    return -1;
  }
  if(para->c_outer_solver==VPCG || para->c_outer_solver==VPCR || para->c_outer_solver==VPGCR || para->c_outer_solver==VPGMRES)
  {
    if(para->c_inner_solver==NONE)
    {
      warning_log((char*)"Outer solver use VP method, must set a inner solver");
      return -1;
    }else if(para->c_inner_solver==VPCG || para->c_inner_solver==VPCR || para->c_inner_solver==VPGCR || para->c_inner_solver==VPGMRES)
    {
      warning_log((char*)"Outer & Inner recurrence VP method !!");
      return -1;
    }else
    {
      para->isVP=true;
    }
  }
  if(para->c_inner_solver!=NONE)
  {
    if(para->c_outer_solver!=VPCG && para->c_outer_solver!=VPCR && para->c_outer_solver!=VPGCR && para->c_outer_solver!=VPGMRES)
    {
      warning_log((char*)"Outer method was not VP, don't set inner solver");
      return -1;
    }
  }
  return 0;
}
示例#3
0
/* ================ delete_data() ================ */
int delete_data(zsock_t *sock, const char *key)
{
    /* ---------------- Send Message ---------------- */
    zmsg_t *delete_msg = create_action_message(MSG_ACTION_DEL);
    message_add_key_data(delete_msg, key, "", 0);

    zmsg_send(&delete_msg, sock);

    /* ---------------- Receive Message ---------------- */

    zmsg_t *recv_msg = zmsg_recv(sock);
    if ( recv_msg == NULL ){
        return -2;
    }
    zmsg_print(recv_msg);

    int rc = -1;
    if (message_check_status(recv_msg, MSG_STATUS_WORKER_NOTFOUND) == 0 ){
        warning_log("Not Found. key=%s", key);
        rc = 0;
    } else if ( message_check_status(recv_msg, MSG_STATUS_WORKER_ERROR) == 0 ){
        error_log("Return MSG_STATUS_WORKER_ERROR. key=%s", key);
        rc = -1;
    }

    zmsg_destroy(&recv_msg);

    return rc;
}
示例#4
0
/*  ==================== udb_handle_delete_response() ==================== */ 
int udb_handle_delete_response(session_t *session, message_t *response)
{
    assert(response->msg_type == MSG_TYPE_RESPONSE);

    int ret = 0;

    udb_t *udb = udb(session);

    message_arg_t *arg = (message_arg_t*)response->data;

    if ( response->result == RESULT_SUCCESS ) {

    } else if ( response->result == RESULT_ERR_NOTFOUND ) {
        /* ---------- key ---------- */
        message_arg_t *argKey = arg;

        warning_log("Not Deleted for NOTFOUND! key=%s", argKey->data);
    } else {
        error_log("Error response code! result=%d", response->result);
        ret = -1;
    }

    if ( udb->after_delete_finished != NULL ){
        udb->after_delete_finished(udb, response);
    }

    udb->finished_works++;

    return ret;
}
// Documented in header
int contractor_controller_close(void)
{

  debug_log("contractor_controller_close called.");

  if (kill_all_contractors_using_signal(SIGTERM) != 0)
  {

    warning_log("Not all contractors died after being sent a SIGTERM, will SIGKILL");

    if (kill_all_contractors_using_signal(SIGKILL) != 0)
    {
      error_log("Not all contractors died after bing sent a SIGKILL!");
      return -1;
    }
  }

  if (child_contractors != NULL)
  {
    g_slist_free_full(child_contractors, contractor_gslist_free);
    child_contractors = NULL;
  }

  return 0;
}
示例#6
0
/* ==================== parse_write_request() ==================== */ 
int parse_write_request(session_t *session, message_t *request, msgidx_t *msgidx)
{
    if ( request->data_length <= 0 ) {
        warning_log("request->data_length <= 0!");
        return -1;
    }

    msgidx->message = request;

    /* -------- message args -------- */
    message_arg_t *arg = (message_arg_t*)request->data;
    message_arg_t *argCRC32 = NULL;

    /* -------- argKey -------- */
    message_arg_t *argKey = arg;
    assert(argKey->size > 0);
    if ( argKey->size > 0 ) {
        uint32_t keylen = argKey->size < NAME_MAX - 1 ? argKey->size : NAME_MAX - 1;
        msgidx->key = argKey->data;
        msgidx->keylen = keylen;
    } else {
        /*uuid_t uuid;*/
        /*uuid_generate(uuid);*/
        /*uuid_unparse(uuid, block->key);*/
        return -1;
    }
    /* -------- argMd5 -------- */
    message_arg_t *argMd5 = message_next_arg(argKey);
    msgidx->key_md5 = (md5_value_t*)argMd5->data;

    /* -------- argFileSize -------- */
    message_arg_t *argFileSize = message_next_arg(argMd5);
    msgidx->object_size = *((uint32_t*)argFileSize->data);

    /* -------- argCRC32 -------- */
    argCRC32 = message_next_arg(argFileSize);

    /* -------- argData -------- */
    message_arg_t *argData = message_next_arg(argCRC32);

    /*if ( argData->size > 0 ) {*/
        /*if ( check_data_crc32(request->id, argCRC32, argData) != 0 ){*/
            /*error_log("fd(%d) request message id(%d) Check buffer crc32 failed.", session_fd(session), request->id);*/
            /*return -1;*/
        /*}*/
    /*} */

    msgidx->data = argData->data;
    msgidx->data_size = argData->size;

    /*assert(msgidx->data_size > 0);*/


    return 0;
}
示例#7
0
int check_solver(char *optarg, enum SolverName *solver)
{
  if(strncmp(optarg, "CG", 2)==0 || strncmp(optarg, "cg", 2)==0)
  {
    *solver=CG;
  }else if(strncmp(optarg, "CR", 2)==0 || strncmp(optarg, "cr", 2)==0)
  {
    *solver=CR;
  }else if(strncmp(optarg, "GCR", 3)==0 || strncmp(optarg, "gcr", 3)==0)
  {
    *solver=GCR;
  }else if(strncmp(optarg, "GMRES", 5)==0 || strncmp(optarg, "gmres", 5)==0)
  {
    *solver=GMRES;
  }else if(strncmp(optarg, "KSKIPCG", 7)==0 || strncmp(optarg, "kskipcg", 7)==0)
  {
    *solver=KSKIPCG;
  }else if(strncmp(optarg, "KSKIPCR", 7)==0 || strncmp(optarg, "kskipcr", 7)==0)
  {
    *solver=KSKIPCR;
  }else if(strncmp(optarg, "VPCG", 4)==0 || strncmp(optarg, "vpcg", 4)==0)
  {
    *solver=VPCG;
  }else if(strncmp(optarg, "VPCR", 4)==0 || strncmp(optarg, "vpcr", 4)==0)
  {
    *solver=VPCR;
  }else if(strncmp(optarg, "VPGCR", 5)==0 || strncmp(optarg, "vpgcr", 5)==0)
  {
    *solver=VPGCR;
  }
  else if(strncmp(optarg, "VPGMRES", 7)==0 || strncmp(optarg, "vpgmres", 7)==0)
  {
    *solver=VPGMRES;
  }
  else if(strncmp(optarg, "BICG", 4)==0 || strncmp(optarg, "bicg", 4)==0)
  {
    *solver=BICG;
  }
  else if(strncmp(optarg, "KSKIPBICG", 9)==0 || strncmp(optarg, "kskipbicg", 9)==0)
  {
    *solver=KSKIPBICG;
  }
  else{
    warning_log((char*)"not defined solver name");
    return -1;
  }
  return 0;
}
示例#8
0
/* ================ download_data() ================ */
int download_data(zsock_t *sock, const char *key)
{
    /* ---------------- Send Message ---------------- */
    zmsg_t *download_msg = create_action_message(MSG_ACTION_GET);
    message_add_key_data(download_msg, key, "", 0);

    zmsg_send(&download_msg, sock);

    /* ---------------- Receive Message ---------------- */

    zmsg_t *recv_msg = zmsg_recv(sock);
    if ( recv_msg == NULL ){
        return -2;
    }
    /*zmsg_print(recv_msg);*/

    int rc = -1;
    if (message_check_status(recv_msg, MSG_STATUS_WORKER_NOTFOUND) == 0 ){
        warning_log("Not Found. key=%s", key);
        rc = 0;
    } else if ( message_check_status(recv_msg, MSG_STATUS_WORKER_ERROR) == 0 ){
        error_log("Return MSG_STATUS_WORKER_ERROR. key=%s", key);
        rc = -1;
    } else {
        /*zmsg_print(recv_msg);*/
        zframe_t *frame_msgtype = zmsg_first(recv_msg);
        if ( frame_msgtype != NULL ){
            int16_t msgtype = *(int16_t*)zframe_data(frame_msgtype);
            if ( msgtype == MSGTYPE_DATA ){
                zmsg_first(recv_msg);

                zframe_t *frame_key = zmsg_next(recv_msg);
                UNUSED const char *key = (const char *)zframe_data(frame_key);

                zframe_t *frame_data = zmsg_next(recv_msg);
                UNUSED const char *data =  (const char *)zframe_data(frame_data);
                UNUSED uint32_t data_size = zframe_size(frame_data);
                /*notice_log("Receive key:%s data_size:%d", key, data_size);*/
                rc = 0;
            }
        }
    }

    zmsg_destroy(&recv_msg);

    return rc;
}
示例#9
0
static void cleanup(transport_t t)
{

  transport_close(t);

  // If something went wrong like a subcontractor crashed, it's possible files will be left behind.
  // Double check it here

  char *test_harness_listen_endpoint = g_strdup_printf("%s-%d", TEST_SOCKET, getpid());
  char *file = strstr(test_harness_listen_endpoint, IPC_PREFIX);

  if (file != NULL && (strlen(test_harness_listen_endpoint) > (strlen(IPC_PREFIX) + 1)))
  {
    file = test_harness_listen_endpoint + strlen(IPC_PREFIX);

    struct stat info;

    if (stat(file, &info) != 0)
    {
      debug_log("Couldn't stat %s, not cleaning up.", file);
    } else
    {
      if (unlink(file) != 0)
      {
        warning_log("Couldn't delete endpoint %s, may still exist. Error was %i (%s)", file, errno, strerror(errno));
      } else
      {
        debug_log("Deleted left over IPC end point %s", file);
      }
    }

  } else
  {
    debug_log("End point doesn't appear to be ipc. Not removing file: %s ", file);
  }

  g_free(test_harness_listen_endpoint);

  logger_close();
  config_close();
}
示例#10
0
print_manager_t print_manager_init(unsigned int block_size, unsigned long long start_block)
{
  struct print_manager *pm = (struct print_manager *) g_malloc(sizeof(struct print_manager));

  pm->magic = PRINT_MANAGER_MAGIC;
  pm->block_size = block_size;
  pm->current_offset = start_block;
  pm->abs_tree = g_tree_new_full((GCompareDataFunc) abs_tree_compare, NULL, (GDestroyNotify) g_free, (GDestroyNotify) g_node_safe_destroy);
  pm->continuation_tree = g_tree_new_full((GCompareDataFunc) continuation_tree_compare, NULL, (GDestroyNotify) block_range_close, (GDestroyNotify) continuation_node_free);
  pm->print_array = NULL;
  pm->destroy_array = NULL;
  pm->lookup_offset = 0;
  pm->lookup_range = block_range_init(NULL, 0);

  // Work out which output format to use
  int print_style = 0;

  if (config_get_int_with_default_macro(NULL, CONFIG_OUTPUT_STYLE, &print_style) != 0)
  {
    print_style = CONFIG_OUTPUT_STYLE_DEFAULT;
  }

  switch (print_style)
  {
    case CONFIG_DFRWS_OUTPUT_STYLE:
      pm->print_handler = get_dfrws_print_handler();
      break;
    case CONFIG_PATH_OUTPUT_STYLE:
      pm->print_handler = get_basic_print_handler();
      break;
    default:
      warning_log("Unknown print style selected!!");
      pm->print_handler = get_dfrws_print_handler();
  }

  // Print out the header
  pm->print_handler->print_header();

  return (print_manager_t) pm;
}
示例#11
0
/**
 * Parses the file and populates the structures used by this FUSE driver.
 *
 * \param filename The filename to parse
 * \param r The result structure to populate (or NULL if not needed)
 * \returns 0 if successful, -1 if not.
 */
static int process_file(const char *filename, result_t new_result)
{
  img_info = tsk_img_open_sing(filename, TSK_IMG_TYPE_DETECT, 0);
  if (img_info == NULL)
  {
    info_log("Failed to open image: %s", filename);
    return -1;
  }

  fs_info = tsk_fs_open_img(img_info, 0, TSK_FS_TYPE_DETECT);
  if (fs_info == NULL)
  {
    info_log("Failed to open filesystem: %s", filename);
    return -1;
  }

  const char *fsname = tsk_fs_type_toname(fs_info->ftype);

  result_set_brief_data_description(new_result, fsname);
  mountpoint = g_strdup_printf("%s:mnt-%s", filename, fsname);

  char *description = g_strdup_printf("%" PRIdDADDR " bytes (%" PRIdDADDR " %ss of %u size)", fs_info->block_count * fs_info->block_size, fs_info->block_count, fs_info->duname, fs_info->block_size);

  result_set_data_description(new_result, description);
  g_free(description);

  result_set_confidence(new_result, 100);
  block_start(absolute_offset);

  TSK_FS_DIR_WALK_FLAG_ENUM name_flags = (TSK_FS_DIR_WALK_FLAG_ENUM) (TSK_FS_DIR_WALK_FLAG_ALLOC | TSK_FS_DIR_WALK_FLAG_UNALLOC | TSK_FS_DIR_WALK_FLAG_RECURSE);

  if (tsk_fs_dir_walk(fs_info, fs_info->root_inum, name_flags, examine_dirent, new_result) != 0)
  {
    // Why does this occur? Is it because it's an invalid filesystem structure, or the
    // structure is damaged? I'm going to assume the structure is damaged, but partially available.
    warning_log("Warning, unable to fully walk fs! Probably truncated or not a real FS header.");
  }

  unsigned int size;
  block_range_t *ranges = block_end(&size);

  if (ranges != NULL)
  {
    result_set_block_ranges(new_result, ranges, size);
    for (int i = 0; i < size; i++)
    {
      block_range_close(ranges[i]);
    }
    g_free(ranges);
  }

  if (inode_lookup != NULL)
  {
    g_tree_destroy(inode_lookup);
    inode_lookup = NULL;
  }

  unsigned int num_contracts;
  result_get_new_contracts(new_result, &num_contracts);
  if (num_contracts > 0)
  {
    // Ready to mount!
    int ret = do_mount(mountpoint);

    if (ret != 0)
    {
      error_log("Failed to mount filesystem!");
    }
  }

  remove_all_files();

  return 0;
}
示例#12
0
int get_mat_head(const struct Parameter *para, int *N, int *NNZ)
{
  FILE *in1, *in2, *in3;
  int N_x[3], N_y[3], N_NNZ[3], i;

  if((in1=fopen(para->bx_path, "r")) == NULL)
  {
    warning_log((char*)"fopen failed");
    return -1;
  }
  if((in2=fopen(para->col_path, "r")) == NULL)
  {
    warning_log((char*)"fopen failed");
    return -1;
  }
  if((in3=fopen(para->ptr_path, "r")) == NULL)
  {
    warning_log((char*)"fopen failed");
    return -1;
  }

  fscanf(in1, "%d %d %d\n", &N_x[0], &N_y[0], &N_NNZ[0]);
  fscanf(in2, "%d %d %d\n", &N_x[1], &N_y[1], &N_NNZ[1]);
  fscanf(in3, "%d %d %d\n", &N_x[2], &N_y[2], &N_NNZ[2]);

  for(i=0;i<3;i++)
  {
    if(N_x[i] != N_y[i])
    {
      warning_log((char*)"N_x != N_y");
      return -1;
    }
  }
  if(N_x[0] != N_x[1] || N_x[1] != N_x[2] || N_x[2] != N_x[0])
  {
    warning_log((char*)"N_x was not same in 3files");
    return -1;
  }
  if(N_y[0] != N_y[1] || N_y[1] != N_y[2] || N_y[2] != N_y[0])
  {
    warning_log((char*)"N_y was not same in 3files");
    return -1;
  }
  if(N_NNZ[0] != N_NNZ[1] || N_NNZ[1] != N_NNZ[2] || N_NNZ[2] != N_NNZ[0])
  {
    warning_log((char*)"N_NNZ was not same in 3files");
    return -1;
  }

  *N=N_x[0];
  *NNZ=N_NNZ[0];

  fclose(in1);
  fclose(in2);
  fclose(in3);

#ifdef EBUG
  char size[10];
  sprintf(size, "get N=%d, NNZ=%d", *N, *NNZ);
  normal_log((char*)size);
#endif

  return 0;
}
示例#13
0
int get_opt(int argc, char *argv[], struct Parameter *para)
{
  int opt;
  int longindex;
  int error;
  struct option longopts[] = 
  {
    {"Matrix", required_argument, NULL, 'm'},
    {"OuterSolver", required_argument, NULL, 'S'},
    {"InnerSolver", required_argument, NULL, 's'},
    {"OuterMaxLoop", required_argument, NULL, 'L'},
    {"InnerMaxLoop", required_argument, NULL, 'l'},
    {"OuterEPS", required_argument, NULL, 'E'},
    {"InnerEPS", required_argument, NULL, 'e'},
    {"OuterRestart", required_argument, NULL, 'R'},
    {"InnerRestart", required_argument, NULL, 'r'},
    {"OuterKskip", required_argument, NULL, 'K'},
    {"InnerKskip", required_argument, NULL, 'k'},
    {"OuterFix", required_argument, NULL, 'F'},
    {"InnerFix", required_argument, NULL, 'f'},
    {"Thread", required_argument, NULL, 't'},
    {"Cuda", no_argument, NULL, 'c'},
    {"Verbose", no_argument, NULL, 'v'},
    {"Help", no_argument, NULL, 'h'},
    {0,        0,           0,      0 },
  };

  while((opt=getopt_long_only(argc, argv, "m:S:s:L:l:E:e:R:r:K:k:F:f:t:cvh", longopts, &longindex)) != -1)
  {
    switch(opt)
    {
      case 'm':
        strcpy(para->c_matrix, optarg);
        break;
      case 'S':
        error=check_solver(optarg, &para->c_outer_solver);
        if(error_handle(error, (char*)"error in outer solver name")!=0)
          return -1;
        break;
      case 's':
        error=check_solver(optarg, &para->c_inner_solver);
        if(error_handle(error, (char*)"error in inner solver name")!=0)
          return -1;
        break;
      case 'L':
        para->i_outer_maxloop=atoi(optarg);
        break;
      case 'l':
        para->i_inner_maxloop=atoi(optarg);
        break;
      case 'E':
        para->d_outer_eps=atof(optarg);
        break;
      case 'R':
        para->i_outer_restart=atoi(optarg);
        break;
      case 'r':
        para->i_inner_restart=atoi(optarg);
        break;
      case 'K':
        para->i_outer_kskip=atoi(optarg);
        break;
      case 'k':
        para->i_inner_kskip=atoi(optarg);
        break;
      case 'F':
        para->i_outer_fix=atoi(optarg);
        break;
      case 'f':
        para->i_inner_fix=atoi(optarg);
        break;
      case 't':
        para->i_thread=atoi(optarg);
        break;
      case 'c':
        para->f_cuda=true;
        break;
      case 'v':
        para->f_verbose=true;
        break;
      case 'h':
        show_help();
        exit(0);
      default:
        warning_log((char*)"Unknow option");
        return -1;
    }
  }
#ifdef EBUG
  normal_log((char*)"pass get_opt");
#endif
  return 0;
}
示例#14
0
int find_mat(struct Parameter *para)
{
  DIR *dir;
  struct dirent *dp;
  struct stat st;
  char path[512]="";
  char fullpath[512+512]="";
  char search_name[512]="";

  bool dir_found=false;
  bool file_found=false;
  bool bx=false;
  bool col=false;
  bool ptr=false;

  //TODO: option to change path
  strcpy(search_name, para->c_matrix);
  strcpy(path, "../Matrix/CSR/");


  if((dir = opendir(path)) == NULL)
  {
    warning_log((char*)"open path failed");
    return -1;
  }
  
  for(dp=readdir(dir); dp!=NULL; dp=readdir(dir))
  {
    stat(dp->d_name, &st);
    if(S_ISDIR(st.st_mode))
    {
      if(strcmp(dp->d_name, search_name) == 0)
      {
        dir_found = true;
        break;
      }
    }
  }

  if(!dir_found)
  {
    warning_log((char*)"find matrix failed");
    return -1;
  }else
  {
#ifdef EBUG
    normal_log((char*)"find matrix dir");
#endif
  }

  strcpy(fullpath, path);
  strcat(fullpath, search_name);
  strcat(fullpath, "/");
  if((dir = opendir(fullpath)) == NULL)
  {
    warning_log((char*)"open fullpath failed");
    return -1;
  }
  for(dp=readdir(dir); dp!=NULL; dp=readdir(dir))
  {
    stat(dp->d_name, &st);
    /* if(S_ISDIR(st.st_mode)) */
    /* { */

      /* printf("!!%s\n", dp->d_name); */
      if(strcmp(dp->d_name, "bx.txt") == 0)
      {
        bx=true;
      }else if(strcmp(dp->d_name, "ColVal.txt") == 0)
      {
        col=true;
      }else if(strcmp(dp->d_name, "Ptr.txt") == 0)
      {
        ptr=true;
      }
      if(bx && col && ptr)
      {
        file_found=true;
        break;
      }

    /* } */
  }
  
  if(!file_found)
  {
    warning_log((char*)"matrix file meybe missing ?");
    return -1;
  }else{
    normal_log((char*)"find matrix file");
  }

  strcpy(para->bx_path, fullpath);
  strcpy(para->ptr_path, fullpath);
  strcpy(para->col_path, fullpath);
  strcat(para->bx_path, "bx.txt");
  strcat(para->ptr_path, "Ptr.txt");
  strcat(para->col_path, "ColVal.txt");

  closedir(dir);

  return 0;
}
示例#15
0
/**
 * Starts the harness.
 *
 * \param argc Num of args
 * \param argv The args
 * \returns 0 on success, -1 on error
 */
int main(int argc, char *argv[])
{
  SHORT_PROCESS_NAME = basename_safe(argv[0]);
  PROCESS_NAME = argv[0];

  // We accept only one argument, namely the transport address of the
  // global configuration server
  if (argc != 2)
  {
    print_usage();
    return -1;
  }

  if (config_init(argv[1]) != 0)
  {
    error_log("Unable to setup test harness. Is there a problem with the endpoint syntax? %s", argv[1]);
    return -1;
  }

  int ret = 0;

  ret = logger_config_init();

  if (ret != 0)
  {
    error_log("Failed to create log transport");
    cleanup(NULL);
    return -1;
  }

  char *test_harness_listen_endpoint = g_strdup_printf("%s-%d", TEST_SOCKET, getpid());

  debug_log("Test harness is listening on %s", test_harness_listen_endpoint);
  transport_t transport = transport_init(TRANSPORT_TYPE_PUSHPULL, test_harness_listen_endpoint);

  if (transport == NULL)
  {
    error_log("Unable to create transport");
    g_free(test_harness_listen_endpoint);
    cleanup(NULL);
    return -1;
  }

  if (spawn_subcontractor(argv[1], test_harness_listen_endpoint) != 0)
  {
    error_log("Unable to spawn subcontractor");
    g_free(test_harness_listen_endpoint);
    cleanup(transport);
    return -1;
  }
  g_free(test_harness_listen_endpoint);
  test_harness_listen_endpoint = NULL;

  char *input_file;

  if ((config_get(NULL, CONFIG_INPUT_FILE_OPTION_NAME, &input_file) != 0) || (input_file == NULL))
  {
    error_log("Could not get input file name");
    cleanup(transport);
    return -1;
  }

  char *subcontractor;

  if ((config_get(NULL, CONFIG_TEST_HARNESS_SUBCONTRACTOR_TO_TEST_OPTION_NAME, &subcontractor) != 0) || (subcontractor == NULL))
  {
    error_log("Unable to get the name of the subcontractor which means I couldn't calculate the timeout!");
    return -1;
  }

  const char *sub_name = basename_safe(subcontractor);

  long timeout = CONFIG_CONTRACTOR_SUBCONTRACTOR_TRANSPORT_TIMEOUT_DEFAULT;

  if (config_get_long_group_or_general_with_default_macro(sub_name, CONFIG_CONTRACTOR_SUBCONTRACTOR_TRANSPORT_TIMEOUT, &timeout) != 0)
  {
    info_log("Couldn't find out what timeout option to use, using default");
  }

  transport_set_recv_timeout(transport, timeout);
  debug_log("Using %li for timeout to subcontractor", timeout);

  unsigned int contract_string_size;
  contract_t c = contract_init(NULL, 0);

  contract_set_path(c, input_file);
  contract_set_contiguous(c, 1);
  contract_set_absolute_offset(c, 0);
  char *contract_string = contract_serialise(c, &contract_string_size);

  contract_close(c);
  g_free(input_file);
  if (contract_string == NULL)
  {
    perror("Failed to create contract_string");
    g_free(contract_string);
    g_free(subcontractor);
    cleanup(transport);
    return -1;
  }

  info_log("Sending message");

  unsigned int subcontractor_result_msg_size;
  const char *subcontractor_result_msg = transport_sendrecv(transport, contract_string, contract_string_size, &child_pid, &subcontractor_result_msg_size);

  if (subcontractor_result_msg == NULL)
  {

    if (errno == EAGAIN)
    {
      // Timeout.
      error_log
        ("Timeout in receiving message from subcontractor! Either your subcontractor hung (it will be killed when running in pronghorn) or it didn't compelete in time. You need to make sure that the timeout is long enough, by setting subcontractor_timeout (specifcally for your sub contractor or the general case). In pronghorn, this would be via the config file. Using the test harness, you can specificy this using \"-o %s.subcontractor_timeout=<timeout in milliseconds>\" or \"-o general.subcontractor_timeout=<timeout in milliseconds>\" at the end of the command line",
         sub_name);

    } else if (errno == EINTR)
    {
      // Interupted.
      error_log("Something when wrong waiting for your subcontractor to return. Did it crash?! You might like to try adding \"-o %s.valgrind_opts=<path to valgrind>\" when testing.", sub_name);
    }

    cleanup(transport);
    g_free(contract_string);
    g_free(subcontractor);
    return -1;
  }

  g_free(subcontractor);

  contract_completion_report_t report = contract_completion_report_init(subcontractor_result_msg, subcontractor_result_msg_size);

  if (report == NULL)
  {
    perror("Recreating contract_completion_report");
    g_free(contract_string);
    cleanup(transport);
    return -1;
  } else
  {
    info_log("Reconstructed message");
  }

  info_log("=====================");
  info_log("Results: ");
  unsigned int results_count;
  const result_t *results = contract_completion_report_get_results(report, &results_count);

  c = contract_completion_report_get_original_contract(report);;

  for (int i = 0; i < results_count; i++)
  {
    const result_t r = results[i];

    info_log("Path=%s. Type=(%s) %s. Confidence=%d", contract_get_path(c), result_get_brief_data_description(r), result_get_data_description(r), result_get_confidence(r));

#if PRINT_BLOCK_ARRAY
    unsigned int block_range_size;
    const block_range_t *ranges = result_get_block_ranges(r, &block_range_size);

    if (block_range_size > 0)
    {
      int j;

      info_log("Blocks:");

      // This is inefficient. But it works and this function is rarely used
      char *big_s = g_strdup("");

      for (j = 0; j < block_range_size; j++)
      {
        unsigned long long pos;
        unsigned long long len;

        block_range_get_range(ranges[j], &pos, &len);
        char *new_s = g_strdup_printf("%s %llu-%llu", big_s, pos, pos + len - 1);

        g_free(big_s);
        big_s = new_s;
      }
      info_log("%s", big_s);
      g_free(big_s);
    }
#endif // PRINT_BLOCK_ARRAY

    unsigned int new_contracts_count;

#if SIMPLE_CONTRACT_ENUMERATION
    result_get_new_contracts(r, &new_contracts_count);

    info_log("\t- With %d new contracts!", new_contracts_count);
#else // SIMPLE_CONTRACT_ENUMERATION
    // Yes, this looks dodgy, but it's fine until r gets destroyed (which is after we destroy our copy)
    const contract_t *new_contracts_const = result_get_new_contracts(r, &new_contracts_count);
    contract_t *new_contracts = (contract_t *) g_malloc(sizeof(contract_t) * new_contracts_count);

    memcpy(new_contracts, new_contracts_const, sizeof(contract_t) * new_contracts_count);

    if (new_contracts_count > 0)
    {
      // Sorting the array
#if SORT_CONTRACT_ARRAY
      {
        int j;

        for (j = 0; j < new_contracts_count - 1; j++)
        {
          int k;

          for (k = 0; k < new_contracts_count - j - 1; k++)
          {
            int a = atoi(contract_get_path(new_contracts[k]));
            int b = atoi(contract_get_path(new_contracts[k + 1]));

            if (a > b)
            {
              contract_t temp = new_contracts[k];

              new_contracts[k] = new_contracts[k + 1];
              new_contracts[k + 1] = temp;
            } else if (a == b)
            {
              warning_log("Duplicate entry found! %s", contract_get_path(new_contracts[k]));
            }
          }
        }
      }
#endif // SORT_CONTRACT_ARRAY
#if PRINT_CONTRACT_ARRAY
      {
        info_log("New contracts: ");
        int j;

        for (j = new_contracts_count - 1; j >= 0; j--)
        {
          const char *path = contract_get_path(new_contracts[j]);

          if (access(path, R_OK) == 0)
          {
            info_log("OK %s", path);
            print_md5(path);
          } else
          {
            info_log("Couldn't access advertised new path %s", path);
          }
        }
      }
#endif // PRINT_CONTRACT_ARRAY
    }
    g_free(new_contracts);
#endif // SIMPLE_CONTRACT_ENUMERATION
  }
  contract_completion_report_close(report);


  if (NUM_EXERCISE_LOOPS != 0)
  {
    info_log("=====================");
    info_log("Exercising the plugin");
    for (int i = 0; i < NUM_EXERCISE_LOOPS; i++)
    {
      subcontractor_result_msg = transport_sendrecv(transport, (char *) contract_string, contract_string_size, &child_pid, &subcontractor_result_msg_size);
    }

    info_log("Finished exercising the plugin");
  }

  info_log("=====================");

  info_log("Telling subcontractor to close nicely");

  g_free(contract_string);

  // Send empty contract to tell child to close
  c = contract_init(NULL, 0);
  contract_set_path(c, "");
  contract_string = contract_serialise(c, &contract_string_size);
  contract_close(c);
  subcontractor_result_msg = transport_sendrecv(transport, (char *) contract_string, contract_string_size, &child_pid, &subcontractor_result_msg_size);
  g_free(contract_string);

  if (child_pid != -1)
  {
    sleep(100);
  }

  volatile int local_child_pid = child_pid;

  if (local_child_pid != -1)
  {
    warning_log("Process hasn't died automatically. Sending SIGTERM");
    kill(local_child_pid, SIGTERM);
    sleep(10);
    local_child_pid = child_pid;
    if (local_child_pid != -1)
    {
      warning_log("Process STILL hasn't died... Killing it");
      kill(local_child_pid, SIGKILL);
    }
  }

  cleanup(transport);

  return 0;
}
示例#16
0
/**
 * Analyse contract and respond
 *
 * Attempts to parse the supplied file as JBIG
 *
 * \param to_analyse The contract to analyse
 * \param ccr The contract completion report to populate
 * \returns 0 on sucess, -1 on error
 */
int analyse_contract(contract_t to_analyse, contract_completion_report_t ccr)
{
  struct jbg_dec_state sd;
  unsigned char data[JHEAD_SIZE];
  int status;
  size_t cnt;

  const char *path = contract_get_path(to_analyse);

  jbg_dec_init(&sd);
  FILE *file = fopen(path, "r");

  if (file == NULL)
  {
    warning_log("analyse_contract: Could not open file");
    return 0;
  }

  /* Read header and check for valid JBIG */
  int size = 0;

  size = fread(&data, BYTE, JHEAD_SIZE, file);
  status = jbg_dec_in(&sd, data, JHEAD_SIZE, &cnt);

  if (status >= JBG_EINVAL && status <= (JBG_EINVAL | 14))
  {
    debug_log("Not a valid JBIG file");
    jbg_dec_free(&sd);
    return 0;
  }

  /* Read in the whole JBIG */
  int bytes_read;

  while ((bytes_read = fread(&data, BYTE, BYTE, file)))
  {
    size += bytes_read;
    status = jbg_dec_in(&sd, data, BYTE, &cnt);

    if (status == JBG_EOK)
    {                           /* Found end of file */
      break;
    } else if (status != JBG_EAGAIN)
    {                           /* Error value returned */
      debug_log("Error reading JBIG: %s", jbg_strerror(status));
      jbg_dec_free(&sd);
      return 0;
    } else if (size == 104857600)
    {                           /* Only read upto 100MB */
      debug_log("Read 100MB, couldnt find end of JBIG");
      jbg_dec_free(&sd);
      return 0;
    }
  }
  fclose(file);

  /* Process loaded JBIG */
  gchar *hxw = g_strdup_printf("%ldx%ld", jbg_dec_getwidth(&sd), jbg_dec_getheight(&sd));
  gchar *planes = g_strdup_printf("%d plane(s)", jbg_dec_getplanes(&sd));
  gchar *bytes = g_strdup_printf("%dB", size);

  gchar *data_str = g_strdup_printf("%s, %s, %s", bytes, hxw, planes);

  g_free(hxw);
  g_free(planes);
  g_free(bytes);

  /* Fill in report and result data, identifying blocks if possible */
  long long int offset = contract_get_absolute_offset(to_analyse);
  int contig = contract_is_contiguous(to_analyse);

  result_t result = result_init(NULL, 0);

  populate_result_with_length(result, "JBIG", data_str, 100, offset, size, contig);
  contract_completion_report_add_result(ccr, result);
  result_close(result);

  g_free(data_str);

  return 0;
}