Add DEBUG_PRINTF to stand.h

stand/ is mostly debugged with printfs, in an ad hoc and sometimes
fragile manner. For example BOOTP_DEBUG in bootp.c cannot be defined
unless NETIF_DEBUG is defined in dev_net.c or build fails for lack of the
symbol debug.

The DEBUG_PRINTF implementation in stand.h addresses that and allows
for more control over debug output.  It is compatible with the
usage in libsecureboot.

Simply define _DEBUG_LEVEL to the desired level of debug
or in the case of libsecureboot _DEBUG_LEVEL_VAR to the variable that
will hold that value - default is _debug which is static so each
translation unit can be controlled independently.

The 1st arg to DEBUG_PRINTF is a level which must be greater than or
equal to _DEBUG_LEVEL_VAR if the printf is to be called.
See libsecureboot for more examples.

Reviewed by:	imp
Sponsored by:	Juniper Networks, Inc.
Differential Revision:	https://reviews.freebsd.org/D51269
This commit is contained in:
Simon J. Gerraty 2025-07-17 16:36:17 -07:00
parent 5a846c48f2
commit e67aef4190
5 changed files with 68 additions and 114 deletions

View file

@ -29,6 +29,7 @@
#include <sys/param.h>
#ifdef _STANDALONE
#define _DEBUG_LEVEL_VAR DebugVe
#include <stand.h>
#else
#include <sys/types.h>

View file

