This patch for the original irc2 package from 1989 makes it compile on 
FreeBSD 9. The protocol has changed a bit during that time, I just wanted to see
how hard it would be to compile it.
Funny enough, the client threw some errors, but connected to a modern ircd
anyway. Even funnier, the first release already supported real networking
between multiple servers and the configuration file syntax (C:/N:-lines) has
never changed.
I was told the utmp changes I made were bogus. This is right, because I
mechanically replaced them so that it compiles. 

Feel free to make a better diff.

diff -Nur irc-dist.orig/Makefile irc-dist/Makefile
--- irc-dist.orig/Makefile	1989-10-17 10:08:53.000000000 +0100
+++ irc-dist/Makefile	2012-03-09 21:14:15.521754531 +0100
@@ -25,9 +25,9 @@
 #TARGET_ARCH=
 
 # At least HPUX needs only curses library, not termcap...
-#TLIBS = -lcurses
+TLIBS = -lcurses
 
-TLIBS = -lcurses -ltermcap
+#TLIBS = -lcurses -ltermcap
 
 # Libraries needed for ircd
 
diff -Nur irc-dist.orig/edit.c irc-dist/edit.c
--- irc-dist.orig/edit.c	1989-10-16 12:30:41.000000000 +0100
+++ irc-dist/edit.c	2012-03-09 21:17:43.439753022 +0100
@@ -195,7 +195,7 @@
 
 suspend_irc()
 {
-#if HPUX
+#if HPUX || defined (__FreeBSD__)
 #ifdef SIGSTOP
   kill(getpid(), SIGSTOP);
 #endif
diff -Nur irc-dist.orig/irc.c irc-dist/irc.c
--- irc-dist.orig/irc.c	1989-10-20 11:01:10.000000000 +0100
+++ irc-dist/irc.c	2012-03-09 21:08:08.155754212 +0100
@@ -68,7 +68,6 @@
 
 char *makeclientbuf();
 
-int timeout();
 char buf[BUFSIZE];
 char *mycncmp(), *real_name(), *last_to_me(), *last_from_me();
 aClient me;
diff -Nur irc-dist.orig/s_bsd.c irc-dist/s_bsd.c
--- irc-dist.orig/s_bsd.c	1989-10-16 13:20:21.000000000 +0100
+++ irc-dist/s_bsd.c	2012-03-09 21:05:54.548752864 +0100
@@ -36,7 +36,7 @@
 #include <stdio.h>
 #include <signal.h>
 #include <fcntl.h>
-#include <utmp.h>
+#include <utmpx.h>
 #include <sys/errno.h>
 #if BSD42 || ULTRIX || HPUX
 #include "sock.h"
@@ -338,17 +338,17 @@
 #endif
 }
 
-int utmp_open()
+int utmpx_open()
 {
   return (open(UTMP,O_RDONLY));
 }
 
