示例#1
0
static void pwrsrv_WriteAttribute( rpvd_sMsgWriteAttribute *msg)
{
  rpvd_sMsgAny rmsg;
  pwr_tAName name;
  pwr_tUInt32 asize, aoffs, aelem;
  pwr_tTypeId atid;
  pwr_tStatus sts;
  
  rmsg.Type = rpvd_eMsg_Status;
  rmsg.Id = msg->Id;

  sts = gdh_ObjidToName( msg->Oid, name, sizeof(name), cdh_mName_volumeStrict);
  if ( EVEN(sts)) {
    rmsg.Status = sts;
    udp_Send( (char *)&rmsg, sizeof(rmsg));
    return;
  }

  strcat( name, ".");
  strcat( name, msg->Attribute);

  sts = gdh_GetAttributeCharacteristics( name, &atid, &asize, &aoffs, &aelem);
  if ( EVEN(sts)) {
    rmsg.Status = sts;
    udp_Send( (char *)&rmsg, sizeof(rmsg));
    return;
  }

  sts = gdh_SetObjectInfo( name, &msg->Value, msg->Size);
  rmsg.Status = sts;
  udp_Send( (char *)&rmsg, sizeof(rmsg));
}
示例#2
0
/* sendstring(const message[], const destination[]="")
 * destination has the format "127.0.0.1:9930"; when set to an empty string,
 * a broadcast is sent.
 * To mark the text as a "string", the function inserts a "byte order mark" in
 * front of it. It does this for Extended ASCII strings too, although this is
 * not entirely correct.
 * Returns true on success, false on failure.
 */
static cell AMX_NATIVE_CALL n_sendstring(AMX *amx, const cell *params)
{
  int r = 0, length;
  cell *cstr;
  char *host, *message, *ptr;
  short port=AMX_DGRAMPORT;

  cstr = amx_Address(amx, params[1]);
  amx_UTF8Len(cstr, &length);

  if ((message = alloca(length + 3 + 1)) != NULL) {
    /* insert the byte order mark (BOM) */
    message[0]='\xef';
    message[1]='\xbb';
    message[2]='\xbf';
    /* if this is a wide string, convert it to UTF-8 */
    if ((ucell)*cstr<=UNPACKEDMAX) {
      ptr=message+3;
      while (*cstr!=0)
        amx_UTF8Put(ptr, &ptr, length - (ptr-message), *cstr++);
      *ptr='\0';
    } else {
      amx_GetString(message+3, cstr, 0, UNLIMITED);
    } /* if */

    amx_StrParam(amx, params[2], host);
    if (host != NULL && (ptr=strchr(host,':'))!=NULL && isdigit(ptr[1])) {
      *ptr++='\0';
      port=(short)atoi(ptr);
    } /* if */
    r= (udp_Send(host,port,message,strlen(message)+1) > 0);
  } /* if */

  return r;
}
示例#3
0
static void pwrsrv_SubRemove( rpvd_sMsgSubRemove *msg)
{
  rpvd_sMsgAny rmsg;
  pwrsrv_sSubItem *si;
  
  rmsg.Type = rpvd_eMsg_Status;
  rmsg.Id = msg->Id;

  // Remove and unref
  for ( si = pwrsrv_sublist; si; si = si->next) {
    if ( si->rix == msg->Rix) {
      gdh_UnrefObjectInfo( si->dlid);
      if ( si->prev)
	si->prev->next = si->next;
      else
	pwrsrv_sublist = si->next;
      if ( si->next)
	si->next->prev = si->prev;
      free( (char *)si);
      break;
    }
  }
  printf( "SubRemove: %d\n", msg->Rix);

  rmsg.Status = GDH__SUCCESS;
  udp_Send( (char *)&rmsg, sizeof(rmsg));
}
示例#4
0
static void pwrsrv_SubSend(rpvd_sMsgAny* m)
{
  rpvd_sMsgSubSend msg;
  rpvd_sMsgAny rmsg;
  pwrsrv_sSubItem* si;
  char* subp;
  int msize;
  pwr_tStatus sts;

  msg.Type = rpvd_eMsg_SubSend;
  msg.Id = m->Id;
  msg.Status = GDH__SUCCESS;
  msg.More = 0;

  subp = (char*)&msg.Data;

  for (si = pwrsrv_sublist; si; si = si->next) {
    if (subp - (char*)&msg.Data + 8 + si->size + 4 > sizeof(msg.Data)) {
      /* Buffer is full, send */
      *(int*)subp = -1;

      msg.More = 1;
      msize = subp - (char*)&msg + 4;
      sts = udp_Send((char*)&msg, msize);
      if (EVEN(sts))
        return;

      sts = udp_Receive((char**)&rmsg, 1000);
      if (EVEN(sts) || sts == REM__TIMEOUT)
        return;
      subp = (char*)&msg.Data;
      msg.More = 0;
    }
    *(int*)subp = si->rix;
    subp += 4;
    *(int*)subp = si->size;
    subp += 4;
    if (si->p)
      memcpy(subp, si->p, si->size);
    subp += si->size;
  }
  *(int*)subp = -1;

  msize = subp - (char*)&msg + 4;
  udp_Send((char*)&msg, msize);
}
示例#5
0
/* sendpacket(const packet[], size, const destination[]="")
 * destination has the format "127.0.0.1:9930"; when set to an empty string,
 * a broadcast is sent.
 * Returns true on success, false on failure.
 */