@ -66,10 +66,6 @@
#include "dev_net.h"
#include "bootstrap.h"
#ifdef NETIF_DEBUG
int debug = 0;
#endif
static char *netdev_name;
static int netdev_sock = -1;
static int netdev_opens;
@ -143,11 +139,8 @@ net_open(struct open_file *f, ...)
return (ENXIO);
}
netdev_name = strdup(devname);
#ifdef NETIF_DEBUG
if (debug)
printf("%s: netif_open() succeeded\n",
__func__);
#endif
DEBUG_PRINTF(1,("%s: netif_open() succeeded %#x\n",
__func__, rootip.s_addr));
}
/*
* If network params were not set by netif_open(), try to get
@ -200,10 +193,7 @@ net_close(struct open_file *f)
{
struct devdesc *dev;
#ifdef NETIF_DEBUG
if (debug)
printf("%s: opens=%d\n", __func__, netdev_opens);
#endif
DEBUG_PRINTF(1,("%s: opens=%d\n", __func__, netdev_opens));
dev = f->f_devdata;
dev->d_opendata = NULL;
@ -216,10 +206,7 @@ net_cleanup(void)
{
if (netdev_sock >= 0) {
#ifdef NETIF_DEBUG
if (debug)
printf("%s: calling netif_close()\n", __func__);
#endif
DEBUG_PRINTF(1,("%s: calling netif_close()\n", __func__));
rootip.s_addr = 0;
free(netdev_name);
netif_close(netdev_sock);
@ -271,10 +258,7 @@ net_getparams(int sock)
bootp(sock);
if (myip.s_addr != 0)
goto exit;
#ifdef NETIF_DEBUG
if (debug)
printf("%s: BOOTP failed, trying RARP/RPC...\n", __func__);
#endif
DEBUG_PRINTF(1,("%s: BOOTP failed, trying RARP/RPC...\n", __func__));
#endif
/*
@ -292,10 +276,7 @@ net_getparams(int sock)
printf("%s: bootparam/whoami RPC failed\n", __func__);
return (EIO);
}
#ifdef NETIF_DEBUG
if (debug)
printf("%s: client name: %s\n", __func__, hostname);
#endif
DEBUG_PRINTF(1,("%s: client name: %s\n", __func__, hostname));
/*
* Ignore the gateway from whoami (unreliable).
@ -309,16 +290,12 @@ net_getparams(int sock)
}
if (smask) {
netmask = smask;
#ifdef NETIF_DEBUG
if (debug)
printf("%s: subnet mask: %s\n", __func__,
intoa(netmask));
#endif
DEBUG_PRINTF(1,("%s: subnet mask: %s\n", __func__,
intoa(netmask)));
}
#ifdef NETIF_DEBUG
if (gateip.s_addr && debug)
printf("%s: net gateway: %s\n", __func__, inet_ntoa(gateip));
#endif
if (gateip.s_addr)
DEBUG_PRINTF(1,("%s: net gateway: %s\n", __func__,
inet_ntoa(gateip)));
/* Get the root server and pathname. */
if (bp_getfile(sock, "root", &rootip, rootpath)) {
@ -329,12 +306,10 @@ exit:
if ((rootaddr = net_parse_rootpath()) != INADDR_NONE)
rootip.s_addr = rootaddr;
#ifdef NETIF_DEBUG
if (debug) {
printf("%s: server addr: %s\n", __func__, inet_ntoa(rootip));
printf("%s: server path: %s\n", __func__, rootpath);
}
#endif
DEBUG_PRINTF(1,("%s: proto: %d\n", __func__, netproto));
DEBUG_PRINTF(1,("%s: server addr: %s\n", __func__, inet_ntoa(rootip)));
DEBUG_PRINTF(1,("%s: server port: %d\n", __func__, rootport));
DEBUG_PRINTF(1,("%s: server path: %s\n", __func__, rootpath));
return (0);
}
@ -410,6 +385,8 @@ net_parse_rootpath(void)
(void)strsep(&ptr, ":");
if (ptr != NULL) {
addr = inet_addr(rootpath);
DEBUG_PRINTF(1,("rootpath=%s addr=%#x\n",
rootpath, addr));
bcopy(ptr, rootpath, strlen(ptr) + 1);
}
} else {

View file

@ -42,7 +42,6 @@
#include <string.h>
#define BOOTP_DEBUGxx
#define SUPPORT_DHCP
#define DHCP_ENV_NOVENDOR 1 /* do not parse vendor options */
@ -130,10 +129,7 @@ bootp(int sock)
} wbuf;
struct bootp *rbootp;
#ifdef BOOTP_DEBUG
if (debug)
printf("bootp: socket=%d\n", sock);
#endif
DEBUG_PRINTF(1, ("bootp: socket=%d\n", sock));
if (!bot)
bot = getsecs();
@ -141,10 +137,7 @@ bootp(int sock)
printf("bootp: bad socket. %d\n", sock);
return;
}
#ifdef BOOTP_DEBUG
if (debug)
printf("bootp: d=%lx\n", (long)d);
#endif
DEBUG_PRINTF(1, ("bootp: socktodesc=%lx\n", (long)d));
bp = &wbuf.wbootp;
bzero(bp, sizeof(*bp));
@ -225,31 +218,20 @@ bootp(int sock)
netmask = htonl(IN_CLASSB_NET);
else
netmask = htonl(IN_CLASSC_NET);
#ifdef BOOTP_DEBUG
if (debug)
printf("'native netmask' is %s\n", intoa(netmask));
#endif
DEBUG_PRINTF(1, ("'native netmask' is %s\n", intoa(netmask)));
}
#ifdef BOOTP_DEBUG
if (debug)
printf("mask: %s\n", intoa(netmask));
#endif
DEBUG_PRINTF(1,("rootip: %s\n", inet_ntoa(rootip)));
DEBUG_PRINTF(1,("mask: %s\n", intoa(netmask)));
/* We need a gateway if root is on a different net */
if (!SAMENET(myip, rootip, netmask)) {
#ifdef BOOTP_DEBUG
if (debug)
printf("need gateway for root ip\n");
#endif
DEBUG_PRINTF(1,("need gateway for root ip\n"));
}
/* Toss gateway if on a different net */
if (!SAMENET(myip, gateip, netmask)) {
#ifdef BOOTP_DEBUG
if (debug)
printf("gateway ip (%s) bad\n", inet_ntoa(gateip));
#endif
DEBUG_PRINTF(1,("gateway ip (%s) bad\n", inet_ntoa(gateip)));
gateip.s_addr = 0;
}
@ -264,18 +246,11 @@ bootpsend(struct iodesc *d, void *pkt, size_t len)
{
struct bootp *bp;
#ifdef BOOTP_DEBUG
if (debug)
printf("bootpsend: d=%lx called.\n", (long)d);
#endif
DEBUG_PRINTF(1,("bootpsend: d=%lx called.\n", (long)d));
bp = pkt;
bp->bp_secs = htons((u_short)(getsecs() - bot));
#ifdef BOOTP_DEBUG
if (debug)
printf("bootpsend: calling sendudp\n");
#endif
DEBUG_PRINTF(1,("bootpsend: calling sendudp\n"));
return (sendudp(d, pkt, len));
}
@ -288,34 +263,22 @@ bootprecv(struct iodesc *d, void **pkt, void **payload, time_t tleft,
struct bootp *bp;
void *ptr;
#ifdef BOOTP_DEBUG
if (debug)
printf("bootp_recvoffer: called\n");
#endif
DEBUG_PRINTF(1,("bootp_recvoffer: called\n"));
ptr = NULL;
n = readudp(d, &ptr, (void **)&bp, tleft);
if (n == -1 || n < sizeof(struct bootp) - BOOTP_VENDSIZE)
goto bad;
#ifdef BOOTP_DEBUG
if (debug)
printf("bootprecv: checked. bp = %p, n = %zd\n", bp, n);
#endif
DEBUG_PRINTF(1,("bootprecv: checked. bp = %p, n = %zd\n", bp, n));
if (bp->bp_xid != htonl(d->xid)) {
#ifdef BOOTP_DEBUG
if (debug) {
printf("bootprecv: expected xid 0x%lx, got 0x%x\n",
d->xid, ntohl(bp->bp_xid));
}
#endif
DEBUG_PRINTF(1,("bootprecv: expected xid 0x%lx, got 0x%x\n",
d->xid, ntohl(bp->bp_xid)));
goto bad;
}
#ifdef BOOTP_DEBUG
if (debug)
printf("bootprecv: got one!\n");
#endif
DEBUG_PRINTF(1,("bootprecv: got one!\n"));
/* Suck out vendor info */
if (bcmp(vm_rfc1048, bp->bp_vend, sizeof(vm_rfc1048)) == 0) {
@ -359,10 +322,7 @@ vend_rfc1048(u_char *cp, u_int len)
u_char tag;
const char *val;
#ifdef BOOTP_DEBUG
if (debug)
printf("vend_rfc1048 bootp info. len=%d\n", len);
#endif
DEBUG_PRINTF(1,("vend_rfc1048 bootp info. len=%d\n", len));
ep = cp + len;
/* Step over magic cookie */
@ -443,10 +403,8 @@ vend_cmu(u_char *cp)
{
struct cmu_vend *vp;
#ifdef BOOTP_DEBUG
if (debug)
printf("vend_cmu bootp info.\n");
#endif
DEBUG_PRINTF(1,("vend_cmu bootp info.\n"));
vp = (struct cmu_vend *)cp;
if (vp->v_smask.s_addr != 0) {

View file

@ -31,12 +31,6 @@
#include <string.h>
#include <zlib.h>
#ifdef PKGFS_DEBUG
#define DBG(x) printf x
#else
#define DBG(x)
#endif
static int pkg_open(const char *, struct open_file *);
static int pkg_close(struct open_file *);
static int pkg_read(struct open_file *, void *, size_t, size_t *);
@ -172,6 +166,9 @@ pkgfs_init(const char *pkgname, struct fs_ops *proto)
exclusive_file_system = NULL;
DEBUG_PRINTF(0, ("%s(%s: '%s') -> %d (error=%d)\n", __func__,
proto->fs_name, pkgname, fd, errno));
if (fd == -1)
return (errno);
@ -239,7 +236,7 @@ pkg_open_follow(const char *fn, struct open_file *f, int lnks)
if (strcmp(fn, tf->tf_hdr.ut_name) == 0) {
f->f_fsdata = tf;
tf->tf_fp = 0; /* Reset the file pointer. */
DBG(("%s: found %s type %c\n", __func__,
DEBUG_PRINTF(1, ("%s: found %s type %c\n", __func__,
fn, tf->tf_hdr.ut_typeflag[0]));
if (tf->tf_hdr.ut_typeflag[0] == '2') {
/* we have a symlink
@ -275,6 +272,7 @@ pkg_close(struct open_file *f)
/*
* Free up the cache if we read all of the file.
*/
DEBUG_PRINTF(1, ("%s(%s)\n", __func__, tf->tf_hdr.ut_name));
if (tf->tf_fp == tf->tf_size && tf->tf_cachesz > 0) {
free(tf->tf_cache);
tf->tf_cachesz = 0;
@ -297,6 +295,8 @@ pkg_read(struct open_file *f, void *buf, size_t size, size_t *res)
return (EBADF);
}
DEBUG_PRINTF(4, ("%s(%s,%zd)\n", __func__, tf->tf_hdr.ut_name, size));
if (tf->tf_cachesz == 0)
cache_data(tf, 1);
@ -334,6 +334,8 @@ pkg_read(struct open_file *f, void *buf, size_t size, size_t *res)
tf->tf_fp = fp;
if (res != NULL)
*res = size;
DEBUG_PRINTF(4, ("%s(%s) res=%zd\n", __func__, tf->tf_hdr.ut_name,
(ssize_t)(tf->tf_size - tf->tf_fp)));
return ((sz == -1) ? errno : 0);
}
@ -377,7 +379,7 @@ pkg_seek(struct open_file *f, off_t ofs, int whence)
return (tf->tf_fp);
}
}
DBG(("%s: negative file seek (%jd)\n", __func__,
DEBUG_PRINTF(3, ("%s: negative file seek (%jd)\n", __func__,
(intmax_t)delta));
errno = ESPIPE;
return (-1);
@ -511,26 +513,28 @@ cache_data(struct tarfile *tf, int force)
size_t sz;
if (tf == NULL) {
DBG(("%s: no file to cache data for?\n", __func__));
DEBUG_PRINTF(5, ("%s: no file to cache data for?\n",
__func__));
errno = EINVAL;
return (-1);
}
pkg = tf->tf_pkg;
if (pkg == NULL) {
DBG(("%s: no package associated with file?\n", __func__));
DEBUG_PRINTF(5, ("%s: no package associated with file?\n",
__func__));
errno = EINVAL;
return (-1);
}
if (tf->tf_cachesz > 0) {
DBG(("%s: data already cached\n", __func__));
DEBUG_PRINTF(5, ("%s: data already cached\n", __func__));
errno = EINVAL;
return (-1);
}
if (tf->tf_ofs != pkg->pkg_ofs) {
DBG(("%s: caching after force read of file %s?\n",
DEBUG_PRINTF(5, ("%s: caching after force read of file %s?\n",
__func__, tf->tf_hdr.ut_name));
errno = EINVAL;
return (-1);
@ -548,7 +552,8 @@ cache_data(struct tarfile *tf, int force)
tf->tf_cache = malloc(sz);
if (tf->tf_cache == NULL) {
DBG(("%s: could not allocate %d bytes\n", __func__, (int)sz));
DEBUG_PRINTF(5, ("%s: could not allocate %d bytes\n",
__func__, (int)sz));
errno = ENOMEM;
return (-1);
}
@ -732,7 +737,7 @@ new_package(int fd, struct package **pp)
}
/*
* Done parsing the ZIP header. Spkgt the inflation engine.
* Done parsing the ZIP header. Start the inflation engine.
*/
error = inflateInit2(&pkg->pkg_zs, -15);
if (error != Z_OK)

View file

@ -558,4 +558,17 @@ void tslog_getbuf(void ** buf, size_t * len);
__END_DECLS
/* define _DEBUG_LEVEL n or _DEBUG_LEVEL_VAR before include */
#ifndef DEBUG_PRINTF
# if defined(_DEBUG_LEVEL) || defined(_DEBUG_LEVEL_VAR)
# ifndef _DEBUG_LEVEL_VAR
# define _DEBUG_LEVEL_VAR _debug
static int _debug = _DEBUG_LEVEL;
# endif
# define DEBUG_PRINTF(n, args) if (_DEBUG_LEVEL_VAR >= n) printf args
# else
# define DEBUG_PRINTF(n, args)
# endif
#endif
#endif /* STAND_H */