411 char* temp_char = NULL;
417 int resigns_per_day = 0;
434 int smallest_key_size = 0;
437 enum {KSK = 1, ZSK, CSK};
446 struct key *tmpkey, *firstkey = NULL, *curkey = NULL;
452 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Signatures")) {
453 childNode = curNode->children;
455 if (xmlStrEqual(childNode->name, (
const xmlChar *)
"Resign")) {
456 temp_char = (
char *) xmlNodeGetContent(childNode);
457 status +=
check_time_def(temp_char, my_policy,
"Signatures/Resign", kasp, &resign);
460 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"Refresh")) {
461 temp_char = (
char *) xmlNodeGetContent(childNode);
462 status +=
check_time_def(temp_char, my_policy,
"Signatures/Refresh", kasp, &refresh);
465 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"Validity")) {
466 childNode2 = childNode->children;
468 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Default")) {
469 temp_char = (
char *) xmlNodeGetContent(childNode2);
470 status +=
check_time_def(temp_char, my_policy,
"Signatures/Validity/Default", kasp, &defalt);
473 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Denial")) {
474 temp_char = (
char *) xmlNodeGetContent(childNode2);
475 status +=
check_time_def(temp_char, my_policy,
"Signatures/Validity/Denial", kasp, &denial);
478 childNode2 = childNode2->next;
481 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"Jitter")) {
482 temp_char = (
char *) xmlNodeGetContent(childNode);
483 status +=
check_time_def(temp_char, my_policy,
"Signatures/Jitter", kasp, &jitter);
486 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"InceptionOffset")) {
487 temp_char = (
char *) xmlNodeGetContent(childNode);
488 status +=
check_time_def(temp_char, my_policy,
"Signatures/InceptionOffset", kasp, &inception);
491 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"MaxZoneTTL")) {
492 temp_char = (
char *) xmlNodeGetContent(childNode);
493 status +=
check_time_def(temp_char, my_policy,
"Signatures/MaxZoneTTL", kasp, &maxzone_ttl);
497 childNode = childNode->next;
500 else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Denial")) {
501 childNode = curNode->children;
504 if (xmlStrEqual(childNode->name, (
const xmlChar *)
"NSEC")) {
507 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"NSEC3")) {
509 childNode2 = childNode->children;
512 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Resalt")) {
513 temp_char = (
char *) xmlNodeGetContent(childNode2);
514 status +=
check_time_def(temp_char, my_policy,
"Denial/NSEC3/Resalt", kasp, &resalt);
516 }
else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Hash")) {
517 childNode3 = childNode2->children;
519 if (xmlStrEqual(childNode3->name, (
const xmlChar *)
"Algorithm")) {
520 temp_char = (
char *) xmlNodeGetContent(childNode3);
522 hash_algo = atoi(temp_char);
523 if (hash_algo != 1) {
524 dual_log(
"ERROR: NSEC3 Hash algorithm for %s Policy "
530 }
else if (xmlStrEqual(childNode3->name, (
const xmlChar *)
"Iterations")) {
531 temp_char = (
char *) xmlNodeGetContent(childNode3);
533 iter = atoi(temp_char);
534 hash_iters = atoi(temp_char);
535 if (hash_iters > 100) {
536 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);
540 childNode3 = childNode3->next;
544 childNode2 = childNode2->next;
548 childNode = childNode->next;
551 else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Keys")) {
552 childNode = curNode->children;
555 if (xmlStrEqual(childNode->name, (
const xmlChar *)
"TTL")) {
556 temp_char = (
char *) xmlNodeGetContent(childNode);
557 status +=
check_time_def(temp_char, my_policy,
"Keys/TTL", kasp, &ttl);
560 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"RetireSafety")) {
561 temp_char = (
char *) xmlNodeGetContent(childNode);
562 status +=
check_time_def(temp_char, my_policy,
"Keys/RetireSafety", kasp, &retire);
565 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"PublishSafety")) {
566 temp_char = (
char *) xmlNodeGetContent(childNode);
567 status +=
check_time_def(temp_char, my_policy,
"Keys/PublishSafety", kasp, &publish);
570 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"KSK")) {
571 childNode2 = childNode->children;
573 firstkey = curkey = (
struct key*) malloc(
sizeof *curkey);
575 curkey->next = (
struct key*) malloc(
sizeof *curkey);
576 curkey = curkey->next;
578 memset(curkey, 0,
sizeof *curkey);
583 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Algorithm")) {
584 temp_char = (
char *) xmlNodeGetContent(childNode2);
588 temp_char = (
char *)xmlGetProp(childNode2, (
const xmlChar *)
"length");
592 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Lifetime")) {
593 temp_char = (
char *) xmlNodeGetContent(childNode2);
594 status +=
check_time_def(temp_char, my_policy,
"Keys/KSK Lifetime", kasp, &curkey->life);
597 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Repository")) {
598 curkey->repo = (
char *) xmlNodeGetContent(childNode2);
601 childNode2 = childNode2->next;
604 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"ZSK")) {
605 childNode2 = childNode->children;
607 firstkey = curkey = (
struct key*) malloc(
sizeof *curkey);
609 curkey->next = (
struct key*) malloc(
sizeof *curkey);
610 curkey = curkey->next;
612 memset(curkey, 0,
sizeof *curkey);
617 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Algorithm")) {
618 temp_char = (
char *) xmlNodeGetContent(childNode2);
622 temp_char = (
char *)xmlGetProp(childNode2, (
const xmlChar *)
"length");
624 if (smallest_key_size == 0 || curkey->length < smallest_key_size)
625 smallest_key_size = curkey->length;
629 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Lifetime")) {
630 temp_char = (
char *) xmlNodeGetContent(childNode2);
631 status +=
check_time_def(temp_char, my_policy,
"Keys/ZSK Lifetime", kasp, &curkey->life);
634 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Repository")) {
635 curkey->repo = (
char *) xmlNodeGetContent(childNode2);
638 childNode2 = childNode2->next;
641 else if (xmlStrEqual(childNode->name, (
const xmlChar *)
"CSK")) {
642 childNode2 = childNode->children;
644 firstkey = curkey = (
struct key*) malloc(
sizeof *curkey);
646 curkey->next = (
struct key*) malloc(
sizeof *curkey);
647 curkey = curkey->next;
649 memset(curkey, 0,
sizeof *curkey);
654 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Algorithm")) {
655 temp_char = (
char *) xmlNodeGetContent(childNode2);
659 temp_char = (
char *)xmlGetProp(childNode2, (
const xmlChar *)
"length");
661 if (smallest_key_size == 0 || curkey->length < smallest_key_size)
662 smallest_key_size = curkey->length;
666 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Lifetime")) {
667 temp_char = (
char *) xmlNodeGetContent(childNode2);
668 status +=
check_time_def(temp_char, my_policy,
"Keys/CSK Lifetime", kasp, &curkey->life);
671 else if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Repository")) {
672 curkey->repo = (
char *) xmlNodeGetContent(childNode2);
675 childNode2 = childNode2->next;
679 childNode = childNode->next;
682 else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Zone")) {
683 childNode = curNode->children;
686 if (xmlStrEqual(childNode->name, (
const xmlChar *)
"SOA")) {
687 childNode2 = childNode->children;
690 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"Serial")) {
691 serial = (
char *) xmlNodeGetContent(childNode2);
694 childNode2 = childNode2->next;
698 childNode = childNode->next;
701 else if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Parent")) {
702 childNode = curNode->children;
705 if (xmlStrEqual(childNode->name, (
const xmlChar *)
"DS")) {
706 childNode2 = childNode->children;
709 if (xmlStrEqual(childNode2->name, (
const xmlChar *)
"TTL")) {
710 temp_char = (
char *) xmlNodeGetContent(childNode2);
711 status +=
check_time_def(temp_char, my_policy,
"Parent/DS/TTL", kasp, &ds_ttl);
715 childNode2 = childNode2->next;
719 childNode = childNode->next;
724 curNode = curNode->next;
730 for (curkey = firstkey; curkey; curkey = curkey->next) {
731 if ((curkey->type & KSK) && ds_ttl + ttl >= curkey->life) {
732 dual_log(
"ERROR: KSK/Lifetime (%d seconds) for policy '%s' "
733 "must be greater than the DNSKEY record TTL (%d seconds) plus "
734 "the DS record TTL (%d seconds). This time is needed to pass for the "
735 "KSK to be able to reach the ready state.",
740 if ((curkey->type & ZSK) && maxzone_ttl + ttl >= curkey->life) {
741 dual_log(
"ERROR: ZSK/Lifetime (%d seconds) for policy '%s' "
742 "must be greater than the DNSKEY record TTL (%d seconds) plus "
743 "the MaxZoneTTL (%d seconds). This time is needed to pass for the "
744 "ZSK to be able to reach the ready state.",
748 if ((curkey->type & ZSK) && defalt > curkey->life) {
749 dual_log(
"WARNING: ZSK/Lifetime (%d seconds) for policy '%s' "
750 "is less than Validity/Default (%d seconds), this might "
751 "be a configuration error.",
757 if (refresh <= resign) {
758 dual_log(
"ERROR: The Refresh interval (%d seconds) for "
759 "%s Policy in %s is less than or equal to the Resign interval "
760 "(%d seconds)", refresh,
policy_name, kasp, resign);
766 if (defalt <= refresh) {
767 dual_log(
"ERROR: Validity/Default (%d seconds) for "
768 "%s policy in %s is less than or equal to the Refresh interval "
769 "(%d seconds)", defalt,
policy_name, kasp, refresh);
772 if (denial <= refresh) {
773 dual_log(
"ERROR: Validity/Denial (%d seconds) for "
774 "%s policy in %s is less than or equal to the Refresh interval "
775 "(%d seconds)", denial,
policy_name, kasp, refresh);
783 if (defalt > denial) {
784 if (jitter > (defalt * 0.5)) {
785 dual_log(
"WARNING: Jitter time (%d seconds) is large "
786 "compared to Validity/Default (%d seconds) "
787 "for %s policy in %s", jitter, defalt,
policy_name, kasp);
790 if (jitter > (denial * 0.5)) {
791 dual_log(
"WARNING: Jitter time (%d seconds) is large "
792 "compared to Validity/Denial (%d seconds) "
793 "for %s policy in %s", jitter, denial,
policy_name, kasp);
801 if (inception > 3600) {
802 dual_log(
"WARNING: InceptionOffset is higher than expected "
803 "(%d seconds) for %s policy in %s",
809 if (publish < (ttl * 0.1)) {
810 dual_log(
"WARNING: Keys/PublishSafety (%d seconds) is less than "
811 "0.1 * TTL (%d seconds) for %s policy in %s",
814 else if (publish > (ttl * 5)) {
815 dual_log(
"WARNING: Keys/PublishSafety (%d seconds) is greater than "
816 "5 * TTL (%d seconds) for %s policy in %s",
820 if (retire < (ttl * 0.1)) {
821 dual_log(
"WARNING: Keys/RetireSafety (%d seconds) is less than "
822 "0.1 * TTL (%d seconds) for %s policy in %s",
825 else if (retire > (ttl * 5)) {
826 dual_log(
"WARNING: Keys/RetireSafety (%d seconds) is greater than "
827 "5 * TTL (%d seconds) for %s policy in %s",
835 else if (nsec == 3) {
836 for (curkey = firstkey; curkey; curkey = curkey->next) {
837 if ((curkey->type & KSK) && curkey->algo <= 5) {
838 dual_log(
"ERROR: In policy %s, incompatible algorithm (%d) used for "
839 "KSK NSEC3 in %s.",
policy_name, curkey->algo, kasp);
842 if ((curkey->type & ZSK) && curkey->algo <= 5) {
843 dual_log(
"ERROR: In policy %s, incompatible algorithm (%d) used for "
844 "ZSK NSEC3 in %s.",
policy_name, curkey->algo, kasp);
850 if (resalt < resign) {
851 dual_log(
"WARNING: NSEC3 resalt interval (%d secs) is less than "
852 "signature resign interval (%d secs) for %s Policy",
864 if (!(max_iter = 150) || (smallest_key_size <= 1024 && iter > 150) ||
865 !(max_iter = 500) || (smallest_key_size > 1024 && smallest_key_size <= 2048 && iter > 500) ||
866 !(max_iter = 2500) || (smallest_key_size > 2048 && iter > 2500)) {
867 dual_log(
"WARNING: In policy %s for the given key size (%d) for zone signing key, "
868 "iteration should not be higher than %d",
876 if (serial != NULL && strncmp(serial,
"datecounter", 11) == 0) {
878 resigns_per_day = (60 * 60 * 24) / resign;
879 if (resigns_per_day > 99) {
880 dual_log(
"ERROR: In %s, policy %s, serial type datecounter used "
881 "but %d re-signs requested. No more than 99 re-signs per "
882 "day should be used with datecounter as only 2 digits are "
883 "allocated for the version number.",
893 for (curkey = firstkey; curkey; curkey = curkey->next) {
894 if ((curkey->type & KSK) && (curkey->algo == 5 ||
895 curkey->algo == 7 ||curkey->algo == 8 ||
896 curkey->algo == 10)) {
897 if (curkey->length < 1024) {
898 dual_log(
"WARNING: Key length of %d used for KSK in %s policy in %s. Should "
899 "probably be 1024 or more", curkey->length,
policy_name, kasp);
901 else if (curkey->length > 4096) {
902 dual_log(
"ERROR: Key length of %d used for KSK in %s policy in %s. Should "
903 "be 4096 or less", curkey->length,
policy_name, kasp);
907 if ((curkey->type & ZSK) && (curkey->algo == 5 ||
908 curkey->algo == 7 || curkey->algo == 8 ||
909 curkey->algo == 10)) {
910 if (curkey->length < 1024) {
911 dual_log(
"WARNING: Key length of %d used for ZSK in %s policy in %s. Should "
912 "probably be 1024 or more", curkey->length,
policy_name, kasp);
914 else if (curkey->length > 4096) {
915 dual_log(
"ERROR: Key length of %d used for ZSK in %s policy in %s. Should "
916 "be 4096 or less", curkey->length,
policy_name, kasp);
925 for (curkey = firstkey; curkey; curkey = curkey->next) {
926 if ((curkey->type & KSK) && curkey->repo != NULL) {
927 for (i = 0; i < repo_count; i++) {
928 if (strcmp(curkey->repo, repo_list[i]) == 0) {
932 if (i >= repo_count) {
933 dual_log(
"ERROR: Unknown repository (%s) defined for KSK in "
934 "%s policy in %s", curkey->repo,
policy_name, kasp);
939 if ((curkey->type & ZSK) && curkey->repo != NULL) {
940 for (i = 0; i < repo_count; i++) {
941 if (strcmp(curkey->repo, repo_list[i]) == 0) {
945 if (i >= repo_count) {
946 dual_log(
"ERROR: Unknown repository (%s) defined for ZSK in "
954 for (curkey = firstkey; curkey; curkey = curkey->next) {
955 if (!(curkey->type & KSK))
continue;
957 for (tmpkey = firstkey; tmpkey; tmpkey = tmpkey->next) {
958 if (!(tmpkey->type & ZSK))
continue;
959 if (tmpkey->algo != curkey->algo)
continue;
962 if (curkey->life < tmpkey->life) {
963 dual_log(
"WARNING: KSK minimum lifetime (%d seconds) is less than "
964 "ZSK minimum lifetime (%d seconds) for %s Policy in %s",
969 dual_log(
"ERROR: ZSK with algorithm %i not found, algorithm mismatch between ZSK and KSK", curkey->algo);
977 if (jitter > defalt) {
978 dual_log(
"ERROR: Jitter time (%d seconds) is greater than the "
979 "Default Validity (%d seconds) for %s policy in %s",
983 if (jitter > denial) {
984 dual_log(
"ERROR: Jitter time (%d seconds) is greater than the "
985 "Denial Validity (%d seconds) for %s policy in %s",
991 firstkey = firstkey->next;
1419 char ***repo_listout,
int *repo_countout,
int verbose)
1424 int temp_status = 0;
1429 xmlXPathContextPtr xpath_ctx;
1430 xmlXPathObjectPtr xpath_obj;
1433 char* signer_dir = NULL;
1434 int signer_dir_default = 0;
1435 char* enforcer_dir = NULL;
1436 int enforcer_dir_default = 0;
1439 int* repo_mods = NULL;
1442 xmlSetGenericErrorFunc(NULL, quiet_error_func);
1445 status =
check_rng(conf, OPENDNSSEC_SCHEMA_DIR
"/conf.rng", verbose);
1448 if (status != 0)
return status;
1449 dual_log(
"INFO: The XML in %s is valid", conf);
1452 doc = xmlParseFile(conf);
1453 if (doc == NULL)
return 1;
1456 xpath_ctx = xmlXPathNewContext(doc);
1457 if(xpath_ctx == NULL) {
1463 xexpr = (xmlChar *)
"//Configuration/RepositoryList/Repository";
1464 xpath_obj = xmlXPathEvalExpression(xexpr, xpath_ctx);
1465 if(xpath_obj == NULL) {
1466 xmlXPathFreeContext(xpath_ctx);
1471 if (xpath_obj->nodesetval) {
1472 repo_count = xpath_obj->nodesetval->nodeNr;
1473 *repo_countout = repo_count;
1476 repo_mods = (
int*)malloc(
sizeof(
int) * repo_count);
1477 repo_list = (
char**)malloc(
sizeof(
char*) * repo_count);
1478 *repo_listout = repo_list;
1480 if (repo == NULL || repo_mods == NULL || repo_list == NULL) {
1481 dual_log(
"ERROR: malloc for repo information failed");
1485 for (i = 0; i < repo_count; i++) {
1488 curNode = xpath_obj->nodesetval->nodeTab[i]->xmlChildrenNode;
1491 repo[i].
name = (
char *) xmlGetProp(xpath_obj->nodesetval->nodeTab[i],
1492 (
const xmlChar *)
"name");
1496 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"TokenLabel"))
1497 repo[i].
TokenLabel = (
char *) xmlNodeGetContent(curNode);
1498 if (xmlStrEqual(curNode->name, (
const xmlChar *)
"Module"))
1499 repo[i].module = (
char *) xmlNodeGetContent(curNode);
1500 curNode = curNode->next;
1504 xmlXPathFreeObject(xpath_obj);
1507 for (i = 0; i < repo_count; i++) {
1509 if (repo_mods[i] == 0) {
1512 status +=
check_file(repo[i].module,
"Module");
1517 for (j = i+1; j < repo_count; j++) {
1518 if ( repo_mods[j] == 0 &&
1519 (strcmp(repo[i].module, repo[j].module) == 0) ) {
1522 if (strcmp(repo[i].TokenLabel, repo[j].TokenLabel) == 0) {
1523 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);
1531 for (j = i+1; j < repo_count; j++) {
1532 if (strcmp(repo[i].name, repo[j].name) == 0) {
1533 dual_log(
"ERROR: Two repositories exist with the same name (%s)", repo[i].name);
1541 if (*kasp == NULL) {
1542 xexpr = (xmlChar *)
"//Configuration/Common/PolicyFile";
1543 xpath_obj = xmlXPathEvalExpression(xexpr, xpath_ctx);
1544 if(xpath_obj == NULL) {
1545 xmlXPathFreeContext(xpath_ctx);
1548 for (i = 0; i < repo_count; i++) {
1550 free(repo[i].module);
1551 free(repo[i].TokenLabel);
1558 *kasp = (
char*) xmlXPathCastToString(xpath_obj);
1559 xmlXPathFreeObject(xpath_obj);
1562 if (*zonelist == NULL) {
1563 xexpr = (xmlChar *)
"//Configuration/Common/ZoneListFile";
1564 xpath_obj = xmlXPathEvalExpression(xexpr, xpath_ctx);
1565 if(xpath_obj == NULL) {
1566 xmlXPathFreeContext(xpath_ctx);
1569 for (i = 0; i < repo_count; i++) {
1571 free(repo[i].module);
1572 free(repo[i].TokenLabel);
1579 *zonelist = (
char*) xmlXPathCastToString(xpath_obj);
1580 xmlXPathFreeObject(xpath_obj);
1587 (xmlChar *)
"//Configuration/Enforcer/Privileges/User",
1588 (xmlChar *)
"//Configuration/Enforcer/Privileges/Group");
1593 (xmlChar *)
"//Configuration/Enforcer/Datastore/SQLite");
1594 if (temp_status == -1) {
1600 status += temp_status;
1608 status +=
check_time_def_from_xpath(xpath_ctx, (xmlChar *)
"//Configuration/Enforcer/RolloverNotification",
"Configuration",
"Enforcer/RolloverNotification", conf);
1612 (xmlChar *)
"//Configuration/Enforcer/DelegationSignerSubmitCommand");
1613 if (temp_status > 0) {
1614 status += temp_status;
1619 (xmlChar *)
"//Configuration/Enforcer/WorkingDirectory");
1620 if (temp_status == -1) {
1622 temp_status =
check_path(OPENDNSSEC_STATE_DIR
"/enforcer",
1623 "default Enforcer WorkingDirectory");
1625 if (temp_status > 0) {
1626 status += temp_status;
1632 (xmlChar *)
"//Configuration/Signer/Privileges/User",
1633 (xmlChar *)
"//Configuration/Signer/Privileges/Group");
1637 (xmlChar *)
"//Configuration/Signer/WorkingDirectory");
1638 if (temp_status == -1) {
1640 temp_status =
check_path(OPENDNSSEC_STATE_DIR
"/signer",
1641 "default Signer WorkingDirectory");
1643 if (temp_status > 0) {
1644 status += temp_status;
1648 xexpr = (xmlChar *)
"//Configuration/Signer/WorkingDirectory";
1649 xpath_obj = xmlXPathEvalExpression(xexpr, xpath_ctx);
1650 if (NULL == xpath_obj || xpath_obj->nodesetval->nodeNr == 0) {
1651 signer_dir = (
char*) OPENDNSSEC_STATE_DIR
"/signer";
1652 signer_dir_default = 1;
1655 signer_dir = (
char*) xmlXPathCastToString(xpath_obj);
1656 xmlXPathFreeObject(xpath_obj);
1658 xexpr = (xmlChar *)
"//Configuration/Enforcer/WorkingDirectory";
1659 xpath_obj = xmlXPathEvalExpression(xexpr, xpath_ctx);
1660 if (NULL == xpath_obj || xpath_obj->nodesetval->nodeNr == 0) {
1661 enforcer_dir = (
char*) OPENDNSSEC_STATE_DIR
"/enforcer";
1662 enforcer_dir_default = 1;
1665 enforcer_dir = (
char*) xmlXPathCastToString(xpath_obj);
1666 xmlXPathFreeObject(xpath_obj);
1668 temp_status = strcmp(signer_dir, enforcer_dir);
1669 if (0 == temp_status) {
1671 dual_log(
"ERROR: signer workingdirectory is the same as the one of enforcer");
1673 if (0 == signer_dir_default)
1675 if (0 == enforcer_dir_default)
1678 xmlXPathFreeContext(xpath_ctx);
1681 for (i = 0; i < repo_count; i++) {
1683 free(repo[i].module);
1684 free(repo[i].TokenLabel);