diff -ur dhcp-1.0.0/conflex.c dhcpd-ncc/conflex.c
--- dhcp-1.0.0/conflex.c	Sat Mar 29 02:06:43 1997
+++ dhcpd-ncc/conflex.c	Tue Mar 31 20:25:44 1998
@@ -366,6 +366,8 @@
 			return CIADDR;
 		break;
 	      case 'd':
+	        if (!strcasecmp (atom + 1, "ays"))
+	        	return TIMEOP_DAYS;
 		if (!strcasecmp (atom + 1, "efault-lease-time"))
 			return DEFAULT_LEASE_TIME;
 		if (!strncasecmp (atom + 1, "ynamic-bootp", 12)) {
@@ -398,16 +400,25 @@
 			return GET_LEASE_HOSTNAMES;
 		break;
 	      case 'h':
+		if (!strcasecmp (atom + 1, "ours"))
+			return TIMEOP_HOURS;
 		if (!strcasecmp (atom + 1, "ost"))
 			return HOST;
 		if (!strcasecmp (atom + 1, "ardware"))
 			return HARDWARE;
 		break;
+#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE)
+              case 'i':
+		if (!strcasecmp (atom + 1, "nterface"))
+			return INTERFACE;
+#endif
 	      case 'l':
 		if (!strcasecmp (atom + 1, "ease"))
 			return LEASE;
 		break;
 	      case 'm':
+	        if (!strcasecmp (atom + 1, "inutes"))
+	        	return TIMEOP_MINUTES;
 		if (!strcasecmp (atom + 1, "ax-lease-time"))
 			return MAX_LEASE_TIME;
 		break;
@@ -432,6 +443,8 @@
 			return RANGE;
 		break;
 	      case 's':
+		if (!strcasecmp (atom + 1, "econds"))
+			return TIMEOP_SECONDS;
 		if (!strcasecmp (atom + 1, "tarts"))
 			return STARTS;
 		if (!strcasecmp (atom + 1, "iaddr"))
diff -ur dhcp-1.0.0/confpars.c dhcpd-ncc/confpars.c
--- dhcp-1.0.0/confpars.c	Fri May  9 03:37:30 1997
+++ dhcpd-ncc/confpars.c	Tue Mar 31 20:25:44 1998
@@ -314,6 +314,15 @@
 		parse_option_param (cfile, group);
 		break;
 
+#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE)
+	      case INTERFACE:
+		if (type != ROOT_GROUP)
+			parse_warn ("interface only allowed at top %s",
+				    "level.");
+		set_interface(parse_string(cfile));
+		break;
+#endif
+			
 	      case SERVER_IDENTIFIER:
 		if (type != ROOT_GROUP)
 			parse_warn ("server-identifier only allowed at top %s",
@@ -643,7 +652,12 @@
 	} while (1);
 }
 
-/* lease-time :== NUMBER SEMI */
+/* lease-time :== lease-time-decl SEMI
+   lease-time-decl :== base-lease-time-decl
+                    |  lease-time-decl base-lease-time-decl
+   base-lease-time-decl :== NUMBER
+                         |  NUMBER TIMEOP
+*/
 
 void parse_lease_time (cfile, timep)
 	FILE *cfile;
@@ -651,18 +665,46 @@
 {
 	char *val;
 	int token;
+	TIME temp_time, last_time;
+	
+	temp_time = last_time = 0;
 
 	token = next_token (&val, cfile);
-	if (token != NUMBER) {
+	
+	while(token != SEMI) {
+	    switch(token) {
+	    case NUMBER :
+	        temp_time += last_time;
+	        convert_num ((unsigned char *)timep, val, 10, 32);
+	        /* Unswap the number - convert_num returns stuff in NBO. */
+		last_time = ntohl (*timep); /* XXX */
+		break;
+	    case TIMEOP_SECONDS :
+		temp_time += last_time;
+		last_time = 0;
+		break;
+	    case TIMEOP_MINUTES :
+		temp_time += last_time * 60L;
+		last_time = 0;
+		break;
+	    case TIMEOP_HOURS :
+		temp_time += last_time * 60L * 60L;
+		last_time = 0;
+		break;
+	    case TIMEOP_DAYS :
+		temp_time += last_time * 60L * 60L * 24L;
+		last_time = 0;
+	    	break;
+	    default :
 		parse_warn ("Expecting numeric lease time");
 		skip_to_semi (cfile);
 		return;
+	    }
+	
+	    token = next_token (&val, cfile);
 	}
-	convert_num ((unsigned char *)timep, val, 10, 32);
-	/* Unswap the number - convert_num returns stuff in NBO. */
-	*timep = ntohl (*timep); /* XXX */
 
-	parse_semi (cfile);
+	*timep = temp_time + last_time;
 }
 
 /* shared-network-declaration :==
diff -ur dhcp-1.0.0/dhcpd.h dhcpd-ncc/dhcpd.h
--- dhcp-1.0.0/dhcpd.h	Sat Mar 29 02:31:08 1997
+++ dhcpd-ncc/dhcpd.h	Tue Mar 31 20:25:44 1998
@@ -497,6 +497,9 @@
 #endif
 
 /* dispatch.c */
+#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE)
+void set_interface PROTO ((char *));
+#endif
 extern struct interface_info *interfaces;
 void discover_interfaces PROTO ((int));
 void dispatch PROTO ((void));
diff -ur dhcp-1.0.0/dhctoken.h dhcpd-ncc/dhctoken.h
--- dhcp-1.0.0/dhctoken.h	Sat Mar 29 02:06:44 1997
+++ dhcpd-ncc/dhctoken.h	Tue Mar 31 20:27:33 1998
@@ -90,6 +90,11 @@
 #define ONE_LEASE_PER_CLIENT 294
 #define GET_LEASE_HOSTNAMES 295
 #define USE_HOST_DECL_NAMES 296
+#define INTERFACE	297
+#define TIMEOP_DAYS	298
+#define TIMEOP_HOURS	299
+#define TIMEOP_MINUTES	300
+#define TIMEOP_SECONDS	301
 #define ABANDONED     319
 
 #define is_identifier(x)	((x) >= FIRST_TOKEN &&	\
diff -ur dhcp-1.0.0/dispatch.c dhcpd-ncc/dispatch.c
--- dhcp-1.0.0/dispatch.c	Sat Nov 29 02:04:30 1997
+++ dhcpd-ncc/dispatch.c	Tue Mar 31 20:25:44 1998
@@ -48,6 +48,10 @@
 #include "dhcpd.h"
 #include <sys/ioctl.h>
 
+#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE)
+static char *valid_if = NULL;
+#endif
+
 struct interface_info *interfaces;
 
 static void got_one PROTO ((struct interface_info *));
@@ -127,6 +131,13 @@
 		    !(ifr.ifr_flags & IFF_UP))
 			continue;
 		
+#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE)
+		/* If an interface has been specified, */
+		/* skip non-matching interfaces */
+		if(valid_if != NULL 
+		&& strcmp(valid_if, ifp -> ifr_name) != 0)
+			continue;
+#endif
 		/* See if we've seen an interface that matches this one. */
 		for (tmp = interfaces; tmp; tmp = tmp -> next)
 			if (!strcmp (tmp -> name, ifp -> ifr_name))
@@ -505,3 +516,16 @@
 		return 1;
 	return 0;
 }
+
+#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE)
+
+void set_interface (if_name)
+	char *if_name;
+{
+	if(valid_if != NULL)
+		free(valid_if);
+	valid_if = if_name;
+}
+
+#endif
+
