added reply-to option to dtnquery
authoraidan
Wed, 29 Jun 2011 11:54:26 +0100
changeset 18 3d1ea31e2a19
parent 17 3d5d756acac0
child 19 ce4cfc1cb1b6
added reply-to option to dtnquery
apps/dtnquery/dtnquery.1
apps/dtnquery/dtnquery.c
--- 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 <response_path>.
 
 .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
--- 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, &reg_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" );