return task;
}
-/** See if there is a quit signal, true if so. */
-static int
+int
auth_load_thread_poll_for_quit(struct auth_load_thread* thr)
{
int inevent, loopexit = 0;
uint8_t cmd;
ssize_t ret;
+ if(!thr)
+ return 0;
if(thr->need_to_quit)
return 1;
/* Is there data? */
return 0;
}
if(!xfr_apply_http(task->name, task->namelen, task->host, task->file,
- task->chunks_first, z, scratch_buffer)) {
+ task->chunks_first, z, scratch_buffer, thr)) {
sldns_buffer_free(scratch_buffer);
auth_zone_delete_proxy(z);
return 0;
return 0;
}
if(!xfr_apply_ixfr(task->chunks_first, task->serial, z,
- scratch_buffer)) {
+ scratch_buffer, thr)) {
sldns_buffer_free(scratch_buffer);
auth_zone_delete_proxy(z);
return 0;
return 0;
}
- if(!xfr_apply_axfr(task->chunks_first, z, scratch_buffer)) {
+ if(!xfr_apply_axfr(task->chunks_first, z, scratch_buffer, thr)) {
sldns_buffer_free(scratch_buffer);
auth_zone_delete_proxy(z);
return 0;
/** apply IXFR to zone in memory. z is locked. false on failure(mallocfail) */
int
xfr_apply_ixfr(struct auth_chunk* chunk_list, uint32_t xfr_serial,
- struct auth_zone* z, struct sldns_buffer* scratch_buffer)
+ struct auth_zone* z, struct sldns_buffer* scratch_buffer,
+ struct auth_load_thread* thr)
{
struct auth_chunk* rr_chunk;
int rr_num;
}
rr_counter++;
+ if(thr && rr_counter % 10000 == 0) {
+ if(auth_load_thread_poll_for_quit(thr))
+ return 0;
+ }
chunk_rrlist_gonext(&rr_chunk, &rr_num, &rr_pos, rr_nextpos);
}
if(softfail) {
xfr->num_ixfrs++;
return xfr_apply_ixfr(xfr->task_transfer->chunks_first, xfr->serial, z,
- scratch_buffer);
+ scratch_buffer, NULL);
}
/** apply AXFR to zone in memory. z is locked. false on failure(mallocfail) */
int
xfr_apply_axfr(struct auth_chunk* chunk_list, struct auth_zone* z,
- struct sldns_buffer* scratch_buffer)
+ struct sldns_buffer* scratch_buffer, struct auth_load_thread* thr)
{
struct auth_chunk* rr_chunk;
int rr_num;
}
rr_counter++;
+ if(thr && rr_counter % 10000 == 0) {
+ if(auth_load_thread_poll_for_quit(thr))
+ return 0;
+ }
chunk_rrlist_gonext(&rr_chunk, &rr_num, &rr_pos, rr_nextpos);
}
if(!have_end_soa) {
xfr->soa_zone_acquired = 0;
xfr->num_ixfrs = 0;
return xfr_apply_axfr(xfr->task_transfer->chunks_first, z,
- scratch_buffer);
+ scratch_buffer, NULL);
}
void
int
xfr_apply_http(uint8_t* name, size_t namelen, const char* host,
const char* file, struct auth_chunk* chunk_list, struct auth_zone* z,
- struct sldns_buffer* scratch_buffer)
+ struct sldns_buffer* scratch_buffer, struct auth_load_thread* thr)
{
/* parse data in chunks */
/* parse RR's and read into memory. ignore $INCLUDE from the
/* process this line */
pstate.lineno++;
chunkline_newline_removal(scratch_buffer);
+ if(thr && pstate.lineno % 10000 == 0) {
+ if(auth_load_thread_poll_for_quit(thr))
+ return 0;
+ }
if(chunkline_is_comment_line_or_empty(scratch_buffer)) {
continue;
}
return xfr_apply_http(xfr->name, xfr->namelen,
xfr->task_transfer->master->host,
xfr->task_transfer->master->file,
- xfr->task_transfer->chunks_first, z, scratch_buffer);
+ xfr->task_transfer->chunks_first, z, scratch_buffer, NULL);
}
/** write http chunks to zonefile to create downloaded file */
struct auth_transfer;
struct auth_master;
struct auth_chunk;
+struct auth_load_thread;
/**
* Authoritative zones, shared.
/** Apply http transfer to auth_zone */
int xfr_apply_http(uint8_t* name, size_t namelen, const char* host,
const char* file, struct auth_chunk* chunk_list, struct auth_zone* z,
- struct sldns_buffer* scratch_buffer);
+ struct sldns_buffer* scratch_buffer, struct auth_load_thread* thr);
/** Apply IXFR transfer to auth_zone */
int xfr_apply_ixfr(struct auth_chunk* chunk_list, uint32_t xfr_serial,
- struct auth_zone* z, struct sldns_buffer* scratch_buffer);
+ struct auth_zone* z, struct sldns_buffer* scratch_buffer,
+ struct auth_load_thread* thr);
/** Apply AXFR transfer to auth_zone */
int xfr_apply_axfr(struct auth_chunk* chunk_list, struct auth_zone* z,
- struct sldns_buffer* scratch_buffer);
+ struct sldns_buffer* scratch_buffer, struct auth_load_thread* thr);
#endif /* SERVICES_AUTHZONE_H */