# HG changeset patch # User aidan # Date 1309344866 -3600 # Node ID 3d1ea31e2a19585e5bafa2ad836e56054244f93b # Parent 3d5d756acac06bd8f92b57772f0a35c4c7176592 added reply-to option to dtnquery diff -r 3d5d756acac0 -r 3d1ea31e2a19 apps/dtnquery/dtnquery.1 --- a/apps/dtnquery/dtnquery.1 Mon Jun 27 15:44:08 2011 +0100 +++ b/apps/dtnquery/dtnquery.1 Wed Jun 29 11:54:26 2011 +0100 @@ -24,13 +24,15 @@ .IR src .RB [ -d .IR dest ] +.RB [ -r +.IR reply-to ] .RB [ -f .IR filename ] .RB [ -t .IR literal | base64 | file ] .RB [ -q .IR query ] -.RB [ -r +.RB [ -u .IR exact ] .RB [ -m .IR send | receive | both ] @@ -60,9 +62,6 @@ dtnquery will both send the query and wait to receive the response. .PP -On receiving a response, it will be stored in the directory -specified by the -.B -r . .SH RETURN VALUES Returns 1 if there was an error processing the arguments. @@ -80,6 +79,9 @@ .B \-\^d The destination EID for the bundle. .TP +.B \-\^r +The reply-to EID for the bundle. If not set the src EID will be used. +.TP .B \-\^f The file name to save the response as. The default for this is the query value itself. This may be overridden using this flag. @@ -94,7 +96,7 @@ separated containing see .B dtnmatch. .TP -.B \-\^r +.B \-\^u The matching rule. Currently only `exact' is supported. .TP .B \-\^m diff -r 3d5d756acac0 -r 3d1ea31e2a19 apps/dtnquery/dtnquery.c --- a/apps/dtnquery/dtnquery.c Mon Jun 27 15:44:08 2011 +0100 +++ b/apps/dtnquery/dtnquery.c Wed Jun 29 11:54:26 2011 +0100 @@ -75,10 +75,11 @@ fprintf(stderr, "usage: %s -s < src endpoint > -d < dest endpoint > " "[opts]\n", progname); fprintf(stderr, "options:\n"); + fprintf(stderr, " -r < eid > reply to endpoint\n"); fprintf(stderr, " -f < filename > response filename\n"); fprintf(stderr, " -q < query > query or matching file\n"); fprintf(stderr, " -t < literal | base64 | file > query type\n"); - fprintf(stderr, " -r < exact > matching rule\n"); + fprintf(stderr, " -u < exact > matching rule\n"); fprintf(stderr, " -m < send | receive | both > mode\n"); fprintf(stderr, " -n < count > number of bundles to recv\n"); fprintf(stderr, " -o < seconds > timeout\n"); @@ -180,10 +181,11 @@ parse_options(int argc, char** argv, char * src_eid_name, // s char * dest_eid_name, // d + char * reply_eid_name, // r char * filename, // f char * query, // q int * query_type, // t - int * matching_rule, // r + int * matching_rule, // u int * mode, // m int * count, // n dtn_timeval_t * timeout, // o @@ -204,6 +206,7 @@ //initialize strings memset(src_eid_name, 0, sizeof(char) * PATH_MAX); memset(dest_eid_name, 0, sizeof(char) * PATH_MAX); + memset(reply_eid_name, 0, sizeof(char) * PATH_MAX); memset(filename, 0, sizeof(char) * PATH_MAX); memset(query, 0, sizeof(char) * PATH_MAX); memset(matching_file, 0, sizeof(char) * PATH_MAX); @@ -211,7 +214,7 @@ while( !done ) { - c = getopt(argc, argv, "s:d:f:q:t:r:m:n:o:e:i:E:A:S:P:DXFcC1NWvhH"); + c = getopt(argc, argv, "s:d:f:q:t:r:u:m:n:o:e:i:E:A:S:P:DXFcC1NWvhH"); switch(c) { case 's': @@ -220,6 +223,9 @@ case 'd': strncpy(dest_eid_name, optarg, PATH_MAX); break; + case 'r': + strncpy(reply_eid_name, optarg, PATH_MAX); + break; case 'f': strncpy(filename, optarg, PATH_MAX); break; @@ -241,7 +247,7 @@ usage(); exit(1); } - case 'r': + case 'u': if (!strcasecmp(optarg, "exact")) { *matching_rule = DTN_BPQ_EXACT; break; @@ -358,21 +364,26 @@ exit(1); } - // now set matching file if required - if (*query_type == DTN_BPQ_FILE) { - strncpy(matching_file, query, PATH_MAX); - memset(query, 0, sizeof(char) * PATH_MAX); + } + // now set matching file if required + if (*query_type == DTN_BPQ_FILE) { + strncpy(matching_file, query, PATH_MAX); + memset(query, 0, sizeof(char) * PATH_MAX); - int ret = parse_matching_file(matching_file, matching_rule, - query_type, query, bundle_expiry, *verbose); - if (ret != DTN_SUCCESS) { - fprintf(stderr, "error parsing matching file, " - "see man page dtnmatch(1)\n"); - usage(1); - exit(1); - } + int ret = parse_matching_file(matching_file, matching_rule, + query_type, query, bundle_expiry, *verbose); + if (ret != DTN_SUCCESS) { + fprintf(stderr, "error parsing matching file, " + "see man page dtnmatch(1)\n"); + usage(1); + exit(1); } } + + // if no reply-to eid set, use the src eid + if (reply_eid_name == NULL) + strncpy(reply_eid_name, src_eid_name, PATH_MAX); + return 0; } @@ -385,6 +396,7 @@ int validate_options(const char * src_eid_name, const char * dest_eid_name, + const char * reply_eid_name, const char * query, int query_type, int matching_rule, @@ -404,16 +416,19 @@ case DTN_BPQ_SEND: //requires src, dest, query REQUIRE(strlen(src_eid_name) > 0, "-s required\n"); REQUIRE(strlen(dest_eid_name) > 0, "-d required\n"); + REQUIRE(strlen(reply_eid_name) > 0, "-r required\n"); REQUIRE(strlen(query) > 0, "-q required\n"); break; case DTN_BPQ_RECV: //requires src REQUIRE(strlen(src_eid_name) > 0, "-s required\n"); + REQUIRE(strlen(reply_eid_name) > 0, "-r required\n"); break; case DTN_BPQ_SEND_RECV: //requires src, dest, query REQUIRE(strlen(src_eid_name) > 0, "-s required\n"); REQUIRE(strlen(dest_eid_name) > 0, "-d required\n"); + REQUIRE(strlen(reply_eid_name) > 0, "-r required\n"); REQUIRE(strlen(query) > 0, "-q required\n"); break; default: @@ -425,7 +440,7 @@ query_type == DTN_BPQ_BASE64 || query_type == DTN_BPQ_FILE, "-t invalid type\n"); - REQUIRE(matching_rule == DTN_BPQ_EXACT, "-r invalid rule\n"); + REQUIRE(matching_rule == DTN_BPQ_EXACT, "-u invalid rule\n"); REQUIRE(bundle_expiry > 0, "-e must be a positive integer\n"); #undef REQUIRE //todo: check this is ok @@ -741,6 +756,7 @@ dtn_reg_id_t regid, const dtn_endpoint_id_t * src_eid, const dtn_endpoint_id_t * dest_eid, + const dtn_endpoint_id_t * reply_eid, char * query, int matching_rule, int bundle_expiry, @@ -786,10 +802,10 @@ // set the bundle spec eids if (verbose) fprintf(stdout, "Source: %s\n", src_eid->uri); if (verbose) fprintf(stdout, "Destination: %s\n", dest_eid->uri); + if (verbose) fprintf(stdout, "Reply-To: %s\n", reply_eid->uri); bundle_spec.source = *src_eid; bundle_spec.dest = *dest_eid; - - dtn_copy_eid(&bundle_spec.replyto, &bundle_spec.source);// add support for this to be set differently + bundle_spec.replyto = *reply_eid; // set the bundle spec dtn options bundle_spec.expiration = bundle_expiry; @@ -914,9 +930,11 @@ dtn_endpoint_id_t reg_eid; dtn_endpoint_id_t src_eid; dtn_endpoint_id_t dest_eid; + dtn_endpoint_id_t reply_eid; char reg_eid_name[PATH_MAX]; char src_eid_name[PATH_MAX]; char dest_eid_name[PATH_MAX]; + char reply_eid_name[PATH_MAX]; char filename[PATH_MAX]; char query[PATH_MAX]; int query_type = DTN_BPQ_LITERAL; @@ -938,12 +956,14 @@ memset( reg_eid_name, 0, sizeof(char) * PATH_MAX ); memset( src_eid_name, 0, sizeof(char) * PATH_MAX ); memset( dest_eid_name, 0, sizeof(char) * PATH_MAX ); + memset( reply_eid_name, 0, sizeof(char) * PATH_MAX ); memset( filename, 0, sizeof(char) * PATH_MAX ); memset( query, 0, sizeof(char) * PATH_MAX ); parse_options(argc, argv, src_eid_name, dest_eid_name, + reply_eid_name, filename, query, &query_type, @@ -968,6 +988,7 @@ validate_options(src_eid_name, dest_eid_name, + reply_eid_name, query, query_type, matching_rule, @@ -994,9 +1015,11 @@ parse_eid(handle, ®_eid, reg_eid_name, verbose); parse_eid(handle, &src_eid, src_eid_name, verbose); parse_eid(handle, &dest_eid, dest_eid_name, verbose); + parse_eid(handle, &reply_eid, reply_eid_name, verbose); if (verbose) fprintf(stdout, "parsed reg_eid: %s\n", reg_eid.uri); if (verbose) fprintf(stdout, "parsed src_eid: %s\n", src_eid.uri); if (verbose) fprintf(stdout, "parsed dest_eid: %s\n", dest_eid.uri); + if (verbose) fprintf(stdout, "parsed reply_eid: %s\n", reply_eid.uri); if (verbose) fprintf(stdout, "regid: %d\n", regid); // get dtn registration @@ -1021,7 +1044,7 @@ exit(1); \ } case DTN_BPQ_SEND: - TRY( send_bpq(handle, regid, &src_eid, &dest_eid, query, + TRY( send_bpq(handle, regid, &src_eid, &dest_eid, &reply_eid, query, matching_rule, bundle_expiry, priority, delivery_options, verbose), "error sending query\n" ); break; @@ -1032,7 +1055,7 @@ break; case DTN_BPQ_SEND_RECV: - TRY( send_bpq(handle, regid, &src_eid, &dest_eid, query, + TRY( send_bpq(handle, regid, &src_eid, &dest_eid, &reply_eid, query, matching_rule, bundle_expiry, priority, delivery_options, verbose), "error sending query\n" );