diff --git a/client.c b/client.c index f1a0afc9..a2f1aea7 100755 --- a/client.c +++ b/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 [-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]; diff --git a/mphlr.h b/mphlr.h index 716bf75f..66183832 100755 --- a/mphlr.h +++ b/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); diff --git a/peers.c b/peers.c index 60e381bc..b5e74570 100755 --- a/peers.c +++ b/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];