mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-03-25 05:15:20 +00:00
Added -A option to ask for the address of a peer.
Compiled in to use batmand.peers by default without needing -l. Added peerAddress() function to get address of a peer programatically.
This commit is contained in:
parent
601ca12499
commit
af2ec8dc51
81
client.c
81
client.c
@ -407,6 +407,87 @@ int writeItem(char *sid,int var_id,int instance,unsigned char *value,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int peerAddress(char *did,char *sid,int flags)
|
||||
{
|
||||
unsigned char transaction_id[8];
|
||||
unsigned char packet[8000];
|
||||
int packet_len=0;
|
||||
struct response *r;
|
||||
struct response_set responses;
|
||||
|
||||
int i;
|
||||
int pc;
|
||||
in_addr_t mypeers[256];
|
||||
|
||||
bzero(&responses,sizeof(responses));
|
||||
|
||||
/* Prepare the request packet */
|
||||
if (packetMakeHeader(packet,8000,&packet_len,transaction_id))
|
||||
{
|
||||
if (debug) fprintf(stderr,"%s() failed at line %d\n",__FUNCTION__,__LINE__);
|
||||
return -1;
|
||||
}
|
||||
if (did&&(!sid))
|
||||
{ if (packetSetDid(packet,8000,&packet_len,did)) {
|
||||
if (debug) fprintf(stderr,"%s() failed at line %d\n",__FUNCTION__,__LINE__);
|
||||
return -1; }
|
||||
}
|
||||
else if (sid&&(!did))
|
||||
{ if (packetSetSid(packet,8000,&packet_len,sid)) {
|
||||
if (debug) fprintf(stderr,"%s() failed at line %d\n",__FUNCTION__,__LINE__);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (debug) fprintf(stderr,"%s() failed at line %d\n",__FUNCTION__,__LINE__);
|
||||
return setReason("You must request items by DID or SID, not neither, nor both");
|
||||
}
|
||||
|
||||
|
||||
if (packetAddVariableRequest(packet,8000,&packet_len,
|
||||
"dids",0,0,128 /* only small things please */)) {
|
||||
if (debug) fprintf(stderr,"%s() failed at line %d\n",__FUNCTION__,__LINE__);
|
||||
return -1;
|
||||
}
|
||||
if (packetFinalise(packet,8000,&packet_len)) {
|
||||
if (debug) fprintf(stderr,"%s() failed at line %d\n",__FUNCTION__,__LINE__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int method=REQ_PARALLEL;
|
||||
if (sid) method=REQ_FIRSTREPLY;
|
||||
if (packetSendRequest(method,packet,packet_len,NONBATCH,transaction_id,&responses)) {
|
||||
if (debug) fprintf(stderr,"peerAddress() failed because packetSendRequest() failed.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
r=responses.responses;
|
||||
if (!r)
|
||||
{
|
||||
if (debug) fprintf(stderr,"peerAddress() failed because noone answered.\n");
|
||||
return -1;
|
||||
}
|
||||
while(r)
|
||||
{
|
||||
if (flags&1) printf("%s\n",inet_ntoa(r->sender));
|
||||
if (flags&2) {
|
||||
if (pc<256) mypeers[pc++]=r->sender.s_addr;
|
||||
}
|
||||
break;
|
||||
r=r->next;
|
||||
}
|
||||
|
||||
/* Set the peer list to exactly the list of nodes that we have identified */
|
||||
if (flags&2)
|
||||
{
|
||||
for(i=0;i<pc;i++)
|
||||
peers[i]=mypeers[i];
|
||||
peer_count=pc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int requestItem(char *did,char *sid,char *item,int instance,unsigned char *buffer,int buffer_length,int *len,
|
||||
unsigned char *transaction_id)
|
||||
{
|
||||
|
8
dna.c
8
dna.c
@ -201,6 +201,8 @@ int usage(char *complaint)
|
||||
fprintf(stderr,"usage:\n");
|
||||
fprintf(stderr," dna [-v ...] -S <hlr size in MB> [-f HLR backing file]\n");
|
||||
fprintf(stderr,"or\n");
|
||||
fprintf(stderr," dna <-d|-s> id -A\n");
|
||||
fprintf(stderr,"or\n");
|
||||
fprintf(stderr," dna <-d|-s> id [-p pin] [-i variable instance] <-R variable[=value]>\n");
|
||||
fprintf(stderr," [-v ...] [-t request timeout in ms] [-O output file name template]\n");
|
||||
fprintf(stderr,"or\n");
|
||||
@ -211,6 +213,7 @@ int usage(char *complaint)
|
||||
|
||||
fprintf(stderr,"\n");
|
||||
fprintf(stderr," -v - increase verbosity.\n");
|
||||
fprintf(stderr," -A - Ask for address of subscriber.\n");
|
||||
fprintf(stderr," -b - Specify BATMAN socket to obtain peer list (flaky).\n");
|
||||
fprintf(stderr," -l - Specify BATMAN socket to obtain peer list (better, but requires Serval patched BATMAN).\n");
|
||||
fprintf(stderr," -n - Do not detach from foreground in server mode.\n");
|
||||
@ -249,7 +252,7 @@ int main(int argc,char **argv)
|
||||
|
||||
srandomdev();
|
||||
|
||||
while((c=getopt(argc,argv,"b:B:S:f:d:i:l:np:P:s:t:vR:W:U:D:CO:")) != -1 )
|
||||
while((c=getopt(argc,argv,"Ab:B:S:f:d:i:l:np:P:s:t:vR:W:U:D:CO:")) != -1 )
|
||||
{
|
||||
switch(c)
|
||||
{
|
||||
@ -299,6 +302,9 @@ int main(int argc,char **argv)
|
||||
case 'v': /* Increase verbosity */
|
||||
debug++;
|
||||
break;
|
||||
case 'A': /* get address (IP or otherwise) of a given peer */
|
||||
peerAddress(did,sid,3 /* 1 = print list of addresses to stdout, 2 = set peer list to responders */);
|
||||
break;
|
||||
case 'R': /* read a variable */
|
||||
{
|
||||
unsigned char buffer[65535];
|
||||
|
1
mphlr.h
1
mphlr.h
@ -320,3 +320,4 @@ int responseFromPeer(struct response_set *responses,int peerId);
|
||||
int additionalPeer(char *peer);
|
||||
int getBatmanPeerList(char *socket_path,in_addr_t peers[],int *peer_count,int peer_max);
|
||||
int hlrDump(unsigned char *hlr,int hofs);
|
||||
int peerAddress(char *did,char *sid,int flags);
|
||||
|
2
peers.c
2
peers.c
@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#include "mphlr.h"
|
||||
|
||||
char *batman_socket=NULL;
|
||||
char *batman_peerfile=NULL;
|
||||
char *batman_peerfile="/data/data/org.servalproject/var/batmand.peers";
|
||||
|
||||
int peer_count=0;
|
||||
in_addr_t peers[MAX_PEERS];
|
||||
|
Loading…
x
Reference in New Issue
Block a user