--- /dev/null
+--- pump-0.8.11/pump.c.nobootp Thu Mar 1 02:15:22 2001
++++ pump-0.8.11/pump.c Thu Jul 19 18:29:55 2001
+@@ -758,7 +758,7 @@
+ int killDaemon = 0;
+ int winId = 0;
+ int release = 0, renew = 0, status = 0, lookupHostname = 0, nodns = 0;
+- int nogateway = 0;
++ int nogateway = 0, nobootp = 0;
+ struct command cmd, response;
+ char * configFile = "/etc/pump.conf";
+ struct pumpOverrideInfo * overrides;
+@@ -788,6 +788,8 @@
+ N_("Don't update resolv.conf"), NULL },
+ { "no-gateway", '\0', POPT_ARG_NONE, &nogateway, 0,
+ N_("Don't set a gateway for this interface"), NULL },
++ { "no-bootp", '\0', POPT_ARG_NONE, &nobootp, 0,
++ N_("Ignore non-DHCP BOOTP responses"), NULL },
+ { "win-client-ident", '\0', POPT_ARG_NONE, &winId, 0,
+ N_("Set the client identifier to match Window's") },
+ /*{ "test", 't', POPT_ARG_NONE, &test, 0,
+@@ -831,6 +833,8 @@
+ flags |= PUMP_FLAG_FORCEHNLOOKUP;
+ if (nodns)
+ overrides->flags |= OVERRIDE_FLAG_NODNS;
++ if (nobootp)
++ overrides->flags |= OVERRIDE_FLAG_NOBOOTP;
+ if (nogateway)
+ overrides->flags |= OVERRIDE_FLAG_NOGATEWAY;
+
+--- pump-0.8.11/dhcp.c.nobootp Tue Feb 27 12:03:02 2001
++++ pump-0.8.11/dhcp.c Thu Jul 19 18:29:55 2001
+@@ -1321,8 +1321,11 @@
+
+ syslog (LOG_DEBUG, "PUMP: sending discover\n");
+
++ if (override && (override->flags & OVERRIDE_FLAG_NOBOOTP))
++ syslog (LOG_DEBUG, "PUMP: Ignoring non-DHCP BOOTP responses\n");
++
+ if ((chptr = handleTransaction(s, override, &breq, &bresp, &broadcastAddr,
+- NULL, 1, startTime, DHCP_TYPE_OFFER))) {
++ NULL, (override && (override->flags & OVERRIDE_FLAG_NOBOOTP))?0:1, startTime, DHCP_TYPE_OFFER))) {
+ close(s);
+ pumpDisableInterface(intf->device);
+ return chptr;
+--- pump-0.8.11/pump.h.nobootp Thu Feb 1 17:58:16 2001
++++ pump-0.8.11/pump.h Thu Jul 19 18:29:55 2001
+@@ -74,6 +74,7 @@
+ #define OVERRIDE_FLAG_NODNS (1 << 0)
+ #define OVERRIDE_FLAG_NONISDOMAIN (1 << 1)
+ #define OVERRIDE_FLAG_NOGATEWAY (1 << 2)
++#define OVERRIDE_FLAG_NOBOOTP (1 << 3)
+
+ struct pumpOverrideInfo {
+ struct pumpNetIntf intf;
+--- pump-0.8.11/config.c.nobootp Thu Jul 19 18:30:02 2001
++++ pump-0.8.11/config.c Thu Jul 19 18:30:20 2001
+@@ -182,6 +182,12 @@
+ return 1;
+ }
+ override->flags |= OVERRIDE_FLAG_NODNS;
++ } else if (!strcmp(start, "nobootp")) {
++ if (*rest) {
++ parseError(*lineNum, "unexpected argument to nobootp directive");
++ return 1;
++ }
++ override->flags |= OVERRIDE_FLAG_NOBOOTP;
+ } else if (!strcmp(start, "nogateway")) {
+ if (*rest) {
+ parseError(*lineNum, "unexpected argument to nogateway directive");
--- /dev/null
+--- pump-0.8.11/pump.c.retryforever Fri Jul 20 10:42:10 2001
++++ pump-0.8.11/pump.c Fri Jul 20 11:03:01 2001
+@@ -386,7 +386,36 @@
+ closest = -1;
+ if (numInterfaces) {
+ for (i = 0; i < numInterfaces; i++)
+- if ((intf[i].set & PUMP_INTFINFO_HAS_LEASE) &&
++ /* if this interface has an expired lease due to
++ * renewal failures and it's time to try again to
++ * get a new lease, then try again
++ *
++ * note: this trys every 30 secs FOREVER; this may
++ * or may not be desirable. could also have a back-off
++ * hueristic that increases the retry delay after each
++ * failed attempt and a maximum number of tries or
++ * maximum period of time to try for.
++ */
++ if ((intf[i].set & PUMP_INTFINFO_NEEDS_NEWLEASE) &&
++ (intf[i].renewAt < pumpUptime())) {
++ if (pumpDhcpRun(intf[i].device, 0,
++ intf[i].reqLease,
++ intf[i].set & PUMP_NETINFO_HAS_HOSTNAME
++ ? intf[i].hostname : NULL,
++ intf + i, overrides)) {
++
++ /* failed to get a new lease, so try
++ * again in 30 seconds
++ */
++ intf[i].renewAt = pumpUptime() + 30;
++
++ } else {
++ intf[i].set &= ~PUMP_INTFINFO_NEEDS_NEWLEASE;
++ callScript(overrides->script, PUMP_SCRIPT_NEWLEASE,
++ &intf[i]);
++ }
++ }
++ else if ((intf[i].set & PUMP_INTFINFO_HAS_LEASE) &&
+ (closest == -1 ||
+ (intf[closest].renewAt > intf[i].renewAt)))
+ closest = i;
+@@ -398,7 +427,12 @@
+ "failed to renew lease for device %s",
+ intf[closest].device);
+
+- if ((intf[closest].renewAt += pumpUptime() + 30) >
++ /* if the renewal failed, then set renewAt to
++ * try again in 30 seconds AND then if renewAt's
++ * value is after the lease expiration then
++ * try to get a fresh lease for the interface
++ */
++ if ((intf[closest].renewAt = pumpUptime() + 30) >
+ intf[closest].leaseExpiration) {
+ o = overrides;
+ while (*o->intf.device &&
+@@ -408,6 +442,8 @@
+ if (!*o->intf.device) o = overrides;
+
+ intf[closest].set &= ~PUMP_INTFINFO_HAS_LEASE;
++ intf[closest].set |= PUMP_INTFINFO_NEEDS_NEWLEASE;
++
+
+ if (pumpDhcpRun(intf[closest].device,
+ intf[closest].flags,
+@@ -415,6 +451,16 @@
+ intf[closest].set & PUMP_NETINFO_HAS_HOSTNAME
+ ? intf[closest].hostname : NULL,
+ intf + closest, o)) {
++
++ /* failed to get a new lease, so try
++ * again in 30 seconds
++ */
++ intf[closest].renewAt = pumpUptime() + 30;
++#if 0
++ /* ifdef this out since we now try more than once to get
++ * a new lease and don't, therefore, want to remove the interface
++ */
++
+ if (numInterfaces == 1) {
+ callScript(o->script, PUMP_SCRIPT_DOWN,
+ &intf[closest]);
+@@ -426,7 +472,10 @@
+
+ intf[i] = intf[numInterfaces - 1];
+ numInterfaces--;
++#endif
+ } else {
++ intf[closest].set &=
++ ~PUMP_INTFINFO_NEEDS_NEWLEASE;
+ callScript(o->script, PUMP_SCRIPT_NEWLEASE,
+ &intf[closest]);
+ }
+--- pump-0.8.11/pump.h.retryforever Fri Jul 20 10:42:10 2001
++++ pump-0.8.11/pump.h Fri Jul 20 10:42:10 2001
+@@ -23,6 +23,7 @@
+ #define PUMP_INTFINFO_HAS_LEASE (1 << 7)
+ #define PUMP_INTFINFO_HAS_REQLEASE (1 << 8)
+ #define PUMP_INTFINFO_HAS_NEXTSERVER (1 << 9)
++#define PUMP_INTFINFO_NEEDS_NEWLEASE (1 << 10)
+
+ #define PUMP_NETINFO_HAS_LOGSRVS (1 << 15)
+ #define PUMP_NETINFO_HAS_LPRSRVS (1 << 16)
+--- pump-0.8.11/dhcp.c.sopwith Mon Jul 23 19:18:29 2001
++++ pump-0.8.11/dhcp.c Mon Jul 23 19:18:49 2001
+@@ -47,6 +47,7 @@
+ #include <sys/wait.h>
+ #include <syslog.h>
+ #include <unistd.h>
++#include <time.h>
+
+ #include "pump.h"
+
--- /dev/null
+--- pump-0.8.11/pump.c.sopwith Sun Aug 26 18:19:18 2001
++++ pump-0.8.11/pump.c Sun Aug 26 18:21:42 2001
+@@ -67,7 +67,7 @@
+ struct {
+ char device[20];
+ int flags;
+- int reqLease; /* in hours */
++ int reqLease; /* in seconds */
+ char reqHostname[200];
+ } start;
+ int result; /* 0 for success */
+@@ -803,7 +803,8 @@
+ int rc;
+ int test = 0;
+ int flags = 0;
+- int lease = 12;
++ int lease_hrs = 0;
++ int lease = 12*3600;
+ int killDaemon = 0;
+ int winId = 0;
+ int release = 0, renew = 0, status = 0, lookupHostname = 0, nodns = 0;
+@@ -823,8 +824,10 @@
+ N_("iface") },
+ { "kill", 'k', POPT_ARG_NONE, &killDaemon, 0,
+ N_("Kill daemon (and disable all interfaces)"), NULL },
+- { "lease", 'l', POPT_ARG_INT, &lease, 0,
++ { "lease", 'l', POPT_ARG_INT, &lease_hrs, 0,
+ N_("Lease time to request (in hours)"), N_("hours") },
++ { "leasesecs", 'L', POPT_ARG_INT, &lease, 0,
++ N_("Lease time to request (in seconds)"), N_("seconds") },
+ { "lookup-hostname", '\0', POPT_ARG_NONE, &lookupHostname, 0,
+ N_("Force lookup of hostname") },
+ { "release", 'r', POPT_ARG_NONE, &release, 0,
+@@ -906,7 +909,10 @@
+ cmd.type = CMD_STARTIFACE;
+ strcpy(cmd.u.start.device, device);
+ cmd.u.start.flags = flags;
+- cmd.u.start.reqLease = lease * 60 * 60;
++ if(lease_hrs)
++ cmd.u.start.reqLease = lease_hrs * 60 * 60;
++ else
++ cmd.u.start.reqLease = lease;
+ strcpy(cmd.u.start.reqHostname, hostname);
+ }
+
--- /dev/null
+--- pump-0.8.11/net.c.21088 Fri Jul 20 12:26:57 2001
++++ pump-0.8.11/net.c Fri Jul 20 12:29:59 2001
+@@ -738,6 +738,7 @@
+ int main(int argc, const char **argv) {
+ int netSet, rc;
+ int x;
++ int noDns = 0;
+ char * bootProto = NULL;
+ char * device = NULL;
+ char * hostname = NULL;
+@@ -768,6 +769,9 @@
+ },
+ { "device", 'd', POPT_ARG_STRING, &device, 0,
+ _("Network device"), NULL
++ },
++ { "nodns", '\0', POPT_ARG_NONE, &noDns, 0,
++ _("No DNS lookups"), NULL
+ },
+ { 0, 0, 0, 0, 0 }
+ };