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:
gardners 2011-03-22 16:31:02 +10:30
parent 601ca12499
commit af2ec8dc51
4 changed files with 90 additions and 2 deletions

View File

@ -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
View File

@ -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];

View File

@ -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);

View File

@ -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];