mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-30 22:15:20 +00:00
clean up library
address style issues, unfreed memory, etc.
This commit is contained in:
@@ -54,9 +54,9 @@ int
|
|||||||
main(int argc, char **argv) {
|
main(int argc, char **argv) {
|
||||||
#ifdef USE_DNSRPS
|
#ifdef USE_DNSRPS
|
||||||
char cstr[sizeof("zone ") + 1024 + 10];
|
char cstr[sizeof("zone ") + 1024 + 10];
|
||||||
librpz_clist_t *clist;
|
librpz_clist_t *clist = NULL;
|
||||||
librpz_client_t *client;
|
librpz_client_t *client = NULL;
|
||||||
librpz_rsp_t *rsp;
|
librpz_rsp_t *rsp = NULL;
|
||||||
uint32_t serial;
|
uint32_t serial;
|
||||||
#endif /* ifdef USE_DNSRPS */
|
#endif /* ifdef USE_DNSRPS */
|
||||||
double seconds;
|
double seconds;
|
||||||
@@ -110,6 +110,7 @@ main(int argc, char **argv) {
|
|||||||
true);
|
true);
|
||||||
if (client == NULL) {
|
if (client == NULL) {
|
||||||
fprintf(stderr, "## %s\n", emsg.c);
|
fprintf(stderr, "## %s\n", emsg.c);
|
||||||
|
librpz->clist_detach(&clist);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,16 +121,20 @@ main(int argc, char **argv) {
|
|||||||
{
|
{
|
||||||
fprintf(stderr, "## %s\n", emsg.c);
|
fprintf(stderr, "## %s\n", emsg.c);
|
||||||
librpz->client_detach(&client);
|
librpz->client_detach(&client);
|
||||||
|
librpz->clist_detach(&clist);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!librpz->soa_serial(&emsg, &serial, optarg, rsp)) {
|
if (!librpz->soa_serial(&emsg, &serial, optarg, rsp)) {
|
||||||
fprintf(stderr, "## %s\n", emsg.c);
|
fprintf(stderr, "## %s\n", emsg.c);
|
||||||
|
librpz->rsp_detach(&rsp);
|
||||||
librpz->client_detach(&client);
|
librpz->client_detach(&client);
|
||||||
|
librpz->clist_detach(&clist);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
librpz->rsp_detach(&rsp);
|
librpz->rsp_detach(&rsp);
|
||||||
librpz->client_detach(&client);
|
librpz->client_detach(&client);
|
||||||
|
librpz->clist_detach(&clist);
|
||||||
printf("%u\n", serial);
|
printf("%u\n", serial);
|
||||||
#else /* ifdef USE_DNSRPS */
|
#else /* ifdef USE_DNSRPS */
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
|
@@ -42,6 +42,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <isc/endian.h>
|
||||||
#include <isc/util.h>
|
#include <isc/util.h>
|
||||||
|
|
||||||
#include <dns/librpz.h>
|
#include <dns/librpz.h>
|
||||||
@@ -65,8 +66,6 @@ typedef struct {
|
|||||||
char *cstr;
|
char *cstr;
|
||||||
bool uses_expired;
|
bool uses_expired;
|
||||||
trpz_clist_t *pclist;
|
trpz_clist_t *pclist;
|
||||||
ssize_t *base_zones;
|
|
||||||
size_t nbase_zones;
|
|
||||||
} trpz_client_t;
|
} trpz_client_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -82,6 +81,8 @@ typedef struct {
|
|||||||
trpz_result_t *all_nodes;
|
trpz_result_t *all_nodes;
|
||||||
size_t num_zones, num_nodes;
|
size_t num_zones, num_nodes;
|
||||||
ssize_t last_zone;
|
ssize_t last_zone;
|
||||||
|
ssize_t *base_zones;
|
||||||
|
size_t nbase_zones;
|
||||||
} trpz_rsp_t;
|
} trpz_rsp_t;
|
||||||
|
|
||||||
librpz_log_level_t g_log_level = LIBRPZ_LOG_TRACE2;
|
librpz_log_level_t g_log_level = LIBRPZ_LOG_TRACE2;
|
||||||
@@ -92,24 +93,26 @@ apply_all_updates(trpz_rsp_t *trsp);
|
|||||||
static void
|
static void
|
||||||
clear_all_updates(trpz_rsp_t *trsp);
|
clear_all_updates(trpz_rsp_t *trsp);
|
||||||
|
|
||||||
static int
|
static bool
|
||||||
domain_ntop(const u_char *src, char *dst, size_t dstsiz);
|
domain_ntop(const u_char *src, char *dst, size_t dstsiz);
|
||||||
static int
|
static bool
|
||||||
domain_pton2(const char *src, u_char *dst, size_t dstsiz, size_t *dstlen,
|
domain_pton2(const char *src, u_char *dst, size_t dstsiz, size_t *dstlen,
|
||||||
bool lower);
|
bool lower);
|
||||||
|
|
||||||
void
|
void
|
||||||
trpz_set_log(librpz_log_fnc_t *new_log, const char *prog_nm);
|
trpz_set_log(librpz_log_fnc_t *new_log, const char *prog_nm);
|
||||||
void
|
void
|
||||||
trpz_vlog(librpz_log_level_t level, void *ctx, const char *p, va_list args);
|
trpz_vlog(librpz_log_level_t level, void *ctx, const char *p, va_list args)
|
||||||
|
LIBRPZ_PF(3, 0);
|
||||||
void
|
void
|
||||||
trpz_log(librpz_log_level_t level, void *ctx, const char *p, ...);
|
trpz_log(librpz_log_level_t level, void *ctx, const char *p, ...)
|
||||||
|
LIBRPZ_PF(3, 4);
|
||||||
librpz_log_level_t
|
librpz_log_level_t
|
||||||
trpz_log_level_val(librpz_log_level_t level);
|
trpz_log_level_val(librpz_log_level_t level);
|
||||||
void
|
void
|
||||||
trpz_vpemsg(librpz_emsg_t *emsg, const char *p, va_list args);
|
trpz_vpemsg(librpz_emsg_t *emsg, const char *p, va_list args) LIBRPZ_PF(2, 0);
|
||||||
void
|
void
|
||||||
trpz_pemsg(librpz_emsg_t *emsg, const char *fmt, ...);
|
trpz_pemsg(librpz_emsg_t *emsg, const char *fmt, ...) LIBRPZ_PF(2, 3);
|
||||||
librpz_clist_t *
|
librpz_clist_t *
|
||||||
trpz_clist_create(librpz_emsg_t *emsg, librpz_mutex_t *lock,
|
trpz_clist_create(librpz_emsg_t *emsg, librpz_mutex_t *lock,
|
||||||
librpz_mutex_t *unlock, librpz_mutex_t *mutex_destroy,
|
librpz_mutex_t *unlock, librpz_mutex_t *mutex_destroy,
|
||||||
@@ -212,16 +215,17 @@ librpz_0_t LIBRPZ_DEF = {
|
|||||||
* zones.
|
* zones.
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
has_base_zone(trpz_client_t *cli, ssize_t zone) {
|
has_base_zone(trpz_rsp_t *trsp, ssize_t zone) {
|
||||||
size_t n;
|
size_t n;
|
||||||
|
|
||||||
if (cli == NULL || cli->base_zones == NULL || cli->nbase_zones == 0) {
|
if (trsp == NULL || trsp->base_zones == NULL || trsp->nbase_zones == 0)
|
||||||
|
{
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (n = 0; n < cli->nbase_zones; n++) {
|
for (n = 0; n < trsp->nbase_zones; n++) {
|
||||||
if (cli->base_zones[n] == BASE_ZONE_ANY ||
|
if (trsp->base_zones[n] == BASE_ZONE_ANY ||
|
||||||
cli->base_zones[n] == zone)
|
trsp->base_zones[n] == zone)
|
||||||
{
|
{
|
||||||
return (true);
|
return (true);
|
||||||
}
|
}
|
||||||
@@ -233,7 +237,6 @@ has_base_zone(trpz_client_t *cli, ssize_t zone) {
|
|||||||
static bool
|
static bool
|
||||||
pack_soa_record(unsigned char *rdatap, size_t rbufsz, size_t *rdlenp,
|
pack_soa_record(unsigned char *rdatap, size_t rbufsz, size_t *rdlenp,
|
||||||
const rpz_soa_t *psoa) {
|
const rpz_soa_t *psoa) {
|
||||||
uint32_t *uptr = NULL;
|
|
||||||
size_t needed = (sizeof(uint32_t) * 5) + strlen(psoa->mname) + 2 +
|
size_t needed = (sizeof(uint32_t) * 5) + strlen(psoa->mname) + 2 +
|
||||||
strlen(psoa->rname) + 2;
|
strlen(psoa->rname) + 2;
|
||||||
size_t mlen = 0, rlen = 0, used = 0;
|
size_t mlen = 0, rlen = 0, used = 0;
|
||||||
@@ -254,22 +257,29 @@ pack_soa_record(unsigned char *rdatap, size_t rbufsz, size_t *rdlenp,
|
|||||||
|
|
||||||
used = rlen + mlen;
|
used = rlen + mlen;
|
||||||
|
|
||||||
uptr = (uint32_t *)(rdatap + rlen + mlen);
|
rdatap += rlen + mlen;
|
||||||
*uptr++ = htonl(psoa->serial);
|
ISC_U32TO8_BE(rdatap, psoa->serial);
|
||||||
*uptr++ = htonl(psoa->refresh);
|
rdatap += 4;
|
||||||
*uptr++ = htonl(psoa->retry);
|
ISC_U32TO8_BE(rdatap, psoa->refresh);
|
||||||
*uptr++ = htonl(psoa->expire);
|
rdatap += 4;
|
||||||
*uptr++ = htonl(psoa->minimum);
|
ISC_U32TO8_BE(rdatap, psoa->retry);
|
||||||
|
rdatap += 4;
|
||||||
|
ISC_U32TO8_BE(rdatap, psoa->expire);
|
||||||
|
rdatap += 4;
|
||||||
|
ISC_U32TO8_BE(rdatap, psoa->minimum);
|
||||||
|
rdatap += 4;
|
||||||
|
used += (4 * 5);
|
||||||
|
|
||||||
used += (sizeof(uint32_t) * 5);
|
if (rdlenp != NULL) {
|
||||||
|
|
||||||
if (rdlenp) {
|
|
||||||
*rdlenp = used;
|
*rdlenp = used;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (true);
|
return (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_log(librpz_log_level_t level, void *ctx, const char *fmt, va_list args)
|
||||||
|
LIBRPZ_PF(3, 0);
|
||||||
static void
|
static void
|
||||||
do_log(librpz_log_level_t level, void *ctx, const char *fmt, va_list args) {
|
do_log(librpz_log_level_t level, void *ctx, const char *fmt, va_list args) {
|
||||||
if (level > g_log_level) {
|
if (level > g_log_level) {
|
||||||
@@ -363,13 +373,19 @@ trpz_pemsg(librpz_emsg_t *emsg, const char *fmt, ...) {
|
|||||||
static void
|
static void
|
||||||
scan_data_file_for_errors(void *lctx) {
|
scan_data_file_for_errors(void *lctx) {
|
||||||
char *updfile = NULL, *fname = NULL, *last = NULL;
|
char *updfile = NULL, *fname = NULL, *last = NULL;
|
||||||
|
char *tmp = NULL;
|
||||||
|
|
||||||
updfile = getenv("DNSRPS_TEST_UPDATE_FILE");
|
updfile = getenv("DNSRPS_TEST_UPDATE_FILE");
|
||||||
if (updfile == NULL) {
|
if (updfile == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fname = strtok_r(updfile, ":", &last);
|
tmp = strdup(updfile);
|
||||||
|
if (tmp == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fname = strtok_r(tmp, ":", &last);
|
||||||
|
|
||||||
while (fname) {
|
while (fname) {
|
||||||
char *errp = NULL;
|
char *errp = NULL;
|
||||||
@@ -378,12 +394,13 @@ scan_data_file_for_errors(void *lctx) {
|
|||||||
ret = sanity_check_data_file(fname, &errp);
|
ret = sanity_check_data_file(fname, &errp);
|
||||||
|
|
||||||
if ((ret < 0) && errp) {
|
if ((ret < 0) && errp) {
|
||||||
trpz_log(LIBRPZ_LOG_ERROR, lctx, errp);
|
trpz_log(LIBRPZ_LOG_ERROR, lctx, "%s", errp);
|
||||||
free(errp);
|
free(errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
fname = strtok_r(NULL, ":", &last);
|
fname = strtok_r(NULL, ":", &last);
|
||||||
}
|
}
|
||||||
|
free(tmp);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -683,8 +700,10 @@ trpz_client_create(librpz_emsg_t *emsg, librpz_clist_t *clist, const char *cstr,
|
|||||||
void
|
void
|
||||||
trpz_client_detach(librpz_client_t **clientp) {
|
trpz_client_detach(librpz_client_t **clientp) {
|
||||||
if (clientp != NULL && *clientp != NULL) {
|
if (clientp != NULL && *clientp != NULL) {
|
||||||
librpz_client_t *client = *clientp;
|
trpz_client_t *client = (trpz_client_t *)(*clientp);
|
||||||
*clientp = NULL;
|
if (client->cstr != NULL) {
|
||||||
|
free(client->cstr);
|
||||||
|
}
|
||||||
free(client);
|
free(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -700,12 +719,18 @@ trpz_client_detach(librpz_client_t **clientp) {
|
|||||||
static int
|
static int
|
||||||
apply_all_updates(trpz_rsp_t *trsp) {
|
apply_all_updates(trpz_rsp_t *trsp) {
|
||||||
char *updfile = NULL, *fname = NULL, *last = NULL;
|
char *updfile = NULL, *fname = NULL, *last = NULL;
|
||||||
|
char *tmp = NULL;
|
||||||
|
|
||||||
updfile = getenv("DNSRPS_TEST_UPDATE_FILE");
|
updfile = getenv("DNSRPS_TEST_UPDATE_FILE");
|
||||||
if (updfile == NULL) {
|
if (updfile == NULL) {
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tmp = strdup(updfile);
|
||||||
|
if (tmp == NULL) {
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
fname = strtok_r(updfile, ":", &last);
|
fname = strtok_r(updfile, ":", &last);
|
||||||
while (fname != NULL) {
|
while (fname != NULL) {
|
||||||
char *errp = NULL;
|
char *errp = NULL;
|
||||||
@@ -715,17 +740,19 @@ apply_all_updates(trpz_rsp_t *trsp) {
|
|||||||
&trsp->num_nodes, &trsp->all_zones,
|
&trsp->num_nodes, &trsp->all_zones,
|
||||||
&trsp->num_zones, &errp);
|
&trsp->num_zones, &errp);
|
||||||
|
|
||||||
if (errp) {
|
if (errp != NULL) {
|
||||||
fprintf(stderr, "Error loading updates: %s\n", errp);
|
fprintf(stderr, "Error loading updates: %s\n", errp);
|
||||||
free(errp);
|
free(errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
free(tmp);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
fname = strtok_r(NULL, ":", &last);
|
fname = strtok_r(NULL, ":", &last);
|
||||||
}
|
}
|
||||||
|
free(tmp);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@@ -747,6 +774,12 @@ clear_all_updates(trpz_rsp_t *trsp) {
|
|||||||
size_t n;
|
size_t n;
|
||||||
|
|
||||||
for (n = 0; n < trsp->num_nodes; n++) {
|
for (n = 0; n < trsp->num_nodes; n++) {
|
||||||
|
if (trsp->all_nodes[n].canonical != NULL) {
|
||||||
|
free(trsp->all_nodes[n].canonical);
|
||||||
|
}
|
||||||
|
if (trsp->all_nodes[n].dname != NULL) {
|
||||||
|
free(trsp->all_nodes[n].dname);
|
||||||
|
}
|
||||||
if (trsp->all_nodes[n].rrs) {
|
if (trsp->all_nodes[n].rrs) {
|
||||||
size_t m;
|
size_t m;
|
||||||
|
|
||||||
@@ -806,24 +839,29 @@ trpz_rsp_create(librpz_emsg_t *emsg, librpz_rsp_t **rspp, int *min_ns_dotsp,
|
|||||||
result->stack_idx = 1;
|
result->stack_idx = 1;
|
||||||
result->last_zone = -1;
|
result->last_zone = -1;
|
||||||
|
|
||||||
*rspp = (librpz_rsp_t *)result;
|
assert(*rspp == NULL);
|
||||||
|
|
||||||
clear_all_updates(result);
|
clear_all_updates(result);
|
||||||
cli->base_zones = get_cstr_zones(cli->cstr, result,
|
result->base_zones = get_cstr_zones(cli->cstr, result,
|
||||||
&(cli->nbase_zones));
|
&(result->nbase_zones));
|
||||||
|
|
||||||
if (cli->base_zones == NULL) {
|
if (result->base_zones == NULL) {
|
||||||
trpz_pemsg(emsg, "no valid policy zone specified");
|
trpz_pemsg(emsg, "no valid policy zone specified");
|
||||||
free(*rspp);
|
clear_all_updates(result);
|
||||||
*rspp = NULL;
|
free(result);
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (apply_all_updates(result) < 0) {
|
if (apply_all_updates(result) < 0) {
|
||||||
trpz_pemsg(emsg, "internal error loading test data 1");
|
trpz_pemsg(emsg, "internal error loading test data 1");
|
||||||
|
clear_all_updates(result);
|
||||||
|
free(result->base_zones);
|
||||||
|
free(result);
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*rspp = (librpz_rsp_t *)result;
|
||||||
|
|
||||||
return (true);
|
return (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -890,13 +928,14 @@ trpz_rsp_pop_discard(librpz_emsg_t *emsg, librpz_rsp_t *rsp) {
|
|||||||
|
|
||||||
void
|
void
|
||||||
trpz_rsp_detach(librpz_rsp_t **rspp) {
|
trpz_rsp_detach(librpz_rsp_t **rspp) {
|
||||||
if (rspp && *rspp) {
|
if (rspp != NULL && *rspp != NULL) {
|
||||||
trpz_rsp_t *trsp = (trpz_rsp_t *)*rspp;
|
trpz_rsp_t *trsp = (trpz_rsp_t *)*rspp;
|
||||||
|
|
||||||
clear_all_updates(trsp);
|
|
||||||
|
|
||||||
free(*rspp);
|
|
||||||
*rspp = NULL;
|
*rspp = NULL;
|
||||||
|
clear_all_updates(trsp);
|
||||||
|
if (trsp->base_zones != NULL) {
|
||||||
|
free(trsp->base_zones);
|
||||||
|
}
|
||||||
|
free(trsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -1059,11 +1098,7 @@ trpz_rsp_soa(librpz_emsg_t *emsg, uint32_t *ttlp, librpz_rr_t **rrp,
|
|||||||
|
|
||||||
rres->rdlength = htons(rdlen);
|
rres->rdlength = htons(rdlen);
|
||||||
|
|
||||||
if (rrp) {
|
if (origin != NULL) {
|
||||||
*rrp = rres;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (origin) {
|
|
||||||
uint8_t *buf = NULL;
|
uint8_t *buf = NULL;
|
||||||
int nbytes;
|
int nbytes;
|
||||||
|
|
||||||
@@ -1079,6 +1114,12 @@ trpz_rsp_soa(librpz_emsg_t *emsg, uint32_t *ttlp, librpz_rr_t **rrp,
|
|||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rrp != NULL) {
|
||||||
|
*rrp = rres;
|
||||||
|
} else {
|
||||||
|
free(rdbuf);
|
||||||
|
}
|
||||||
|
|
||||||
return (true);
|
return (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1285,7 +1326,7 @@ trpz_ck_domain(librpz_emsg_t *emsg, const uint8_t *domain, size_t domain_size,
|
|||||||
trsp->all_zones[trsp->all_nodes[n].result.dznum]
|
trsp->all_zones[trsp->all_nodes[n].result.dznum]
|
||||||
.not_recursive_only ||
|
.not_recursive_only ||
|
||||||
recursed) &&
|
recursed) &&
|
||||||
has_base_zone(trsp->client,
|
has_base_zone(trsp,
|
||||||
trsp->all_nodes[n].result.dznum) &&
|
trsp->all_nodes[n].result.dznum) &&
|
||||||
!trsp->all_zones[trsp->all_nodes[n].result.dznum]
|
!trsp->all_zones[trsp->all_nodes[n].result.dznum]
|
||||||
.forgotten)
|
.forgotten)
|
||||||
@@ -1316,7 +1357,7 @@ trpz_ck_domain(librpz_emsg_t *emsg, const uint8_t *domain, size_t domain_size,
|
|||||||
{
|
{
|
||||||
if (recursed &&
|
if (recursed &&
|
||||||
has_base_zone(
|
has_base_zone(
|
||||||
trsp->client,
|
trsp,
|
||||||
trsp->all_nodes[n].result.dznum) &&
|
trsp->all_nodes[n].result.dznum) &&
|
||||||
!trsp->all_zones[trsp->all_nodes[n]
|
!trsp->all_zones[trsp->all_nodes[n]
|
||||||
.result.dznum]
|
.result.dznum]
|
||||||
@@ -1508,7 +1549,7 @@ address_cmp(const char *addrstr, const void *addr, uint family,
|
|||||||
unsigned int nmask = 32;
|
unsigned int nmask = 32;
|
||||||
|
|
||||||
if (family == AF_INET6) {
|
if (family == AF_INET6) {
|
||||||
if (!inet_ntop(AF_INET6, addr, abuf, sizeof(abuf))) {
|
if (inet_ntop(AF_INET6, addr, abuf, sizeof(abuf)) == 0) {
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1525,14 +1566,16 @@ address_cmp(const char *addrstr, const void *addr, uint family,
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
} else if (sscanf(addrstr, "%d.%d.%d.%d", &ipstr[1], &ipstr[2],
|
} else if (sscanf(addrstr, "%d.%d.%d.%d", &ipstr[1], &ipstr[2],
|
||||||
&ipstr[3], &ipstr[4]) != 4)
|
&ipstr[3], &ipstr[4]) != 4)
|
||||||
{
|
{
|
||||||
perror("bad address format");
|
perror("bad address format");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ipstr[1] > 255 || ipstr[2] > 255 || ipstr[3] > 255 ||
|
if (ipstr[1] > 255 || ipstr[2] > 255 || ipstr[3] > 255 ||
|
||||||
ipstr[4] > 255) {
|
ipstr[4] > 255 || ipstr[1] < 0 || ipstr[2] < 0 ||
|
||||||
|
ipstr[3] < 0 || ipstr[4] < 0)
|
||||||
|
{
|
||||||
perror("bad address format");
|
perror("bad address format");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@@ -1550,7 +1593,7 @@ address_cmp(const char *addrstr, const void *addr, uint family,
|
|||||||
memmove(&a2, addr, sizeof(uint32_t));
|
memmove(&a2, addr, sizeof(uint32_t));
|
||||||
m = get_mask(nmask);
|
m = get_mask(nmask);
|
||||||
|
|
||||||
if (pmask) {
|
if (pmask != NULL) {
|
||||||
*pmask = nmask;
|
*pmask = nmask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1562,7 +1605,7 @@ address_cmp(const char *addrstr, const void *addr, uint family,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(addrstr, abuf) == 0) {
|
if (strcmp(addrstr, abuf) == 0) {
|
||||||
if (pmask) {
|
if (pmask != NULL) {
|
||||||
*pmask = nmask;
|
*pmask = nmask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1629,7 +1672,7 @@ trpz_ck_ip(librpz_emsg_t *emsg, const void *addr, uint family,
|
|||||||
trsp->all_zones[trsp->all_nodes[n].result.dznum]
|
trsp->all_zones[trsp->all_nodes[n].result.dznum]
|
||||||
.not_recursive_only ||
|
.not_recursive_only ||
|
||||||
recursed) &&
|
recursed) &&
|
||||||
has_base_zone(trsp->client,
|
has_base_zone(trsp,
|
||||||
trsp->all_nodes[n].result.dznum) &&
|
trsp->all_nodes[n].result.dznum) &&
|
||||||
!trsp->all_zones[trsp->all_nodes[n].result.dznum]
|
!trsp->all_zones[trsp->all_nodes[n].result.dznum]
|
||||||
.forgotten)
|
.forgotten)
|
||||||
@@ -1641,7 +1684,7 @@ trpz_ck_ip(librpz_emsg_t *emsg, const void *addr, uint family,
|
|||||||
|
|
||||||
} else if ((nfidx < 0) && !recursed &&
|
} else if ((nfidx < 0) && !recursed &&
|
||||||
has_base_zone(
|
has_base_zone(
|
||||||
trsp->client,
|
trsp,
|
||||||
trsp->all_nodes[n].result.dznum) &&
|
trsp->all_nodes[n].result.dznum) &&
|
||||||
!trsp->all_zones[trsp->all_nodes[n]
|
!trsp->all_zones[trsp->all_nodes[n]
|
||||||
.result.dznum]
|
.result.dznum]
|
||||||
@@ -1767,14 +1810,14 @@ trpz_soa_serial(librpz_emsg_t *emsg, uint32_t *serialp, const char *domain_nm,
|
|||||||
|
|
||||||
dlen = strlen(domain_nm);
|
dlen = strlen(domain_nm);
|
||||||
|
|
||||||
if (dlen > 0 && domain_nm[dlen - 1] == '.') {
|
if (dlen > 0U && domain_nm[dlen - 1] == '.') {
|
||||||
dlen--;
|
dlen--;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (n = 0; n < trsp->num_zones; n++) {
|
for (n = 0; n < trsp->num_zones; n++) {
|
||||||
if (dlen != strlen(trsp->all_zones[n].name)) {
|
if (dlen != strlen(trsp->all_zones[n].name)) {
|
||||||
continue;
|
continue;
|
||||||
} else if (!has_base_zone(trsp->client, n)) {
|
} else if (!has_base_zone(trsp, n)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1794,20 +1837,20 @@ trpz_soa_serial(librpz_emsg_t *emsg, uint32_t *serialp, const char *domain_nm,
|
|||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static bool
|
||||||
domain_ntop(const u_char *src, char *dst, size_t dstsiz) {
|
domain_ntop(const u_char *src, char *dst, size_t dstsiz) {
|
||||||
const unsigned char *sptr = src;
|
const unsigned char *sptr = src;
|
||||||
char *dptr = dst, *dend = dst + dstsiz;
|
char *dptr = dst, *dend = dst + dstsiz;
|
||||||
|
|
||||||
if (dst == NULL || dstsiz == 0) {
|
if (dst == NULL || dstsiz == 0) {
|
||||||
return (0);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(dst, 0, dstsiz);
|
memset(dst, 0, dstsiz);
|
||||||
|
|
||||||
while (*sptr) {
|
while (*sptr) {
|
||||||
if (((dptr + *sptr) > dend)) {
|
if (((dptr + *sptr) > dend)) {
|
||||||
return (0);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sptr != src) {
|
if (sptr != src) {
|
||||||
@@ -1820,10 +1863,10 @@ domain_ntop(const u_char *src, char *dst, size_t dstsiz) {
|
|||||||
sptr++;
|
sptr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (1);
|
return (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static bool
|
||||||
domain_pton2(const char *src, u_char *dst, size_t dstsiz, size_t *dstlen,
|
domain_pton2(const char *src, u_char *dst, size_t dstsiz, size_t *dstlen,
|
||||||
bool lower) {
|
bool lower) {
|
||||||
unsigned char *dptr = dst;
|
unsigned char *dptr = dst;
|
||||||
@@ -1841,12 +1884,12 @@ domain_pton2(const char *src, u_char *dst, size_t dstsiz, size_t *dstlen,
|
|||||||
tmps = strdup(src);
|
tmps = strdup(src);
|
||||||
if (tmps == NULL) {
|
if (tmps == NULL) {
|
||||||
perror("strdup");
|
perror("strdup");
|
||||||
return (0);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
tptr = tmps;
|
tptr = tmps;
|
||||||
|
|
||||||
if (dstlen) {
|
if (dstlen != NULL) {
|
||||||
*dstlen = 0;
|
*dstlen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1854,31 +1897,33 @@ domain_pton2(const char *src, u_char *dst, size_t dstsiz, size_t *dstlen,
|
|||||||
tok = strsep(&tptr, ".");
|
tok = strsep(&tptr, ".");
|
||||||
|
|
||||||
if (((dptr + strlen(tok) + 1) > dend)) {
|
if (((dptr + strlen(tok) + 1) > dend)) {
|
||||||
return (0);
|
free(tmps);
|
||||||
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
*dptr++ = strlen(tok);
|
*dptr++ = strlen(tok);
|
||||||
memmove(dptr, tok, strlen(tok));
|
memmove(dptr, tok, strlen(tok));
|
||||||
dptr += strlen(tok);
|
dptr += strlen(tok);
|
||||||
|
|
||||||
if (dstlen) {
|
if (dstlen != NULL) {
|
||||||
(*dstlen) += (1 + strlen(tok));
|
(*dstlen) += (1 + strlen(tok));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dptr >= dend) {
|
if (dptr >= dend) {
|
||||||
return (0);
|
free(tmps);
|
||||||
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
*dptr = 0;
|
*dptr = 0;
|
||||||
|
|
||||||
if (dstlen) {
|
if (dstlen != NULL) {
|
||||||
(*dstlen)++;
|
(*dstlen)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(tmps);
|
free(tmps);
|
||||||
|
|
||||||
return (1);
|
return (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX: needs IPv6 support. */
|
/* XXX: needs IPv6 support. */
|
||||||
@@ -2107,7 +2152,7 @@ trpz_rsp_rr(librpz_emsg_t *emsg, uint16_t *typep, uint16_t *classp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (strncmp(tmpexp, "*.", 2) == 0) {
|
if (strncmp(tmpexp, "*.", 2) == 0) {
|
||||||
size_t nrd;
|
int nrd;
|
||||||
uint32_t n = snprintf(
|
uint32_t n = snprintf(
|
||||||
tmpexp3,
|
tmpexp3,
|
||||||
sizeof(tmpexp3),
|
sizeof(tmpexp3),
|
||||||
@@ -2122,6 +2167,13 @@ trpz_rsp_rr(librpz_emsg_t *emsg, uint16_t *typep, uint16_t *classp,
|
|||||||
}
|
}
|
||||||
nrd = wdns_str_to_name(
|
nrd = wdns_str_to_name(
|
||||||
tmpexp3, &nrdata, 1);
|
tmpexp3, &nrdata, 1);
|
||||||
|
if (nrd < 0) {
|
||||||
|
trpz_pemsg(
|
||||||
|
emsg,
|
||||||
|
"Error packing "
|
||||||
|
"domain");
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
to_copy = nrd;
|
to_copy = nrd;
|
||||||
copy_src = nrdata;
|
copy_src = nrdata;
|
||||||
}
|
}
|
||||||
@@ -2133,6 +2185,9 @@ trpz_rsp_rr(librpz_emsg_t *emsg, uint16_t *typep, uint16_t *classp,
|
|||||||
*rrp = calloc(1, needed);
|
*rrp = calloc(1, needed);
|
||||||
if (*rrp == NULL) {
|
if (*rrp == NULL) {
|
||||||
trpz_pemsg(emsg, "calloc: %s", strerror(errno));
|
trpz_pemsg(emsg, "calloc: %s", strerror(errno));
|
||||||
|
if (nrdata != NULL) {
|
||||||
|
free(nrdata);
|
||||||
|
}
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2141,6 +2196,9 @@ trpz_rsp_rr(librpz_emsg_t *emsg, uint16_t *typep, uint16_t *classp,
|
|||||||
(*rrp)->ttl = htonl(this_rr->ttl);
|
(*rrp)->ttl = htonl(this_rr->ttl);
|
||||||
(*rrp)->rdlength = htons(to_copy);
|
(*rrp)->rdlength = htons(to_copy);
|
||||||
memmove((*rrp)->rdata, copy_src, to_copy);
|
memmove((*rrp)->rdata, copy_src, to_copy);
|
||||||
|
if (nrdata != NULL) {
|
||||||
|
free(nrdata);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result->next_rr = this_rr->rrn;
|
result->next_rr = this_rr->rrn;
|
||||||
|
@@ -83,7 +83,7 @@ get_address_info(const char *astr, int *pfamily, char *pbuf,
|
|||||||
unsigned int prefix = 0, values[16] = { 0 }, hex_values[16] = { 0 };
|
unsigned int prefix = 0, values[16] = { 0 }, hex_values[16] = { 0 };
|
||||||
bool is_ipv6 = false;
|
bool is_ipv6 = false;
|
||||||
|
|
||||||
if (!astr || !pfamily || !pbuf) {
|
if (astr == NULL || pfamily == NULL || pbuf == NULL) {
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,7 +164,7 @@ get_address_info(const char *astr, int *pfamily, char *pbuf,
|
|||||||
*/
|
*/
|
||||||
if (*pfamily == AF_INET) {
|
if (*pfamily == AF_INET) {
|
||||||
if (prefix > 32) {
|
if (prefix > 32) {
|
||||||
if (errp) {
|
if (errp != NULL) {
|
||||||
*errp = str_printf(
|
*errp = str_printf(
|
||||||
"invalid rpz IP address \"%s\"; "
|
"invalid rpz IP address \"%s\"; "
|
||||||
"invalid prefix length of %u",
|
"invalid prefix length of %u",
|
||||||
@@ -182,7 +182,7 @@ get_address_info(const char *astr, int *pfamily, char *pbuf,
|
|||||||
size_t n;
|
size_t n;
|
||||||
|
|
||||||
if (prefix > 128) {
|
if (prefix > 128) {
|
||||||
if (errp) {
|
if (errp != NULL) {
|
||||||
*errp = str_printf(
|
*errp = str_printf(
|
||||||
"invalid rpz IP address \"%s\"; "
|
"invalid rpz IP address \"%s\"; "
|
||||||
"invalid prefix length of %u",
|
"invalid prefix length of %u",
|
||||||
@@ -255,7 +255,7 @@ wdns_domain_to_str(const uint8_t *src, size_t src_len, char *dst) {
|
|||||||
size_t bytes_remaining = src_len;
|
size_t bytes_remaining = src_len;
|
||||||
uint8_t oclen;
|
uint8_t oclen;
|
||||||
|
|
||||||
if (!src) {
|
if (src == NULL) {
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -499,6 +499,7 @@ add_other_rr(trpz_result_t *node, const char *rrtype, const char *val,
|
|||||||
rptr->ttl == nrec.ttl && rptr->rdlength == nrec.rdlength &&
|
rptr->ttl == nrec.ttl && rptr->rdlength == nrec.rdlength &&
|
||||||
!memcmp(rptr->rdata, nrec.rdata, nrec.rdlength))
|
!memcmp(rptr->rdata, nrec.rdata, nrec.rdlength))
|
||||||
{
|
{
|
||||||
|
free(nrec.rdata);
|
||||||
return (n + 1);
|
return (n + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -522,7 +523,7 @@ void
|
|||||||
reverse_labels(const char *str, char *pbuf) {
|
reverse_labels(const char *str, char *pbuf) {
|
||||||
const char *sptr = str, *end = NULL;
|
const char *sptr = str, *end = NULL;
|
||||||
|
|
||||||
if (!sptr || !*sptr) {
|
if (sptr == NULL || *sptr == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -565,7 +566,7 @@ parse_zone_options(const char *str) {
|
|||||||
char *tok = NULL, *sptr = NULL;
|
char *tok = NULL, *sptr = NULL;
|
||||||
unsigned long result = 0;
|
unsigned long result = 0;
|
||||||
|
|
||||||
if (!str || !*str) {
|
if (str == NULL || *str == 0) {
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1053,11 +1054,10 @@ static void
|
|||||||
free_nodes(trpz_result_t **presults, size_t *pnresults) {
|
free_nodes(trpz_result_t **presults, size_t *pnresults) {
|
||||||
size_t n, tot;
|
size_t n, tot;
|
||||||
|
|
||||||
if ((!presults || !*presults) && pnresults) {
|
if (presults == NULL || *presults == NULL) {
|
||||||
*pnresults = 0;
|
if (pnresults != NULL) {
|
||||||
}
|
*pnresults = 0;
|
||||||
|
}
|
||||||
if (!presults || !*presults) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1067,21 +1067,21 @@ free_nodes(trpz_result_t **presults, size_t *pnresults) {
|
|||||||
trpz_result_t *res = &((*presults)[n - 1]);
|
trpz_result_t *res = &((*presults)[n - 1]);
|
||||||
size_t m;
|
size_t m;
|
||||||
|
|
||||||
if (res->canonical) {
|
if (res->canonical != NULL) {
|
||||||
free(res->canonical);
|
free(res->canonical);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res->dname) {
|
if (res->dname != NULL) {
|
||||||
free(res->dname);
|
free(res->dname);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (m = 0; m < res->nrrs; m++) {
|
for (m = 0; m < res->nrrs; m++) {
|
||||||
if (res->rrs[m].rdata) {
|
if (res->rrs[m].rdata != NULL) {
|
||||||
free(res->rrs[m].rdata);
|
free(res->rrs[m].rdata);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res->rrs) {
|
if (res->rrs != NULL) {
|
||||||
free(res->rrs);
|
free(res->rrs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1113,7 +1113,7 @@ sanity_check_data_file(const char *fname, char **errp) {
|
|||||||
FILE *f = NULL;
|
FILE *f = NULL;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
|
|
||||||
if (errp) {
|
if (errp != NULL) {
|
||||||
*errp = NULL;
|
*errp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1163,7 +1163,7 @@ sanity_check_data_file(const char *fname, char **errp) {
|
|||||||
} else if (strcasecmp(line, "static") &&
|
} else if (strcasecmp(line, "static") &&
|
||||||
strcasecmp(line, "update"))
|
strcasecmp(line, "update"))
|
||||||
{
|
{
|
||||||
if (errp) {
|
if (errp != NULL) {
|
||||||
*errp = str_printf("Found unknown instruction "
|
*errp = str_printf("Found unknown instruction "
|
||||||
"directive: \"%s\"\n",
|
"directive: \"%s\"\n",
|
||||||
line);
|
line);
|
||||||
@@ -1192,7 +1192,7 @@ sanity_check_data_file(const char *fname, char **errp) {
|
|||||||
strcasecmp(rrbuf, "TXT") && strcasecmp(rrbuf, "DNAME") &&
|
strcasecmp(rrbuf, "TXT") && strcasecmp(rrbuf, "DNAME") &&
|
||||||
strcasecmp(rrbuf, "AAAA"))
|
strcasecmp(rrbuf, "AAAA"))
|
||||||
{
|
{
|
||||||
if (errp) {
|
if (errp != NULL) {
|
||||||
*errp = str_printf("Target \"%s\" is not "
|
*errp = str_printf("Target \"%s\" is not "
|
||||||
"currently supported!\n",
|
"currently supported!\n",
|
||||||
rrbuf);
|
rrbuf);
|
||||||
@@ -1378,12 +1378,20 @@ wdns_str_to_name(const char *str, uint8_t **pbuf, bool downcase) {
|
|||||||
|
|
||||||
if (slen == 1 && *p == '.') {
|
if (slen == 1 && *p == '.') {
|
||||||
*pbuf = malloc(1);
|
*pbuf = malloc(1);
|
||||||
|
if (*pbuf == NULL) {
|
||||||
|
perror("malloc");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
*pbuf[0] = 0;
|
*pbuf[0] = 0;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = 0;
|
res = 0;
|
||||||
*pbuf = malloc(WDNS_MAXLEN_NAME);
|
*pbuf = malloc(WDNS_MAXLEN_NAME);
|
||||||
|
if (*pbuf == NULL) {
|
||||||
|
perror("malloc");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
data = *pbuf;
|
data = *pbuf;
|
||||||
label_len = 0;
|
label_len = 0;
|
||||||
@@ -1394,22 +1402,19 @@ wdns_str_to_name(const char *str, uint8_t **pbuf, bool downcase) {
|
|||||||
c = *p++;
|
c = *p++;
|
||||||
label_len++;
|
label_len++;
|
||||||
|
|
||||||
|
/* Will the wire name become too long? */
|
||||||
|
if (res >= WDNS_MAXLEN_NAME) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (slen == 0) {
|
if (slen == 0) {
|
||||||
/* end of input */
|
/* end of input */
|
||||||
if (res == WDNS_MAXLEN_NAME) {
|
|
||||||
res = -1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
*oclen = --label_len;
|
*oclen = --label_len;
|
||||||
*data++ = '\0';
|
*data++ = '\0';
|
||||||
res++;
|
res++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res >= WDNS_MAXLEN_NAME) {
|
|
||||||
res = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c >= 'A' && c <= 'Z') {
|
if (c >= 'A' && c <= 'Z') {
|
||||||
/* an upper case letter; downcase it */
|
/* an upper case letter; downcase it */
|
||||||
if (downcase) {
|
if (downcase) {
|
||||||
@@ -1420,7 +1425,6 @@ wdns_str_to_name(const char *str, uint8_t **pbuf, bool downcase) {
|
|||||||
} else if (c == '\\' && !isdigit(*p)) {
|
} else if (c == '\\' && !isdigit(*p)) {
|
||||||
/* an escaped character */
|
/* an escaped character */
|
||||||
if (slen <= 0) {
|
if (slen <= 0) {
|
||||||
res = -1;
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
*data++ = *p;
|
*data++ = *p;
|
||||||
@@ -1480,5 +1484,6 @@ wdns_str_to_name(const char *str, uint8_t **pbuf, bool downcase) {
|
|||||||
|
|
||||||
out:
|
out:
|
||||||
free(*pbuf);
|
free(*pbuf);
|
||||||
|
*pbuf = NULL;
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
@@ -227,14 +227,15 @@ typedef struct {
|
|||||||
typedef bool(librpz_parse_log_opt_t)(librpz_emsg_t *emsg, const char *arg);
|
typedef bool(librpz_parse_log_opt_t)(librpz_emsg_t *emsg, const char *arg);
|
||||||
LIBDEF_F(parse_log_opt)
|
LIBDEF_F(parse_log_opt)
|
||||||
|
|
||||||
typedef void(librpz_vpemsg_t)(librpz_emsg_t *emsg, const char *p, va_list args);
|
typedef void(librpz_vpemsg_t)(librpz_emsg_t *emsg, const char *p, va_list args)
|
||||||
|
LIBRPZ_PF(2, 0);
|
||||||
LIBDEF_F(vpemsg)
|
LIBDEF_F(vpemsg)
|
||||||
typedef void(librpz_pemsg_t)(librpz_emsg_t *emsg, const char *p, ...)
|
typedef void(librpz_pemsg_t)(librpz_emsg_t *emsg, const char *p, ...)
|
||||||
LIBRPZ_PF(2, 3);
|
LIBRPZ_PF(2, 3);
|
||||||
LIBDEF_F(pemsg)
|
LIBDEF_F(pemsg)
|
||||||
|
|
||||||
typedef void(librpz_vlog_t)(librpz_log_level_t level, void *ctx, const char *p,
|
typedef void(librpz_vlog_t)(librpz_log_level_t level, void *ctx, const char *p,
|
||||||
va_list args);
|
va_list args) LIBRPZ_PF(3, 0);
|
||||||
LIBDEF_F(vlog)
|
LIBDEF_F(vlog)
|
||||||
typedef void(librpz_log_t)(librpz_log_level_t level, void *ctx, const char *p,
|
typedef void(librpz_log_t)(librpz_log_level_t level, void *ctx, const char *p,
|
||||||
...) LIBRPZ_PF(3, 4);
|
...) LIBRPZ_PF(3, 4);
|
||||||
|
Reference in New Issue
Block a user