--- 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 <src eid> required\n");
REQUIRE(strlen(dest_eid_name) > 0, "-d <dest eid> required\n");
+ REQUIRE(strlen(reply_eid_name) > 0, "-r <reply eid> required\n");
REQUIRE(strlen(query) > 0, "-q <query> required\n");
break;
case DTN_BPQ_RECV: //requires src
REQUIRE(strlen(src_eid_name) > 0, "-s <src eid> required\n");
+ REQUIRE(strlen(reply_eid_name) > 0, "-r <reply eid> required\n");
break;
case DTN_BPQ_SEND_RECV: //requires src, dest, query
REQUIRE(strlen(src_eid_name) > 0, "-s <src eid> required\n");
REQUIRE(strlen(dest_eid_name) > 0, "-d <dest eid> required\n");
+ REQUIRE(strlen(reply_eid_name) > 0, "-r <reply eid> required\n");
REQUIRE(strlen(query) > 0, "-q <query> required\n");
break;
default:
@@ -425,7 +440,7 @@
query_type == DTN_BPQ_BASE64 ||
query_type == DTN_BPQ_FILE, "-t <query type> invalid type\n");
- REQUIRE(matching_rule == DTN_BPQ_EXACT, "-r <matching rule> invalid rule\n");
+ REQUIRE(matching_rule == DTN_BPQ_EXACT, "-u <matching rule> invalid rule\n");
REQUIRE(bundle_expiry > 0, "-e <expiry> 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" );