38 #include <ldns/ldns.h>
40 #include <sys/types.h>
45 static const char* util_str =
"util";
55 ldns_rr_type type = 0;
59 type = ldns_rr_get_type(rr);
60 return (type == LDNS_RR_TYPE_RRSIG ||
61 type == LDNS_RR_TYPE_NSEC ||
62 type == LDNS_RR_TYPE_NSEC3 ||
63 type == LDNS_RR_TYPE_NSEC3PARAMS);
87 for (i = 0; i <= rdata_count; i++) {
89 ldns_rdf_compare(ldns_rr_rdf(rr1, i), ldns_rr_rdf(rr2, i)) != 0) {
110 rr1_len = ldns_rr_uncompressed_size(rr1);
111 rr2_len = ldns_rr_uncompressed_size(rr2);
112 if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) != 0) {
115 if (ldns_rr_get_class(rr1) != ldns_rr_get_class(rr2)) {
118 if (ldns_rr_get_type(rr1) != LDNS_RR_TYPE_SOA) {
121 if (ldns_rr_get_type(rr1) != ldns_rr_get_type(rr2)) {
124 if (offset > rr1_len || offset > rr2_len) {
125 if (rr1_len == rr2_len) {
142 ldns_status status = LDNS_STATUS_OK;
145 ldns_buffer* rr1_buf;
146 ldns_buffer* rr2_buf;
149 return LDNS_STATUS_ERR;
151 rr1_len = ldns_rr_uncompressed_size(rr1);
152 rr2_len = ldns_rr_uncompressed_size(rr2);
153 rr1_buf = ldns_buffer_new(rr1_len);
154 rr2_buf = ldns_buffer_new(rr2_len);
156 status = ldns_rr2buffer_wire_canonical(rr1_buf, rr1, LDNS_SECTION_ANY);
157 if (status != LDNS_STATUS_OK) {
158 ldns_buffer_free(rr1_buf);
159 ldns_buffer_free(rr2_buf);
163 status = ldns_rr2buffer_wire_canonical(rr2_buf, rr2, LDNS_SECTION_ANY);
164 if (status != LDNS_STATUS_OK) {
165 ldns_buffer_free(rr1_buf);
166 ldns_buffer_free(rr2_buf);
170 *cmp = ldns_rr_compare_wire(rr1_buf, rr2_buf);
171 ldns_buffer_free(rr1_buf);
172 ldns_buffer_free(rr2_buf);
173 return LDNS_STATUS_OK;
185 ldns_dnssec_rrs *new_rrs = NULL;
186 ldns_status status = LDNS_STATUS_OK;
188 uint32_t default_ttl = 0;
190 if (!rrs || !rrs->rr || !rr) {
191 return LDNS_STATUS_ERR;
194 rr_ttl = ldns_rr_ttl(rr);
196 if (status != LDNS_STATUS_OK) {
205 new_rrs = ldns_dnssec_rrs_new();
208 default_ttl = ldns_rr_ttl(rrs->rr);
209 if (rr_ttl < default_ttl) {
210 ldns_rr_set_ttl(rrs->rr, rr_ttl);
212 ldns_rr_set_ttl(new_rrs->rr, default_ttl);
214 return LDNS_STATUS_OK;
216 }
else if (cmp > 0) {
219 new_rrs = ldns_dnssec_rrs_new();
220 new_rrs->rr = rrs->rr;
221 new_rrs->next = rrs->next;
226 default_ttl = ldns_rr_ttl(new_rrs->rr);
227 if (rr_ttl < default_ttl) {
228 ldns_rr_set_ttl(new_rrs->rr, rr_ttl);
230 ldns_rr_set_ttl(rrs->rr, default_ttl);
233 return LDNS_STATUS_OK;
237 return LDNS_STATUS_NO_DATA;
239 return LDNS_STATUS_OK;
248 util_read_pidfile(
const char* file)
256 if ((fd = open(file, O_RDONLY)) == -1) {
259 if (((l = read(fd, pidbuf,
sizeof(pidbuf)))) == -1) {
269 pid = (pid_t) strtol(pidbuf, &t, 10);
271 if (*t && *t !=
'\n') {
286 struct stat stat_ret;
291 if (stat(pidfile, &stat_ret) != 0) {
292 if (errno != ENOENT) {
293 ods_log_error(
"[%s] cannot stat pidfile %s: %s", util_str, pidfile,
297 if (S_ISREG(stat_ret.st_mode)) {
299 if ((oldpid = util_read_pidfile(pidfile)) == -1) {
301 if (errno != ENOENT) {
303 pidfile, strerror(errno));
306 if (kill(oldpid, 0) == 0 || errno == EPERM) {
308 "a process with pid %u is already running. "
309 "If no ods-signerd process is running, a previous "
310 "instance didn't shutdown cleanly, please remove this "
311 "file and try again.", util_str, pidfile, oldpid);
316 "but no process with pid %u is running. "
317 "A previous instance didn't shutdown cleanly, this "
318 "pidfile is stale.", util_str, pidfile, oldpid);
337 size_t result = 0, size = 0;
342 ods_log_debug(
"[%s] writing pid %lu to pidfile %s", util_str,
343 (
unsigned long) pid, pidfile);
344 snprintf(pidbuf,
sizeof(pidbuf),
"%lu\n", (
unsigned long) pid);
349 size = strlen(pidbuf);
353 result = fwrite((
const void*) pidbuf, 1, size, fd);
356 ods_log_error(
"[%s] write to pidfile %s failed: %s", util_str,
357 pidfile, strerror(errno));
358 }
else if (result < size) {
359 ods_log_error(
"[%s] short write to pidfile %s: disk full?", util_str,
381 ldns_buffer* tmp_buffer = NULL;
388 tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
392 if (ldns_rr2buffer_str_fmt(tmp_buffer, NULL, rr)
395 result = ldns_buffer2str(tmp_buffer);
397 fprintf(fd,
"%s", result);
401 fprintf(fd,
"; Unable to convert rr to string\n");
407 ldns_buffer_free(tmp_buffer);
418 return (((((srcsize + 3) / 4) * 3)) + 1);
#define DNS_SERIAL_GT(a, b)
void ods_log_debug(const char *format,...)
ldns_status util_dnssec_rrs_compare(ldns_rr *rr1, ldns_rr *rr2, int *cmp)
size_t util_b64_pton_calculate_size(size_t srcsize)
enum ods_enum_status ods_status
int util_soa_compare_rdata(ldns_rr *rr1, ldns_rr *rr2)
void ods_log_error(const char *format,...)
#define SE_SOA_RDATA_SERIAL
ods_status util_rr_print(FILE *fd, const ldns_rr *rr)
FILE * ods_fopen(const char *file, const char *dir, const char *mode)
int util_serial_gt(uint32_t serial_new, uint32_t serial_old)
void ods_log_crit(const char *format,...)
int util_write_pidfile(const char *pidfile, pid_t pid)
#define SE_SOA_RDATA_MINIMUM
ldns_status util_dnssec_rrs_add_rr(ldns_dnssec_rrs *rrs, ldns_rr *rr)
int util_check_pidfile(const char *pidfile)
int util_soa_compare(ldns_rr *rr1, ldns_rr *rr2)
void ods_fclose(FILE *fd)
#define ods_log_assert(x)
int util_is_dnssec_rr(ldns_rr *rr)
void ods_log_warning(const char *format,...)