Example #1
0
static VALUE rfpset_spit_array(VALUE self, VALUE array, VALUE filename) {
  gzFile out = gzopen(RSTRING_PTR(filename), "wb2");
  if(out == NULL) return rb_fix_new(-1);

  long ii; 
  long size = RARRAY_LEN(array);

  // sort the array in place
  VALUE* values = RARRAY_PTR(array);
  rstring_sort_array(values, size);

  // spit them at the disk, freeing as we go
  VALUE last_value = 0;
  for(ii = 0; ii < size; ++ii) {
    if(!last_value
       || RSTRING_LEN(values[ii]) != RSTRING_LEN(last_value)
       || memcmp(RSTRING_PTR(values[ii]), RSTRING_PTR(last_value),
                 RSTRING_LEN(last_value)) != 0) {
      // this blob is unique. Write it
      rstring_write(out, values[ii]);
      last_value = values[ii];
    }
  }

  gzclose(out);

  // return the number of blobs written
  return rb_fix_new(size);
}
Example #2
0
static VALUE asteroid_s_run(VALUE Self, VALUE Host, VALUE Port, VALUE Module){
  char *host = StringValuePtr(Host);
  int port = FIX2INT(Port);
  
  epoll_fd = asteroid_poll_create(1024);
  if(epoll_fd == -1) runtime_error();

  struct sockaddr_in addr;
  addr.sin_family = AF_INET;
  addr.sin_port = htons(port);
  addr.sin_addr.s_addr = inet_addr(host);
  int s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP), c, one = 1;
  if(s == -1) runtime_error();
  fcntl(s, F_SETFL, fcntl(s, F_GETFL, 0) | O_NONBLOCK);
  setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
  nosigpipe(s);
  if(bind(s, (struct sockaddr*)&addr, sizeof(addr)) != 0) runtime_error();
  if(listen(s, MAX_CONNECTION) != 0) runtime_error();
  if(rb_block_given_p()) rb_yield(Qnil);
  
  VALUE Class = rb_define_class_under(Asteroid, "Server", rb_cObject);
  rb_define_method(Class, "send_data",
    asteroid_server_send_data, 1);
  rb_define_method(Class, "write_and_close",
    asteroid_server_write_and_close, 0);
  rb_include_module(Class, Module);
  // Mac OS X, Fedora needs explicit rb_thread_schedule call.
  for(running = 1; running; rb_thread_schedule()){
    socklen_t len = sizeof(addr);
    while((c = accept(s, (struct sockaddr*)&addr, &len)) != -1){
      printf("A New client connected here\n");
      fcntl(c, F_SETFL, fcntl(c, F_GETFL, 0) | O_NONBLOCK);
      asteroid_poll_event_t event;
      memset(&event, 0, sizeof(event));
      if(asteroid_poll_add(epoll_fd, &event, c) == -1) runtime_error();
      // instantiate server class which responds to client.
      VALUE Server = rb_class_new_instance(0, NULL, Class);
      rb_iv_set(Server, "@fd", rb_fix_new(c));
      rb_hash_aset(clients, rb_fix_new(c), Server);
      if(rb_respond_to(Server, rb_intern("post_init"))){
        rb_funcall(Server, rb_intern("post_init"), 0);
      }
    }
    if(dispatch() != 0) asteroid_s_stop(Asteroid);
    // You must call them to give a chance for ruby to handle system events.
    // CHECK_INTS;
  }

  rb_iterate(rb_each, clients, close_socket_proc, Qnil);
  rb_funcall(clients, rb_intern("clear"), 0);
  close(s);
  close(epoll_fd);
  return Qnil;
}
static void digipass_to_rbhash(TDigipassBlob* dpdata, VALUE hash) {
  char buffer[256];
  memset(buffer, 0, sizeof(buffer));
  strncpy(buffer, dpdata->Serial, 10);
  rb_hash_aset(hash, rb_str_new2("serial"), rb_str_new2(buffer));
  memset(buffer, 0, sizeof(buffer));
  strncpy(buffer, dpdata->AppName, 12);
  rb_hash_aset(hash, rb_str_new2("app_name"), rb_str_new2(buffer));
  memset(buffer, 0, sizeof(buffer));
  strncpy(buffer, dpdata->Blob, 224);
  rb_hash_aset(hash, rb_str_new2("blob"), rb_str_new2(buffer));
  rb_hash_aset(hash, rb_str_new2("flags1"), rb_fix_new(dpdata->DPFlags[0]));
  rb_hash_aset(hash, rb_str_new2("flags2"), rb_fix_new(dpdata->DPFlags[1]));
}
Example #4
0
static VALUE group_translate_ranks(VALUE self, VALUE ary, VALUE rgrp2)
{
    VALUE outary;
    MPI_Group *grp1, *grp2;
    int rv, i, len, *ranks1, *ranks2;

    Data_Get_Struct(self, MPI_Group, grp1);
    Data_Get_Struct(grp2, MPI_Group, grp2);

    len = RARRAY(ary)->len;
    ranks1 = ALLOCA_N(int, len);
    ranks2 = ALLOCA_N(int, len);

    for (i = 0; i < len; i++)
        ranks1[i] = FIX2INT(rb_ary_entry(ary, i));

    rv = MPI_Group_translate_ranks(*grp1, len, ranks1, *grp2, ranks2);
    mpi_exception(rv);

    outary = rb_ary_new2(len);
    for (i = 0; i < len; i++) {
        if (ranks2[i] == MPI_UNDEFINED)
            rb_ary_store(outary, i, UNDEFINED);
        else
            rb_ary_store(outary, i, rb_fix_new(ranks2[i]));
    }

    return outary;
}
Example #5
0
static VALUE status_tag(VALUE self)
{
    MPI_Status *stat;

    Data_Get_Struct(self, MPI_Status, stat);

    return rb_fix_new(stat->MPI_TAG);
}
Example #6
0
static VALUE status_source(VALUE self)
{
    MPI_Status *stat;

    Data_Get_Struct(self, MPI_Status, stat);

    return rb_fix_new(stat->MPI_SOURCE);
}
Example #7
0
VALUE php_value_to_integer(VALUE self) {
    zval *zv = get_zval(self);

    if (zv) {
        convert_to_long(zv);
        return rb_fix_new(Z_LVAL_P(zv));
    }

    return Qnil;
}
Example #8
0
static VALUE group_size(VALUE self)
{
    int rv, size;
    MPI_Group *grp;

    Data_Get_Struct(self, MPI_Group, grp);

    rv = MPI_Group_size(*grp, &size);
    mpi_exception(rv);

    return rb_fix_new(size);
}
Example #9
0
static VALUE group_rank(VALUE self)
{
    int rv, rank;
    MPI_Group *grp;

    Data_Get_Struct(self, MPI_Group, grp);

    rv = MPI_Group_rank(*grp, &rank);
    mpi_exception(rv);

    if (rank == MPI_UNDEFINED)
        return UNDEFINED;

    return rb_fix_new(rank);
}
Example #10
0
VALUE rfpset_slurp_array(VALUE self, VALUE filename) {
  gzFile in = gzopen(RSTRING_PTR(filename), "rb");
  if(in == NULL) return rb_fix_new(-1);

  VALUE array = rb_ary_new();

  blob* next_blob = blob_make(512);
  while((next_blob = blob_read(in, next_blob)) != NULL) {
    rb_ary_push(array, rb_str_new(next_blob->data, next_blob->size));
  }
  gzclose(in);
  free(next_blob);

  return array;
}
Example #11
0
VALUE rfpset_intersect_files(VALUE self, VALUE filenames) {
  long file_count = RARRAY_LEN(filenames);
  VALUE* values = RARRAY_PTR(filenames);
  int ii;

  if(file_count == 1) {
    return rfpset_slurp_array(self, values[0]);
  }

  gzFile* files = malloc(sizeof(gzFile) * file_count);

  // open all the files
  for(ii = 0; ii < file_count; ++ii) {
    const char* name = RSTRING_PTR(values[ii]);
    gzFile file = gzopen(name, "rb");
    if(file == NULL) break; // failure!
    files[ii] = file;
  }

  // make sure they all opened
  if(ii < file_count) {
    // close them all
    int jj;
    for(jj = 0; jj < ii; ++jj) {
      gzclose(files[jj]);
    }
    return rb_fix_new(-1);
  }

  VALUE array = blob_intersect_files(files, file_count);

  // close the files
  for(ii = 0; ii < file_count; ++ii) {
    gzclose(files[ii]);
  }

  return array;
}
Example #12
0
int dispatch(){
  int i, s, len;
  while(1){
    TRAP_BEG;
    s = asteroid_poll_wait(epoll_fd, events, EVENT_BUF_SIZE, 1);
    TRAP_END;
    if(s <= 0) break;
    for(i = 0; i < s; ++i){
      asteroid_poll_event_t event = events[i];
      int fd = AST_POLL_EVENT_SOCK(&event);
      VALUE Fd = rb_fix_new(fd);
      VALUE Server = rb_hash_aref(clients, Fd);
      if(AST_POLL_EVENT_CAN_READ(&event)){
        VALUE Buf = rb_str_new("", 0);
        char buf[1024];
        while((len = read(fd, buf, 1023)) > 0){
          buf[len] = '\0';
          rb_str_concat(Buf, rb_str_new2(buf));
        }
        if(len == -1 && errno == EAGAIN){
          if(rb_respond_to(Server, rb_intern("receive_data"))){
            rb_funcall(Server, rb_intern("receive_data"), 1, Buf);
          }
        }else{
          if(rb_respond_to(Server, rb_intern("unbind"))){
            rb_funcall(Server, rb_intern("unbind"), 0);
          }
          asteroid_poll_remove(epoll_fd, &event, fd);
          rb_hash_delete(clients, Fd);
          close(fd);
        }
      }
    }
  }
  return 0;
}
Example #13
0
/* @overload crc16(buf)
 *   Calculate CRC16 checksum of a string
 *   
 *   @param buf [String] the string to be checksummed
 *   @return [Fixnum] the CRC16 value
 */
static VALUE mm_gps_CRC16(VALUE klass, VALUE str)
{
  Check_Type(str, T_STRING);
  return rb_fix_new(CRC16(RSTRING_PTR(str), RSTRING_LEN(str)));
}