diff -ur irc-cvs/common/struct_def.h irc-cvs.xline/common/struct_def.h
--- irc-cvs/common/struct_def.h	2004-04-07 19:02:37.000000000 +0200
+++ irc-cvs.xline/common/struct_def.h	2004-05-10 01:33:32.000000000 +0200
@@ -180,7 +180,9 @@
 #define FLAGS_RESTRICT	0x0010 /* restricted user */
 #define FLAGS_AWAY	0x0020 /* user is away */
 #define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */
-	
+#ifdef XLINE
+#define FLAGS_XLINED	0x0100	/* X-lined client */
+#endif
 #define	SEND_UMODES	(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY)
 #define	ALL_UMODES	(SEND_UMODES|FLAGS_LOCOP|FLAGS_RESTRICT)
 
@@ -323,6 +325,9 @@
 #define	CONF_BOUNCE		0x040000
 #define	CONF_OTHERKILL		0x080000
 #define	CONF_DENY		0x100000
+#ifdef XLINE
+#define CONF_XLINE		0x200000
+#endif
 
 #define	CONF_OPS		(CONF_OPERATOR | CONF_LOCOP)
 #define	CONF_SERVER_MASK	(CONF_CONNECT_SERVER | CONF_NOCONNECT_SERVER |\
@@ -349,6 +354,13 @@
 #define PFLAG_DELAYED		0x00001
 #define PFLAG_SERVERONLY	0x00002
 
+#ifdef XLINE
+#define XFLAG_WHOLE		0x00001
+#define IsConfXlineWhole(x)	((x)->flags & XFLAG_WHOLE)
+#define IsXlined(x)		((x)->user && (x)->user->flags & FLAGS_XLINED)
+#define SetXlined(x)		((x)->user->flags |= FLAGS_XLINED)
+#endif
+
 #define IsConfDelayed(x)	((x)->flags & PFLAG_DELAYED)
 #define IsConfServeronly(x)	((x)->flags & PFLAG_SERVERONLY)
 
@@ -916,6 +928,9 @@
 #define EXITC_AREFQ	'u'	/* Unauthorized by iauth, be quiet */
 #define EXITC_VIRUS	'v'	/* joined a channel used by PrettyPark virus */
 #define EXITC_YLINEMAX	'Y'	/* Y:line max clients limit */
+#ifdef XLINE
+#define EXITC_XLINE	'X'	/* Forbidden GECOS */
+#endif
 
 /* eXternal authentication slave OPTions */
 #define	XOPT_REQUIRED	0x01	/* require authentication be done by iauth */
Only in irc-cvs.xline: i686-pc-linux-gnu
diff -ur irc-cvs/ircd/chkconf.c irc-cvs.xline/ircd/chkconf.c
--- irc-cvs/ircd/chkconf.c	2004-03-05 23:06:10.000000000 +0100
+++ irc-cvs.xline/ircd/chkconf.c	2004-05-08 20:10:25.000000000 +0200
@@ -355,6 +355,11 @@
 			case 'y':
 			        aconf->status = CONF_CLASS;
 		        	break;
+#ifdef XLINE
+			case 'X':
+				aconf->status = CONF_XLINE;
+				break;
+#endif
 		    default:
                         (void)fprintf(stderr, "%s:%d\tWARNING: unknown conf line letter (%c)\n",
 				filelist->filename, nr - filelist->min, *tmp);
diff -ur irc-cvs/ircd/s_conf.c irc-cvs.xline/ircd/s_conf.c
--- irc-cvs/ircd/s_conf.c	2004-05-07 22:02:51.000000000 +0200
+++ irc-cvs.xline/ircd/s_conf.c	2004-05-10 02:09:09.000000000 +0200
@@ -212,6 +212,36 @@
 	*s++ = '\0';
 	return pfsbuf;
 }
