diff --git a/src/knot/other/error.c b/src/knot/other/error.c index 70c84a3a4b51132c82c50825bf219eb4989ce1b5..80343bd2ba9e11effc0b224745f63c3bff3d29b4 100644 --- a/src/knot/other/error.c +++ b/src/knot/other/error.c @@ -41,6 +41,7 @@ const error_table_t knotd_error_msgs[] = { {KNOTD_ENOIPV6, "IPv6 support disabled."}, {KNOTD_EMALF, "Malformed data."}, {KNOTD_ESPACE, "Not enough space provided."}, - {KNOTD_EEXPIRED, "Resource is expired."}, + {KNOTD_EEXPIRED, "Resource is expired."}, + {KNOTD_ENODIFF, "Cannot create zone diff."}, {KNOTD_ERROR, 0} }; diff --git a/src/knot/other/error.h b/src/knot/other/error.h index 65c51cf9d8a75397a552a23aa3f6b2e2034ef421..aa4961e04ebb71c91be2bda9cd48d789e4794f52 100644 --- a/src/knot/other/error.h +++ b/src/knot/other/error.h @@ -63,8 +63,9 @@ enum knot_error_t { KNOTD_EMALF, /*!< \brief Malformed data. */ KNOTD_ESPACE, /*!< \brief Not enough space provided. */ KNOTD_EEXPIRED, /*!< \brief Resource is expired. */ + KNOTD_ENODIFF, /*!< \brief Cannot create zone diff. */ - KNOTD_ERROR_COUNT = 21 + KNOTD_ERROR_COUNT = 22 }; /*! \brief Table linking error messages to error codes. */ diff --git a/src/knot/server/zones.c b/src/knot/server/zones.c index 7dea81200b16cac24b3d2c2ddcacb9aca7f47921..81e1bf43c055e0d891d1c85e05648a2413b0e025 100644 --- a/src/knot/server/zones.c +++ b/src/knot/server/zones.c @@ -3209,8 +3209,10 @@ int zones_create_and_save_changesets(const knot_zone_t *old_zone, dbg_zones("zones: create_changesets: " "Could not create changesets. Reason: %s\n", knot_strerror(ret)); - if (ret == KNOT_EAGAIN) { - return KNOTD_EOK; + if (ret == KNOT_ERANGE) { + return KNOTD_ERANGE; + } else if (ret == KNOT_ENODIFF) { + return KNOTD_ENODIFF; } else { return KNOTD_ERROR; } diff --git a/src/libknot/util/error.h b/src/libknot/util/error.h index 4a6d4c718b5711122ad4f8e05883db42b1d47036..9b441e488c0d6d828081f52abf6c6c723a0073a7 100644 --- a/src/libknot/util/error.h +++ b/src/libknot/util/error.h @@ -69,7 +69,8 @@ enum knot_error { KNOT_ECONN, /*!< Connection reset. */ KNOT_EIXFRSPACE, /*!< IXFR reply did not fit in. */ KNOT_ECNAME, /*!< CNAME loop found in zone. */ - KNOT_ERROR_COUNT = 35 + KNOT_ENODIFF, /*!< No zone diff can be created. */ + KNOT_ERROR_COUNT = 36 }; /*! \brief Table linking error messages to error codes. */ diff --git a/src/libknot/util/libknot_error.c b/src/libknot/util/libknot_error.c index 30f1f218420180bafb7f35ca8957295cba998c0d..bba968a712b2eb481c34feaba6cf8e69a9fc7367 100644 --- a/src/libknot/util/libknot_error.c +++ b/src/libknot/util/libknot_error.c @@ -52,5 +52,6 @@ const error_table_t knot_error_msgs[KNOT_ERROR_COUNT] = { {KNOT_ECONN, "Connection reset."}, {KNOT_EIXFRSPACE, "IXFR reply did not fit in."}, {KNOT_ECNAME, "CNAME loop found in zone."}, + {KNOT_ENODIFF, "Cannot create zone diff."}, {KNOT_ERROR, 0} }; diff --git a/src/libknot/zone/zone-diff.c b/src/libknot/zone/zone-diff.c index db03f35cc256097c8f73c6659141c6e140221aa7..07817d4eb9fcb83fb81275e5c31daa410ea502e3 100644 --- a/src/libknot/zone/zone-diff.c +++ b/src/libknot/zone/zone-diff.c @@ -21,6 +21,7 @@ #include "libknot/util/debug.h" #include "libknot/rdata.h" #include "zone-diff.h" +#include "libknot/nameserver/name-server.h" struct zone_diff_param { const knot_zone_contents_t *contents; @@ -29,6 +30,7 @@ struct zone_diff_param { int ret; }; +// forward declaration static int knot_zone_diff_rdata(const knot_rrset_t *rrset1, const knot_rrset_t *rrset2, knot_changeset_t *changeset); @@ -78,11 +80,18 @@ static int knot_zone_diff_load_soas(const knot_zone_contents_t *zone1, dbg_zonediff("zone_diff: load_soas: Got bad SOA.\n"); } - if (soa_serial1 >= soa_serial2) { + if (ns_serial_compare(soa_serial1, soa_serial2) == 0) { dbg_zonediff("zone_diff: " "second zone must have higher serial than the " "first one.\n"); - return KNOT_EAGAIN; + return KNOT_ENODIFF; + } + + if (ns_serial_compare(soa_serial1, soa_serial2) == 0) { + dbg_zonediff("zone_diff: " + "second zone must have higher serial than the " + "first one.\n"); + return KNOT_ERANGE; } /* We will not touch SOA later, now is the time to handle RRSIGs. */