diff -Naur pump-0.8.11-orig/dhcp.c pump-0.8.11/dhcp.c
--- pump-0.8.11-orig/dhcp.c	Tue Feb 27 17:03:02 2001
+++ pump-0.8.11/dhcp.c	Fri Mar 16 10:08:17 2001
@@ -1083,7 +1083,7 @@
 /* This is somewhat broken. We try only to renew the lease. If we fail,
    we don't try to completely rebind. This doesn't follow the DHCP spec,
    but for the install it should be a reasonable compromise. */
-int pumpDhcpRenew(struct pumpNetIntf * intf) {
+int pumpDhcpRenew(struct pumpNetIntf * intf, struct pumpOverrideInfo * override) {
     struct bootpRequest breq, bresp;
     unsigned char messageType;
     struct sockaddr_in serverAddr;
@@ -1129,8 +1129,17 @@
 
     if (handleTransaction(s, NULL, &breq, &bresp, &serverAddr, NULL, 0,
 			   startTime, DHCP_TYPE_ACK)) {
-	close(s);
-	return 1;
+	if (override->ftci)
+	{
+	    syslog (LOG_INFO, "can't renew lease for %s, no response from server", intf->device);
+	    intf->leaseExpiration = startTime + 600;
+	    intf->renewAt = startTime + (7 * 600 / 8);
+	    close(s);
+	    return 0;
+	} else {
+	    close(s);
+	    return 1;
+	}
     }
 
     parseLease(&bresp, intf);
@@ -1410,6 +1419,7 @@
     override->timeout = DEFAULT_TIMEOUT;
     override->numRetries = DEFAULT_NUM_RETRIES;
     override->script = NULL;
+    override->ftci = 0;
 }
 
 /*
diff -Naur pump-0.8.11-orig/pump.c pump-0.8.11/pump.c
--- pump-0.8.11-orig/pump.c	Thu Mar  1 07:15:22 2001
+++ pump-0.8.11/pump.c	Fri Mar 16 10:10:43 2001
@@ -393,7 +393,7 @@
 	    if (closest != -1) {
 		tv.tv_sec = intf[closest].renewAt - pumpUptime();
 		if (tv.tv_sec <= 0) {
-		    if (pumpDhcpRenew(intf + closest)) {
+		    if (pumpDhcpRenew(intf + closest, overrides)) {
 			syslog(LOG_INFO,
 				"failed to renew lease for device %s",
 				intf[closest].device);
@@ -506,7 +506,7 @@
 		if (i == numInterfaces)
 		    cmd.u.result = RESULT_UNKNOWNIFACE;
 		else {
-		    cmd.u.result = pumpDhcpRenew(intf + i);
+		    cmd.u.result = pumpDhcpRenew(intf + i, overrides);
 		    if (!cmd.u.result) {
 			callScript(o->script, PUMP_SCRIPT_RENEWAL, intf + i);
 			callIfupPost(intf + i);
@@ -757,7 +757,7 @@
     int lease = 12;
     int killDaemon = 0;
     int winId = 0;
-    int release = 0, renew = 0, status = 0, lookupHostname = 0, nodns = 0;
+    int release = 0, renew = 0, status = 0, lookupHostname = 0, nodns = 0, ftci = 0;
     int nogateway = 0;
     struct command cmd, response;
     char * configFile = "/etc/pump.conf";
@@ -790,6 +790,8 @@
 			N_("Don't set a gateway for this interface"), NULL },
 	    { "win-client-ident", '\0', POPT_ARG_NONE, &winId, 0,
 			N_("Set the client identifier to match Window's") },
+	    { "ftci", 'f', POPT_ARG_NONE, &ftci, 0,
+			N_("Don't give up on dead DHCP servers"), NULL },
 	    /*{ "test", 't', POPT_ARG_NONE, &test, 0,
 			N_("Don't change the interface configuration or "
 			   "run as a deamon.") },*/
@@ -833,6 +835,8 @@
 	overrides->flags |= OVERRIDE_FLAG_NODNS;
     if (nogateway)
 	overrides->flags |= OVERRIDE_FLAG_NOGATEWAY;
+    if (ftci)
+	overrides->ftci = 1;
 
     cont = openControlSocket(configFile, overrides);
     if (cont < 0) 
@@ -860,6 +864,7 @@
     write(cont, &cmd, sizeof(cmd));
     read(cont, &response, sizeof(response));
 
+/* What is this for? Why do we try again if it failed?
     if (response.type == CMD_RESULT && response.u.result &&
 	    cmd.type == CMD_STARTIFACE) {
 	cont = openControlSocket(configFile, overrides);
@@ -868,7 +873,7 @@
 	write(cont, &cmd, sizeof(cmd));
 	read(cont, &response, sizeof(response));
     }
-
+*/
     if (response.type == CMD_RESULT) {
 	if (response.u.result) {
 	    fprintf(stderr, "Operation failed.\n");
diff -Naur pump-0.8.11-orig/pump.h pump-0.8.11/pump.h
--- pump-0.8.11-orig/pump.h	Thu Feb  1 22:58:16 2001
+++ pump-0.8.11/pump.h	Fri Mar 16 10:02:07 2001
@@ -82,6 +82,7 @@
     int numRetries;
     int timeout;
     char * script;
+    int ftci;
 };
 
 void pumpInitOverride(struct pumpOverrideInfo * override);
@@ -92,7 +93,7 @@
 /* setup an interface for sending a broadcast -- uses all 0's address */
 char * pumpPrepareInterface(struct pumpNetIntf * intf, int s);
 char * pumpDisableInterface(char * device);
-int pumpDhcpRenew(struct pumpNetIntf * intf);
+int pumpDhcpRenew(struct pumpNetIntf * intf, struct pumpOverrideInfo * override);
 int pumpDhcpRelease(struct pumpNetIntf * intf);
 int pumpSetupDefaultGateway(struct in_addr * gw);
 time_t pumpUptime(void);