+#ifdef XLINE
+char *xline_flags_to_string(long flags)
+{
+	static char xfsbuf[BUFSIZE];
+	char *s;
+
+	s = xfsbuf;
+	
+	if (flags & XFLAG_WHOLE)
+	{
+		*s++ = 'W';
+	}
+	if (s == xfsbuf)
+	{
+		*s++ = '-';
+	}
+	*s++ = '\0';
+	return xfsbuf;
+}
+long xline_flags_parse(char *string)
+{
+	long tmp = 0;
+	if (index(string, 'W'))
+	{
+		tmp |= XFLAG_WHOLE;
+	}
+	return tmp;
+}
+
+#endif
 /*
  * remove all conf entries from the client except those which match
  * the status field mask.
@@ -1399,6 +1429,11 @@
 			case 'y':
 			        aconf->status = CONF_CLASS;
 		        	break;
+#ifdef XLINE
+			case 'X':
+				aconf->status = CONF_XLINE;
+				break;
+#endif
 		    default:
 			Debug((DEBUG_ERROR, "Error in config file: %s", line));
 			break;
@@ -1535,7 +1570,12 @@
 				}
 			}
 		}
-
+#ifdef XLINE
+		if (aconf->status & CONF_XLINE && tmp3)
+		{
+			aconf->flags = xline_flags_parse(tmp3);
+		}
+#endif
 		if (aconf->status & CONF_SERVICE)
 			aconf->port &= SERVICE_MASK_ALL;
 		if (aconf->status & (CONF_SERVER_MASK|CONF_SERVICE))
diff -ur irc-cvs/ircd/s_conf_ext.h irc-cvs.xline/ircd/s_conf_ext.h
--- irc-cvs/ircd/s_conf_ext.h	2004-03-20 22:14:33.000000000 +0100
+++ irc-cvs.xline/ircd/s_conf_ext.h	2004-05-09 23:10:52.000000000 +0200
@@ -73,6 +73,10 @@
 EXTERN long iline_flags_parse(char *string);
 EXTERN char *pline_flags_to_string(long flags);
 EXTERN long pline_flags_parse(char *string);
+#ifdef XLINE
+EXTERN char *xline_flags_to_string(long flags);
+EXTERN long xline_flags_parse(char *string);
+#endif
 # ifdef	INET6
 EXTERN char *ipv6_convert (char *orig);
 # endif
diff -ur irc-cvs/ircd/s_serv.c irc-cvs.xline/ircd/s_serv.c
--- irc-cvs/ircd/s_serv.c	2004-04-07 19:02:38.000000000 +0200
+++ irc-cvs.xline/ircd/s_serv.c	2004-05-10 00:54:46.000000000 +0200
@@ -1858,6 +1858,23 @@
 		{ 0, 0, 0}
 	};
 
+#ifdef XLINE
+static  void    report_x_lines(aClient *sptr, char *to)
+{
+	aConfItem *tmp;
+
+	for (tmp = conf; tmp; tmp = tmp->next)
+	{
+		if (tmp->status != CONF_XLINE)
+			continue;
+
+		sendto_one(sptr,":%s %d %s %s :%s ", ME, RPL_STATSDEBUG, to,
+				 xline_flags_to_string(tmp->flags),
+				 tmp->host);
+	}
+}
+#endif
+
 static	void	report_configured_links(aClient *sptr, char *to, int mask)
 {
 	static	char	null[] = "<NULL>";
@@ -2187,11 +2204,17 @@
 	case 'V' : case 'v' : /* V conf lines */
 		report_configured_links(cptr, parv[0], CONF_VER);
 		break;
-#ifdef	DEBUGMODE
 	case 'X' : case 'x' : /* lists */
+#ifdef DEBUGMODE
 		send_listinfo(cptr, parv[0]);
-		break;
 #endif
+#ifdef XLINE
+		if (IsAnOper(sptr))
+		{
+			report_x_lines(sptr, parv[0]);
+		}
+#endif
+		break;
 	case 'Y' : case 'y' : /* Y lines */
 		report_classes(cptr, parv[0]);
 		break;
diff -ur irc-cvs/ircd/s_user.c irc-cvs.xline/ircd/s_user.c
--- irc-cvs/ircd/s_user.c	2004-03-29 20:49:28.000000000 +0200
+++ irc-cvs.xline/ircd/s_user.c	2004-05-10 00:43:57.000000000 +0200
@@ -603,6 +603,14 @@
 			return exit_client(cptr, sptr, &me, (reason) ? buf :
 					   "K-lined");
 		    }
+#ifdef XLINE
+		if (!IsKlineExempt(sptr) && IsXlined(sptr))
+		{
+			sptr->exitc = EXITC_XLINE;
+			return exit_client(cptr, sptr, &me,
+				XLINE_EXIT_REASON);
+		}
+#endif
 		sp = user->servp;
 	    }
 	else
@@ -2457,6 +2465,36 @@
 #ifndef	NO_DEFAULT_INVISIBLE
 	SetInvisible(sptr);
 #endif
+#ifdef XLINE
+	if (MyConnect(sptr))
+	{
+		aConfItem *tmp;
+		char xbuf[BUFSIZE];
+		sprintf(xbuf, "%s %s %s %s", username, host, server, realname);
+
+		for (tmp = conf; tmp; tmp = tmp->next)
+		{
+			if (tmp->status != CONF_XLINE)
+				continue;
+
+			if (IsConfXlineWhole(tmp))
+			{
+			       if (tmp->host && !match(tmp->host, xbuf))
+			       {
+				       SetXlined(sptr);
+			       }
+			}
+			else
+			{
+				if (tmp->host && !match(tmp->host, realname))
+				{
+					SetXlined(sptr);
+				}
+			}
+               }
+       }
+#endif
+
 	/* parse desired user modes sent in USER */
 	/* old behaviour - bits */
 	if ((i = atoi(host)))
