Introduced groups_t instead of uint32_t
diff --git a/CHANGES b/CHANGES
index dc9a590..813feff 100644
--- a/CHANGES
+++ b/CHANGES
@@ -9,6 +9,9 @@
 	The number of warnings has been reduced, e.g.removing a non existing
 	file does in most cases no longer log a warning.
 
+Coding:
+	Introduced groups_t instead of uint32_t, for more flexibility
+
 ####################### V 1.7.4.5 (not released):
 
 Corrections:
diff --git a/compat.h b/compat.h
index 6999923..80618bb 100644
--- a/compat.h
+++ b/compat.h
@@ -99,17 +99,22 @@
 #endif
 
 #define F_uint8_t "%hu"
+#define F_uint8_x "%02hx"
 #define F_int8_t  "%hd"
 
 #ifndef F_uint16_t
 #  if HAVE_BASIC_UINT16_T==0
 #    define F_uint16_t "%hu"
+#    define F_uint16_x "%04hx"
 #  elif HAVE_BASIC_UINT16_T==2
 #    define F_uint16_t "%hu"
+#    define F_uint16_x "%04hx"
 #  elif HAVE_BASIC_UINT16_T==4
 #    define F_uint16_t "%u"
+#    define F_uint16_x "%04x"
 #  elif HAVE_BASIC_UINT16_T==6
 #    define F_uint16_t "%lu"
+#    define F_uint16_x "%04lx"
 #  else
 #    error "HAVE_BASIC_UINT16_T is out of range:" HAVE_BASIC_UINT16_T
 #  endif
@@ -118,12 +123,16 @@
 #ifndef F_uint32_t
 #  if HAVE_BASIC_UINT32_T==0
 #    define F_uint32_t "%hu"
+#    define F_uint32_x "%08hx"
 #  elif HAVE_BASIC_UINT32_T==2
 #    define F_uint32_t "%hu"
+#    define F_uint32_x "%08hx"
 #  elif HAVE_BASIC_UINT32_T==4
 #    define F_uint32_t "%u"
+#    define F_uint32_x "%08x"
 #  elif HAVE_BASIC_UINT32_T==6
 #    define F_uint32_t "%lu"
+#    define F_uint32_x "%08lx"
 #  else
 #    error "HAVE_BASIC_UINT32_T is out of range:" HAVE_BASIC_UINT32_T
 #  endif
@@ -132,14 +141,19 @@
 #ifndef F_uint64_t
 #  if HAVE_BASIC_UINT64_T==0
 #    define F_uint64_t "%hu"
+#    define F_uint64_x "%016hx"
 #  elif HAVE_BASIC_UINT64_T==2
 #    define F_uint64_t "%hu"
+#    define F_uint64_x "%016hx"
 #  elif HAVE_BASIC_UINT64_T==4
 #    define F_uint64_t "%u"
+#    define F_uint64_x "%016x"
 #  elif HAVE_BASIC_UINT64_T==6
 #    define F_uint64_t "%lu"
+#    define F_uint64_x "%016lx"
 #  elif HAVE_BASIC_UINT64_T==8
 #    define F_uint64_t "%llu"
+#    define F_uint64_x "%016llx"
 #  else
 #    error "HAVE_BASIC_UINT64_T is out of range:" HAVE_BASIC_UINT64_T
 #  endif
diff --git a/xio-creat.c b/xio-creat.c
index ed98f0c..c3c2af8 100644
--- a/xio-creat.c
+++ b/xio-creat.c
@@ -13,7 +13,7 @@
 #include "xio-creat.h"
 
 
-static int xioopen_creat(int arg, const char *argv[], struct opt *opts, int rw, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3);
+static int xioopen_creat(int arg, const char *argv[], struct opt *opts, int rw, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3);
 
 
 /*! within stream model, this is a write-only address - use 2 instead of 3 */
@@ -37,7 +37,7 @@
 }
 
 
