Home | History | Annotate | Line # | Download | only in include
      1 /*	$NetBSD: am_utils.h,v 1.2 2015/10/14 16:00:17 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1997-2014 Erez Zadok
      5  * Copyright (c) 1990 Jan-Simon Pendry
      6  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
      7  * Copyright (c) 1990 The Regents of the University of California.
      8  * All rights reserved.
      9  *
     10  * This code is derived from software contributed to Berkeley by
     11  * Jan-Simon Pendry at Imperial College, London.
     12  *
     13  * Redistribution and use in source and binary forms, with or without
     14  * modification, are permitted provided that the following conditions
     15  * are met:
     16  * 1. Redistributions of source code must retain the above copyright
     17  *    notice, this list of conditions and the following disclaimer.
     18  * 2. Redistributions in binary form must reproduce the above copyright
     19  *    notice, this list of conditions and the following disclaimer in the
     20  *    documentation and/or other materials provided with the distribution.
     21  * 3. Neither the name of the University nor the names of its contributors
     22  *    may be used to endorse or promote products derived from this software
     23  *    without specific prior written permission.
     24  *
     25  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     35  * SUCH DAMAGE.
     36  *
     37  *
     38  * File: am-utils/include/am_utils.h
     39  *
     40  */
     41 
     42 /*
     43  * Definitions that are specific to the am-utils package.
     44  */
     45 
     46 #ifndef _AM_UTILS_H
     47 #define _AM_UTILS_H
     48 
     49 
     50 #include "aux_conf.h"
     51 
     52 /**************************************************************************/
     53 /*** MACROS								***/
     54 /**************************************************************************/
     55 
     56 #if !defined(__syslog_attribute__) && !defined(__syslog__)
     57 #define __syslog__ __printf__
     58 #endif
     59 
     60 /*
     61  * General macros.
     62  */
     63 #ifndef FALSE
     64 # define FALSE 0
     65 #endif /* not FALSE */
     66 #ifndef TRUE
     67 # define TRUE 1
     68 #endif /* not TRUE */
     69 #ifndef MAX
     70 # define MAX(a, b)	((a) > (b) ? (a) : (b))
     71 #endif /* not MAX */
     72 #ifndef MIN
     73 # define MIN(a, b)	((a) < (b) ? (a) : (b))
     74 #endif /* not MIN */
     75 
     76 #define	ONE_HOUR	(60 * 60)	/* One hour in seconds */
     77 
     78 #ifndef MAXHOSTNAMELEN
     79 # ifdef HOSTNAMESZ
     80 #  define MAXHOSTNAMELEN HOSTNAMESZ
     81 # else /* not HOSTNAMESZ */
     82 #  define MAXHOSTNAMELEN 256
     83 # endif /* not HOSTNAMESZ */
     84 #endif /* not MAXHOSTNAMELEN */
     85 
     86 /*
     87  * for hlfsd, and amd for detecting uid/gid
     88  */
     89 #ifndef INVALIDID
     90 /* this is also defined in include/am_utils.h */
     91 # define INVALIDID	(((unsigned short) ~0) - 3)
     92 #endif /* not INVALIDID */
     93 
     94 /*
     95  * String comparison macros
     96  */
     97 #define STREQ(s1, s2)		(strcmp((s1), (s2)) == 0)
     98 #define STRCEQ(s1, s2)		(strcasecmp((s1), (s2)) == 0)
     99 #define NSTREQ(s1, s2, n)	(strncmp((s1), (s2), (n)) == 0)
    100 #define NSTRCEQ(s1, s2, n)	(strncasecmp((s1), (s2), (n)) == 0)
    101 #define FSTREQ(s1, s2)		((*(s1) == *(s2)) && STREQ((s1),(s2)))
    102 
    103 /*
    104  * Logging options/flags
    105  */
    106 #define	XLOG_FATAL	0x0001
    107 #define	XLOG_ERROR	0x0002
    108 #define	XLOG_USER	0x0004
    109 #define	XLOG_WARNING	0x0008
    110 #define	XLOG_INFO	0x0010
    111 #define	XLOG_DEBUG	0x0020
    112 #define	XLOG_MAP	0x0040
    113 #define	XLOG_STATS	0x0080
    114 /* log option compositions */
    115 #define XLOG_MASK	0x00ff	/* mask for all flags */
    116 #define XLOG_MANDATORY	(XLOG_FATAL|XLOG_ERROR)	/* cannot turn these off */
    117 #define XLOG_ALL	(XLOG_FATAL|XLOG_ERROR|XLOG_USER|XLOG_WARNING|XLOG_INFO|XLOG_MAP|XLOG_STATS)
    118 /* default: fatal + error + user + warning + info */
    119 #define XLOG_DEFAULT	(XLOG_MASK & (XLOG_ALL & ~XLOG_MAP & ~XLOG_STATS))
    120 
    121 /* default: no logging options */
    122 
    123 #define NO_SUBNET	"notknown"   /* default subnet name for no subnet */
    124 #define	NEXP_AP		(1022)			/* gdmr: was 254 */
    125 #define NEXP_AP_MARGIN	(128)			/* ???? not used */
    126 
    127 /*
    128  * Linked list macros
    129  */
    130 #define	AM_FIRST(ty, q)	((ty *) ((q)->q_forw))
    131 #define	AM_LAST(ty, q)	((ty *) ((q)->q_back))
    132 #define	NEXT(ty, q)	((ty *) (((qelem *) q)->q_forw))
    133 #define	PREV(ty, q)	((ty *) (((qelem *) q)->q_back))
    134 #define	HEAD(ty, q)	((ty *) q)
    135 #define	ITER(v, ty, q) \
    136 	for ((v) = AM_FIRST(ty,(q)); (v) != HEAD(ty,(q)); (v) = NEXT(ty,(v)))
    137 
    138 /* allocate anything of type ty */
    139 #define	ALLOC(ty)	((ty *) xmalloc(sizeof(ty)))
    140 #define	CALLOC(ty)	((ty *) xzalloc(sizeof(ty)))
    141 /* simply allocate b bytes */
    142 #define	SALLOC(b)	xmalloc((b))
    143 
    144 /*
    145  * Systems which have the mount table in a file need to read it before
    146  * they can perform an unmount() system call.
    147  */
    148 #define UMOUNT_FS(dir, mtb_name, unmount_flags)	umount_fs(dir, mtb_name, unmount_flags)
    149 /* next two are imported via $srcdir/conf/umount/umount_*.c */
    150 extern int umount_fs(char *mntdir, const char *mnttabname, u_int unmount_flags);
    151 #ifdef MNT2_GEN_OPT_FORCE
    152 extern int umount2_fs(const char *mntdir, u_int unmount_flags);
    153 #endif /* MNT2_GEN_OPT_FORCE */
    154 
    155 /* unmount-related flags (special handling of autofs, forced/lazy, etc.) */
    156 #define AMU_UMOUNT_FORCE        0x1
    157 #define AMU_UMOUNT_DETACH       0x2
    158 #define AMU_UMOUNT_AUTOFS       0x4
    159 
    160 /*
    161  * The following values can be tuned...
    162  */
    163 #define	ALLOWED_MOUNT_TIME	40	/* 40s for a mount */
    164 
    165 /*
    166  * RPC-related macros.
    167  */
    168 #define	RPC_XID_PORTMAP		0
    169 #define	RPC_XID_MOUNTD		1
    170 #define	RPC_XID_NFSPING		2
    171 #define	RPC_XID_WEBNFS		3
    172 #define	RPC_XID_MASK		(0x0f)	/* 16 id's for now */
    173 #define	MK_RPC_XID(type_id, uniq)	((type_id) | ((uniq) << 4))
    174 
    175 /*
    176  * What level of AMD are we backward compatible with?
    177  * This only applies to externally visible characteristics.
    178  * Rev.Minor.Branch.Patch (2 digits each)
    179  */
    180 #define	AMD_COMPAT	5000000	/* 5.0 */
    181 
    182 
    183 /**************************************************************************/
    184 /*** STRUCTURES AND TYPEDEFS						***/
    185 /**************************************************************************/
    186 
    187 /* some typedefs must come first */
    188 typedef char *amq_string;
    189 typedef struct _qelem qelem;
    190 typedef struct mntlist mntlist;
    191 
    192 /*
    193  * Linked list
    194  * (the name 'struct qelem' conflicts with linux's unistd.h)
    195  */
    196 struct _qelem {
    197   qelem *q_forw;
    198   qelem *q_back;
    199 };
    200 
    201 /*
    202  * Option tables
    203  */
    204 struct opt_tab {
    205   char *opt;
    206   int flag;
    207 };
    208 
    209 /*
    210  * Server states
    211  */
    212 typedef enum {
    213   Start,
    214   Run,
    215   Finishing,
    216   Quit,
    217   Done
    218 } serv_state;
    219 
    220 
    221 /*
    222  * List of mount table entries
    223  */
    224 struct mntlist {
    225   struct mntlist *mnext;
    226   mntent_t *mnt;
    227 };
    228 
    229 /*
    230  * Mount map
    231  */
    232 typedef struct mnt_map mnt_map;
    233 
    234 
    235 /**************************************************************************/
    236 /*** EXTERNALS								***/
    237 /**************************************************************************/
    238 
    239 /*
    240  * Useful constants
    241  */
    242 extern char *mnttab_file_name;	/* Mount table */
    243 extern char *cpu;		/* "CPU type" */
    244 extern char *endian;		/* "big" */
    245 extern char *hostdomain;	/* "southseas.nz" */
    246 extern char copyright[];	/* Copyright info */
    247 extern char version[];		/* Version info */
    248 
    249 /*
    250  * Global variables.
    251  */
    252 extern AUTH *nfs_auth;		/* Dummy authorization for remote servers */
    253 extern FILE *logfp;		/* Log file */
    254 extern SVCXPRT *nfsxprt;
    255 extern char *PrimNetName;	/* Name of primary connected network */
    256 extern char *PrimNetNum;	/* Name of primary connected network */
    257 extern char *SubsNetName;	/* Name of subsidiary connected network */
    258 extern char *SubsNetNum;	/* Name of subsidiary connected network */
    259 
    260 extern void am_set_progname(char *pn); /* "amd" */
    261 extern const char *am_get_progname(void); /* "amd" */
    262 extern void am_set_hostname(char *hn);
    263 extern const char *am_get_hostname(void);
    264 extern pid_t am_set_mypid(void);
    265 extern pid_t am_mypid;
    266 
    267 extern int foreground;		/* Foreground process */
    268 extern int orig_umask;		/* umask() on startup */
    269 extern serv_state amd_state;	/* Should we go now */
    270 extern struct in_addr myipaddr;	/* (An) IP address of this host */
    271 extern struct opt_tab xlog_opt[];
    272 extern u_short nfs_port;	/* Our NFS service port */
    273 
    274 /*
    275  * Global routines
    276  */
    277 extern CLIENT *get_mount_client(char *unused_host, struct sockaddr_in *sin, struct timeval *tv, int *sock, u_long mnt_version);
    278 extern RETSIGTYPE sigchld(int);
    279 extern bool_t xdr_amq_string(XDR *xdrs, amq_string *objp);
    280 extern bool_t xdr_dirpath(XDR *xdrs, dirpath *objp);
    281 extern char **strsplit(char *, int, int);
    282 extern char *expand_selectors(char *);
    283 extern char *get_version_string(void);
    284 extern char *inet_dquad(char *, size_t, u_long);
    285 extern char *print_wires(void);
    286 extern char *str3cat(char *, char *, char *, char *);
    287 extern char *strvcat(const char *, ...);
    288 extern char *strealloc(char *, char *);
    289 extern char *strip_selectors(char *, char *);
    290 extern char *strnsave(const char *, int);
    291 extern int amu_close(int fd);
    292 extern int bind_resv_port(int, u_short *);
    293 extern int cmdoption(char *, struct opt_tab *, u_int *);
    294 extern int compute_automounter_mount_flags(mntent_t *);
    295 extern int compute_mount_flags(mntent_t *);
    296 extern void discard_nfs_args(void *, u_long);
    297 extern u_long get_amd_program_number(void);
    298 extern int getcreds(struct svc_req *, uid_t *, gid_t *, SVCXPRT *);
    299 extern int hasmntval(mntent_t *, char *);
    300 extern unsigned int hasmntvalerr(mntent_t *, char *, int *);
    301 extern char *hasmntstr(mntent_t *, char *);
    302 extern char *hasmnteq(mntent_t *, char *);
    303 extern char *haseq(char *);
    304 extern int is_network_member(const char *net);
    305 extern int is_interface_local(u_long);
    306 extern int islocalnet(u_long);
    307 extern int make_rpc_packet(char *, int, u_long, struct rpc_msg *, voidp, XDRPROC_T_TYPE, AUTH *);
    308 extern int mkdirs(char *, int);
    309 extern int mount_fs(mntent_t *, int, caddr_t, int, MTYPE_TYPE, u_long, const char *, const char *, int);
    310 extern void nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp);
    311 extern void nfs_program_3(struct svc_req *rqstp, SVCXPRT *transp);
    312 #define get_nfs_dispatcher_version(a) \
    313     ((a) == nfs_program_2 ? NFS_VERSION : NFS_VERSION3)
    314 extern int pickup_rpc_reply(voidp, int, voidp, XDRPROC_T_TYPE);
    315 extern int switch_option(char *);
    316 extern int switch_to_logfile(char *logfile, int orig_umask, int truncate_log);
    317 extern mntlist *read_mtab(char *, const char *);
    318 #ifndef HAVE_TRANSPORT_TYPE_TLI
    319 extern struct sockaddr_in *amu_svc_getcaller(SVCXPRT *xprt);
    320 #endif /* not HAVE_TRANSPORT_TYPE_TLI */
    321 extern time_t time(time_t *);
    322 extern void amu_get_myaddress(struct in_addr *iap, const char *preferred_localhost);
    323 extern void amu_release_controlling_tty(void);
    324 extern void compute_automounter_nfs_args(nfs_args_t *nap, mntent_t *mntp);
    325 extern void discard_mntlist(mntlist *mp);
    326 extern void free_mntlist(mntlist *);
    327 extern void getwire(char **name1, char **number1);
    328 extern void going_down(int);
    329 extern void mnt_free(mntent_t *);
    330 extern void plog(int, const char *,...)
    331      __attribute__ ((__format__ (__syslog__, 2, 3)));
    332 extern void rmdirs(char *);
    333 extern void rpc_msg_init(struct rpc_msg *, u_long, u_long, u_long);
    334 extern void set_amd_program_number(u_long program);
    335 extern void show_opts(int ch, struct opt_tab *);
    336 extern void unregister_amq(void);
    337 extern voidp xmalloc(int);
    338 extern voidp xrealloc(voidp, int);
    339 extern voidp xzalloc(int);
    340 extern char *xstrdup(const char *);
    341 extern int check_pmap_up(char *host, struct sockaddr_in* sin);
    342 extern u_long get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto, u_long def);
    343 extern int nfs_valid_version(u_long vers);
    344 extern long get_server_pid(void);
    345 extern void setup_sighandler(int signum, void (*handler)(int));
    346 extern time_t clocktime(nfstime *nt);
    347 
    348 #if defined(DEBUG) && (defined(HAVE_C99_VARARGS_MACROS) || defined(HAVE_GCC_VARARGS_MACROS))
    349 # ifdef HAVE_C99_VARARGS_MACROS
    350 #define xsnprintf(str,size,fmt,...)	_xsnprintf(__FILE__,__LINE__,(str),(size),(fmt),__VA_ARGS__)
    351 # endif /* HAVE_C99_VARARGS_MACROS */
    352 # ifdef HAVE_GCC_VARARGS_MACROS
    353 #define xsnprintf(str,size,fmt,args...)		_xsnprintf(__FILE__,__LINE__,(str),(size),(fmt),args)
    354 # endif /* HAVE_GCC_VARARGS_MACROS */
    355 extern int _xsnprintf(const char *filename, int lineno, char *str, size_t size, const char *format, ...);
    356 #define xvsnprintf(str,size,fmt,ap)	_xvsnprintf(__FILE__,__LINE__,(str),(size),(fmt),(ap))
    357 extern int _xvsnprintf(const char *filename, int lineno, char *str, size_t size, const char *format, va_list ap);
    358 #else /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
    359 extern int xsnprintf(char *str, size_t size, const char *format, ...);
    360 extern int xvsnprintf(char *str, size_t size, const char *format, va_list ap);
    361 #endif /* not DEBUG or no C99/GCC-style vararg cpp macros supported */
    362 
    363 #ifdef DEBUG
    364 extern void _xstrlcat(const char *filename, int lineno, char *dst, const char *src, size_t len);
    365 # define xstrlcat(d,s,l)	_xstrlcat(__FILE__,__LINE__,(d),(s),(l))
    366 extern void _xstrlcpy(const char *filename, int lineno, char *dst, const char *src, size_t len);
    367 # define xstrlcpy(d,s,l)	_xstrlcpy(__FILE__,__LINE__,(d),(s),(l))
    368 #else /* not DEBUG */
    369 extern void xstrlcat(char *dst, const char *src, size_t len);
    370 extern void xstrlcpy(char *dst, const char *src, size_t len);
    371 #endif /* not DEBUG */
    372 
    373 #ifdef MOUNT_TABLE_ON_FILE
    374 extern void rewrite_mtab(mntlist *, const char *);
    375 extern void unlock_mntlist(void);
    376 extern void write_mntent(mntent_t *, const char *);
    377 #endif /* MOUNT_TABLE_ON_FILE */
    378 
    379 #if defined(HAVE_SYSLOG_H) || defined(HAVE_SYS_SYSLOG_H)
    380 extern int syslogging;
    381 #endif /* defined(HAVE_SYSLOG_H) || defined(HAVE_SYS_SYSLOG_H) */
    382 
    383 extern void compute_nfs_args(void *nap, mntent_t *mntp, int genflags, struct netconfig *nfsncp, struct sockaddr_in *ip_addr, u_long nfs_version, char *nfs_proto, am_nfs_handle_t *fhp, char *host_name, char *fs_name);
    384 extern void destroy_nfs_args(void *nap, u_long nfs_version);
    385 extern int create_amq_service(int *udp_soAMQp, SVCXPRT **udp_amqpp, struct netconfig **udp_amqncpp, int *tcp_soAMQp, SVCXPRT **tcp_amqpp, struct netconfig **tcp_amqncpp, u_short preferred_amq_port);
    386 extern int create_nfs_service(int *soNFSp, u_short *nfs_portp, SVCXPRT **nfs_xprtp, void (*dispatch_fxn)(struct svc_req *rqstp, SVCXPRT *transp), u_long nfs_version);
    387 extern int amu_svc_register(SVCXPRT *, u_long, u_long, void (*)(struct svc_req *, SVCXPRT *), u_long, struct netconfig *);
    388 
    389 #ifdef HAVE_TRANSPORT_TYPE_TLI
    390 
    391 extern int get_knetconfig(struct knetconfig **kncpp, struct netconfig *in_ncp, char *nc_protoname);
    392 extern struct netconfig *nfsncp;
    393 extern void free_knetconfig(struct knetconfig *kncp);
    394 
    395 #endif /* HAVE_TRANSPORT_TYPE_TLI */
    396 
    397 #ifdef HAVE_FS_AUTOFS
    398 extern int register_autofs_service(char *autofs_conftype, void (*autofs_dispatch)(struct svc_req *rqstp, SVCXPRT *xprt));
    399 extern int unregister_autofs_service(char *autofs_conftype);
    400 #endif /* HAVE_FS_AUTOFS */
    401 
    402 
    403 #ifndef HAVE_STRUCT_FHSTATUS_FHS_FH
    404 # define fhs_fh  fhstatus_u.fhs_fhandle
    405 #endif /* not HAVE_STRUCT_FHSTATUS_FHS_FH */
    406 
    407 
    408 /*
    409  * Network File System: the old faithful generation NFS V.2
    410  */
    411 #ifndef NFS_VERSION2
    412 # define NFS_VERSION2 ((u_int) 2)
    413 #endif /* not NFS_VERSION2 */
    414 
    415 /*
    416  * Network File System: the not so new anymore generation NFS V.3
    417  */
    418 #ifdef HAVE_FS_NFS3
    419 # ifndef NFS_VERSION3
    420 #  define NFS_VERSION3 ((u_int) 3)
    421 # endif /* not NFS_VERSION3 */
    422 #endif /* HAVE_FS_NFS3 */
    423 
    424 /*
    425  * Network File System: the new generation NFS V.4
    426  */
    427 #ifdef HAVE_FS_NFS4
    428 # ifndef NFS_VERSION4
    429 #  define NFS_VERSION4 ((u_int) 4)
    430 # endif /* not NFS_VERSION4 */
    431 #endif /* HAVE_FS_NFS4 */
    432 
    433 /**************************************************************************/
    434 /*** DEBUGGING								***/
    435 /**************************************************************************/
    436 
    437 /*
    438  * DEBUGGING:
    439  */
    440 
    441 #ifdef DEBUG
    442 
    443 # define	D_DAEMON	0x0001	/* Enter daemon mode */
    444 # define	D_TRACE		0x0002	/* Do protocol trace */
    445 # define	D_FULL		0x0004	/* Do full trace */
    446 # define	D_MTAB		0x0008	/* Use local mtab */
    447 # define	D_AMQ		0x0010	/* Register amq program */
    448 # define	D_STR		0x0020	/* Debug string munging */
    449 # ifdef DEBUG_MEM
    450 #  define	D_MEM		0x0040	/* Trace memory allocations */
    451 # else /* not DEBUG_MEM */
    452 #  define	D_MEM		0x0000	/* Dummy */
    453 # endif /* not DEBUG_MEM */
    454 # define	D_FORK		0x0080	/* Fork server (hlfsd only) */
    455 # define	D_INFO		0x0100	/* info service specific debugging (hesiod, nis, etc) */
    456 # define	D_HRTIME	0x0200	/* Print high resolution time stamps */
    457 # define	D_XDRTRACE	0x0400	/* Trace xdr routines */
    458 # define	D_READDIR	0x0800	/* Show browsable_dir progress */
    459 /* debug option compositions */
    460 # define	D_MASK		0x0fff  /* mask of known flags */
    461 # define	D_BASIC		(D_TRACE|D_FULL|D_STR|D_MEM|D_INFO|D_XDRTRACE|D_READDIR)
    462 # define	D_CONTROL	(D_DAEMON|D_AMQ|D_FORK)
    463 /* immutable flags: cannot be changed via "amq -D" */
    464 # define	D_IMMUTABLE	(D_MTAB  | D_CONTROL)
    465 # define	D_ALL		(D_BASIC | D_CONTROL)
    466 # define	D_DEFAULT	(D_MASK & D_ALL & ~D_XDRTRACE)
    467 /* test mode: nodaemon, noamq, nofork, (local) mtab */
    468 # define	D_TEST		(D_BASIC | D_MTAB)
    469 
    470 # define	amuDebug(x)	(debug_flags & (x))
    471 # define	dlog		if (amuDebug(D_FULL)) dplog
    472 
    473 /* my favorite debugging tool -Erez */
    474 #define EZKDBG plog(XLOG_INFO,"EZK:%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__)
    475 
    476 # ifdef DEBUG_MEM
    477 /*
    478  * If debugging memory, then call a special freeing function that logs
    479  * more info, and resets the pointer to NULL so it cannot be used again.
    480  */
    481 #  define	XFREE(x) dxfree(__FILE__,__LINE__,x)
    482 extern void dxfree(char *file, int line, voidp ptr);
    483 extern void malloc_verify(void);
    484 # else /* not DEBUG_MEM */
    485 /*
    486  * If regular debugging, then free the pointer and reset to NULL.
    487  * This should remain so for as long as am-utils is in alpha/beta testing.
    488  */
    489 #  define	XFREE(x) do { free((voidp)x); x = NULL;} while (0)
    490 # endif /* not DEBUG_MEM */
    491 
    492 /* functions that depend solely on debugging */
    493 extern void print_nfs_args(const void *, u_long nfs_version);
    494 extern int debug_option (char *opt);
    495 extern void dplog(const char *fmt, ...)
    496      __attribute__ ((__format__ (__syslog__, 1, 2)));
    497 
    498 #else /* not DEBUG */
    499 
    500 /* set dummy flags to zero */
    501 # define	D_DAEMON	0x0001	/* Enter daemon mode */
    502 # define	D_TRACE		0x0000	/* dummy: Do protocol trace */
    503 # define	D_FULL		0x0000	/* dummy: Do full trace */
    504 # define	D_MTAB		0x0000	/* dummy: Use local mtab */
    505 # define	D_AMQ		0x0010	/* Register amq program */
    506 # define	D_STR		0x0000	/* dummy: Debug string munging */
    507 # define	D_MEM		0x0000	/* dummy: Trace memory allocations */
    508 # define	D_FORK		0x0080	/* Fork server (hlfsd only) */
    509 # define	D_INFO		0x0000	/* dummy: info service debugging */
    510 # define	D_HRTIME	0x0000	/* dummy: hi-res time stamps */
    511 # define	D_XDRTRACE	0x0000	/* dummy: Trace xdr routines */
    512 # define	D_READDIR	0x0000	/* dummy: browsable_dir progress */
    513 # define	D_CONTROL	(D_DAEMON|D_AMQ|D_FORK)
    514 # define	amuDebug(x)	(debug_flags & (x))
    515 /*
    516  * If not debugging, then also reset the pointer.
    517  * It's safer -- and besides, free() should do that anyway.
    518  */
    519 # define	XFREE(x) do { free((voidp)x); x = NULL;} while (0)
    520 
    521 # if defined(HAVE_GCC_VARARGS_MACROS)
    522 #  define	dlog(fmt...)
    523 # elif defined(HAVE_C99_VARARGS_MACROS)
    524 #  define	dlog(...)
    525 # else  /* no c99 varargs */
    526 /* this define means that we CCP leaves code behind the (list,of,args)  */
    527 #  define	dlog
    528 # endif /* no c99 varargs */
    529 
    530 # define	print_nfs_args(nap, nfs_version)
    531 # define	debug_option(x)	(1)
    532 
    533 #endif /* not DEBUG */
    534 
    535 extern u_int debug_flags;	/* Debug options */
    536 extern struct opt_tab dbg_opt[];
    537 
    538 /**************************************************************************/
    539 /*** MISC (stuff left to autoconfiscate)				***/
    540 /**************************************************************************/
    541 
    542 #endif /* not _AM_UTILS_H */
    543