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)); }
/* 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; }
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)); }
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); }
/* 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); }
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); }
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)); }
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: ; } }
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)); }
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)); }
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; } }