-static int xioopen_creat(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3) {
+static int xioopen_creat(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3) {
    const char *filename = argv[1];
    int rw = (xioflags&XIO_ACCMODE);
    bool exists;
diff --git a/xio-exec.c b/xio-exec.c
index 05f8f96..dd1acab 100644
--- a/xio-exec.c
+++ b/xio-exec.c
@@ -16,7 +16,7 @@
 static int xioopen_exec(int argc, const char *argv[], struct opt *opts,
 		int xioflags,	/* XIO_RDONLY etc. */
 		xiofile_t *fd,
-		unsigned groups,
+		groups_t groups,
 		int dummy1, int dummy2, int dummy3
 		);
 
@@ -27,7 +27,7 @@
 static int xioopen_exec(int argc, const char *argv[], struct opt *opts,
 		int xioflags,	/* XIO_RDONLY, XIO_MAYCHILD etc. */
 		xiofile_t *fd,
-		unsigned groups,
+		groups_t groups,
 		int dummy1, int dummy2, int dummy3
 		) {
    int status;
diff --git a/xio-fdnum.c b/xio-fdnum.c
index 15564ec..70015d0 100644
--- a/xio-fdnum.c
+++ b/xio-fdnum.c
@@ -12,7 +12,7 @@
 
 #if WITH_FDNUM
 
-static int xioopen_fdnum(int argc, const char *argv[], struct opt *opts, int rw, xiofile_t *xfd, unsigned groups, int dummy1, int dummy2, int dummy3);
+static int xioopen_fdnum(int argc, const char *argv[], struct opt *opts, int rw, xiofile_t *xfd, groups_t groups, int dummy1, int dummy2, int dummy3);
 
 
 const struct addrdesc addr_fd     = { "fd",     3, xioopen_fdnum, GROUP_FD|GROUP_FIFO|GROUP_CHR|GROUP_BLK|GROUP_FILE|GROUP_SOCKET|GROUP_TERMIOS|GROUP_SOCK_UNIX|GROUP_SOCK_IP|GROUP_IPAPP, 0, 0, 0 HELP(":<num>") };
@@ -20,7 +20,7 @@
 
 /* use some file descriptor and apply the options. Set the FD_CLOEXEC flag. */
 static int xioopen_fdnum(int argc, const char *argv[], struct opt *opts,
-			 int xioflags, xiofile_t *xfd, unsigned groups,
+			 int xioflags, xiofile_t *xfd, groups_t groups,
 			 int dummy1, int dummy2, int dummy3) {
    char *a1;
    int rw = (xioflags&XIO_ACCMODE);
diff --git a/xio-file.c b/xio-file.c
index 4f4648b..27b3fab 100644
--- a/xio-file.c
+++ b/xio-file.c
@@ -11,7 +11,7 @@
 #include "xio-file.h"
 
 
-static int xioopen_open(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3);
+static int xioopen_open(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3);
 
 
 #if WITH_OPEN
@@ -72,7 +72,7 @@
    if the filesystem entry already exists, the data is appended
    if it does not exist, a file is created and the data is appended
 */
-static int xioopen_open(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3) {
+static int xioopen_open(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3) {
    const char *filename = argv[1];
    int rw = (xioflags & XIO_ACCMODE);
    bool exists;
diff --git a/xio-gopen.c b/xio-gopen.c
index 370de60..6321330 100644
--- a/xio-gopen.c
+++ b/xio-gopen.c
@@ -14,12 +14,12 @@
 
 #if WITH_GOPEN
 
-static int xioopen_gopen(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3);
+static int xioopen_gopen(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3);
 
 
 const struct addrdesc addr_gopen  = { "gopen",  3, xioopen_gopen, GROUP_FD|GROUP_FIFO|GROUP_CHR|GROUP_BLK|GROUP_REG|GROUP_NAMED|GROUP_OPEN|GROUP_FILE|GROUP_TERMIOS|GROUP_SOCKET|GROUP_SOCK_UNIX, 0, 0, 0 HELP(":<filename>") };
 
-static int xioopen_gopen(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3) {
+static int xioopen_gopen(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3) {
    const char *filename = argv[1];
    flags_t openflags = (xioflags & XIO_ACCMODE);
    mode_t st_mode;
diff --git a/xio-interface.c b/xio-interface.c
index 475bfd1..cae24b3 100644
--- a/xio-interface.c
+++ b/xio-interface.c
@@ -16,7 +16,7 @@
 
 static
 int xioopen_interface(int argc, const char *argv[], struct opt *opts,
-		      int xioflags, xiofile_t *xfd, unsigned groups, int pf,
+		      int xioflags, xiofile_t *xfd, groups_t groups, int pf,
 		      int dummy2, int dummy3);
 
 const struct addrdesc xioaddr_interface= { "interface",    3, xioopen_interface, GROUP_FD|GROUP_SOCKET, PF_PACKET, 0, 0 HELP(":<interface>") };
@@ -25,7 +25,7 @@
 static
 int _xioopen_interface(const char *ifname,
 		       struct opt *opts, int xioflags, xiofile_t *xxfd,
-		       unsigned groups, int pf) {
+		       groups_t groups, int pf) {
    xiosingle_t *xfd = &xxfd->stream;
    union sockaddr_union us = {{0}};
    socklen_t uslen;
@@ -74,7 +74,7 @@
 
 static
 int xioopen_interface(int argc, const char *argv[], struct opt *opts,
-		      int xioflags, xiofile_t *xxfd, unsigned groups,
+		      int xioflags, xiofile_t *xxfd, groups_t groups,
 		      int pf, int dummy2, int dummy3) {
    xiosingle_t *xfd = &xxfd->stream;
    int result;
diff --git a/xio-ipapp.c b/xio-ipapp.c
index 96011a3..ef92d2c 100644
--- a/xio-ipapp.c
+++ b/xio-ipapp.c
@@ -23,7 +23,7 @@
 /* we expect the form "host:port" */
 int xioopen_ipapp_connect(int argc, const char *argv[], struct opt *opts,
 			   int xioflags, xiofile_t *xxfd,
-			   unsigned groups, int socktype, int ipproto,
+			   groups_t groups, int socktype, int ipproto,
 			   int pf) {
    struct single *xfd = &xxfd->stream;
    struct opt *opts0 = NULL;
@@ -258,7 +258,7 @@
 /* currently only used for TCP4 */
 int xioopen_ipapp_listen(int argc, const char *argv[], struct opt *opts,
 			  int xioflags, xiofile_t *fd,
-			 unsigned groups, int socktype,
+			 groups_t groups, int socktype,
 			 int ipproto, int pf) {
    struct opt *opts0 = NULL;
    union sockaddr_union us_sa, *us = &us_sa;
diff --git a/xio-ipapp.h b/xio-ipapp.h
index 2fe4299..52fc682 100644
--- a/xio-ipapp.h
+++ b/xio-ipapp.h
@@ -15,7 +15,7 @@
 extern const struct optdesc opt_lowport;
 
 extern int xioopen_ipapp_connect(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd,
-			 unsigned groups, int socktype,
+			 groups_t groups, int socktype,
 			 int ipproto, int protname);
 extern int
    _xioopen_ipapp_prepare(struct opt *opts, struct opt **opts0,
@@ -32,7 +32,7 @@
 				   struct opt *opts);
 extern int xioopen_ipapp_listen(int argc, const char *argv[], struct opt *opts,
 			  int xioflags, xiofile_t *fd,
-			 unsigned groups, int socktype,
+			 groups_t groups, int socktype,
 				 int ipproto, int protname);
 extern int _xioopen_ipapp_listen_prepare(struct opt *opts, struct opt **opts0,
 				   const char *portname, int *pf, int ipproto,
diff --git a/xio-named.c b/xio-named.c
index 6e35d3e..da4f10e 100644
--- a/xio-named.c
+++ b/xio-named.c
@@ -96,8 +96,8 @@
    After this sub you may proceed with open() or whatever...
    */
 int _xioopen_named_early(int argc, const char *argv[], xiofile_t *xfd,
-			 int groups,
-		      bool *exists, struct opt *opts) {
+			 groups_t groups, bool *exists, struct opt *opts)
+{
    const char *path = argv[1];
 #if HAVE_STAT64
    struct stat64 statbuf;
diff --git a/xio-named.h b/xio-named.h
index 561d192..e727a9b 100644
--- a/xio-named.h
+++ b/xio-named.h
@@ -19,7 +19,7 @@
 extern int
    applyopts_named(const char *filename, struct opt *opts, unsigned int phase);
 extern int _xioopen_named_early(int argc, const char *argv[], xiofile_t *xfd,
-				int groups,
+				groups_t groups,
 				bool *exists, struct opt *opts);
 extern int _xioopen_open(const char *path, int rw, struct opt *opts);
 
diff --git a/xio-openssl.c b/xio-openssl.c
index 042d97b..2215662 100644
--- a/xio-openssl.c
+++ b/xio-openssl.c
@@ -43,12 +43,12 @@
 
 /* static declaration of ssl's open function */
 static int xioopen_openssl_connect(int argc, const char *argv[], struct opt *opts,
-				   int xioflags, xiofile_t *fd, unsigned groups,
+				   int xioflags, xiofile_t *fd, groups_t groups,
 			   int dummy1, int dummy2, int dummy3);
 
 /* static declaration of ssl's open function */
 static int xioopen_openssl_listen(int argc, const char *argv[], struct opt *opts,
-				  int xioflags, xiofile_t *fd, unsigned groups,
+				  int xioflags, xiofile_t *fd, groups_t groups,
 			   int dummy1, int dummy2, int dummy3);
 static int openssl_SSL_ERROR_SSL(int level, const char *funcname);
 static int openssl_handle_peer_certificate(struct single *xfd,
@@ -199,7 +199,7 @@
 				   writing (1), or both (2) ? */
 		   xiofile_t *xxfd,	/* a xio file descriptor structure,
 				   already allocated */
-		   unsigned groups,	/* the matching address groups... */
+		   groups_t groups,	/* the matching address groups... */
 		   int protogrp,	/* first transparent integer value from
 				   addr_openssl */
 		   int dummy2,	/* second transparent integer value from
@@ -487,7 +487,7 @@
 				   writing (1), or both (2) ? */
 		   xiofile_t *xxfd,	/* a xio file descriptor structure,
 				   already allocated */
-		   unsigned groups,	/* the matching address groups... */
+		   groups_t groups,	/* the matching address groups... */
 		   int protogrp,	/* first transparent integer value from
 				   addr_openssl */
 		   int dummy2,	/* second transparent integer value from
diff --git a/xio-pipe.c b/xio-pipe.c
index f8862a7..b5b9719 100644
--- a/xio-pipe.c
+++ b/xio-pipe.c
@@ -12,7 +12,7 @@
 
 #if WITH_PIPE
 
-static int xioopen_fifo(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3);
+static int xioopen_fifo(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3);
 static int xioopen_fifo_unnamed(xiofile_t *sock, struct opt *opts);
 
 
@@ -75,7 +75,7 @@
 
 
 /* open a named or unnamed pipe/fifo */
-static int xioopen_fifo(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3) {
+static int xioopen_fifo(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3) {
    const char *pipename = argv[1];
    int rw = (xioflags & XIO_ACCMODE);
 #if HAVE_STAT64
diff --git a/xio-progcall.c b/xio-progcall.c
index 6daf14c..c530983 100644
--- a/xio-progcall.c
+++ b/xio-progcall.c
@@ -47,7 +47,7 @@
  */
 int _xioopen_foxec(int xioflags,	/* XIO_RDONLY etc. */
 		struct single *fd,
-		unsigned groups,
+		   groups_t groups,
 		   struct opt **copts,	/* in: opts; out: opts for child */
 		   int *duptostderr	/* out: redirect stderr to output fd */
 		) {
diff --git a/xio-progcall.h b/xio-progcall.h
index cd06bdb..09083be 100644
--- a/xio-progcall.h
+++ b/xio-progcall.h
@@ -20,7 +20,7 @@
 
 extern int _xioopen_foxec(int rw,	/* O_RDONLY etc. */
 		struct single *fd,
-		unsigned groups,
+			  groups_t groups,
 		struct opt **opts,
 			  int *duptostderr
 		);
diff --git a/xio-proxy.c b/xio-proxy.c
index e22588c..d4d664d 100644
--- a/xio-proxy.c
+++ b/xio-proxy.c
@@ -22,7 +22,7 @@
 
 static int xioopen_proxy_connect(int argc, const char *argv[], struct opt *opts,
 				 int xioflags, xiofile_t *fd,
-				 unsigned groups, int dummy1, int dummy2,
+				 groups_t groups, int dummy1, int dummy2,
 				 int dummy3);
 
 const struct optdesc opt_proxyport = { "proxyport", NULL, OPT_PROXYPORT, GROUP_HTTP, PH_LATE, TYPE_STRING, OFUNC_SPEC };
@@ -79,7 +79,7 @@
 
 static int xioopen_proxy_connect(int argc, const char *argv[], struct opt *opts,
 				 int xioflags, xiofile_t *xxfd,
-				 unsigned groups, int dummy1, int dummy2,
+				 groups_t groups, int dummy1, int dummy2,
 				 int dummy3) {
       /* we expect the form: host:host:port */
    struct single *xfd = &xxfd->stream;
diff --git a/xio-pty.c b/xio-pty.c
index 41058c7..cf508aa 100644
--- a/xio-pty.c
+++ b/xio-pty.c
@@ -18,7 +18,7 @@
 
 #define MAXPTYNAMELEN 64
 
-static int xioopen_pty(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3);
+static int xioopen_pty(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3);
 
 const struct addrdesc addr_pty = { "pty",   3, xioopen_pty, GROUP_NAMED|GROUP_FD|GROUP_TERMIOS|GROUP_PTY, 0, 0, 0 HELP("") };
 
@@ -28,7 +28,7 @@
 const struct optdesc opt_pty_intervall  = { "pty-interval",  NULL,         OPT_PTY_INTERVALL,  GROUP_PTY, PH_EARLY, TYPE_TIMESPEC, OFUNC_SPEC, 0, 0 };
 #endif /* HAVE_POLL */
 
-static int xioopen_pty(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xfd, unsigned groups, int dummy1, int dummy2, int dummy3) {
+static int xioopen_pty(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xfd, groups_t groups, int dummy1, int dummy2, int dummy3) {
    /* we expect the form: filename */
    int ptyfd = -1, ttyfd = -1;
 #if defined(HAVE_DEV_PTMX) || defined(HAVE_DEV_PTC)
diff --git a/xio-rawip.c b/xio-rawip.c
index ed9119a..5ba3600 100644
--- a/xio-rawip.c
+++ b/xio-rawip.c
@@ -19,25 +19,25 @@
 
 static
 int xioopen_rawip_sendto(int argc, const char *argv[], struct opt *opts,
-			 int xioflags, xiofile_t *fd, unsigned groups, int pf,
+			 int xioflags, xiofile_t *fd, groups_t groups, int pf,
 			 int dummy2, int dummy3);
 static
 int xioopen_rawip_datagram(int argc, const char *argv[], struct opt *opts,
-			 int xioflags, xiofile_t *fd, unsigned groups, int pf,
+			 int xioflags, xiofile_t *fd, groups_t groups, int pf,
 			 int dummy2, int dummy3);
 static
 int xioopen_rawip_recvfrom(int argc, const char *argv[], struct opt *opts,
-			 int xioflags, xiofile_t *xfd, unsigned groups,
+			 int xioflags, xiofile_t *xfd, groups_t groups,
 			 int pf, int socktype, int dummy3);
 static
 int xioopen_rawip_recv(int argc, const char *argv[], struct opt *opts,
-		       int xioflags, xiofile_t *xfd, unsigned groups,
+		       int xioflags, xiofile_t *xfd, groups_t groups,
 		       int pf, int socktype, int ipproto);
 
 static
 int _xioopen_rawip_sendto(const char *hostname, const char *protname,
 			  struct opt *opts, int xioflags,
-			  xiofile_t *xxfd, unsigned groups, int *pf);
+			  xiofile_t *xxfd, groups_t groups, int *pf);
 
 const struct addrdesc addr_rawip_sendto  = { "ip-sendto",      3, xioopen_rawip_sendto,   GROUP_FD|GROUP_SOCKET|GROUP_SOCK_IP4|GROUP_SOCK_IP6, PF_UNSPEC, 0, 0 HELP(":<host>:<protocol>") };
 const struct addrdesc addr_rawip_datagram= { "ip-datagram",    3, xioopen_rawip_datagram, GROUP_FD|GROUP_SOCKET|GROUP_SOCK_IP4|GROUP_SOCK_IP6|GROUP_RANGE, PF_UNSPEC, 0, 0 HELP(":<host>:<protocol>") };
@@ -64,7 +64,7 @@
 /* socklen_t salen;*/
 static
 int xioopen_rawip_sendto(int argc, const char *argv[], struct opt *opts,
-			 int xioflags, xiofile_t *xxfd, unsigned groups,
+			 int xioflags, xiofile_t *xxfd, groups_t groups,
 			 int pf, int dummy2, int dummy3) {
    int result;
 
@@ -91,7 +91,7 @@
 static
 int _xioopen_rawip_sendto(const char *hostname, const char *protname,
 			  struct opt *opts, int xioflags, xiofile_t *xxfd,
-			  unsigned groups, int *pf) {
+			  groups_t groups, int *pf) {
    char *garbage;
    xiosingle_t *xfd = &xxfd->stream;
    union sockaddr_union us;
@@ -150,7 +150,7 @@
 /* we expect the form: address:protocol */
 static
 int xioopen_rawip_datagram(int argc, const char *argv[], struct opt *opts,
-			 int xioflags, xiofile_t *xxfd, unsigned groups,
+			 int xioflags, xiofile_t *xxfd, groups_t groups,
 			 int pf, int dummy2, int dummy3) {
    xiosingle_t *xfd = &xxfd->stream;
    char *rangename;
@@ -196,7 +196,7 @@
 
 static
 int xioopen_rawip_recvfrom(int argc, const char *argv[], struct opt *opts,
-		     int xioflags, xiofile_t *xfd, unsigned groups,
+		     int xioflags, xiofile_t *xfd, groups_t groups,
 		     int pf, int socktype, int dummy3) {
    const char *protname = argv[1];
    char *garbage;
@@ -254,7 +254,7 @@
 
 static
 int xioopen_rawip_recv(int argc, const char *argv[], struct opt *opts,
-		       int xioflags, xiofile_t *xfd, unsigned groups,
+		       int xioflags, xiofile_t *xfd, groups_t groups,
 		       int pf, int socktype, int dummy3) {
    const char *protname = argv[1];
    char *garbage;
diff --git a/xio-readline.c b/xio-readline.c
index 96e21f7..a17fe66 100644
--- a/xio-readline.c
+++ b/xio-readline.c
@@ -26,7 +26,7 @@
 #define READLINE_MAXPROMPT 512
 
 static int xioopen_readline(int argc, const char *argv[], struct opt *opts,
-			    int rw, xiofile_t *xfd, unsigned groups,
+			    int rw, xiofile_t *xfd, groups_t groups,
 			    int dummy1, int dummy2, int dummy3);
 
 
@@ -38,7 +38,7 @@
 const struct optdesc opt_noecho       = { "noecho",       NULL,      OPT_NOECHO,       GROUP_READLINE, PH_LATE, TYPE_STRING, OFUNC_SPEC,   0 };
 
 static int xioopen_readline(int argc, const char *argv[], struct opt *opts,
-			    int xioflags, xiofile_t *xfd, unsigned groups,
+			    int xioflags, xiofile_t *xfd, groups_t groups,
 			    int dummy1, int dummy2, int dummy3) {
    int rw = (xioflags & XIO_ACCMODE);
    char msgbuf[256], *cp = msgbuf;
diff --git a/xio-socket.c b/xio-socket.c
index 23dec0d..6aa0a5e 100644
--- a/xio-socket.c
+++ b/xio-socket.c
@@ -31,34 +31,34 @@
 
 static
 int xioopen_socket_connect(int argc, const char *argv[], struct opt *opts,
-			   int xioflags, xiofile_t *xfd, unsigned groups,
+			   int xioflags, xiofile_t *xfd, groups_t groups,
 			   int dummy1, int dummy2, int dummy3);
 static
 int xioopen_socket_listen(int argc, const char *argv[], struct opt *opts,
-			  int xioflags, xiofile_t *xfd, unsigned groups,
+			  int xioflags, xiofile_t *xfd, groups_t groups,
 			  int dummy1, int dummy2, int dummy3);
 static
 int xioopen_socket_sendto(int argc, const char *argv[], struct opt *opts,
-			  int xioflags, xiofile_t *xfd, unsigned groups,
+			  int xioflags, xiofile_t *xfd, groups_t groups,
 			  int dummy1, int dummy2, int dummy3);
 static
 int xioopen_socket_datagram(int argc, const char *argv[], struct opt *opts,
-			    int xioflags, xiofile_t *xfd, unsigned groups,
+			    int xioflags, xiofile_t *xfd, groups_t groups,
 			    int dummy1, int dummy2, int dummy3);
 static
 int xioopen_socket_recvfrom(int argc, const char *argv[], struct opt *opts,
-			    int xioflags, xiofile_t *xfd, unsigned groups,
+			    int xioflags, xiofile_t *xfd, groups_t groups,
 			    int dummy1, int socktype, int dummy3);
 static
 int xioopen_socket_recv(int argc, const char *argv[], struct opt *opts,
-			int xioflags, xiofile_t *xfd, unsigned groups,
-			int dumy1, int dummy2, int dummy3);
+			int xioflags, xiofile_t *xfd, groups_t groups, 
+			int dummy1, int dummy2, int dummy3);
 
 static
 int _xioopen_socket_sendto(const char *pfname, const char *type,
 			   const char *proto, const char *address,
 			   struct opt *opts, int xioflags, xiofile_t *xxfd,
-			   unsigned groups);
+			   groups_t groups);
 
 static int
 xiolog_ancillary_socket(struct cmsghdr *cmsg, int *num,
@@ -210,7 +210,7 @@
 
 static
 int xioopen_socket_connect(int argc, const char *argv[], struct opt *opts,
-			   int xioflags, xiofile_t *xxfd, unsigned groups,
+			   int xioflags, xiofile_t *xxfd, groups_t groups,
 			   int dummy1, int dummy2, int dummy3) {
    struct single *xfd = &xxfd->stream;
    const char *pfname = argv[1];
@@ -291,7 +291,7 @@
 #if WITH_LISTEN
 static
 int xioopen_socket_listen(int argc, const char *argv[], struct opt *opts,
-			  int xioflags, xiofile_t *xxfd, unsigned groups,
+			  int xioflags, xiofile_t *xxfd, groups_t groups,
 			  int dummy1, int dummy2, int dummy3) {
    struct single *xfd = &xxfd->stream;
    const char *pfname = argv[1];
@@ -361,7 +361,7 @@
 /* we expect the form: ...:domain:type:protocol:remote-address */
 static
 int xioopen_socket_sendto(int argc, const char *argv[], struct opt *opts,
-			  int xioflags, xiofile_t *xxfd, unsigned groups,
+			  int xioflags, xiofile_t *xxfd, groups_t groups,
 			  int dummy1, int dummy2, int dummy3) {
    int result;
 
@@ -384,7 +384,7 @@
 int _xioopen_socket_sendto(const char *pfname, const char *type,
 			   const char *protname, const char *address,
 			   struct opt *opts, int xioflags, xiofile_t *xxfd,
-			   unsigned groups) {
+			   groups_t groups) {
    xiosingle_t *xfd = &xxfd->stream;
    char *garbage;
    union sockaddr_union us = {{0}};
@@ -475,7 +475,7 @@
 /* we expect the form: ...:domain:socktype:protocol:local-address */
 static
 int xioopen_socket_recvfrom(int argc, const char *argv[], struct opt *opts,
-		     int xioflags, xiofile_t *xxfd, unsigned groups,
+		     int xioflags, xiofile_t *xxfd, groups_t groups,
 		     int dummy, int summy2, int dummy3) {
    struct single *xfd = &xxfd->stream;
    const char *pfname = argv[1];
@@ -552,7 +552,7 @@
 /* we expect the form: ...:domain:type:protocol:local-address */
 static
 int xioopen_socket_recv(int argc, const char *argv[], struct opt *opts,
-		       int xioflags, xiofile_t *xxfd, unsigned groups,
+		       int xioflags, xiofile_t *xxfd, groups_t groups,
 		       int dummy1, int dummy2, int dummy3) {
    struct single *xfd = &xxfd->stream;
    const char *pfname = argv[1];
@@ -631,7 +631,7 @@
 /* we expect the form: ...:domain:type:protocol:remote-address */
 static
 int xioopen_socket_datagram(int argc, const char *argv[], struct opt *opts,
-			    int xioflags, xiofile_t *xxfd, unsigned groups,
+			    int xioflags, xiofile_t *xxfd, groups_t groups,
 			    int dummy1, int dummy2, int dummy3) {
    xiosingle_t *xfd = &xxfd->stream;
    const char *pfname = argv[1];
@@ -1029,7 +1029,7 @@
 int _xioopen_dgram_sendto(/* them is already in xfd->peersa */
 			union sockaddr_union *us, socklen_t uslen,
 			struct opt *opts,
-			int xioflags, xiosingle_t *xfd, unsigned groups,
+			int xioflags, xiosingle_t *xfd, groups_t groups,
 			int pf, int socktype, int ipproto, bool alt) {
    int level = E_ERROR;
    union sockaddr_union la; socklen_t lalen = sizeof(la);
diff --git a/xio-socket.h b/xio-socket.h
index 1b6f00b..96bf95e 100644
--- a/xio-socket.h
+++ b/xio-socket.h
@@ -101,7 +101,7 @@
 int _xioopen_dgram_sendto(/* them is already in xfd->peersa */
 			union sockaddr_union *us, socklen_t uslen,
 			struct opt *opts,
-			int xioflags, xiosingle_t *xfd, unsigned groups,
+			int xioflags, xiosingle_t *xfd, groups_t groups,
 			int pf, int socktype, int ipproto, bool alt);
 extern
 int _xioopen_dgram_recvfrom(struct single *xfd, int xioflags,
diff --git a/xio-socks.c b/xio-socks.c
index 0af5cda..4dde96b 100644
--- a/xio-socks.c
+++ b/xio-socks.c
@@ -29,7 +29,7 @@
 
 static int xioopen_socks4_connect(int argc, const char *argv[], struct opt *opts,
 				  int xioflags, xiofile_t *fd,
-				  unsigned groups, int dummy1, int dummy2,
+				  groups_t groups, int dummy1, int dummy2,
 				  int dummy3);
 
 const struct optdesc opt_socksport = { "socksport", NULL, OPT_SOCKSPORT, GROUP_IP_SOCKS4, PH_LATE, TYPE_STRING, OFUNC_SPEC };
@@ -41,7 +41,7 @@
 
 static int xioopen_socks4_connect(int argc, const char *argv[], struct opt *opts,
 				  int xioflags, xiofile_t *xxfd,
-				  unsigned groups, int socks4a, int dummy2,
+				  groups_t groups, int socks4a, int dummy2,
 				  int dummy3) {
    /* we expect the form: host:host:port */
    struct single *xfd = &xxfd->stream;
diff --git a/xio-stdio.c b/xio-stdio.c
index 44f375c..0cae125 100644
--- a/xio-stdio.c
+++ b/xio-stdio.c
@@ -13,8 +13,8 @@
 
 #if WITH_STDIO
 
-static int xioopen_stdio(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3);
-static int xioopen_stdfd(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xfd, unsigned groups, int fd, int dummy2, int dummy3);
+static int xioopen_stdio(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3);
+static int xioopen_stdfd(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xfd, groups_t groups, int fd, int dummy2, int dummy3);
 
 
 /* we specify all option groups that we can imagine for a FD, becasue the
@@ -30,7 +30,7 @@
    generate a dual address. */
 int xioopen_stdio_bi(xiofile_t *sock) {
    struct opt *optspr;
-   unsigned int groups1 = addr_stdio.groups;
+   groups_t groups1 = addr_stdio.groups;
    int result;
 
    if (xioopen_makedual(sock) < 0) {
@@ -135,7 +135,7 @@
 
 /* wrap around unidirectional xioopensingle and xioopen_fd to automatically determine stdin or stdout fd depending on rw.
    Do not set FD_CLOEXEC flag. */
-static int xioopen_stdio(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3) {
+static int xioopen_stdio(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3) {
    int rw = (xioflags&XIO_ACCMODE);
 
    if (argc != 1) {
@@ -154,7 +154,7 @@
 
 /* wrap around unidirectional xioopensingle and xioopen_fd to automatically determine stdin or stdout fd depending on rw.
    Do not set FD_CLOEXEC flag. */
-static int xioopen_stdfd(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xfd, unsigned groups, int fd, int dummy2, int dummy3) {
+static int xioopen_stdfd(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xfd, groups_t groups, int fd, int dummy2, int dummy3) {
    int rw = (xioflags&XIO_ACCMODE);
 
    if (argc != 1) {
diff --git a/xio-system.c b/xio-system.c
index d232ec3..93f29bf 100644
--- a/xio-system.c
+++ b/xio-system.c
@@ -16,7 +16,7 @@
 static int xioopen_system(int arg, const char *argv[], struct opt *opts,
 		int xioflags,	/* XIO_RDONLY etc. */
 		xiofile_t *fd,
-		unsigned groups,
+		groups_t groups,
 		int dummy1, int dummy2, int dummy3
 		);
 
@@ -26,7 +26,7 @@
 static int xioopen_system(int argc, const char *argv[], struct opt *opts,
 		int xioflags,	/* XIO_RDONLY etc. */
 		xiofile_t *fd,
-		unsigned groups,
+		groups_t groups,
 		int dummy1, int dummy2, int dummy3
 		) {
    int status;
diff --git a/xio-tun.c b/xio-tun.c
index 14a4028..3851b03 100644
--- a/xio-tun.c
+++ b/xio-tun.c
@@ -15,7 +15,7 @@
 #include "xio-tun.h"
 
 
-static int xioopen_tun(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, unsigned groups, int dummy1, int dummy2, int dummy3);
+static int xioopen_tun(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *fd, groups_t groups, int dummy1, int dummy2, int dummy3);
 
 /****** TUN addresses ******/
 const struct optdesc opt_tun_device    = { "tun-device",     NULL,      OPT_TUN_DEVICE,      GROUP_TUN,       PH_OPEN, TYPE_FILENAME, OFUNC_SPEC };
@@ -64,7 +64,7 @@
 } ;
 #endif
 
-static int xioopen_tun(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xfd, unsigned groups, int dummy1, int dummy2, int dummy3) {
+static int xioopen_tun(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xfd, groups_t groups, int dummy1, int dummy2, int dummy3) {
    char *tundevice = NULL;
    char *tunname = NULL, *tuntype = NULL;
    int pf = /*! PF_UNSPEC*/ PF_INET;
diff --git a/xio-udp.c b/xio-udp.c
index d2006df..4359510 100644
--- a/xio-udp.c
+++ b/xio-udp.c
@@ -21,25 +21,25 @@
 
 static
 int xioopen_udp_sendto(int argc, const char *argv[], struct opt *opts,
-		     int xioflags, xiofile_t *xfd, unsigned groups,
+		     int xioflags, xiofile_t *xfd, groups_t groups,
 		     int pf, int socktype, int ipproto);
 static
 int xioopen_udp_datagram(int argc, const char *argv[], struct opt *opts,
-		     int xioflags, xiofile_t *xfd, unsigned groups,
+		     int xioflags, xiofile_t *xfd, groups_t groups,
 		     int pf, int socktype, int ipproto);
 static
 int xioopen_udp_recvfrom(int argc, const char *argv[], struct opt *opts,
-		       int xioflags, xiofile_t *xfd, unsigned groups,
+		       int xioflags, xiofile_t *xfd, groups_t groups,
 		       int pf, int socktype, int ipproto);
 static
 int xioopen_udp_recv(int argc, const char *argv[], struct opt *opts,
-		     int xioflags, xiofile_t *xfd, unsigned groups,
+		     int xioflags, xiofile_t *xfd, groups_t groups,
 		     int pf, int socktype, int ipproto);
 
 static
 int _xioopen_udp_sendto(const char *hostname, const char *servname,
 			struct opt *opts,
-			int xioflags, xiofile_t *xxfd, unsigned groups,
+			int xioflags, xiofile_t *xxfd, groups_t groups,
 			int pf, int socktype, int ipproto);
 
 const struct addrdesc addr_udp_connect  = { "udp-connect",    3, xioopen_ipapp_connect, GROUP_FD|GROUP_SOCKET|GROUP_SOCK_IP4|GROUP_SOCK_IP6|GROUP_IP_UDP, SOCK_DGRAM, IPPROTO_UDP, PF_UNSPEC HELP(":<host>:<port>") };
@@ -275,7 +275,7 @@
 /* we expect the form: port */
 int xioopen_ipdgram_listen(int argc, const char *argv[], struct opt *opts,
 			   int xioflags, xiofile_t *fd,
-			  unsigned groups, int pf, int ipproto,
+			  groups_t groups, int pf, int ipproto,
 			  int protname) {
    const char *portname = argv[1];
    union sockaddr_union us;
@@ -328,7 +328,7 @@
 
 static
 int xioopen_udp_sendto(int argc, const char *argv[], struct opt *opts,
-		     int xioflags, xiofile_t *xxfd, unsigned groups,
+		     int xioflags, xiofile_t *xxfd, groups_t groups,
 		     int pf, int socktype, int ipproto) {
    int result;
 
@@ -357,7 +357,7 @@
 static
 int _xioopen_udp_sendto(const char *hostname, const char *servname,
 			struct opt *opts,
-		     int xioflags, xiofile_t *xxfd, unsigned groups,
+		     int xioflags, xiofile_t *xxfd, groups_t groups,
 		     int pf, int socktype, int ipproto) {
    xiosingle_t *xfd = &xxfd->stream;
    union sockaddr_union us;
@@ -421,7 +421,7 @@
 
 static
 int xioopen_udp_datagram(int argc, const char *argv[], struct opt *opts,
-		     int xioflags, xiofile_t *xxfd, unsigned groups,
+		     int xioflags, xiofile_t *xxfd, groups_t groups,
 		     int pf, int socktype, int ipproto) {
    xiosingle_t *xfd = &xxfd->stream;
    char *rangename;
@@ -482,7 +482,7 @@
 
 static
 int xioopen_udp_recvfrom(int argc, const char *argv[], struct opt *opts,
-		     int xioflags, xiofile_t *xfd, unsigned groups,
+		     int xioflags, xiofile_t *xfd, groups_t groups,
 		     int pf, int socktype, int ipproto) {
    union sockaddr_union us;
    socklen_t uslen = sizeof(us);
@@ -555,7 +555,7 @@
 
 static
 int xioopen_udp_recv(int argc, const char *argv[], struct opt *opts,
-		     int xioflags, xiofile_t *xfd, unsigned groups,
+		     int xioflags, xiofile_t *xfd, groups_t groups,
 		     int pf, int socktype, int ipproto) {
    union sockaddr_union us;
    socklen_t uslen = sizeof(us);
diff --git a/xio-udp.h b/xio-udp.h
index fd9d028..af07730 100644
--- a/xio-udp.h
+++ b/xio-udp.h
@@ -30,7 +30,7 @@
 
 extern int xioopen_ipdgram_listen(int argc, const char *argv[], struct opt *opts,
 				  int rw, xiofile_t *fd,
-			  unsigned groups, int af, int ipproto,
+			  groups_t groups, int af, int ipproto,
 			  int protname);
 
 #endif /* !defined(__xio_udp_h_included) */
diff --git a/xio-unix.c b/xio-unix.c
index 7229de9..4c36de4 100644
--- a/xio-unix.c
+++ b/xio-unix.c
@@ -24,16 +24,16 @@
 #  define ABSTRACT 0
 #endif
 
-static int xioopen_unix_connect(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, unsigned groups, int abstract, int dummy2, int dummy3);
-static int xioopen_unix_listen(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, unsigned groups, int abstract, int dummy2, int dummy3);
-static int xioopen_unix_sendto(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, unsigned groups, int abstract, int dummy2, int dummy3);
-static int xioopen_unix_recvfrom(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, unsigned groups, int abstract, int dummy2, int dummy3);
+static int xioopen_unix_connect(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, groups_t groups, int abstract, int dummy2, int dummy3);
+static int xioopen_unix_listen(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, groups_t groups, int abstract, int dummy2, int dummy3);
+static int xioopen_unix_sendto(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, groups_t groups, int abstract, int dummy2, int dummy3);
+static int xioopen_unix_recvfrom(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, groups_t groups, int abstract, int dummy2, int dummy3);
 static
 int xioopen_unix_recv(int argc, const char *argv[], struct opt *opts,
-		      int xioflags, xiofile_t *xxfd, unsigned groups,
+		      int xioflags, xiofile_t *xxfd, groups_t groups,
 		      int abstract, int dummy2, int dummy3);
 static
-int xioopen_unix_client(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, unsigned groups, int abstract, int dummy2, int dummy3);
+int xioopen_unix_client(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, groups_t groups, int abstract, int dummy2, int dummy3);
 
 /* the first free parameter is 0 for "normal" unix domain sockets, or 1 for
    abstract unix sockets (Linux); the second and third free parameter are
@@ -115,7 +115,7 @@
 }
 
 #if WITH_LISTEN
-static int xioopen_unix_listen(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, unsigned groups, int abstract, int dummy2, int dummy3) {
+static int xioopen_unix_listen(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, groups_t groups, int abstract, int dummy2, int dummy3) {
    /* we expect the form: filename */
    const char *name;
    xiosingle_t *xfd = &xxfd->stream;
@@ -200,7 +200,7 @@
 #endif /* WITH_LISTEN */
 
 
-static int xioopen_unix_connect(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, unsigned groups, int abstract, int dummy2, int dummy3) {
+static int xioopen_unix_connect(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, groups_t groups, int abstract, int dummy2, int dummy3) {
    /* we expect the form: filename */
    const char *name;
    struct single *xfd = &xxfd->stream;
@@ -348,7 +348,7 @@
 }
 
 
-static int xioopen_unix_sendto(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, unsigned groups, int abstract, int dummy, int dummy3) {
+static int xioopen_unix_sendto(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, groups_t groups, int abstract, int dummy, int dummy3) {
    /* we expect the form: filename */
    const char *name;
    xiosingle_t *xfd = &xxfd->stream;
@@ -411,7 +411,7 @@
 
 static
 int xioopen_unix_recvfrom(int argc, const char *argv[], struct opt *opts,
-		     int xioflags, xiofile_t *xxfd, unsigned groups,
+		     int xioflags, xiofile_t *xxfd, groups_t groups,
 		     int abstract, int dummy2, int dummy3) {
    /* we expect the form: filename */
    const char *name;
@@ -491,7 +491,7 @@
 
 static
 int xioopen_unix_recv(int argc, const char *argv[], struct opt *opts,
-		      int xioflags, xiofile_t *xxfd, unsigned groups,
+		      int xioflags, xiofile_t *xxfd, groups_t groups,
 		      int abstract, int dummy2, int dummy3) {
    /* we expect the form: filename */
    const char *name;
@@ -565,7 +565,7 @@
 
 
 /* generic UNIX socket client, tries connect, SEQPACKET, send(to) */
-static int xioopen_unix_client(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, unsigned groups, int abstract, int dummy2, int dummy3) {
+static int xioopen_unix_client(int argc, const char *argv[], struct opt *opts, int xioflags, xiofile_t *xxfd, groups_t groups, int abstract, int dummy2, int dummy3) {
    /* we expect the form: filename */
    if (argc != 2) {
       Error2("%s: wrong number of parameters (%d instead of 1)", argv[0], argc-1);
@@ -586,8 +586,8 @@
    OPT_PROTOCOL_FAMILY, OPT_UNIX_TIGHTSOCKLEN, OPT_UNLINK_CLOSE, OPT_BIND,
    OPT_SO_TYPE, OPT_SO_PROTOTYPE, OPT_CLOEXEC, OPT_USER, OPT_GROUP, ?OPT_FORK,
 */
-int
-_xioopen_unix_client(xiosingle_t *xfd, int xioflags, unsigned groups,
+int 
+_xioopen_unix_client(xiosingle_t *xfd, int xioflags, groups_t groups,
 		     int abstract, struct opt *opts, const char *name) {
    const struct opt *namedopt;
    int pf = PF_UNIX;
diff --git a/xio-unix.h b/xio-unix.h
index 3e97f83..049ad8d 100644
--- a/xio-unix.h
+++ b/xio-unix.h
@@ -32,7 +32,7 @@
 		       struct sockaddr_un *sa, socklen_t salen, int ipproto);
 
 extern int
-_xioopen_unix_client(xiosingle_t *xfd, int xioflags, unsigned groups,
+_xioopen_unix_client(xiosingle_t *xfd, int xioflags, groups_t groups,
 		     int abstract, struct opt *opts, const char *name);
 
 #endif /* !defined(__xio_unix_h_included) */
diff --git a/xio-vsock.c b/xio-vsock.c
index 37fed61..29025f8 100644
--- a/xio-vsock.c
+++ b/xio-vsock.c
@@ -14,10 +14,10 @@
 #include "xio-vsock.h"
 
 static int xioopen_vsock_connect(int argc, const char *argv[], struct opt *opts,
-        int xioflags, xiofile_t *xxfd, unsigned groups, int abstract,
+        int xioflags, xiofile_t *xxfd, groups_t groups, int abstract,
         int dummy2, int dummy3);
 static int xioopen_vsock_listen(int argc, const char *argv[], struct opt *opts,
-        int xioflags, xiofile_t *xxfd, unsigned groups, int abstract,
+        int xioflags, xiofile_t *xxfd, groups_t groups, int abstract,
         int dummy2, int dummy3);
 
 static void xiolog_vsock_cid(void);
@@ -67,7 +67,7 @@
 }
 
 static int xioopen_vsock_connect(int argc, const char *argv[], struct opt *opts,
-        int xioflags, xiofile_t *xxfd, unsigned groups,
+        int xioflags, xiofile_t *xxfd, groups_t groups,
         int abstract, int dummy2, int dummy3) {
    /* we expect the form :cid:port */
    struct single *xfd = &xxfd->stream;
@@ -124,7 +124,7 @@
 
 #if WITH_LISTEN
 static int xioopen_vsock_listen(int argc, const char *argv[], struct opt *opts,
-        int xioflags, xiofile_t *xxfd, unsigned groups, int abstract,
+        int xioflags, xiofile_t *xxfd, groups_t groups, int abstract,
         int dummy2, int dummy3) {
    /* we expect the form :port */
    struct single *xfd = &xxfd->stream;
diff --git a/xio.h b/xio.h
index fad024d..63e8b7d 100644
--- a/xio.h
+++ b/xio.h
@@ -89,6 +89,9 @@
 			   streams */
 } ;
 
+typedef uint32_t groups_t;
+#define F_groups_t F_uint32_x
+
 /* global XIO options/parameters */
 typedef struct {
    bool strictopts;
@@ -311,9 +314,9 @@
 struct addrdesc {
    const char *defname;	/* main (canonical) name of address */
    int directions;	/* 1..read, 2..write, 3..both */
-   int (*func)(int argc, const char *argv[], struct opt *opts, int rw, xiofile_t *fd, unsigned groups,
+   int (*func)(int argc, const char *argv[], struct opt *opts, int rw, xiofile_t *fd, groups_t groups,
 	       int arg1, int arg2, int arg3);
-   unsigned groups;
+   groups_t groups;
    int arg1;
    int arg2;
    int arg3;
diff --git a/xiohelp.c b/xiohelp.c
index 8d1b19f..26f3343 100644
--- a/xiohelp.c
+++ b/xiohelp.c
@@ -74,7 +74,7 @@
 /* print a line about a single option */
 static int xiohelp_option(FILE *of, const struct optname *on, const char *name) {
    int j;
-   unsigned int groups;
+   groups_t groups;
    bool occurred;
 
    fprintf(of, "      %s\tgroups=", name);
@@ -99,7 +99,7 @@
    const struct addrname *an;
    const struct optname *on;
    int i, j;
-   unsigned int groups;
+   groups_t groups;
    bool occurred;
 
    fputs("   bi-address:\n", of);
diff --git a/xioopts.c b/xioopts.c
index 15a72e5..1731cd5 100644
--- a/xioopts.c
+++ b/xioopts.c
@@ -1847,7 +1847,7 @@
    to the array opts. Uses the option table 'optionnames'.
    returns 0 on success, -1 on error, 1 on unknown/wrong option
 */
-int parseopts(const char **a, unsigned int groups, struct opt **opts) {
+int parseopts(const char **a, groups_t groups, struct opt **opts) {
 
    return parseopts_table(a, groups, opts, optionnames,
 			  sizeof(optionnames)/sizeof(struct optname)-1);
@@ -1858,7 +1858,7 @@
    to the array opts. Uses the specified option table.
    returns 0 on success, -1 on error, 1 on unknown/wrong option
 */
-int parseopts_table(const char **a, unsigned int groups, struct opt **opts,
+int parseopts_table(const char **a, groups_t groups, struct opt **opts,
 	      const struct optname optionnames[], size_t optionnum) {
    int i=0;
    struct opt *opt;
@@ -1949,7 +1949,7 @@
 	  !xioopts_ignoregroups) {
 	 Error1("parseopts_table(): option \"%s\" not supported with this address type",
 		token /*a0*/);
-	 Info2("parseopts_table()  groups=%08x, ent->group=%08x",
+	 Info2("parseopts_table()  groups="F_groups_t", ent->group="F_groups_t,
 	       groups, ent->desc->group);
 #if 0
 	 continue;
@@ -2633,7 +2633,7 @@
 /* look for an option with the given properties
    return a pointer to the first matching valid option in the list
    Returns NULL when no matching option found */
-const struct opt *searchopt(const struct opt *opts, unsigned int groups, enum e_phase from, enum e_phase to,
+const struct opt *searchopt(const struct opt *opts, groups_t groups, enum e_phase from, enum e_phase to,
 		      enum e_func func) {
    int i;
 
@@ -2656,7 +2656,7 @@
 
 /* copy the already parsed options for repeated application, but only those
    matching groups ANY and <groups> */
-struct opt *copyopts(const struct opt *opts, unsigned int groups) {
+struct opt *copyopts(const struct opt *opts, groups_t groups) {
    struct opt *new;
    int i, j, n;
 
@@ -2689,7 +2689,7 @@
 
 /* move options to a new options list
    move only those matching <groups> */
-struct opt *moveopts(struct opt *opts, unsigned int groups) {
+struct opt *moveopts(struct opt *opts, groups_t groups) {
    struct opt *new;
    int i, j, n;
 
@@ -2756,8 +2756,8 @@
 
 /* determines the address group from mode_t */
 /* does not set GROUP_FD; cannot determine GROUP_TERMIOS ! */
-int _groupbits(mode_t mode) {
-   unsigned int result = 0;
+groups_t _groupbits(mode_t mode) {
+   groups_t result = 0;
 
    switch ((mode&S_IFMT)>>12) {
    case (S_IFIFO>>12):	/* 1, FIFO */
@@ -2785,13 +2785,13 @@
 }
 
 /* does not set GROUP_FD */
-int groupbits(int fd) {
+groups_t groupbits(int fd) {
 #if HAVE_STAT64
    struct stat64 buf;
 #else
    struct stat buf;
 #endif /* !HAVE_STAT64 */
-   int result;
+   groups_t result;
 
    if (
 #if HAVE_STAT64
@@ -3801,7 +3801,7 @@
 
 /* apply and consume all options of type FLAG and group.
    Return 0 if everything went right, or -1 if an error occurred. */
-int applyopts_flags(struct opt *opts, int group, flags_t *result) {
+int applyopts_flags(struct opt *opts, groups_t group, flags_t *result) {
    struct opt *opt = opts;
 
    if (!opts)  return 0;
diff --git a/xioopts.h b/xioopts.h
index 61ced08..ac36e95 100644
--- a/xioopts.h
+++ b/xioopts.h
@@ -139,7 +139,7 @@
 
 #define GROUP_FD	0x00000001	/* everything applyable to a fd */
 #define GROUP_FIFO	0x00000002
-#define GROUP_CHR	0x00000004
+#define GROUP_CHR	0x00000004 	/* not yet used? */
 #define GROUP_BLK	0x00000008
 #define GROUP_REG	0x00000010
 #define GROUP_FILE GROUP_REG
@@ -161,13 +161,13 @@
 #define GROUP_PARENT	0x00080000	/* for parent of communicating child */
 
 #define GROUP_SOCK_UNIX	0x00100000
-#define GROUP_SOCK_IP4	0x00200000
+#define GROUP_SOCK_IP4	0x00200000 	/* not yet used? */
 #define GROUP_SOCK_IP6	0x00400000
 #define GROUP_SOCK_IP	(GROUP_SOCK_IP4|GROUP_SOCK_IP6)
 #define GROUP_INTERFACE	0x00800000
 #define GROUP_TUN       GROUP_INTERFACE
 
-#define GROUP_IP_UDP	0x01000000
+#define GROUP_IP_UDP	0x01000000 	/* not yet used? */
 #define GROUP_IP_TCP	0x02000000
 #define GROUP_IPAPP	(GROUP_IP_UDP|GROUP_IP_TCP|GROUP_IP_SCTP)	/* true: indicates one of UDP, TCP, SCTP */
 #define GROUP_IP_SOCKS4	0x04000000
@@ -176,10 +176,10 @@
 #define GROUP_PROCESS	0x10000000	/* a process related option */
 #define GROUP_APPL	0x20000000	/* option handled by data loop */
 #define GROUP_HTTP	0x40000000	/* any HTTP client */
-#define GROUP_IP_SCTP	0x80000000
+#define GROUP_IP_SCTP	0x80000000U
 
 #define GROUP_ANY	(GROUP_PROCESS|GROUP_APPL)
-#define GROUP_ALL	0xffffffff
+#define GROUP_ALL	0xffffffffU
 
 
 /* no IP multicasts, no error queue yet */
@@ -898,7 +898,7 @@
    const char *defname;		/* default name */
    const char *nickname;	/* usual name */
    enum e_optcode optcode;	/* short form of option name */
-   unsigned int group;
+   groups_t group;
    enum e_phase phase;		/* when this option is to be used */
    enum e_types type;	/* the data type as expected on input, and stored */
    enum e_func  func;	/* which function can apply this option, e.g. ioctl(),
@@ -935,7 +935,7 @@
 extern int applyopts(int fd, struct opt *opts, enum e_phase phase);
 extern int applyopts2(int fd, struct opt *opts, unsigned int from,
 		      unsigned int to);
-extern int applyopts_flags(struct opt *opts, int group, flags_t *result);
+extern int applyopts_flags(struct opt *opts, groups_t group, flags_t *result);
 extern int applyopts_cloexec(int fd, struct opt *opts);
 extern int applyopts_early(const char *path, struct opt *opts);
 extern int applyopts_fchown(int fd, struct opt *opts);
@@ -943,18 +943,18 @@
 extern int applyopts_offset(struct single *xfd, struct opt *opts);
 extern int applyopts_signal(struct single *xfd, struct opt *opts);
 extern int _xio_openlate(struct single *fd, struct opt *opts);
-extern int parseopts(const char **a, unsigned int groups, struct opt **opts);
-extern int parseopts_table(const char **a, unsigned int groups,
+extern int parseopts(const char **a, groups_t groups, struct opt **opts);
+extern int parseopts_table(const char **a, groups_t groups,
 			   struct opt **opts,
 			 const struct optname optionnames[], size_t optionnum);
-extern const struct opt *searchopt(const struct opt *opts, unsigned int groups, enum e_phase from, enum e_phase to,
+extern const struct opt *searchopt(const struct opt *opts, groups_t groups, enum e_phase from, enum e_phase to,
 				   enum e_func func);
-extern struct opt *copyopts(const struct opt *opts, unsigned int groups);
-extern struct opt *moveopts(struct opt *opts, unsigned int groups);
+extern struct opt *copyopts(const struct opt *opts, groups_t groups);
+extern struct opt *moveopts(struct opt *opts, groups_t groups);
 extern int leftopts(const struct opt *opts);
 extern int showleft(const struct opt *opts);
-extern int groupbits(int fd);
-extern int _groupbits(mode_t mode);
+extern groups_t groupbits(int fd);
+extern groups_t _groupbits(mode_t mode);
 extern int dropopts(struct opt *opts, unsigned int phase);
 extern int dropopts2(struct opt *opts, unsigned int from, unsigned int to);