415 char* temp_char = NULL;
421 int resigns_per_day = 0;
438 int smallest_key_size = 0;
441 enum {KSK = 1, ZSK, CSK};
450 struct key *tmpkey, *firstkey = NULL, *curkey = NULL;
456 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Signatures")) {
457 childNode = curNode->children;
459 if (xmlStrEqual(childNode->name, (
const xmlChar *)
"Resign")) {
460 temp_char = (
char *) xmlNodeGetContent(childNode);
461 status +=
check_time_def(temp_char, my_policy,
"Signatures/Resign", kasp, &resign);
464 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"Refresh")) {
465 temp_char = (
char *) xmlNodeGetContent(childNode);
466 status +=
check_time_def(temp_char, my_policy,
"Signatures/Refresh", kasp, &refresh);
469 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"Validity")) {
470 childNode2 = childNode->children;
472 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Default")) {
473 temp_char = (
char *) xmlNodeGetContent(childNode2);
474 status +=
check_time_def(temp_char, my_policy,
"Signatures/Validity/Default", kasp, &defalt);
477 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Denial")) {
478 temp_char = (
char *) xmlNodeGetContent(childNode2);
479 status +=
check_time_def(temp_char, my_policy,
"Signatures/Validity/Denial", kasp, &denial);
482 childNode2 = childNode2->next;
485 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"Jitter")) {
486 temp_char = (
char *) xmlNodeGetContent(childNode);
487 status +=
check_time_def(temp_char, my_policy,
"Signatures/Jitter", kasp, &jitter);
490 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"InceptionOffset")) {
491 temp_char = (
char *) xmlNodeGetContent(childNode);
492 status +=
check_time_def(temp_char, my_policy,
"Signatures/InceptionOffset", kasp, &inception);
495 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"MaxZoneTTL")) {
496 temp_char = (
char *) xmlNodeGetContent(childNode);
497 status +=
check_time_def(temp_char, my_policy,
"Signatures/MaxZoneTTL", kasp, &maxzone_ttl);
501 childNode = childNode->next;
504 else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Denial")) {
505 childNode = curNode->children;
508 if (xmlStrEqual(childNode->name, (
const xmlChar *)
"NSEC")) {
511 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"NSEC3")) {
513 childNode2 = childNode->children;
516 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Resalt")) {
517 temp_char = (
char *) xmlNodeGetContent(childNode2);
518 status +=
check_time_def(temp_char, my_policy,
"Denial/NSEC3/Resalt", kasp, &resalt);
520 }
else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Hash")) {
521 childNode3 = childNode2->children;
523 if (xmlStrEqual(childNode3->name, (
const xmlChar *)
"Algorithm")) {
524 temp_char = (
char *) xmlNodeGetContent(childNode3);
526 hash_algo = atoi(temp_char);
527 if (hash_algo != 1) {
528 dual_log(
"ERROR: NSEC3 Hash algorithm for %s Policy "
534 }
else if (xmlStrEqual(childNode3->name, (
const xmlChar *)
"Iterations")) {
535 temp_char = (
char *) xmlNodeGetContent(childNode3);
537 iter = atoi(temp_char);
538 hash_iters = atoi(temp_char);
539 if (hash_iters > 100) {
540 dual_log(
"WARNING: NSEC3 Hash iterations for %s Policy in %s is %d which is larger than the recommended maximum of 100",
policy_name, kasp, hash_iters);
544 childNode3 = childNode3->next;
548 childNode2 = childNode2->next;
552 childNode = childNode->next;
555 else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Keys")) {
556 childNode = curNode->children;
559 if (xmlStrEqual(childNode->name, (
const xmlChar *)
"TTL")) {
560 temp_char = (
char *) xmlNodeGetContent(childNode);
561 status +=
check_time_def(temp_char, my_policy,
"Keys/TTL", kasp, &ttl);
564 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"RetireSafety")) {
565 temp_char = (
char *) xmlNodeGetContent(childNode);
566 status +=
check_time_def(temp_char, my_policy,
"Keys/RetireSafety", kasp, &retire);
569 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"PublishSafety")) {
570 temp_char = (
char *) xmlNodeGetContent(childNode);
571 status +=
check_time_def(temp_char, my_policy,
"Keys/PublishSafety", kasp, &publish);
574 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"KSK")) {
575 childNode2 = childNode->children;
577 firstkey = curkey = (
struct key*) malloc(
sizeof *curkey);
579 curkey->next = (
struct key*) malloc(
sizeof *curkey);
580 curkey = curkey->next;
582 memset(curkey, 0,
sizeof *curkey);
587 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Algorithm")) {
588 temp_char = (
char *) xmlNodeGetContent(childNode2);
592 temp_char = (
char *)xmlGetProp(childNode2, (
const xmlChar *)
"length");
596 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Lifetime")) {
597 temp_char = (
char *) xmlNodeGetContent(childNode2);
598 status +=
check_time_def(temp_char, my_policy,
"Keys/KSK Lifetime", kasp, &curkey->life);
601 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Repository")) {
602 curkey->repo = (
char *) xmlNodeGetContent(childNode2);
605 childNode2 = childNode2->next;
608 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"ZSK")) {
609 childNode2 = childNode->children;
611 firstkey = curkey = (
struct key*) malloc(
sizeof *curkey);
613 curkey->next = (
struct key*) malloc(
sizeof *curkey);
614 curkey = curkey->next;
616 memset(curkey, 0,
sizeof *curkey);
621 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Algorithm")) {
622 temp_char = (
char *) xmlNodeGetContent(childNode2);
626 temp_char = (
char *)xmlGetProp(childNode2, (
const xmlChar *)
"length");
628 if (smallest_key_size == 0 || curkey->length < smallest_key_size)
629 smallest_key_size = curkey->length;
633 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Lifetime")) {
634 temp_char = (
char *) xmlNodeGetContent(childNode2);
635 status +=
check_time_def(temp_char, my_policy,
"Keys/ZSK Lifetime", kasp, &curkey->life);
638 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Repository")) {
639 curkey->repo = (
char *) xmlNodeGetContent(childNode2);
642 childNode2 = childNode2->next;
645 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"CSK")) {
646 childNode2 = childNode->children;
648 firstkey = curkey = (
struct key*) malloc(
sizeof *curkey);
650 curkey->next = (
struct key*) malloc(
sizeof *curkey);
651 curkey = curkey->next;
653 memset(curkey, 0,
sizeof *curkey);
658 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Algorithm")) {
659 temp_char = (
char *) xmlNodeGetContent(childNode2);
663 temp_char = (
char *)xmlGetProp(childNode2, (
const xmlChar *)
"length");
665 if (smallest_key_size == 0 || curkey->length < smallest_key_size)
666 smallest_key_size = curkey->length;
670 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Lifetime")) {
671 temp_char = (
char *) xmlNodeGetContent(childNode2);
672 status +=
check_time_def(temp_char, my_policy,
"Keys/CSK Lifetime", kasp, &curkey->life);
675 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Repository")) {
676 curkey->repo = (
char *) xmlNodeGetContent(childNode2);
679 childNode2 = childNode2->next;
683 childNode = childNode->next;
686 else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Zone")) {
687 childNode = curNode->children;
690 if (xmlStrEqual(childNode->name, (
const xmlChar *)
"SOA")) {
691 childNode2 = childNode->children;
694 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Serial")) {
695 serial = (
char *) xmlNodeGetContent(childNode2);
698 childNode2 = childNode2->next;
702 childNode = childNode->next;
705 else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Parent")) {
706 childNode = curNode->children;
709 if (xmlStrEqual(childNode->name, (
const xmlChar *)
"DS")) {
710 childNode2 = childNode->children;
713 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"TTL")) {
714 temp_char = (
char *) xmlNodeGetContent(childNode2);
715 status +=
check_time_def(temp_char, my_policy,
"Parent/DS/TTL", kasp, &ds_ttl);
719 childNode2 = childNode2->next;
723 childNode = childNode->next;
728 curNode = curNode->next;
734 for (curkey = firstkey; curkey; curkey = curkey->next) {
735 if ((curkey->type & KSK) && ds_ttl + ttl >= curkey->life) {
736 dual_log(
"ERROR: KSK/Lifetime (%d seconds) for policy '%s' "
737 "must be greater than the DNSKEY record TTL (%d seconds) plus "
738 "the DS record TTL (%d seconds). This time is needed to pass for the "
739 "KSK to be able to reach the ready state.",
744 if ((curkey->type & ZSK) && maxzone_ttl + ttl >= curkey->life) {
745 dual_log(
"ERROR: ZSK/Lifetime (%d seconds) for policy '%s' "
746 "must be greater than the DNSKEY record TTL (%d seconds) plus "
747 "the MaxZoneTTL (%d seconds). This time is needed to pass for the "
748 "ZSK to be able to reach the ready state.",
752 if ((curkey->type & ZSK) && defalt > curkey->life) {
753 dual_log(
"WARNING: ZSK/Lifetime (%d seconds) for policy '%s' "
754 "is less than Validity/Default (%d seconds), this might "
755 "be a configuration error.",
761 if (refresh <= resign) {
762 dual_log(
"ERROR: The Refresh interval (%d seconds) for "
763 "%s Policy in %s is less than or equal to the Resign interval "
764 "(%d seconds)", refresh,
policy_name, kasp, resign);
770 if (defalt <= refresh) {
771 dual_log(
"ERROR: Validity/Default (%d seconds) for "
772 "%s policy in %s is less than or equal to the Refresh interval "
773 "(%d seconds)", defalt,
policy_name, kasp, refresh);
776 if (denial <= refresh) {
777 dual_log(
"ERROR: Validity/Denial (%d seconds) for "
778 "%s policy in %s is less than or equal to the Refresh interval "
779 "(%d seconds)", denial,
policy_name, kasp, refresh);
787 if (defalt > denial) {
788 if (jitter > (defalt * 0.5)) {
789 dual_log(
"WARNING: Jitter time (%d seconds) is large "
790 "compared to Validity/Default (%d seconds) "
791 "for %s policy in %s", jitter, defalt,
policy_name, kasp);
794 if (jitter > (denial * 0.5)) {
795 dual_log(
"WARNING: Jitter time (%d seconds) is large "
796 "compared to Validity/Denial (%d seconds) "
797 "for %s policy in %s", jitter, denial,
policy_name, kasp);
805 if (inception > 3600) {
806 dual_log(
"WARNING: InceptionOffset is higher than expected "
807 "(%d seconds) for %s policy in %s",
813 if (publish < (ttl * 0.1)) {
814 dual_log(
"WARNING: Keys/PublishSafety (%d seconds) is less than "
815 "0.1 * TTL (%d seconds) for %s policy in %s",
818 else if (publish > (ttl * 5)) {
819 dual_log(
"WARNING: Keys/PublishSafety (%d seconds) is greater than "
820 "5 * TTL (%d seconds) for %s policy in %s",
824 if (retire < (ttl * 0.1)) {
825 dual_log(
"WARNING: Keys/RetireSafety (%d seconds) is less than "
826 "0.1 * TTL (%d seconds) for %s policy in %s",
829 else if (retire > (ttl * 5)) {
830 dual_log(
"WARNING: Keys/RetireSafety (%d seconds) is greater than "
831 "5 * TTL (%d seconds) for %s policy in %s",
839 else if (nsec == 3) {
840 for (curkey = firstkey; curkey; curkey = curkey->next) {
841 if ((curkey->type & KSK) && curkey->algo <= 5) {
842 dual_log(
"ERROR: In policy %s, incompatible algorithm (%d) used for "
843 "KSK NSEC3 in %s.",
policy_name, curkey->algo, kasp);
846 if ((curkey->type & ZSK) && curkey->algo <= 5) {
847 dual_log(
"ERROR: In policy %s, incompatible algorithm (%d) used for "
848 "ZSK NSEC3 in %s.",
policy_name, curkey->algo, kasp);
854 if (resalt < resign) {
855 dual_log(
"WARNING: NSEC3 resalt interval (%d secs) is less than "
856 "signature resign interval (%d secs) for %s Policy",
868 if (!(max_iter = 150) || (smallest_key_size <= 1024 && iter > 150) ||
869 !(max_iter = 500) || (smallest_key_size > 1024 && smallest_key_size <= 2048 && iter > 500) ||
870 !(max_iter = 2500) || (smallest_key_size > 2048 && iter > 2500)) {
871 dual_log(
"WARNING: In policy %s for the given key size (%d) for zone signing key, "
872 "iteration should not be higher than %d",
880 if (serial != NULL && strncmp(serial,
"datecounter", 11) == 0) {
882 resigns_per_day = (60 * 60 * 24) / resign;
883 if (resigns_per_day > 99) {
884 dual_log(
"ERROR: In %s, policy %s, serial type datecounter used "
885 "but %d re-signs requested. No more than 99 re-signs per "
886 "day should be used with datecounter as only 2 digits are "
887 "allocated for the version number.",
897 for (curkey = firstkey; curkey; curkey = curkey->next) {
898 if ((curkey->type & KSK) && (curkey->algo == 5 ||
899 curkey->algo == 7 ||curkey->algo == 8 ||
900 curkey->algo == 10)) {
901 if (curkey->length < 1024) {
902 dual_log(
"WARNING: Key length of %d used for KSK in %s policy in %s. Should "
903 "probably be 1024 or more", curkey->length,
policy_name, kasp);
905 else if (curkey->length > 4096) {
906 dual_log(
"ERROR: Key length of %d used for KSK in %s policy in %s. Should "
907 "be 4096 or less", curkey->length,
policy_name, kasp);
911 if ((curkey->type & ZSK) && (curkey->algo == 5 ||
912 curkey->algo == 7 || curkey->algo == 8 ||
913 curkey->algo == 10)) {
914 if (curkey->length < 1024) {
915 dual_log(
"WARNING: Key length of %d used for ZSK in %s policy in %s. Should "
916 "probably be 1024 or more", curkey->length,
policy_name, kasp);
918 else if (curkey->length > 4096) {
919 dual_log(
"ERROR: Key length of %d used for ZSK in %s policy in %s. Should "
920 "be 4096 or less", curkey->length,
policy_name, kasp);
929 for (curkey = firstkey; curkey; curkey = curkey->next) {
930 if ((curkey->type & KSK) && curkey->repo != NULL) {
931 for (i = 0; i < repo_count; i++) {
932 if (strcmp(curkey->repo, repo_list[i]) == 0) {
936 if (i >= repo_count) {
937 dual_log(
"ERROR: Unknown repository (%s) defined for KSK in "
938 "%s policy in %s", curkey->repo,
policy_name, kasp);
943 if ((curkey->type & ZSK) && curkey->repo != NULL) {
944 for (i = 0; i < repo_count; i++) {
945 if (strcmp(curkey->repo, repo_list[i]) == 0) {
949 if (i >= repo_count) {
950 dual_log(
"ERROR: Unknown repository (%s) defined for ZSK in "
958 for (curkey = firstkey; curkey; curkey = curkey->next) {
959 if (!(curkey->type & KSK))
continue;
961 for (tmpkey = firstkey; tmpkey; tmpkey = tmpkey->next) {
962 if (!(tmpkey->type & ZSK))
continue;
963 if (tmpkey->algo != curkey->algo)
continue;
966 if (curkey->life < tmpkey->life) {
967 dual_log(
"WARNING: KSK minimum lifetime (%d seconds) is less than "
968 "ZSK minimum lifetime (%d seconds) for %s Policy in %s",
973 dual_log(
"ERROR: ZSK with algorithm %i not found, algorithm mismatch between ZSK and KSK", curkey->algo);
981 if (jitter > defalt) {
982 dual_log(
"ERROR: Jitter time (%d seconds) is greater than the "
983 "Default Validity (%d seconds) for %s policy in %s",
987 if (jitter > denial) {
988 dual_log(
"ERROR: Jitter time (%d seconds) is greater than the "
989 "Denial Validity (%d seconds) for %s policy in %s",
995 firstkey = firstkey->next;
1423 char ***repo_listout,
int *repo_countout,
int verbose)
1428 int temp_status = 0;
1433 xmlXPathContextPtr xpath_ctx;
1434 xmlXPathObjectPtr xpath_obj;
1437 char* signer_dir = NULL;
1438 int signer_dir_default = 0;
1439 char* enforcer_dir = NULL;
1440 int enforcer_dir_default = 0;
1443 int* repo_mods = NULL;
1446 xmlSetGenericErrorFunc(NULL, quiet_error_func);
1449 status =
check_rng(conf, OPENDNSSEC_SCHEMA_DIR
"/conf.rng", verbose);
1452 if (status != 0)
return status;
1453 dual_log(
"INFO: The XML in %s is valid", conf);
1456 doc = xmlParseFile(conf);
1457 if (doc == NULL)
return 1;
1460 xpath_ctx = xmlXPathNewContext(doc);
1461 if(xpath_ctx == NULL) {
1467 xexpr = (xmlChar *)
"//Configuration/RepositoryList/Repository";
1468 xpath_obj = xmlXPathEvalExpression(xexpr, xpath_ctx);
1469 if(xpath_obj == NULL) {
1470 xmlXPathFreeContext(xpath_ctx);
1475 if (xpath_obj->nodesetval) {
1476 repo_count = xpath_obj->nodesetval->nodeNr;
1477 *repo_countout = repo_count;
1480 repo_mods = (
int*)malloc(
sizeof(
int) * repo_count);
1481 repo_list = (
char**)malloc(
sizeof(
char*) * repo_count);
1482 *repo_listout = repo_list;
1484 if (repo == NULL || repo_mods == NULL || repo_list == NULL) {
1485 dual_log(
"ERROR: malloc for repo information failed");
1489 for (i = 0; i < repo_count; i++) {
1492 curNode = xpath_obj->nodesetval->nodeTab[i]->xmlChildrenNode;
1495 repo[i].
name = (
char *) xmlGetProp(xpath_obj->nodesetval->nodeTab[i],
1496 (
const xmlChar *)
"name");
1500 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"TokenLabel"))
1501 repo[i].
TokenLabel = (
char *) xmlNodeGetContent(curNode);
1502 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Module"))
1503 repo[i].module = (
char *) xmlNodeGetContent(curNode);
1504 curNode = curNode->next;
1508 xmlXPathFreeObject(xpath_obj);
1511 for (i = 0; i < repo_count; i++) {
1513 if (repo_mods[i] == 0) {
1516 status +=
check_file(repo[i].module,
"Module");
1521 for (j = i+1; j < repo_count; j++) {
1522 if ( repo_mods[j] == 0 &&
1523 (strcmp(repo[i].module, repo[j].module) == 0) ) {
1526 if (strcmp(repo[i].TokenLabel, repo[j].TokenLabel) == 0) {
1527 dual_log(
"ERROR: Multiple Repositories (%s and %s) in %s have the same Module (%s) and TokenLabel (%s)", repo[i].name, repo[j].name, conf, repo[i].module, repo[i].TokenLabel);
1535 for (j = i+1; j < repo_count; j++) {
1536 if (strcmp(repo[i].name, repo[j].name) == 0) {
1537 dual_log(
"ERROR: Two repositories exist with the same name (%s)", repo[i].name);
1545 if (*kasp == NULL) {
1546 xexpr = (xmlChar *)
"//Configuration/Common/PolicyFile";
1547 xpath_obj = xmlXPathEvalExpression(xexpr, xpath_ctx);
1548 if(xpath_obj == NULL) {
1549 xmlXPathFreeContext(xpath_ctx);
1552 for (i = 0; i < repo_count; i++) {
1554 free(repo[i].module);
1555 free(repo[i].TokenLabel);
1562 *kasp = (
char*) xmlXPathCastToString(xpath_obj);
1563 xmlXPathFreeObject(xpath_obj);
1566 if (*zonelist == NULL) {
1567 xexpr = (xmlChar *)
"//Configuration/Common/ZoneListFile";
1568 xpath_obj = xmlXPathEvalExpression(xexpr, xpath_ctx);
1569 if(xpath_obj == NULL) {
1570 xmlXPathFreeContext(xpath_ctx);
1573 for (i = 0; i < repo_count; i++) {
1575 free(repo[i].module);
1576 free(repo[i].TokenLabel);
1583 *zonelist = (
char*) xmlXPathCastToString(xpath_obj);
1584 xmlXPathFreeObject(xpath_obj);
1591 (xmlChar *)
"//Configuration/Enforcer/Privileges/User",
1592 (xmlChar *)
"//Configuration/Enforcer/Privileges/Group");
1597 (xmlChar *)
"//Configuration/Enforcer/Datastore/SQLite");
1598 if (temp_status == -1) {
1604 status += temp_status;
1612 status +=
check_time_def_from_xpath(xpath_ctx, (xmlChar *)
"//Configuration/Enforcer/RolloverNotification",
"Configuration",
"Enforcer/RolloverNotification", conf);
1616 (xmlChar *)
"//Configuration/Enforcer/DelegationSignerSubmitCommand");
1617 if (temp_status > 0) {
1618 status += temp_status;
1623 (xmlChar *)
"//Configuration/Enforcer/WorkingDirectory");
1624 if (temp_status == -1) {
1626 temp_status =
check_path(OPENDNSSEC_STATE_DIR
"/enforcer",
1627 "default Enforcer WorkingDirectory");
1629 if (temp_status > 0) {
1630 status += temp_status;
1636 (xmlChar *)
"//Configuration/Signer/Privileges/User",
1637 (xmlChar *)
"//Configuration/Signer/Privileges/Group");
1641 (xmlChar *)
"//Configuration/Signer/WorkingDirectory");
1642 if (temp_status == -1) {
1644 temp_status =
check_path(OPENDNSSEC_STATE_DIR
"/signer",
1645 "default Signer WorkingDirectory");
1647 if (temp_status > 0) {
1648 status += temp_status;
1652 xexpr = (xmlChar *)
"//Configuration/Signer/WorkingDirectory";
1653 xpath_obj = xmlXPathEvalExpression(xexpr, xpath_ctx);
1654 if (NULL == xpath_obj || xpath_obj->nodesetval->nodeNr == 0) {
1655 signer_dir = (
char*) OPENDNSSEC_STATE_DIR
"/signer";
1656 signer_dir_default = 1;
1659 signer_dir = (
char*) xmlXPathCastToString(xpath_obj);
1660 xmlXPathFreeObject(xpath_obj);
1662 xexpr = (xmlChar *)
"//Configuration/Enforcer/WorkingDirectory";
1663 xpath_obj = xmlXPathEvalExpression(xexpr, xpath_ctx);
1664 if (NULL == xpath_obj || xpath_obj->nodesetval->nodeNr == 0) {
1665 enforcer_dir = (
char*) OPENDNSSEC_STATE_DIR
"/enforcer";
1666 enforcer_dir_default = 1;
1669 enforcer_dir = (
char*) xmlXPathCastToString(xpath_obj);
1670 xmlXPathFreeObject(xpath_obj);
1672 temp_status = strcmp(signer_dir, enforcer_dir);
1673 if (0 == temp_status) {
1675 dual_log(
"ERROR: signer workingdirectory is the same as the one of enforcer");
1677 if (0 == signer_dir_default)
1679 if (0 == enforcer_dir_default)
1682 xmlXPathFreeContext(xpath_ctx);
1685 for (i = 0; i < repo_count; i++) {
1687 free(repo[i].module);
1688 free(repo[i].TokenLabel);