static cell AMX_NATIVE_CALL n_sendpacket(AMX *amx, const cell *params)
{
  cell *cstr;
  char *host, *ptr;
  short port=AMX_DGRAMPORT;

  cstr = amx_Address(amx, params[1]);
  amx_StrParam(amx, params[3], host);
  if (host != NULL && (ptr=strchr(host,':'))!=NULL && isdigit(ptr[1])) {
    *ptr++='\0';
    port=(short)atoi(ptr);
  } /* if */
  return (udp_Send(host,port,(const char *)cstr,params[2] * sizeof(cell)) > 0);
}
示例#6
0
static void pwrsrv_ObjectName( rpvd_sMsgObjectName *msg)
{
  rpvd_sMsgOid m;
  pwr_tStatus sts;
  char name[256];

  /* Simulate an oid request */
  m.Type = rpvd_eMsg_Oid;
  m.Id = msg->Id;
  if ( msg->POid.oix) {
    sts = gdh_ObjidToName( msg->POid, name, sizeof(name), cdh_mName_volumeStrict);
    if ( EVEN(sts)) {
      rpvd_sMsgObject rmsg;
      rmsg.Type = rpvd_eMsg_Object;
      rmsg.Id = msg->Id;
      rmsg.Status = sts;
      udp_Send( (char *)&rmsg, sizeof(rmsg));
      return;
    }
    strcat( name, "-");
    strcat( name, msg->Name);
  }
  else
    strncpy( name, msg->Name, sizeof(name));
  sts = gdh_NameToObjid( name, &m.Oid);
  if ( EVEN(sts)) {
    rpvd_sMsgObject rmsg;
    rmsg.Type = rpvd_eMsg_Object;
    rmsg.Id = msg->Id;
    rmsg.Status = sts;
    udp_Send( (char *)&rmsg, sizeof(rmsg));
    return;
  }
  
  pwrsrv_Oid( &m);
}
示例#7
0
static void pwrsrv_NodeUp( rpvd_sMsgAny *msg)
{
  rpvd_sMsgAny rmsg;
  pwrsrv_sSubItem *si, *si_next;

  rmsg.Type = rpvd_eMsg_Status;
  rmsg.Id = msg->Id;
  rmsg.Status = GDH__SUCCESS;

  /* Remove all subcli */
  for ( si = pwrsrv_sublist; si; si = si_next) {
    si_next = si->next;
    free( (char *) si);
  }
  pwrsrv_sublist = 0;
 
  udp_Send( (char *)&rmsg, sizeof(rmsg));
}
示例#8
0
void remote_pvd_pwrcli::dispatch( co_procom *pcom, rpvd_sMsg *msg)
{
  pwr_tStatus sts;

  switch ( msg->Any.Type) {
  case rpvd_eMsg_NodeUp: {
    rpvd_sMsgAny rmsg;

    printf( "NodeUp\n");

    rmsg.Type = REM__SUCCESS;
    rmsg.Id = msg->Any.Id;
    sts = udp_Send( (char *)&rmsg, sizeof(rmsg));

    pcom->flushNodes();
    subRestore();
    break;
  }
  default: ;
  }
}
示例#9
0
static void pwrsrv_Oid( rpvd_sMsgOid *msg)
{
  rpvd_sMsgObject rmsg;
  pwr_tOid fth;
  pwr_tOid fch;
  pwr_tOid lch;
  pwr_tOid bws;
  pwr_tOid fws;
  pwr_tCid cid;
  pwr_tObjName name;
  pwr_tOid o;
  pwr_tStatus sts;
  pwr_tOid plist[200];
  int psize = 0;
  int i, j;
  char *s;

  rmsg.Type = rpvd_eMsg_Object;
  rmsg.Id = msg->Id;
  rmsg.Status = 1;
  rmsg.Oid = msg->Oid;

  sts = gdh_GetObjectClass( msg->Oid, &cid);
  if ( EVEN(sts)) {
    rmsg.Status = sts;
    udp_Send( (char *)&rmsg, sizeof(rmsg));
    return;
  }

  plist[psize++] = msg->Oid;
  for ( sts = gdh_GetParent( plist[psize-1], &o); 
	ODD(sts);
	sts = gdh_GetParent( plist[psize-1], &o)) {
    plist[psize++] = o;
  }
  /* Add volume object */
  plist[psize].oix = 0;
  plist[psize++].vid = msg->Oid.vid;

  for ( j = 0; j < psize; j++) {
    i = psize - j - 1;

    sts = gdh_GetObjectClass( plist[i], &cid);

    if ( i == psize - 1) {
      /* Volume object */
      fth.oix = 0;

      sts = gdh_GetRootList( &fch);
      if ( EVEN(sts)) {
	fch.oix = 0;
	lch.oix = 0;
      }
      else {
	sts = 1;
	for ( lch = fch; ODD(sts); sts = gdh_GetNextSibling( lch, &o)) {
	  lch = o;
	}
      }
      fws.oix = 0;
      bws.oix = 0;

      sts = gdh_ObjidToName( plist[i], name, sizeof(name), cdh_mName_volume);
      if ( (s = strrchr( name, ':')))
	*s = 0;
    }
    else {
      sts = gdh_GetParent( plist[i], &fth);
      if ( EVEN(sts)) 
	fth.oix = 0;
      sts = gdh_GetChild( plist[i], &fch);
      if ( EVEN(sts)) {
	fch.oix = 0;
	lch.oix = 0;
      }
      else {
	lch = fch;
	for ( sts = gdh_GetNextSibling( lch, &o); 
	      ODD(sts); 
	      sts = gdh_GetNextSibling( lch, &o)) {
	  lch = o;
	}
      }
      sts = gdh_GetNextSibling( plist[i], &fws);
      if ( EVEN(sts))
	fws.oix = rmsg.o[j-1].fchoix;
      sts = gdh_GetPreviousSibling( plist[i], &bws);
      if ( EVEN(sts))
	bws.oix = rmsg.o[j-1].lchoix;
      sts = gdh_ObjidToName( plist[i], name, sizeof(name), cdh_mName_object);
    }
    rmsg.o[j].oix = plist[i].oix;
    rmsg.o[j].fthoix = fth.oix;
    rmsg.o[j].fchoix = fch.oix;
    rmsg.o[j].lchoix = lch.oix;
    rmsg.o[j].fwsoix = fws.oix;
    rmsg.o[j].bwsoix = bws.oix;
    rmsg.o[j].cid = cid;
    strcpy( rmsg.o[j].name, name);
  }
  rmsg.OSize = psize;
  udp_Send( (char *)&rmsg, sizeof(rmsg));
}
示例#10
0
static void pwrsrv_SubAdd( rpvd_sMsgSubAdd *msg)
{
  rpvd_sMsgAny rmsg;
  pwr_tAName name;
  pwr_tUInt32 asize, aoffs, aelem;
  pwr_tTypeId atid;
  pwr_tStatus sts;
  pwrsrv_sSubItem *si;
  void *p;
  pwr_tRefId dlid;
  
  rmsg.Type = rpvd_eMsg_Status;
  rmsg.Id = msg->Id;

  /* Check that this rix doesn't exist */
  for ( si = pwrsrv_sublist; si; si = si->next) {
    if ( si->rix == msg->Rix) {
      return;
    }
  }

  sts = gdh_ObjidToName( msg->Oid, name, sizeof(name), cdh_mName_volumeStrict);
  if ( EVEN(sts)) {
    rmsg.Status = sts;
    udp_Send( (char *)&rmsg, sizeof(rmsg));
    return;
  }

  if ( strcmp( msg->Attribute, "") != 0) {
    strcat( name, ".");
    strcat( name, msg->Attribute);

    sts = gdh_GetAttributeCharacteristics( name, &atid, &asize, &aoffs, &aelem);
    if ( EVEN(sts)) {
      rmsg.Status = sts;
      udp_Send( (char *)&rmsg, sizeof(rmsg));
      return;
    }
  }
  else {
    sts = gdh_GetObjectSize( msg->Oid, &asize);
    if ( EVEN(sts)) {
      rmsg.Status = sts;
      udp_Send( (char *)&rmsg, sizeof(rmsg));
      return;
    }
  }

  /* Direct link to atttribute */
  sts = gdh_RefObjectInfo( name, &p, &dlid, asize);
  if ( EVEN(sts)) {
    rmsg.Status = sts;
    udp_Send( (char *)&rmsg, sizeof(rmsg));
    return;
  }
       
  /* Insert first in sublist */
  si = (pwrsrv_sSubItem *) calloc( 1, sizeof(pwrsrv_sSubItem));
  si->oid = msg->Oid;
  strcpy( si->attribute, msg->Attribute);
  si->size = asize;
  si->rix = msg->Rix;
  si->p = p;
  si->dlid = dlid;
       
  si->next = pwrsrv_sublist;
  if ( si->next)
    si->next->prev = si;
  pwrsrv_sublist = si;

  
  printf( "SubAdd: %d %s\n", msg->Rix, name);

  rmsg.Status = GDH__SUCCESS;
  udp_Send( (char *)&rmsg, sizeof(rmsg));
}
示例#11
0
void remote_pvd_pwrcli::subRequest( co_procom *pcom)
{
  rpvd_sMsgAny msg;
  rpvd_sMsgSubSend *rmsg;
  pwr_tStatus sts;
  char *subp;
  int rix;
  int size;

  msg.Type = rpvd_eMsg_SubRequest;
  msg.Id = rpvd_id++;
  for (;;) {
    sts = udp_CheckLink();
    if ( EVEN(sts)) return;

    sts = udp_Send( (char *)&msg, sizeof(msg));
    if ( EVEN(sts)) return;

    sts = udp_Receive( (char **)&rmsg, 1000);
    if ( EVEN(sts))
      return;
    if ( sts == REM__TIMEOUT) {
      udp_LinkFailure();
      return;
    }
    while ( rmsg->Id != msg.Id) {
      dispatch( pcom, (rpvd_sMsg *)rmsg);

      sts = udp_Receive( (char **)&rmsg, 1000);
      if ( sts == REM__TIMEOUT) {
	pcom->provideStatus( REM__DISORDER);
	return;
      }
    }

    // Unpack the message
    subp = (char *) &rmsg->Data;
    while ( *(int *)subp != -1) {
      rix = *(int *)subp;
      subp += 4;
      size = *(int *)subp;
      subp += 4;
      
      sublist_iterator it = rpvd_sublist.find( rix);
      if ( it != rpvd_sublist.end()) {
	// TODO Data conversion !!!

	if ( rpvd_opsys == 0 || rpvd_opsys == gdbroot->my_node->os) {
	  memcpy( it->second.m_p, subp, it->second.m_size);
	}
	else {
	  gdb_sNode 	n;
	  gdb_sClass	*cp;
	  int size;
	  
	  memset( &n, 0, sizeof(n));
	  n.os = (co_eOS) rpvd_opsys;
	  n.fm.b.bo = co_eBO_little;
	  n.netver = gdbroot->my_node->netver;
	  size = it->second.m_size;

	  cp = (gdb_sClass *) hash_Search(&sts, gdbroot->cid_ht, &it->second.m_cid);
	  if (cp != NULL) {
	    rndc_ConvertData(&sts, &n, cp, it->second.m_p, subp, 
			    (pwr_tUInt32 *)&size, ndc_eOp_encode, it->second.m_offset, 0);
	  }
	}
      }
      subp += size;
    }
    if ( !rmsg->More)
      break;
  }
}