-int utmp_read(fd, name, line, host)
+int utmpx_read(fd, name, line, host)
 int fd;
 char *name, *line, *host;
 {
-  struct utmp ut;
-  while (read(fd, &ut, sizeof (struct utmp)) == sizeof (struct utmp)) {
+  struct utmpx ut;
+  while (read(fd, &ut, sizeof (struct utmpx)) == sizeof (struct utmpx)) {
     strncpy(name,ut.ut_name,8);  name[8] = '\0';
     strncpy(line,ut.ut_line,8);  line[8] = '\0';
 #ifdef USER_PROCESS
@@ -364,7 +364,7 @@
   return(-1);
 }
 
-int utmp_close(fd)
+int utmpx_close(fd)
 int fd;
 {
   return(close(fd));
diff -Nur irc-dist.orig/s_msg.c irc-dist/s_msg.c
--- irc-dist.orig/s_msg.c	1989-10-17 08:11:30.000000000 +0100
+++ irc-dist/s_msg.c	2012-03-09 21:05:54.549754725 +0100
@@ -25,7 +25,7 @@
 #if APOLLO
 #include <sys/types.h>
 #endif
-#include <utmp.h>
+#include <utmpx.h>
 #include <ctype.h>
 #include <stdio.h>
 #include "msg.h"
@@ -868,14 +868,14 @@
   else 
     *(host++) = '\0';
   if (host == NULL || *host == '\0' || MyEqual(host,myhostname,HOSTLEN)) {
-    if ((fd = utmp_open()) == -1) {
+    if ((fd = utmpx_open()) == -1) {
       sendto_one(sptr,"NOTICE %s Cannot open %s",sptr->nickname,UTMP);
       return(0);
     }
-    while (!(flag = utmp_read(fd, namebuf, linebuf, hostbuf))) 
+    while (!(flag = utmpx_read(fd, namebuf, linebuf, hostbuf))) 
       if (Equal(namebuf,user))
 	break;
-    utmp_close(fd);
+    utmpx_close(fd);
     if (flag == -1)
       sendto_one(sptr,"NOTICE %s :%s: No such user found",
 		 sptr->nickname, myhostname);
@@ -928,12 +928,12 @@
     return(0);
   }
   if (host == NULL || *host == '\0' || Equal(host,myhostname)) {
-    if ((fd = utmp_open()) == -1) {
+    if ((fd = utmpx_open()) == -1) {
       sendto_one(sptr,"NOTICE %s Cannot open %s",sptr->nickname,UTMP);
       return(0);
     }
     sendto_one(sptr,"NOTICE %s :UserID   Terminal Host", sptr->nickname);
-    while (!utmp_read(fd, namebuf, linebuf, hostbuf)) {
+    while (!utmpx_read(fd, namebuf, linebuf, hostbuf)) {
       flag = 1;
       sendto_one(sptr,"NOTICE %s :%-8s %-8s %-8s",
 		 sptr->nickname, namebuf, linebuf, hostbuf);
@@ -941,7 +941,7 @@
     if (flag == 0) 
       sendto_one(sptr,"NOTICE %s :Nobody logged in on %s",
 		 sptr->nickname, host);
-    utmp_close(fd);
+    utmpx_close(fd);
     return(0);
   }
   for (; acptr; acptr = acptr->next) 
@@ -1182,7 +1182,6 @@
 {
   int port, tmpport, retval;
   aConfItem *aconf;
-  extern char *sys_errlist[];
   if (sptr->status != STAT_SERVER && !ISOPER(sptr)) {
     sendto_one(cptr,"ERROR :Connect: Privileged command");
     return(-1);
diff -Nur irc-dist.orig/s_sys.c irc-dist/s_sys.c
--- irc-dist.orig/s_sys.c	1989-10-16 13:20:21.000000000 +0100
+++ irc-dist/s_sys.c	2012-03-09 21:05:54.549754725 +0100
@@ -36,7 +36,7 @@
 #include <stdio.h>
 #include <signal.h>
 #include <fcntl.h>
-#include <utmp.h>
+#include <utmpx.h>
 #include <sys/errno.h>
 #if BSD42 || ULTRIX || HPUX
 #include "sock.h"
@@ -338,18 +338,18 @@
 #endif
 }
 
-int utmp_open()
+int utmpx_open()
 {
   return (open(UTMP,O_RDONLY));
 }
 
-int utmp_read(fd, name, line, host)
+int utmpx_read(fd, name, line, host)
 int fd;
 char *name, *line, *host;
 {
-  struct utmp ut;
-  while (read(fd, &ut, sizeof (struct utmp)) == sizeof (struct utmp)) {
-    strncpy(name,ut.ut_name,8);  name[8] = '\0';
+  struct utmpx ut;
+  while (read(fd, &ut, sizeof (struct utmpx)) == sizeof (struct utmpx)) {
+    strncpy(name,ut.ut_user,8);  name[8] = '\0';
     strncpy(line,ut.ut_line,8);  line[8] = '\0';
 #ifdef USER_PROCESS
     strncpy(host, myhostname, 8); host[8] = '\0';
@@ -364,7 +364,7 @@
   return(-1);
 }
 
-int utmp_close(fd)
+int utmpx_close(fd)
 int fd;
 {
   return(close(fd));
diff -Nur irc-dist.orig/s_sysv.c irc-dist/s_sysv.c
--- irc-dist.orig/s_sysv.c	1989-10-16 12:30:55.000000000 +0100
+++ irc-dist/s_sysv.c	2012-03-09 21:05:54.549754725 +0100
@@ -28,7 +28,7 @@
 #include <stdio.h>
 #include <signal.h>
 #include <fcntl.h>
-#include <utmp.h>
+#include <utmpx.h>
 #include "struct.h"
 
 extern aClient me;
@@ -139,18 +139,18 @@
   fcntl(cptr->fd, F_SETFL, res | O_NDELAY); */
 }
 
-int utmp_open()
+int utmpx_open()
 {
   int fd;
   return (open(UTMP,O_RDONLY));
 }
 
-int utmp_read(fd, name, line, host)
+int utmpx_read(fd, name, line, host)
 int fd;
 char *name, *line, *host;
 {
-  struct utmp ut;
-  while (read(fd, &ut, sizeof (struct utmp)) == sizeof (struct utmp)) {
+  struct utmpx ut;
+  while (read(fd, &ut, sizeof (struct utmpx)) == sizeof (struct utmpx)) {
     CopyFixLen(name,ut.ut_name,9); 
     CopyFixLen(line,ut.ut_line,9); 
     strncpy(host,(ut.ut_host[0]) ? (ut.ut_host) : myhostname, 16);
@@ -160,7 +160,7 @@
   return(-1);
 }
 
-int utmp_close(fd)
+int utmpx_close(fd)
 int fd;
 {
   return(close(fd));
diff -Nur irc-dist.orig/struct.h irc-dist/struct.h
--- irc-dist.orig/struct.h	1989-10-17 08:15:11.000000000 +0100
+++ irc-dist/struct.h	2012-03-09 21:06:52.866752971 +0100
@@ -156,7 +156,7 @@
 
 #define FLUSH_BUFFER   -2
 #define MAXFD        32
-#define UTMP         "/etc/utmp"
+#define UTMP         "/var/log/utx.lastlogin"
 
 #define DUMMY_TERM     0
 #define CURSES_TERM    1
diff -Nur irc-dist.orig/swear.c irc-dist/swear.c
--- irc-dist.orig/swear.c	1989-10-20 07:43:41.000000000 +0100
+++ irc-dist/swear.c	2012-03-09 21:10:33.707753809 +0100
@@ -21,6 +21,8 @@
 /* Curses replacement routines. Uses termcap */
 
 #include <sys/ioctl.h>
+#define COMPAT_43TTY
+#include <sys/ioctl_compat.h>
 #include <stdio.h>
 #include <sys/file.h>
 #include <ctype.h>
