static int AMXAPI amx_DGramIdle(AMX *amx, int AMXAPI Exec(AMX *, cell *, int)) { char message[BUFLEN], source[SRC_BUFSIZE]; cell *amx_addr_src; int len, chars; int err=0; assert(idxReceiveString >= 0 || idxReceivePacket >= 0); if (PrevIdle != NULL) PrevIdle(amx, Exec); /* set up listener (first call only) */ if (!dgramBound) { if (dgramPort==0) dgramPort=AMX_DGRAMPORT; /* use default port if none was set */ if (udp_Listen(dgramPort)==-1) return AMX_ERR_GENERAL; dgramBound=1; } /* if */ if (udp_IsPacket()) { len=udp_Receive(message, sizeof message / sizeof message[0], source); amx_PushString(amx,&amx_addr_src,source,1,0); /* check the presence of a byte order mark: if it is absent, the received * packet is no string; also check the packet size against string length */ if ((message[0]!='\xef' || message[1]!='\xbb' || message[2]!='\xbf' || len!=(int)strlen(message)+1 || idxReceiveString<0) && idxReceivePacket>=0) { /* receive as "packet" */ amx_Push(amx,len); amx_PushArray(amx,NULL,(cell*)message,len); err=Exec(amx,NULL,idxReceivePacket); } else { const char *msg=message; if (msg[0]=='\xef' && msg[1]=='\xbb' && msg[2]=='\xbf') msg+=3; /* skip BOM */ /* optionally convert from UTF-8 to a wide string */ if (amx_UTF8Check(msg,&chars)==AMX_ERR_NONE) { cell *array=alloca((chars+1)*sizeof(cell)); cell *ptr=array; if (array!=NULL) { while (err==AMX_ERR_NONE && *msg!='\0') amx_UTF8Get(msg,&msg,ptr++); *ptr=0; /* zero-terminate */ amx_PushArray(amx,NULL,array,chars+1); } /* if */ } else { amx_PushString(amx,NULL,msg,1,0); } /* if */ err=Exec(amx,NULL,idxReceiveString); } /* if */ while (err==AMX_ERR_SLEEP) err=Exec(amx,NULL,AMX_EXEC_CONT); amx_Release(amx,amx_addr_src); } /* if */ return err; }
void remote_pvd_pwrcli::objectName( co_procom *pcom, char *name, pwr_tOix poix) { rpvd_sMsgObjectName msg; rpvd_sMsgObject *rmsg; pwr_tStatus sts; msg.Type = rpvd_eMsg_ObjectName; msg.Id = rpvd_id++; strcpy( msg.Name, name); msg.POid.vid = rpvd_vid; msg.POid.oix = poix; if ( pvd_cLog) logg( "ObjName", poix, name); sts = udp_Request( (char *)&msg, sizeof(msg), (char **)&rmsg); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } if ( sts == REM__TIMEOUT) { pcom->provideStatus( REM__UDPNOCON); 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; } } if ( rmsg->Type != rpvd_eMsg_Object) { pcom->provideStatus( REM__DISORDER); return; } if ( EVEN( rmsg->Status)) { pcom->provideStatus( rmsg->Status); return; } vector<procom_obj> m_list; for ( int i = 0; i < rmsg->OSize; i++) { procom_obj item; item.oix = rmsg->o[i].oix; item.fthoix = rmsg->o[i].fthoix; item.fchoix = rmsg->o[i].fchoix; item.lchoix = rmsg->o[i].lchoix; item.fwsoix = rmsg->o[i].fwsoix; item.bwsoix = rmsg->o[i].bwsoix; item.cid = rmsg->o[i].cid; strcpy( item.name, rmsg->o[i].name); m_list.push_back(item); } pcom->provideObjects( GDH__SUCCESS, m_list); }
void remote_pvd_pwrcli::receive( co_procom *pcom) { rpvd_sMsgAny *msg; pwr_tStatus sts; // Get any message sts = udp_Receive( (char **)&msg, 20); if ( ODD(sts) && sts != REM__TIMEOUT) { dispatch( pcom, (rpvd_sMsg *)msg); } }
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); }
void remote_pvd_pwrcli::subDisassociateBuffer( co_procom *pcom, pwr_tSubid subid) { rpvd_sMsgSubRemove msg; rpvd_sMsgAny *rmsg; pwr_tStatus sts; // Remove from local list sublist_iterator it = rpvd_sublist.find( subid.rix); if ( it != rpvd_sublist.end()) rpvd_sublist.erase( it); // Send message msg.Type = rpvd_eMsg_SubRemove; msg.Id = rpvd_id++; msg.Rix = subid.rix; if ( pvd_cLog) logg( "DisoBuff", subid.rix, "(rix)"); sts = udp_Request( (char *)&msg, sizeof(msg), (char **)&rmsg); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } if ( sts == REM__TIMEOUT) { pcom->provideStatus( REM__UDPNOCON); 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; } } if ( rmsg->Type != rpvd_eMsg_Status) { pcom->provideStatus( REM__DISORDER); return; } pcom->provideStatus( rmsg->Status); }
int main(int argc, char *argv[]) { pwr_tStatus sts; char remote_address[40]; char remote_host_name[40]; rpvd_sMsg *msg; rpvd_sMsgAny umsg; rpvd_sMsgAny *rmsg; int udp_port; /* Read arguments */ if ( argc < 3) { usage(); exit(0); } strcpy( remote_address, argv[1]); strcpy( remote_host_name, argv[2]); if ( argc >= 4) { sts = sscanf( argv[3], "%d", &udp_port); if ( sts != 1) { usage(); exit(0); } } else udp_port = 3051; sts = udp_Init( remote_address, remote_host_name, udp_port); if ( EVEN(sts)) { exit(0); } sts = gdh_Init( "remote_pvd_pwrsrv"); if ( EVEN(sts)) return sts; umsg.Type = rpvd_eMsg_NodeUp; umsg.Id = 0; sts = udp_Request( (char *)&umsg, sizeof(umsg), (char **)&rmsg); if ( ODD(sts) && sts != REM__TIMEOUT && ODD(rmsg->Status)) printf( "Link up\n"); for (;;) { sts = udp_Receive( (char **)&msg, 5000); if ( sts == REM__TIMEOUT) { printf( "Alive\n"); } else if ( ODD(sts)) { switch ( msg->Any.Type) { case rpvd_eMsg_Oid: pwrsrv_Oid( &msg->Oid); break; case rpvd_eMsg_ObjectName: pwrsrv_ObjectName( &msg->ObjectName); break; case rpvd_eMsg_ReadAttribute: pwrsrv_ReadAttribute( &msg->ReadAttribute); break; case rpvd_eMsg_WriteAttribute: pwrsrv_WriteAttribute( &msg->WriteAttribute); break; case rpvd_eMsg_SubAdd: pwrsrv_SubAdd( &msg->SubAdd); break; case rpvd_eMsg_SubRemove: pwrsrv_SubRemove( &msg->SubRemove); break; case rpvd_eMsg_SubRequest: pwrsrv_SubSend( &msg->Any); break; case rpvd_eMsg_NodeUp: pwrsrv_NodeUp( &msg->Any); break; } } } }
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; } }
void remote_pvd_pwrcli::subAssociateBuffer( co_procom *pcom, void **buff, int oix, int offset, int size, pwr_tSubid subid) { rpvd_sMsgSubAdd msg; rpvd_sMsgAny *rmsg; pwr_tStatus sts; pwr_tAttrRef aref; pwr_tOName aname; pwr_tCid cid; pwr_tUInt32 osize; msg.Type = rpvd_eMsg_SubAdd; msg.Id = rpvd_id++; msg.Oid.oix = oix; msg.Oid.vid = rpvd_vid; sts = gdh_GetObjectSize( msg.Oid, &osize); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } memset( &aref, 0, sizeof(aref)); aref.Objid = msg.Oid; aref.Offset = offset; aref.Size = size; if ( (int) osize == size) aref.Flags.b.Object = 1; sts = gdh_GetObjectClass( msg.Oid, &cid); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } if ( aref.Flags.b.Object) strcpy( aname, ""); else { sts = gdh_ClassAttrrefToAttr( cid, &aref, aname, sizeof(aname)); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } } strcpy( msg.Attribute, aname); msg.Rix = subid.rix; msg.Size = size; if ( pvd_cLog) logg( "AssoBuff", msg.Oid.oix, aname); sts = udp_Request( (char *)&msg, sizeof(msg), (char **)&rmsg); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } if ( sts == REM__TIMEOUT) { pcom->provideStatus( REM__UDPNOCON); 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; } } if ( rmsg->Type != rpvd_eMsg_Status) { pcom->provideStatus( REM__DISORDER); return; } if ( EVEN( rmsg->Status)) { pcom->provideStatus( rmsg->Status); return; } pcom->provideStatus( rmsg->Status); if ( ODD(rmsg->Status)) { // Add to local list subitem s(size, cid, offset, msg.Attribute, msg.Oid); rpvd_sublist[subid.rix] = s; *buff = rpvd_sublist[subid.rix].m_p; } }
void remote_pvd_pwrcli::readAttribute( co_procom *pcom, pwr_tOix oix, unsigned int offset, unsigned int size) { rpvd_sMsgReadAttribute msg; rpvd_sMsgAttribute *rmsg; pwr_tStatus sts; pwr_tAttrRef aref; pwr_tOName aname; pwr_tCid cid; msg.Type = rpvd_eMsg_ReadAttribute; msg.Id = rpvd_id++; msg.Oid.oix = oix; msg.Oid.vid = rpvd_vid; memset( &aref, 0, sizeof(aref)); aref.Objid = msg.Oid; aref.Offset = offset; aref.Size = size; sts = gdh_GetObjectClass( msg.Oid, &cid); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } sts = gdh_ClassAttrrefToAttr( cid, &aref, aname, sizeof(aname)); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } strcpy( msg.Attribute, aname); if ( pvd_cLog) logg( "Read", aref.Objid.oix, aname); sts = udp_Request( (char *)&msg, sizeof(msg), (char **)&rmsg); if ( pvd_cLog) logg( "Reply", sts, ""); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } if ( sts == REM__TIMEOUT) { pcom->provideStatus( REM__UDPNOCON); 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; } } if ( rmsg->Type != rpvd_eMsg_Attribute) { pcom->provideStatus( REM__DISORDER); return; } if ( EVEN( rmsg->Status)) { pcom->provideStatus( rmsg->Status); return; } // TODO Float conversion !!! if ( rpvd_opsys == 0 || rpvd_opsys == gdbroot->my_node->os) { void *p = &rmsg->Value; pcom->provideAttr( GDH__SUCCESS, oix, rmsg->Size, p); } else { gdb_sNode n; gdb_sClass *cp; void *p = NULL; memset( &n, 0, sizeof(n)); n.os = (co_eOS) rpvd_opsys; p = malloc( max(rmsg->Size, (int)aref.Size)); size = aref.Size; cp = (gdb_sClass *) hash_Search(&sts, gdbroot->cid_ht, &cid); if (cp != NULL) { rndc_ConvertData(&sts, &n, cp, p, &rmsg->Value, (pwr_tUInt32 *)&size, ndc_eOp_encode, aref.Offset, 0); pcom->provideAttr( GDH__SUCCESS, oix, rmsg->Size, p); } else { pcom->provideStatus( GDH__NOSUCHCLASS); } } }
void remote_pvd_pwrcli::writeAttribute( co_procom *pcom, pwr_tOix oix, unsigned int offset, unsigned int size, char *buffer) { rpvd_sMsgWriteAttribute msg; rpvd_sMsgAny *rmsg; pwr_tStatus sts; pwr_tAttrRef aref; pwr_tOName aname; pwr_tCid cid; msg.Type = rpvd_eMsg_WriteAttribute; msg.Id = rpvd_id++; msg.Oid.oix = oix; msg.Oid.vid = rpvd_vid; msg.Size = size; memset( &aref, 0, sizeof(aref)); aref.Objid = msg.Oid; aref.Offset = offset; aref.Size = size; sts = gdh_GetObjectClass( msg.Oid, &cid); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } sts = gdh_ClassAttrrefToAttr( cid, &aref, aname, sizeof(aname)); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } strcpy( msg.Attribute, aname); // TODO Float conversion if ( rpvd_opsys == 0 || rpvd_opsys == gdbroot->my_node->os) memcpy( &msg.Value, buffer, size); else { gdb_sNode n; gdb_sClass *cp; int rsize; memset( &n, 0, sizeof(n)); n.os = (co_eOS) rpvd_opsys; rsize = aref.Size; cp = (gdb_sClass *) hash_Search(&sts, gdbroot->cid_ht, &cid); if (cp != NULL) { rndc_ConvertData(&sts, &n, cp, &msg.Value, buffer, (pwr_tUInt32 *)&rsize, ndc_eOp_decode, aref.Offset, 0); } } if ( pvd_cLog) logg( "Write", aref.Objid.oix, aname); sts = udp_Request( (char *)&msg, sizeof(msg), (char **)&rmsg); if ( EVEN(sts)) { pcom->provideStatus( sts); return; } if ( sts == REM__TIMEOUT) { pcom->provideStatus( REM__UDPNOCON); 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; } } if ( rmsg->Type != rpvd_eMsg_Status) { pcom->provideStatus( REM__DISORDER); return; } pcom->provideStatus( rmsg->Status); }