Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fast reload #1015

Open
wants to merge 65 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
a399e7b
- fast-reload, add unbound-control fast_reload
wcawijngaards Nov 3, 2023
a38a37d
- fast-reload, make a thread to service the unbound-control command.
wcawijngaards Nov 3, 2023
88a60f0
- fast-reload, communication sockets for information transfer.
wcawijngaards Nov 3, 2023
bc0c9a4
- fast-reload, fix compile for unbound-dnstap-socket.
wcawijngaards Nov 3, 2023
6b00fd4
- fast-reload, set nonblocking communication to keep the server thread
wcawijngaards Nov 6, 2023
2c0f622
- fast-reload, poll routine to test for readiness, timeout fails conn…
wcawijngaards Nov 6, 2023
3e17db1
- fast-reload, detect loop in sock_poll_timeout routine.
wcawijngaards Nov 6, 2023
43ff8e1
- fast-reload, send done and exited notification.
wcawijngaards Nov 7, 2023
dab478d
- fast-reload, defines for constants in ipc.
wcawijngaards Nov 30, 2023
bc95c79
Merge branch 'master' into fast-reload
wcawijngaards Nov 30, 2023
f2c0e22
- fast-reload, ipc socket recv and send resists partial reads and wri…
wcawijngaards Nov 30, 2023
fcfb3fe
- fast-reload, send exit command to thread when done.
wcawijngaards Nov 30, 2023
32e98b4
- fast-reload, output strings for client on string list.
wcawijngaards Dec 1, 2023
c07e941
- fast-reload, add newline to terminal output.
wcawijngaards Dec 4, 2023
9c6d102
- fast-reload, send client string to remote client.
wcawijngaards Dec 4, 2023
d9b965e
- fast-reload, better debug output.
wcawijngaards Dec 4, 2023
caf6419
- fast-reload, print queue structure, for output to the remote client.
wcawijngaards Dec 8, 2023
8f710f0
Merge branch 'master' into fast-reload
wcawijngaards Dec 8, 2023
f93b718
- fast-reload, move print items to print queue from fast_reload_threa…
wcawijngaards Dec 8, 2023
828f6d7
- fast-reload, keep list of pending print queue items in daemon struct.
wcawijngaards Dec 8, 2023
a882c35
- fast-reload, comment explains in_list for printq to print remainder.
wcawijngaards Dec 8, 2023
82c9e9c
- fast-reload, unit test testdata/fast_reload_thread.tdir that tests the
wcawijngaards Jan 4, 2024
6a2b399
Merge branch 'master' into fast-reload
wcawijngaards Jan 4, 2024
cce409c
- fast-reload, fix test link for fast_reload_printq_list_delete funct…
wcawijngaards Jan 4, 2024
85127a4
- fast-reload, reread config file from disk.
wcawijngaards Jan 4, 2024
4304754
- fast-reload, unshare forwards, making the structure locked, with an…
wcawijngaards Jan 4, 2024
091ea9f
- fast-reload, for nonthreaded, the unbound-control commands forward,
wcawijngaards Jan 4, 2024
5436c9c
Merge branch 'master' into fast-reload
wcawijngaards Jan 4, 2024
39e5959
- fast-reload, unshared stub hints, making the structure locked, with…
wcawijngaards Jan 5, 2024
25aa0be
Merge branch 'master' into fast-reload
wcawijngaards Jan 5, 2024
e146a92
- fast-reload, helpful comments for hints lookup function return value.
wcawijngaards Jan 5, 2024
5c3f72d
- fast-reload, fix bug in fast reload printout, the strlist appendlis…
wcawijngaards Jan 8, 2024
94ef337
- fast-reload, keep track of reloadtime and deletestime and print them.
wcawijngaards Jan 8, 2024
38573f4
- fast-reload, keep track of constructtime and print it.
wcawijngaards Jan 8, 2024
53b647e
- fast-reload, construct new items.
wcawijngaards Jan 8, 2024
b0da43e
- fast-reload, better comment.
wcawijngaards Jan 8, 2024
a57c943
- fast-reload, reload the config and swap trees for forwards and stub…
wcawijngaards Jan 9, 2024
9c1274e
- fast-reload, in forwards_swap_tree set protection of trees with locks.
wcawijngaards Jan 9, 2024
b567a5c
- fast-reload, in hints_swap_tree also swap the node count of the trees.
wcawijngaards Jan 9, 2024
eee7d88
- fast-reload, reload ipc to stop and start threads.
wcawijngaards Jan 9, 2024
9e98d17
Merge branch 'master' into fast-reload
wcawijngaards Jan 9, 2024
bcaebb1
- fast-reload, unused forward declarations removed.
wcawijngaards Jan 11, 2024
c3a754f
- fast-reload, unit test that fast reload works with forwards and stubs.
wcawijngaards Jan 22, 2024
a423aa9
Merge branch 'master' into fast-reload
wcawijngaards Jan 22, 2024
c96debd
Merge branch 'master' into fast-reload
wcawijngaards Jan 22, 2024
b28f671
- fast-reload, fix clang analyzer warnings.
wcawijngaards Jan 23, 2024
b62f8cf
Merge branch 'master' into fast-reload
wcawijngaards Jan 23, 2024
3907d00
Merge branch 'master' into fast-reload
wcawijngaards Feb 15, 2024
0b79daf
- fast-reload, small documentation entry in unbound-control -h output.
wcawijngaards Feb 15, 2024
d047c3f
- fast-reload, printout memory use by fast reload, in bytes.
wcawijngaards Mar 19, 2024
b3dbb62
Merge branch 'master' into fast-reload
wcawijngaards Mar 19, 2024
d915c4c
- fast-reload, compile without threads.
wcawijngaards Mar 21, 2024
bebce30
- fast-reload, document fast_reload in man page.
wcawijngaards Mar 21, 2024
942dd56
- fast-reload, print ok when done successfully.
wcawijngaards Mar 21, 2024
2ab619f
- fast-reload, option for fast-reload commandline, +v verbosity option,
wcawijngaards Mar 21, 2024
c97f5a6
- fast-reload, option for fast-reload commandline, +p does not pause …
wcawijngaards Mar 21, 2024
123205c
- fast-reload, option for fast-reload commandline, +d drops mesh quer…
wcawijngaards Mar 21, 2024
46bdbc7
- fast-reload, fix to poll every thread with nopause to make certain …
wcawijngaards Mar 21, 2024
58ff34c
- fast-reload, fix to use atomic store for config variables with nopa…
wcawijngaards Mar 21, 2024
1aa9800
- fast-reload, reload views.
wcawijngaards Apr 5, 2024
3c33eef
Merge branch 'master' into fast-reload
wcawijngaards Apr 5, 2024
cd33d21
- fast-reload, when tag defines are different, it drops the queries.
wcawijngaards Apr 5, 2024
d9cfc8d
- fast-reload, fix tag define check.
wcawijngaards Apr 5, 2024
3c3fa03
Merge branch 'master' into fast-reload
wcawijngaards Apr 5, 2024
d52018a
- fast-reload, document that tag change causes drop of queries.
wcawijngaards Apr 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -866,7 +866,7 @@ view.lo view.o: $(srcdir)/services/view.c config.h $(srcdir)/services/view.h $(s
$(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h \
$(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/msgreply.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
$(srcdir)/sldns/rrdef.h $(srcdir)/sldns/sbuffer.h $(srcdir)/util/config_file.h
$(srcdir)/sldns/rrdef.h $(srcdir)/sldns/sbuffer.h $(srcdir)/util/config_file.h $(srcdir)/respip/respip.h
rpz.lo rpz.o: $(srcdir)/services/rpz.c config.h $(srcdir)/services/rpz.h $(srcdir)/services/localzone.h \
$(srcdir)/util/rbtree.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/storage/dnstree.h \
$(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/msgreply.h \
Expand Down Expand Up @@ -962,7 +962,7 @@ fptr_wlist.lo fptr_wlist.o: $(srcdir)/util/fptr_wlist.c config.h $(srcdir)/util/
$(srcdir)/validator/val_nsec3.h $(srcdir)/validator/val_sigcrypt.h $(srcdir)/validator/val_kentry.h \
$(srcdir)/validator/val_neg.h $(srcdir)/validator/autotrust.h $(srcdir)/libunbound/libworker.h \
$(srcdir)/libunbound/context.h $(srcdir)/util/alloc.h $(srcdir)/libunbound/unbound-event.h \
$(srcdir)/libunbound/worker.h
$(srcdir)/libunbound/worker.h $(srcdir)/daemon/remote.h
locks.lo locks.o: $(srcdir)/util/locks.c config.h $(srcdir)/util/locks.h $(srcdir)/util/log.h
log.lo log.o: $(srcdir)/util/log.c config.h $(srcdir)/util/log.h $(srcdir)/util/locks.h $(srcdir)/sldns/sbuffer.h
mini_event.lo mini_event.o: $(srcdir)/util/mini_event.c config.h $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.h \
Expand Down Expand Up @@ -1278,7 +1278,8 @@ daemon.lo daemon.o: $(srcdir)/daemon/daemon.c config.h $(srcdir)/daemon/daemon.h
$(srcdir)/util/edns.h $(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/rrset.h \
$(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/services/localzone.h \
$(srcdir)/services/authzone.h $(srcdir)/services/mesh.h $(srcdir)/services/rpz.h $(srcdir)/respip/respip.h \
$(srcdir)/util/random.h $(srcdir)/util/tube.h $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h
$(srcdir)/util/random.h $(srcdir)/util/tube.h $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h \
$(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h
remote.lo remote.o: $(srcdir)/daemon/remote.c config.h $(srcdir)/daemon/remote.h $(srcdir)/daemon/worker.h \
$(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h $(srcdir)/util/data/packed_rrset.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/netevent.h \
Expand All @@ -1296,7 +1297,7 @@ remote.lo remote.o: $(srcdir)/daemon/remote.c config.h $(srcdir)/daemon/remote.h
$(srcdir)/validator/val_anchor.h $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h \
$(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h $(srcdir)/iterator/iter_delegpt.h \
$(srcdir)/services/outside_network.h $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/parseutil.h \
$(srcdir)/sldns/wire2str.h
$(srcdir)/sldns/wire2str.h $(srcdir)/util/locks.h $(srcdir)/util/ub_event.h
stats.lo stats.o: $(srcdir)/daemon/stats.c config.h $(srcdir)/daemon/stats.h $(srcdir)/util/timehist.h \
$(srcdir)/libunbound/unbound.h $(srcdir)/daemon/worker.h $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
Expand Down Expand Up @@ -1484,7 +1485,8 @@ context.lo context.o: $(srcdir)/libunbound/context.c config.h $(srcdir)/libunbou
$(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h \
$(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
$(srcdir)/services/authzone.h $(srcdir)/services/mesh.h $(srcdir)/services/rpz.h $(srcdir)/daemon/stats.h \
$(srcdir)/util/timehist.h $(srcdir)/respip/respip.h $(srcdir)/util/edns.h
$(srcdir)/util/timehist.h $(srcdir)/respip/respip.h $(srcdir)/util/edns.h \
$(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h
libunbound.lo libunbound.o: $(srcdir)/libunbound/libunbound.c $(srcdir)/libunbound/unbound.h \
$(srcdir)/libunbound/unbound-event.h config.h $(srcdir)/libunbound/context.h $(srcdir)/util/locks.h \
$(srcdir)/util/log.h $(srcdir)/util/alloc.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h \
Expand All @@ -1496,7 +1498,8 @@ libunbound.lo libunbound.o: $(srcdir)/libunbound/libunbound.c $(srcdir)/libunbou
$(srcdir)/sldns/sbuffer.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/util/netevent.h \
$(srcdir)/dnscrypt/dnscrypt.h $(srcdir)/services/cache/rrset.h \
$(srcdir)/util/storage/slabhash.h $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h \
$(srcdir)/services/rpz.h $(srcdir)/daemon/stats.h $(srcdir)/util/timehist.h $(srcdir)/respip/respip.h
$(srcdir)/services/rpz.h $(srcdir)/daemon/stats.h $(srcdir)/util/timehist.h $(srcdir)/respip/respip.h \
$(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h
libworker.lo libworker.o: $(srcdir)/libunbound/libworker.c config.h $(srcdir)/libunbound/libworker.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(srcdir)/libunbound/context.h $(srcdir)/util/alloc.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h \
Expand All @@ -1510,8 +1513,7 @@ libworker.lo libworker.o: $(srcdir)/libunbound/libworker.c config.h $(srcdir)/li
$(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h $(srcdir)/services/outbound_list.h \
$(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/util/regional.h $(srcdir)/util/random.h \
$(srcdir)/util/storage/lookup3.h $(srcdir)/util/net_help.h $(srcdir)/util/data/dname.h \
$(srcdir)/util/data/msgencode.h $(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h \
$(srcdir)/sldns/str2wire.h
$(srcdir)/util/data/msgencode.h $(srcdir)/sldns/str2wire.h
unbound-host.lo unbound-host.o: $(srcdir)/smallapp/unbound-host.c config.h $(srcdir)/libunbound/unbound.h \
$(srcdir)/sldns/rrdef.h $(srcdir)/sldns/wire2str.h
asynclook.lo asynclook.o: $(srcdir)/testcode/asynclook.c config.h $(srcdir)/libunbound/unbound.h \
Expand Down
3 changes: 2 additions & 1 deletion cachedb/cachedb.c
Original file line number Diff line number Diff line change
Expand Up @@ -666,6 +666,7 @@ cachedb_extcache_store(struct module_qstate* qstate, struct cachedb_env* ie)
static int
cachedb_intcache_lookup(struct module_qstate* qstate, struct cachedb_env* cde)
{
uint8_t dpname_storage[LDNS_MAX_DOMAINLEN+1];
uint8_t* dpname=NULL;
size_t dpnamelen=0;
struct dns_msg* msg;
Expand All @@ -674,7 +675,7 @@ cachedb_intcache_lookup(struct module_qstate* qstate, struct cachedb_env* cde)
return 0;
}
if(iter_stub_fwd_no_cache(qstate, &qstate->qinfo,
&dpname, &dpnamelen))
&dpname, &dpnamelen, dpname_storage, sizeof(dpname_storage)))
return 0; /* no cache for these queries */
msg = dns_cache_lookup(qstate->env, qstate->qinfo.qname,
qstate->qinfo.qname_len, qstate->qinfo.qtype,
Expand Down
3 changes: 3 additions & 0 deletions config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,9 @@
/* Define to 1 if you have the <stdarg.h> header file. */
#undef HAVE_STDARG_H

/* Define to 1 if you have the <stdatomic.h> header file. */
#undef HAVE_STDATOMIC_H

/* Define to 1 if you have the <stdbool.h> header file. */
#undef HAVE_STDBOOL_H

Expand Down
8 changes: 8 additions & 0 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -16007,6 +16007,14 @@ then :

fi

ac_fn_c_check_header_compile "$LINENO" "stdatomic.h" "ac_cv_header_stdatomic_h" "$ac_includes_default
"
if test "x$ac_cv_header_stdatomic_h" = xyes
then :
printf "%s\n" "#define HAVE_STDATOMIC_H 1" >>confdefs.h

fi


# check for types.
# Using own tests for int64* because autoconf builtin only give 32bit.
Expand Down
1 change: 1 addition & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,7 @@ AC_CHECK_HEADERS([netioapi.h],,, [AC_INCLUDES_DEFAULT

# Check for Linux timestamping headers
AC_CHECK_HEADERS([linux/net_tstamp.h],,, [AC_INCLUDES_DEFAULT])
AC_CHECK_HEADERS([stdatomic.h],,, [AC_INCLUDES_DEFAULT])

# check for types.
# Using own tests for int64* because autoconf builtin only give 32bit.
Expand Down
22 changes: 17 additions & 5 deletions daemon/cachedump.c
Original file line number Diff line number Diff line change
Expand Up @@ -850,15 +850,20 @@ int print_deleg_lookup(RES* ssl, struct worker* worker, uint8_t* nm,
if(!ssl_printf(ssl, "The following name servers are used for lookup "
"of %s\n", b))
return 0;


lock_rw_rdlock(&worker->env.fwds->lock);
dp = forwards_lookup(worker->env.fwds, nm, qinfo.qclass);
if(dp) {
if(!ssl_printf(ssl, "forwarding request:\n"))
if(!ssl_printf(ssl, "forwarding request:\n")) {
lock_rw_unlock(&worker->env.fwds->lock);
return 0;
}
print_dp_main(ssl, dp, NULL);
print_dp_details(ssl, worker, dp);
lock_rw_unlock(&worker->env.fwds->lock);
return 1;
}
lock_rw_unlock(&worker->env.fwds->lock);

while(1) {
dp = dns_cache_find_delegation(&worker->env, nm, nmlen,
Expand Down Expand Up @@ -892,22 +897,29 @@ int print_deleg_lookup(RES* ssl, struct worker* worker, uint8_t* nm,
return 0;
continue;
}
}
}
lock_rw_rdlock(&worker->env.hints->lock);
stub = hints_lookup_stub(worker->env.hints, nm, qinfo.qclass,
dp);
if(stub) {
if(stub->noprime) {
if(!ssl_printf(ssl, "The noprime stub servers "
"are used:\n"))
"are used:\n")) {
lock_rw_unlock(&worker->env.hints->lock);
return 0;
}
} else {
if(!ssl_printf(ssl, "The stub is primed "
"with servers:\n"))
"with servers:\n")) {
lock_rw_unlock(&worker->env.hints->lock);
return 0;
}
}
print_dp_main(ssl, stub->dp, NULL);
print_dp_details(ssl, worker, stub->dp);
lock_rw_unlock(&worker->env.hints->lock);
} else {
lock_rw_unlock(&worker->env.hints->lock);
print_dp_main(ssl, dp, msg);
print_dp_details(ssl, worker, dp);
}
Expand Down
17 changes: 17 additions & 0 deletions daemon/daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@
#include "util/net_help.h"
#include "sldns/keyraw.h"
#include "respip/respip.h"
#include "iterator/iter_fwd.h"
#include "iterator/iter_hints.h"
#include <signal.h>

#ifdef HAVE_SYSTEMD
Expand Down Expand Up @@ -714,6 +716,12 @@ daemon_fork(struct daemon* daemon)
fatal_exit("Could not create local zones: out of memory");
if(!local_zones_apply_cfg(daemon->local_zones, daemon->cfg))
fatal_exit("Could not set up local zones");
if(!(daemon->env->fwds = forwards_create()) ||
!forwards_apply_cfg(daemon->env->fwds, daemon->cfg))
fatal_exit("Could not set forward zones");
if(!(daemon->env->hints = hints_create()) ||
!hints_apply_cfg(daemon->env->hints, daemon->cfg))
fatal_exit("Could not set root or stub hints");

/* process raw response-ip configuration data */
if(!(daemon->respip_set = respip_set_create()))
Expand Down Expand Up @@ -830,6 +838,10 @@ daemon_cleanup(struct daemon* daemon)
slabhash_clear(daemon->env->msg_cache);
}
daemon->old_num = daemon->num; /* save the current num */
forwards_delete(daemon->env->fwds);
daemon->env->fwds = NULL;
hints_delete(daemon->env->hints);
daemon->env->hints = NULL;
local_zones_delete(daemon->local_zones);
daemon->local_zones = NULL;
respip_set_delete(daemon->respip_set);
Expand All @@ -840,6 +852,10 @@ daemon_cleanup(struct daemon* daemon)
auth_zones_cleanup(daemon->env->auth_zones);
/* key cache is cleared by module desetup during next daemon_fork() */
daemon_remote_clear(daemon->rc);
if(daemon->fast_reload_thread)
fast_reload_thread_stop(daemon->fast_reload_thread);
if(daemon->fast_reload_printq_list)
fast_reload_printq_list_delete(daemon->fast_reload_printq_list);
for(i=0; i<daemon->num; i++)
worker_delete(daemon->workers[i]);
free(daemon->workers);
Expand Down Expand Up @@ -890,6 +906,7 @@ daemon_delete(struct daemon* daemon)
listen_desetup_locks();
free(daemon->chroot);
free(daemon->pidfile);
free(daemon->cfgfile);
free(daemon->env);
#ifdef HAVE_SSL
listen_sslctx_delete_ticket_keys();
Expand Down
10 changes: 10 additions & 0 deletions daemon/daemon.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ struct ub_randstate;
struct daemon_remote;
struct respip_set;
struct shm_main_info;
struct fast_reload_thread;
struct fast_reload_printq;

#include "dnstap/dnstap_config.h"
#ifdef USE_DNSTAP
Expand Down Expand Up @@ -146,6 +148,14 @@ struct daemon {
#endif
/** reuse existing cache on reload if other conditions allow it. */
int reuse_cache;
/** the fast reload thread, or NULL */
struct fast_reload_thread* fast_reload_thread;
/** the fast reload printq list */
struct fast_reload_printq* fast_reload_printq_list;
/** the fast reload option to drop mesh queries, true if so. */
int fast_reload_drop_mesh;
/** config file name */
char* cfgfile;
};

/**
Expand Down
Loading