diff --git a/src/libknot/zone/zone.c b/src/libknot/zone/zone.c index 54dd46b3527f523239abf68feb1438a02f71dcb0..65f810d1068d8f361f11e712f4f0c12d0c710c03 100644 --- a/src/libknot/zone/zone.c +++ b/src/libknot/zone/zone.c @@ -146,14 +146,18 @@ void knot_zone_set_version(knot_zone_t *zone, time_t version) short knot_zone_is_master(const knot_zone_t *zone) { - return zone->master; + return zone->flags & KNOT_ZONE_MASTER; } /*----------------------------------------------------------------------------*/ void knot_zone_set_master(knot_zone_t *zone, short master) { - zone->master = master; + if (master) { + zone->flags |= KNOT_ZONE_MASTER; + } else { + zone->flags &= ~KNOT_ZONE_MASTER; + } } /*----------------------------------------------------------------------------*/ @@ -262,3 +266,14 @@ void knot_zone_set_dtor(knot_zone_t *zone, int (*dtor)(struct knot_zone *)) zone->dtor = dtor; } } + +void knot_zone_set_flag(knot_zone_t *zone, knot_zone_flag_t flag, unsigned on) +{ + if (zone != NULL) { + if (on) { + zone->flags |= flag; + } else { + zone->flags &= ~flag; + } + } +} diff --git a/src/libknot/zone/zone.h b/src/libknot/zone/zone.h index f528af9b8098a7702ebfd7d91320ec580c0a5293..68ff90dc0550ca157760dc6259dab122b59e7fd6 100644 --- a/src/libknot/zone/zone.h +++ b/src/libknot/zone/zone.h @@ -54,6 +54,15 @@ enum knot_zone_retvals { typedef enum knot_zone_retvals knot_zone_retvals_t; +/*! + * \brief Zone flags. + */ +typedef enum knot_zone_flag_t { + KNOT_ZONE_SLAVE = 0 << 0, /*! Slave zone */ + KNOT_ZONE_MASTER = 1 << 0, /*! Master zone. */ + KNOT_ZONE_DISCARDED = 1 << 1 /*! Zone waiting to be discarded. */ +} knot_zone_flag_t; + /*----------------------------------------------------------------------------*/ /*! @@ -71,8 +80,7 @@ struct knot_zone { time_t version; - /*! \todo Set when loading zone. */ - short master; + unsigned flags; void *data; /*!< Pointer to generic zone-related data. */ int (*dtor)(struct knot_zone *); /*!< Data destructor. */ @@ -179,6 +187,24 @@ void knot_zone_set_dtor(knot_zone_t *zone, int (*dtor)(struct knot_zone *)); } } +/*! + * \brief Return zone flags. + * + * \param zone Zone. + */ +static inline unsigned knot_zone_flags(knot_zone_t *zone) { + return zone->flags; +} + +/*! + * \brief Set zone flag. + * + * \param zone Zone. + * \param flag Respected flag. + * \param on 1 to set, 0 to unset flag. + */ +void knot_zone_set_flag(knot_zone_t *zone, knot_zone_flag_t flag, unsigned on); + #endif /*! @} */