/* include checkopts1 */
/* *INDENT-OFF* */
#include	"unpxti.h"

struct xti_opts {
  char			*opt_str;
  t_uscalar_t	 opt_level;
  t_uscalar_t	 opt_name;
  char   	  *(*opt_val_str)(struct t_opthdr *);
} xti_opts[] = {
	"XTI_DEBUG",		XTI_GENERIC,	XTI_DEBUG,		xti_str_uscalard,
	"XTI_LINGER",		XTI_GENERIC,	XTI_LINGER,		xti_str_linger,
	"XTI_RCVBUF",		XTI_GENERIC,	XTI_RCVBUF,		xti_str_uscalard,
	"XTI_RCVLOWAT",		XTI_GENERIC,	XTI_RCVLOWAT,	xti_str_uscalard,
	"XTI_SNDBUF",		XTI_GENERIC,	XTI_SNDBUF,		xti_str_uscalard,
	"XTI_SNDLOWAT",		XTI_GENERIC,	XTI_SNDLOWAT,	xti_str_uscalard,
	"T_IP_BROADCAST",	T_INET_IP,		T_IP_BROADCAST,	xti_str_uiyn,
	"T_IP_DONTROUTE",	T_INET_IP,		T_IP_DONTROUTE,	xti_str_uiyn,
	"T_IP_OPTIONS",		T_INET_IP,		T_IP_OPTIONS,	xti_str_uchard,
	"T_IP_REUSEADDR",	T_INET_IP,		T_IP_REUSEADDR,	xti_str_uiyn,
	"T_IP_TOS",			T_INET_IP,		T_IP_TOS,		xti_str_ucharx,
	"T_IP_TTL",			T_INET_IP,		T_IP_TTL,		xti_str_uchard,
	"T_TCP_KEEPALIVE",	T_INET_TCP,		T_TCP_KEEPALIVE,xti_str_kpalive,
	"T_TCP_MAXSEG",		T_INET_TCP,		T_TCP_MAXSEG,	xti_str_uscalard,
	"T_TCP_NODELAY",	T_INET_TCP,		T_TCP_NODELAY,	xti_str_usyn,
	"T_UDP_CHECKSUM",	T_INET_UDP,		T_UDP_CHECKSUM,	xti_str_usyn,
	NULL,				0,				0,				NULL
};
/* *INDENT-ON* */
/* end checkopts1 */

/* include checkopts2 */
int
main(int argc, char **argv)
{
	int					fd;
	struct t_opthdr		*topt;
	struct t_optmgmt	*req, *ret;
	struct xti_opts		*ptr;

	if (argc != 2)
		err_quit("usage: checkopts <device>");

	fd = T_open(argv[1], O_RDWR, NULL);
	T_bind(fd, NULL, NULL);

	req = T_alloc(fd, T_OPTMGMT, T_ALL);
	ret = T_alloc(fd, T_OPTMGMT, T_ALL);

	for (ptr = xti_opts; ptr->opt_str != NULL; ptr++) {
		topt = (struct t_opthdr *) req->opt.buf;
		topt->level = ptr->opt_level;
		topt->name = ptr->opt_name;
		topt->len = sizeof(struct t_opthdr);
		req->opt.len = topt->len;
	
		req->flags = T_CHECK;
		printf("%s: ", ptr->opt_str);
		if (t_optmgmt(fd, req, ret) < 0) {
			err_xti_ret("t_optmgmt error");
		} else {
			topt = (struct t_opthdr *) ret->opt.buf;
			printf("%s", xti_str_flags(topt->status));

			if (topt->status == T_SUCCESS || topt->status == T_READONLY) {
				req->flags = T_DEFAULT;
				if (t_optmgmt(fd, req, ret) < 0) {
					err_xti_ret("t_optmgmt error for T_DEFAULT");
				} else {
					topt = (struct t_opthdr *) ret->opt.buf;
					printf(", default = %s", (*ptr->opt_val_str)(topt));
				}
			}
			printf("\n");
		}
	}
	exit(0);
}
/* end checkopts2 */


syntax highlighted by Code2HTML, v. 0.9.1