2
dtn2admin.c: BP routing adminstration interface for
3
the DTN endpoint ID scheme.
6
/* Copyright (c) 2006, California Institute of Technology. */
7
/* All rights reserved. */
8
/* Author: Scott Burleigh, Jet Propulsion Laboratory */
13
static int _echo(int *newValue)
32
static void printText(char *text)
42
static void handleQuit()
44
printText("Please enter command 'q' to stop the program.");
47
static void printSyntaxError(int lineNbr)
51
isprintf(buffer, sizeof buffer,
52
"Syntax error at line %d of dtn2admin.c", lineNbr);
56
#define SYNTAX_ERROR printSyntaxError(__LINE__)
58
static void printUsage()
60
PUTS("Syntax of 'directive' is:");
61
PUTS("\t{ f <endpoint ID> | x <protocol name>/<outduct name>[,dest \
63
PUTS("Note that, by convention, each node name must start with '//'.");
64
PUTS("Valid commands are:");
69
PUTS("\t a plan <node name> <default directive>");
70
PUTS("\t a rule <node name> <demux name> <directive>");
72
PUTS("\t c plan <node name> <default directive>");
73
PUTS("\t c rule <node name> <demux name> <directive>");
75
PUTS("\t d plan <node name>");
76
PUTS("\t d rule <node name> <demux name>");
78
PUTS("\t i plan <node name>");
79
PUTS("\t i rule <node name> <demux name>");
82
PUTS("\t l rule <node name>");
84
PUTS("\t # <comment text>");
87
static int parseDirective(char *actionToken, char *parmToken,
90
Sdr sdr = getIonsdr();
101
if (strlen(parmToken) >= SDRSTRING_BUFSZ)
103
putErrmsg("Station EID is too long.", parmToken);
109
dir->eid = sdr_string_create(sdr, parmToken);
112
putErrmsg("Can't write station EID.", NULL);
121
protocolName = cursor;
122
cursor = strchr(cursor, '/');
125
putErrmsg("Malformed directive: <protocol>/<duct>",
132
outductName = cursor;
133
cursor = strchr(cursor, ',');
137
dir->destDuctName = 0;
143
destDuctName = cursor;
144
if (strlen(destDuctName) >= SDRSTRING_BUFSZ)
146
putErrmsg("Destination duct name is too long.",
152
findOutduct(protocolName, outductName, &vduct, &vductElt);
155
putErrmsg("Unknown outduct.", outductName);
159
dir->outductElt = vduct->outductElt;
163
dir->destDuctName = sdr_string_create(sdr,
167
putErrmsg("Can't write duct name.", NULL);
175
putErrmsg("Invalid action code in directive", cursor);
180
static void executeAdd(int tokenCount, char **tokens)
182
FwdDirective directive;
186
printText("Add what?");
190
if (strcmp(tokens[1], "plan") == 0)
198
if (parseDirective(tokens[3], tokens[4], &directive) < 1)
203
if (dtn2_addPlan(tokens[2], &directive) < 1)
205
dtn2_destroyDirective(&directive);
211
if (strcmp(tokens[1], "rule") == 0)
219
if (parseDirective(tokens[4], tokens[5], &directive) < 1)
224
if (dtn2_addRule(tokens[2], tokens[3], &directive) < 1)
226
dtn2_destroyDirective(&directive);
235
static void executeChange(int tokenCount, char **tokens)
237
FwdDirective directive;
241
printText("Change what?");
245
if (strcmp(tokens[1], "plan") == 0)
253
if (parseDirective(tokens[3], tokens[4], &directive) < 1)
258
if (dtn2_updatePlan(tokens[2], &directive) < 1)
260
dtn2_destroyDirective(&directive);
266
if (strcmp(tokens[1], "rule") == 0)
274
if (parseDirective(tokens[4], tokens[5], &directive) < 1)
279
if (dtn2_updateRule(tokens[2], tokens[3], &directive) < 1)
281
dtn2_destroyDirective(&directive);
290
static void executeDelete(int tokenCount, char **tokens)
294
printText("Delete what?");
298
if (strcmp(tokens[1], "plan") == 0)
306
dtn2_removePlan(tokens[2]);
310
if (strcmp(tokens[1], "rule") == 0)
318
dtn2_removeRule(tokens[2], tokens[3]);
325
static void printDirective(char *context, FwdDirective *dir)
327
Sdr sdr = getIonsdr();
328
char eidString[SDRSTRING_BUFSZ + 1];
329
OBJ_POINTER(Outduct, duct);
330
OBJ_POINTER(ClProtocol, clp);
331
char destDuctName[SDRSTRING_BUFSZ + 1];
337
if (sdr_string_read(sdr, eidString, dir->eid) < 1)
339
isprintf(buffer, sizeof buffer, "%.256s f ?", context);
344
isprintf(buffer, sizeof buffer, "%.256s f %.256s\n",
352
GET_OBJ_POINTER(sdr, Outduct, duct, sdr_list_data(sdr,
354
GET_OBJ_POINTER(sdr, ClProtocol, clp, duct->protocol);
355
if (dir->destDuctName == 0)
357
destDuctName[0] = '\0';
361
destDuctName[0] = ':';
362
if (sdr_string_read(sdr, destDuctName + 1,
363
dir->destDuctName) < 0)
365
istrcpy(destDuctName + 1, "?",
366
sizeof destDuctName - 1);
370
isprintf(buffer, sizeof buffer, "%.256s x %.8s.%.128s%.128s\n",
371
context, clp->name, duct->name, destDuctName);
380
static void printPlan(Dtn2Plan *plan)
382
char nameBuf[SDRSTRING_BUFSZ];
385
if (sdr_string_read(getIonsdr(), nameBuf, plan->nodeName) < 0)
394
printDirective(nodeName, &plan->defaultDirective);
397
static void infoPlan(int tokenCount, char **tokens)
400
OBJ_POINTER(Dtn2Plan, plan);
409
dtn2_findPlan(tokens[2], &planAddr, &elt);
412
printText("Unknown plan.");
416
GET_OBJ_POINTER(getIonsdr(), Dtn2Plan, plan, planAddr);
420
static void printRule(Dtn2Plan *plan, Dtn2Rule *rule)
422
Sdr sdr = getIonsdr();
423
char toNodeName[SDRSTRING_BUFSZ];
424
char demux[SDRSTRING_BUFSZ];
427
if (sdr_string_read(sdr, toNodeName, plan->nodeName) < 0)
429
istrcpy(toNodeName, "?", sizeof toNodeName);
432
if (sdr_string_read(sdr, demux, rule->demux) < 0)
434
istrcpy(demux, "?", sizeof toNodeName);
437
isprintf(context, sizeof context, "%.64s, for %.32s =", toNodeName,
439
printDirective(context, &rule->directive);
442
static void infoRule(int tokenCount, char **tokens)
444
Sdr sdr = getIonsdr();
446
OBJ_POINTER(Dtn2Plan, plan);
448
OBJ_POINTER(Dtn2Rule, rule);
457
dtn2_findPlan(tokens[2], &planAddr, &elt);
460
printText("Unknown plan.");
464
GET_OBJ_POINTER(sdr, Dtn2Plan, plan, planAddr);
465
dtn2_findRule(tokens[2], tokens[3], plan, &ruleAddr, &elt);
468
printText("Unknown rule.");
472
GET_OBJ_POINTER(sdr, Dtn2Rule, rule, ruleAddr);
473
printRule(plan, rule);
476
static void executeInfo(int tokenCount, char **tokens)
480
printText("Information on what?");
484
if (strcmp(tokens[1], "plan") == 0)
486
infoPlan(tokenCount, tokens);
490
if (strcmp(tokens[1], "rule") == 0)
492
infoRule(tokenCount, tokens);
499
static void listPlans()
501
Sdr sdr = getIonsdr();
503
OBJ_POINTER(Dtn2Plan, plan);
505
for (elt = sdr_list_first(sdr, (getDtnConstants())->plans); elt;
506
elt = sdr_list_next(sdr, elt))
508
GET_OBJ_POINTER(sdr, Dtn2Plan, plan, sdr_list_data(sdr, elt));
513
static void listRules(Dtn2Plan *plan)
515
Sdr sdr = getIonsdr();
517
OBJ_POINTER(Dtn2Rule, rule);
519
for (elt = sdr_list_first(sdr, plan->rules); elt;
520
elt = sdr_list_next(sdr, elt))
522
GET_OBJ_POINTER(sdr, Dtn2Rule, rule, sdr_list_data(sdr, elt));
523
printRule(plan, rule);
527
static void executeList(int tokenCount, char **tokens)
530
OBJ_POINTER(Dtn2Plan, plan);
535
printText("List what?");
539
if (strcmp(tokens[1], "plan") == 0)
545
if (strcmp(tokens[1], "rule") == 0)
549
printText("Must specify node name for rules list.");
553
dtn2_findPlan(tokens[2], &planAddr, &elt);
556
printText("Unknown plan.");
560
GET_OBJ_POINTER(getIonsdr(), Dtn2Plan, plan, planAddr);
568
static void switchEcho(int tokenCount, char **tokens)
574
printText("Echo on or off?");
578
switch (*(tokens[1]))
591
printText("Echo on or off?");
595
static int processLine(char *line, int lineLength)
603
for (cursor = line, i = 0; i < 9; i++)
611
findToken(&cursor, &(tokens[i]));
621
/* Skip over any trailing whitespace. */
623
while (isspace((int) *cursor))
628
/* Make sure we've parsed everything. */
632
printText("Too many tokens.");
636
/* Have parsed the command. Now execute it. */
638
switch (*(tokens[0])) /* Command code. */
640
case 0: /* Empty line. */
641
case '#': /* Comment. */
650
executeAdd(tokenCount, tokens);
654
executeChange(tokenCount, tokens);
658
executeDelete(tokenCount, tokens);
662
executeInfo(tokenCount, tokens);
666
executeList(tokenCount, tokens);
670
switchEcho(tokenCount, tokens);
674
return -1; /* End program. */
677
printText("Invalid command. Enter '?' for help.");
682
static int run_dtn2admin(char *cmdFileName)
690
putErrmsg("dtn2admin can't attach to BP.", NULL);
696
putErrmsg("dtn2admin can't initialize routing database", NULL);
700
if (cmdFileName == NULL) /* Interactive. */
705
cmdFile = fileno(stdin);
706
isignal(SIGINT, handleQuit);
711
if (igets(cmdFile, line, sizeof line, &len) == NULL)
718
putErrmsg("igets failed.", NULL);
719
break; /* Out of loop. */
727
if (processLine(line, len))
729
break; /* Out of loop. */
735
cmdFile = iopen(cmdFileName, O_RDONLY, 0777);
738
PERROR("Can't open command file");
744
if (igets(cmdFile, line, sizeof line, &len)
752
putErrmsg("igets failed.", NULL);
757
|| line[0] == '#') /* Comment.*/
762
if (processLine(line, len))
764
break; /* Out of loop. */
773
printText("Stopping dtn2admin.");
778
#if defined (VXWORKS) || defined (RTEMS)
779
int dtn2admin(int a1, int a2, int a3, int a4, int a5,
780
int a6, int a7, int a8, int a9, int a10)
782
char *cmdFileName = (char *) a1;
784
int main(int argc, char **argv)
786
char *cmdFileName = argc > 1 ? argv[1] : NULL;
788
return run_dtn2admin(cmdFileName);