From 9d6ebeafd49d974ab9135bfd9d55a385369f635c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20R=C4=99korajski?= Date: Fri, 16 Jul 1999 15:41:19 +0000 Subject: [PATCH] patchsed for bootp Changed files: bootp-2.4.3-glibc.patch -> 1.1 bootp-2.4.3-linux.patch -> 1.1 bootp-2.4.3-pathfix.patch -> 1.1 bootp-tmprace.patch -> 1.1 dhcp.patch -> 1.1 --- bootp-2.4.3-glibc.patch | 10 + bootp-2.4.3-linux.patch | 47 +++ bootp-2.4.3-pathfix.patch | 69 ++++ bootp-tmprace.patch | 25 ++ dhcp.patch | 736 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 887 insertions(+) create mode 100644 bootp-2.4.3-glibc.patch create mode 100644 bootp-2.4.3-linux.patch create mode 100644 bootp-2.4.3-pathfix.patch create mode 100644 bootp-tmprace.patch create mode 100644 dhcp.patch diff --git a/bootp-2.4.3-glibc.patch b/bootp-2.4.3-glibc.patch new file mode 100644 index 0000000..ed6ba4b --- /dev/null +++ b/bootp-2.4.3-glibc.patch @@ -0,0 +1,10 @@ +--- bootp-2.4.3/getether.c.ewt Thu Jul 10 14:32:20 1997 ++++ bootp-2.4.3/getether.c Thu Jul 10 14:32:25 1997 +@@ -329,7 +329,6 @@ + #include + #include + #include /* struct ifreq */ +-#include /* Needed for IOCTL defs */ + + int + getether(ifname, eap) diff --git a/bootp-2.4.3-linux.patch b/bootp-2.4.3-linux.patch new file mode 100644 index 0000000..3fef1f6 --- /dev/null +++ b/bootp-2.4.3-linux.patch @@ -0,0 +1,47 @@ +--- bootp-2.4.3/bptypes.h.orig Wed Apr 24 17:18:44 1996 ++++ bootp-2.4.3/bptypes.h Wed Apr 24 17:18:50 1996 +@@ -8,7 +8,7 @@ + */ + + #ifndef int32 +-#define int32 long ++#define int32 int + #endif + typedef unsigned int32 u_int32; + +--- bootp-2.4.3/Makefile.orig Wed Apr 24 17:18:59 1996 ++++ bootp-2.4.3/Makefile Wed Apr 24 20:13:59 1996 +@@ -37,10 +37,10 @@ + + INSTALL=/usr/bin/install + DESTDIR= +-BINDIR=/usr/etc +-MANDIR=/usr/local/man ++BINDIR=/usr/sbin ++MANDIR=/usr/man + +-CFLAGS= $(OPTDEFS) $(SYSDEFS) $(FILEDEFS) $(MOREDEFS) ++CFLAGS= $(OPTDEFS) $(SYSDEFS) $(FILEDEFS) $(MOREDEFS) + PROGS= bootpd bootpef bootpgw bootptest + TESTS= trylook trygetif trygetea + +@@ -141,7 +141,7 @@ + OBJ_D= bootpd.o dovend.o readfile.o hash.o dumptab.o \ + lookup.o getif.o hwaddr.o tzone.o report.o $(STRERROR) + bootpd: $(OBJ_D) +- $(CC) -o $@ $(OBJ_D) $(SYSLIBS) ++ $(CC) -o $@ $(OBJ_D) $(SYSLIBS) + + OBJ_EF= bootpef.o dovend.o readfile.o hash.o dumptab.o \ + lookup.o hwaddr.o tzone.o report.o $(STRERROR) +--- bootp-2.4.3/hwaddr.c.orig Wed Apr 24 17:22:12 1996 ++++ bootp-2.4.3/hwaddr.c Wed Apr 24 20:00:26 1996 +@@ -22,6 +22,8 @@ + #include /* for struct ifnet in net/if_arp.h */ + #endif + ++#define MAX_ADDR_LEN 7 ++ + #include + #include + diff --git a/bootp-2.4.3-pathfix.patch b/bootp-2.4.3-pathfix.patch new file mode 100644 index 0000000..a538862 --- /dev/null +++ b/bootp-2.4.3-pathfix.patch @@ -0,0 +1,69 @@ +--- bootp-2.4.3/bootpd.c.old Wed May 13 11:31:49 1998 ++++ bootp-2.4.3/bootpd.c Wed May 13 11:34:07 1998 +@@ -662,6 +662,7 @@ + char *clntpath; + char *homedir, *bootfile; + int n; ++ int lpos; + + /* XXX - SLIP init: Set bp_ciaddr = recv_addr here? */ + +@@ -859,13 +860,20 @@ + * The "real" path is as seen by the BOOTP daemon on this + * machine, while the client path is relative to the TFTP + * daemon chroot directory (i.e. /tftpboot). ++ * ++ * The bootfile might not be properly zero terminated. We ++ * need to play safe - AC + */ + if (hp->flags.tftpdir) { ++ lpos=strlen(hp->tftpdir->string); ++ if(lpos>=sizeof(realpath)-1) ++ return; + strcpy(realpath, hp->tftpdir->string); +- clntpath = &realpath[strlen(realpath)]; ++ clntpath = &realpath[lpos]; + } else { + realpath[0] = '\0'; + clntpath = realpath; ++ lpos=0; + } + + /* +@@ -906,12 +914,18 @@ + if (homedir) { + if (homedir[0] != '/') + strcat(clntpath, "/"); ++ lpos+=strlen(homedir); ++ if(lpos>=sizeof(realpath)) ++ return; + strcat(clntpath, homedir); + homedir = NULL; + } + if (bootfile) { + if (bootfile[0] != '/') + strcat(clntpath, "/"); ++ lpos+=strlen(bootfile); ++ if(lpos>=sizeof(realpath)) ++ return; + strcat(clntpath, bootfile); + bootfile = NULL; + } +@@ -920,8 +934,15 @@ + * First try to find the file with a ".host" suffix + */ + n = strlen(clntpath); +- strcat(clntpath, "."); +- strcat(clntpath, hp->hostname->string); ++ ++ /* ++ * Don't test if it wont fit. ++ */ ++ if(n+1+strlen(hp->hostname->string)hostname->string); ++ } + if (chk_access(realpath, &bootsize) < 0) { + clntpath[n] = 0; /* Try it without the suffix */ + if (chk_access(realpath, &bootsize) < 0) { diff --git a/bootp-tmprace.patch b/bootp-tmprace.patch new file mode 100644 index 0000000..683a52d --- /dev/null +++ b/bootp-tmprace.patch @@ -0,0 +1,25 @@ +diff -Nru bootp-2.4.3/bootpd.c bootp-2.4.3.new/bootpd.c +--- bootp-2.4.3/bootpd.c Fri Nov 13 23:40:05 1998 ++++ bootp-2.4.3.new/bootpd.c Fri Nov 13 23:43:12 1998 +@@ -100,9 +100,8 @@ + #ifndef CONFIG_FILE + #define CONFIG_FILE "/etc/bootptab" + #endif +-#ifndef DUMPTAB_FILE +-#define DUMPTAB_FILE "/tmp/bootpd.dump" +-#endif ++ ++char DUMPTAB_FILE [] = "/tmp/bootpd.dump.XXXXXX"; + + + +@@ -388,7 +387,8 @@ + + if (argc > 1) + bootpd_dump = argv[1]; +- ++ else ++ mktemp(DUMPTAB_FILE); + /* + * Get my hostname and IP address. + */ diff --git a/dhcp.patch b/dhcp.patch new file mode 100644 index 0000000..b12e068 --- /dev/null +++ b/dhcp.patch @@ -0,0 +1,736 @@ +diff -rc bootp-2.4.2/Announce bootp-2.4.3/Announce +*** bootp-2.4.2/Announce Thu Feb 16 21:18:17 1995 +--- bootp-2.4.3/Announce Thu Mar 16 08:58:23 1995 +*************** +*** 6,11 **** +--- 6,13 ---- + + New features in version 2.4 include: + ++ Added static DHCP allocation capabilities. ++ Use: :dl=leasetime for DHCP leasetime handouts + Added a simple BOOTP gateway program: bootpgw + Allow host name anywhere IP address is expected. + Automatically lookup the IP address when the name of a +*************** +*** 49,60 **** + SunOS 4.X (Solaris 1.X) + SunOS 5.X (Solaris 2.X) + System V/386 Rel. 4.0 + + Systems on which others say this code works: + CDC EP/IX (1.4.3, 2.1.1) + DEC Ultrix (4.2, 4.3) +- Linux 1.1.81 + OSF/1 (DEC Alpha CPU) + + Please direct questions, comments, and bug reports to: + +--- 51,69 ---- + SunOS 4.X (Solaris 1.X) + SunOS 5.X (Solaris 2.X) + System V/386 Rel. 4.0 ++ Linux 1.1.81 + + Systems on which others say this code works: + CDC EP/IX (1.4.3, 2.1.1) + DEC Ultrix (4.2, 4.3) + OSF/1 (DEC Alpha CPU) ++ HP 9000 ++ ++ How to get the latest version: ++ ftp firewall.mc.com (anonymous) ++ cd /pub ++ binary ++ get bootp-2.4.2.tar.Z + + Please direct questions, comments, and bug reports to: + +diff -rc bootp-2.4.2/Changes bootp-2.4.3/Changes +*** bootp-2.4.2/Changes Thu Feb 16 17:52:06 1995 +--- bootp-2.4.3/Changes Thu Mar 16 08:24:18 1995 +*************** +*** 2,13 **** +--- 2,28 ---- + Date, Real Name + what... + ++ --> bootp-2.4.3 ++ ++ 08/07/95 middelin@polyware.iaf.nl (Pauline Middelink) ++ Fixed problem while reporting duplicate hardware address in ++ readfile.c (kerry@maine.maine.edu) ++ Changed some code to allow the giaddr to pass through. Needed ++ when the client request is forwarded to us through a gateway. ++ (Broadcasting to the gateway will not reach the client) ++ ++ 01/26/95 Phil.Packer@bbc.co.uk (Phil.Packer) ++ Added dl tag for DHCP lease and rejigged Pauline's codes ++ at the end of bootpd.c to allow the setting of explicit leases. ++ Added "sco" Makefile target. ++ + --> bootp-2.4.2 + + 01/14/95 middelin@polyware.iaf.nl (Pauline Middelink) + Corrected support for the Linux networking code. + Fixed lots of warnings (gcc -Wall) + Added "linux" Makefile target. ++ Written code for DHCP static IP allocation. + + 01/02/95 Jukka Ukkonen + Allow bootptab syntax: ha="0:0:c0:80:e8:a7" +diff -rc bootp-2.4.2/Makefile bootp-2.4.3/Makefile +*** bootp-2.4.2/Makefile Thu Feb 16 16:25:19 1995 +--- bootp-2.4.3/Makefile Thu Mar 16 08:52:30 1995 +*************** +*** 9,15 **** + # OPTion DEFinitions: + # Remove the -DVEND_CMU if you don't wish to support the "CMU vendor format" + # in addition to the RFC1048 format. Leaving out DEBUG saves little. +! OPTDEFS= -DSYSLOG -DVEND_CMU -DDEBUG + + # Uncomment and edit this to choose the facility code used for syslog. + # LOG_FACILITY= "-DLOG_BOOTP=LOG_LOCAL2" +--- 9,16 ---- + # OPTion DEFinitions: + # Remove the -DVEND_CMU if you don't wish to support the "CMU vendor format" + # in addition to the RFC1048 format. Leaving out DEBUG saves little. +! # Remove the -DDHCP if you don't need DHCP support. +! OPTDEFS= -DSYSLOG -DVEND_CMU -DDHCP -DDEBUG + + # Uncomment and edit this to choose the facility code used for syslog. + # LOG_FACILITY= "-DLOG_BOOTP=LOG_LOCAL2" +*************** +*** 95,103 **** + SYSDEFS="-DSVR4" \ + SYSLIBS="-lsocket -lnsl" + +! # Linux 1.1.80+ on [34]86 + linux: +! $(MAKE) SYSDEFS="-O6 -Wall -fomit-frame-pointer" + + # SunOS 4.X + sunos4: +--- 96,111 ---- + SYSDEFS="-DSVR4" \ + SYSLIBS="-lsocket -lnsl" + +! # Linux 1.1.80+ + linux: +! $(MAKE) SYSDEFS="-O6 -Wall -fomit-frame-pointer" \ +! SYSLIBS="" \ +! FILEDEFS='-DCONFIG_FILE=\"/etc/bootptab\" \ +! -DDUMPTAB_FILE=\"/tmp/bootpd.dump\"' +! +! # SCO (pah!) SYSV rel 3.2 +! sco: +! $(MAKE) CC="cc" SYSLIBS="-lsocket" + + # SunOS 4.X + sunos4: +diff -rc bootp-2.4.2/bootp.h bootp-2.4.3/bootp.h +*** bootp-2.4.2/bootp.h Mon Aug 22 18:49:17 1994 +--- bootp-2.4.3/bootp.h Thu Mar 16 08:17:22 1995 +*************** +*** 122,129 **** + #define TAG_NIS_SERVER ((unsigned char) 41) + #define TAG_NTP_SERVER ((unsigned char) 42) + /* DHCP maximum message size. */ + #define TAG_MAX_MSGSZ ((unsigned char) 57) +! + /* XXX - Add new tags here */ + + +--- 122,133 ---- + #define TAG_NIS_SERVER ((unsigned char) 41) + #define TAG_NTP_SERVER ((unsigned char) 42) + /* DHCP maximum message size. */ ++ #define TAG_DHCP_IPLEASE ((unsigned char) 51) ++ #define TAG_DHCP_MSG ((unsigned char) 53) ++ #define TAG_DHCP_SERVERID ((unsigned char) 54) + #define TAG_MAX_MSGSZ ((unsigned char) 57) +! #define TAG_DHCP_IPRENEW ((unsigned char) 58) /* PeP hic facet */ +! #define TAG_DHCP_IPREBIND ((unsigned char) 59) + /* XXX - Add new tags here */ + + +diff -rc bootp-2.4.2/bootpd.c bootp-2.4.3/bootpd.c +*** bootp-2.4.2/bootpd.c Wed Feb 15 22:21:58 1995 +--- bootp-2.4.3/bootpd.c Thu Mar 16 08:31:12 1995 +*************** +*** 76,81 **** +--- 76,90 ---- + # define bzero(p,l) memset(p,0,l) + # define bcmp(a,b,c) memcmp(a,b,c) + #endif ++ #ifdef __linux__ ++ /* Use sigaction to make signal last... */ ++ inline void (*signal(int sig,void (*handler)(int)))(int) { ++ struct sigaction so,sa = {NULL,0,SA_NOMASK|SA_RESTART,NULL}; ++ sa.sa_handler = handler; ++ if (sigaction(sig,&sa,&so)<0) return NULL; ++ return so.sa_handler; ++ } ++ #endif + + #include "bootp.h" + #include "hash.h" +*************** +*** 114,125 **** + #ifdef VEND_CMU + PRIVATE void dovend_cmu P((struct bootp *, struct host *)); + #endif +! PRIVATE void dovend_rfc1048 P((struct bootp *, struct host *, int32)); + PRIVATE void handle_reply P((void)); + PRIVATE void handle_request P((void)); + PRIVATE void sendreply P((int forward, int32 dest_override)); + PRIVATE void usage P((void)); + + #undef P + + /* +--- 123,144 ---- + #ifdef VEND_CMU + PRIVATE void dovend_cmu P((struct bootp *, struct host *)); + #endif +! PRIVATE int dovend_rfc1048 P((struct bootp *, struct host *, int32)); + PRIVATE void handle_reply P((void)); + PRIVATE void handle_request P((void)); + PRIVATE void sendreply P((int forward, int32 dest_override)); + PRIVATE void usage P((void)); + ++ #ifdef DHCP ++ PRIVATE int dhcp_discover P((struct bootp *, struct host *, byte *, int)); ++ PRIVATE int dhcp_request P((struct bootp *, struct host *, byte *, int)); ++ PRIVATE int dhcp_decline P((struct bootp *, struct host *, byte *, int)); ++ PRIVATE int dhcp_release P((struct bootp *, struct host *, byte *, int)); ++ PRIVATE int dhcp_offer P((struct bootp *, struct host *, byte *, int)); ++ PRIVATE int dhcp_ack P((struct bootp *, struct host *, byte *, int)); ++ PRIVATE int dhcp_lease P((struct bootp *, struct host *, byte **)); ++ #endif ++ + #undef P + + /* +*************** +*** 477,482 **** +--- 496,512 ---- + bootpc_port = (u_short) IPPORT_BOOTPC; + } + ++ #ifdef DHCP ++ /* ++ * Maybe we have to broadcast, so enable it. ++ */ ++ n = 1; ++ if (setsockopt(s,SOL_SOCKET,SO_BROADCAST,&n,sizeof(n))<0) { ++ report(LOG_ERR, "setsockopt: %s\n", get_errmsg()); ++ exit(1); ++ } ++ #endif ++ + /* + * Set up signals to read or dump the table. + */ +*************** +*** 701,707 **** + haddrtoa(bp->bp_chaddr, bp->bp_hlen)); + return; /* not found */ + } +- (bp->bp_yiaddr).s_addr = hp->iaddr.s_addr; + + } else { + +--- 731,736 ---- +*************** +*** 724,729 **** +--- 753,759 ---- + return; + } + } ++ (bp->bp_yiaddr).s_addr = hp->iaddr.s_addr; + + if (debug) { + report(LOG_INFO, "found %s (%s)", inet_ntoa(hp->iaddr), +*************** +*** 961,967 **** + */ + if (!bcmp(bp->bp_vend, vm_rfc1048, 4)) { + /* RFC1048 conformant bootp client */ +! dovend_rfc1048(bp, hp, bootsize); + if (debug > 1) { + report(LOG_INFO, "sending reply (with RFC1048 options)"); + } +--- 991,998 ---- + */ + if (!bcmp(bp->bp_vend, vm_rfc1048, 4)) { + /* RFC1048 conformant bootp client */ +! if (!dovend_rfc1048(bp, hp, bootsize)) +! return; + if (debug > 1) { + report(LOG_INFO, "sending reply (with RFC1048 options)"); + } +*************** +*** 1093,1098 **** +--- 1124,1137 ---- + /* Finally, set the server address field. */ + bp->bp_siaddr = siaddr; + } ++ #ifdef DHCP ++ /* ++ * This code is placed here, because otherwise the siaddr ++ * will not be found... ++ */ ++ if (ntohs(bp->bp_flags) & 0x8000 && bp->bp_giaddr.s_addr==0) ++ dst.s_addr = INADDR_BROADCAST; ++ #endif + /* Set up socket address for send. */ + send_addr.sin_family = AF_INET; + send_addr.sin_port = htons(port); +*************** +*** 1220,1228 **** + if (bytesleft < (LEN)) { \ + report(LOG_NOTICE, noroom, \ + hp->hostname->string, MSG); \ +! return; \ + } while (0) +! PRIVATE void + dovend_rfc1048(bp, hp, bootsize) + struct bootp *bp; + struct host *hp; +--- 1259,1267 ---- + if (bytesleft < (LEN)) { \ + report(LOG_NOTICE, noroom, \ + hp->hostname->string, MSG); \ +! return 0; \ + } while (0) +! PRIVATE int + dovend_rfc1048(bp, hp, bootsize) + struct bootp *bp; + struct host *hp; +*************** +*** 1230,1235 **** +--- 1269,1278 ---- + { + int bytesleft, len; + byte *vp; ++ #ifdef DHCP ++ int dhcp = 0; ++ int isme = TRUE; /* DHCP uses this for not-mine-requests */ ++ #endif + + static char noroom[] = "%s: No room for \"%s\" option"; + +*************** +*** 1280,1286 **** + case TAG_SUBNET_MASK: + /* XXX - Should preserve this if given... */ + break; +! } /* swtich */ + p += len; + } + +--- 1323,1335 ---- + case TAG_SUBNET_MASK: + /* XXX - Should preserve this if given... */ + break; +! case TAG_DHCP_MSG: +! dhcp = *p; +! break; +! case TAG_DHCP_SERVERID: +! isme = (len==4) && my_ip_addr.s_addr == ((struct in_addr *)p)->s_addr; +! break; +! } /* switch */ + p += len; + } + +*************** +*** 1347,1362 **** + vp += len; + *vp++ = TAG_END; + bytesleft -= len + 3; +! return; /* no more options here. */ + } + /* +! * The remaining options are inserted by the following +! * function (which is shared with bootpef.c). +! * Keep back one byte for the TAG_END. + */ +! len = dovend_rfc1497(hp, vp, bytesleft - 1); +! vp += len; +! bytesleft -= len; + + /* There should be at least one byte left. */ + NEED(1, "(end)"); +--- 1396,1439 ---- + vp += len; + *vp++ = TAG_END; + bytesleft -= len + 3; +! return 1; /* no more options here. */ + } ++ ++ #ifdef DHCP + /* +! * Check if this is a DHCP request. + */ +! if (dhcp!=0) { +! if (!isme) +! return 0; /* Not mine, discard! */ +! +! switch (dhcp) { +! case 1 : len = dhcp_discover(bp,hp,vp,bytesleft-1); break; +! case 3 : len = dhcp_request(bp,hp,vp,bytesleft-1); break; +! case 4 : len = dhcp_decline(bp,hp,vp,bytesleft-1); break; +! case 7 : len = dhcp_release(bp,hp,vp,bytesleft-1); break; +! default : report(LOG_NOTICE,"Unknown DHCP request (%d)",dhcp); +! return 0; +! } +! /* Is there a DHCP reply at all? */ +! if (len==0) +! return 0; +! vp += len; +! bytesleft -= len; +! } +! else { +! #endif +! /* +! * The remaining options are inserted by the following +! * function (which is shared with bootpef.c). +! * Keep back one byte for the TAG_END. +! */ +! len = dovend_rfc1497(hp, vp, bytesleft - 1); +! vp += len; +! bytesleft -= len; +! #ifdef DHCP +! } +! #endif + + /* There should be at least one byte left. */ + NEED(1, "(end)"); +*************** +*** 1370,1375 **** +--- 1447,1453 ---- + */ + bzero(vp, bytesleft); + } ++ return 1; /* sent reply */ + } /* dovend_rfc1048 */ + #undef NEED + +*************** +*** 1389,1394 **** +--- 1467,1637 ---- + */ + + /* get_errmsg() - now in report.c */ ++ ++ ++ #ifdef DHCP ++ ++ /* ++ * PeP hic facet ++ * Stuff the packet with the Lease info, We need to do this on the Offer and ++ * the ack so separated out here ++ */ ++ PRIVATE ++ int dhcp_lease(bp, hp, vp) ++ struct bootp *bp; ++ struct host *hp; ++ byte **vp; ++ { ++ *(*vp)++ = TAG_DHCP_IPRENEW; /* DHCP Renewal time 50% of lease */ ++ *(*vp)++ = 4; /* Length */ ++ insert_u_long(htonl(hp->dhcp_lease/2),vp); ++ ++ *(*vp)++ = TAG_DHCP_IPREBIND; /* DHCP Rebinding time 85% of lease */ ++ *(*vp)++ = 4; ++ insert_u_long(htonl(hp->dhcp_lease*7/8),vp); ++ ++ *(*vp)++ = TAG_DHCP_IPLEASE; /* IP address lease time */ ++ *(*vp)++ = 4; /* Length */ ++ insert_u_long(htonl(hp->dhcp_lease),vp); /* PeP hic facet, lets see if this works */ ++ ++ return(19); ++ } ++ ++ ++ /* ++ * Formulate an DHCP_DISCOVER reply ++ */ ++ PRIVATE ++ int dhcp_discover(bp, hp, vp, bytesleft) ++ struct bootp *bp; ++ struct host *hp; ++ byte *vp; ++ int bytesleft; ++ { ++ if(debug) ++ report(LOG_INFO, "Received: DHCPDISCOVER"); ++ return(dhcp_offer(bp,hp,vp,bytesleft)); ++ } ++ ++ /* ++ * formulate an DHCP_RELEASE reply ++ */ ++ PRIVATE ++ int dhcp_release(bp, hp, vp, bytesleft) ++ struct bootp *bp; ++ struct host *hp; ++ byte *vp; ++ int bytesleft; ++ { ++ if (debug) ++ report(LOG_INFO, "Received: DHCPRELEASE (discarded)"); ++ return 0; ++ } ++ ++ PRIVATE ++ int dhcp_offer(bp, hp, vp, bytesleft) ++ struct bootp *bp; ++ struct host *hp; ++ byte *vp; ++ int bytesleft; ++ { ++ int len=0; ++ if (debug) ++ report(LOG_INFO, "Sent: DHCPOFFER"); ++ ++ bp->bp_secs = bp->bp_hops = 0; ++ bp->bp_ciaddr.s_addr = 0; ++ ++ *vp++ = TAG_DHCP_MSG; /* DHCP */ ++ *vp++ = 1; /* length */ ++ *vp++ = 2; /* DHCPOFFER */ ++ len += 3; ++ ++ len += dhcp_lease(bp,hp,&vp); ++ ++ *vp++ = TAG_DHCP_SERVERID; ++ *vp++ = 4; ++ insert_u_long(my_ip_addr.s_addr,&vp); ++ len += 6; ++ ++ return len + dovend_rfc1497(hp, vp, bytesleft - len); ++ } ++ ++ /* ++ * Formulate an DHCP_REQUEST reply ++ */ ++ PRIVATE ++ int dhcp_request(bp, hp, vp, bytesleft) ++ struct bootp *bp; ++ struct host *hp; ++ byte *vp; ++ int bytesleft; ++ { ++ bp->bp_secs = bp->bp_hops = 0; ++ ++ if(debug) ++ report(LOG_INFO,"Received: DHCPREQUEST"); ++ /* ++ * Make absolutely sure that if the client requests an address, ++ * it is its own address, and also make sure the hardware ++ * addresses match perfectly. We want to minimize spoofing! ++ */ ++ if ((bp->bp_ciaddr.s_addr && bp->bp_ciaddr.s_addr!=bp->bp_yiaddr.s_addr) || ++ bp->bp_htype != hp->htype || ++ bcmp(bp->bp_chaddr, hp->haddr, haddrlength(hp->htype))) { ++ if (debug) ++ report(LOG_INFO, "Sent: DHCPNAK"); ++ ++ *vp++ = TAG_DHCP_MSG; /* DHCPNAK */ ++ *vp++ = 1; ++ *vp++ = 6; ++ return 3; ++ } ++ else ++ return(dhcp_ack(bp,hp,vp,bytesleft)); ++ } ++ ++ PRIVATE ++ int dhcp_ack(bp, hp, vp, bytesleft) ++ struct bootp *bp; ++ struct host *hp; ++ byte *vp; ++ int bytesleft; ++ { ++ int len=0; ++ if (debug) ++ report(LOG_INFO, "Sent: DHCPACK"); ++ ++ *vp++ = TAG_DHCP_MSG; /* DHCPACK */ ++ *vp++ = 1; ++ *vp++ = 5; ++ len += 3; ++ ++ len += dhcp_lease(bp,hp,&vp); ++ ++ *vp++ = TAG_DHCP_SERVERID; /* Server id */ ++ *vp++ = 4; ++ insert_u_long(my_ip_addr.s_addr,&vp); ++ len += 6; ++ ++ return len + dovend_rfc1497(hp, vp, bytesleft - len); ++ } ++ ++ /* ++ * formulate an DHCP_DECLINE reply ++ */ ++ PRIVATE ++ int dhcp_decline(bp, hp, vp, bytesleft) ++ struct bootp *bp; ++ struct host *hp; ++ byte *vp; ++ int bytesleft; ++ { ++ if (debug) ++ report(LOG_INFO, "Recived: DHCPDECLINE (ignored)"); ++ return 0; ++ } ++ #endif + + /* + * Local Variables: +diff -rc bootp-2.4.2/bootpd.h bootp-2.4.3/bootpd.h +*** bootp-2.4.2/bootpd.h Thu Jul 28 00:30:29 1994 +--- bootp-2.4.3/bootpd.h Thu Mar 16 08:17:23 1995 +*************** +*** 126,131 **** +--- 126,134 ---- + exec_file :1, + msg_size :1, + min_wait :1, ++ #ifdef DHCP ++ dhcp_lease :1, /* PeP hic facet */ ++ #endif + /* XXX - Add new tags here */ + vm_cookie :1; + }; +*************** +*** 184,189 **** +--- 187,195 ---- + unsigned int32 bootsize, + msg_size, + min_wait; ++ #ifdef DHCP ++ unsigned int32 dhcp_lease; /* PeP hic facet */ ++ #endif + struct in_addr bootserver, + iaddr, + swap_server, +diff -rc bootp-2.4.2/bootptest.c bootp-2.4.3/bootptest.c +*** bootp-2.4.2/bootptest.c Thu Feb 16 16:36:25 1995 +--- bootp-2.4.3/bootptest.c Thu Mar 16 08:17:36 1995 +*************** +*** 50,55 **** +--- 50,58 ---- + #include + #endif + ++ #ifndef NO_UNISTD ++ #include ++ #endif + #include + #include + #include +*************** +*** 66,71 **** +--- 69,77 ---- + + #include "patchlevel.h" + ++ static void send_request(); ++ ++ extern int getether(); + static void send_request(); + + #define LOG_ERR 1 +diff -rc bootp-2.4.2/print-bootp.c bootp-2.4.3/print-bootp.c +*** bootp-2.4.2/print-bootp.c Wed Feb 15 23:21:13 1995 +--- bootp-2.4.3/print-bootp.c Thu Mar 16 08:41:15 1995 +*************** +*** 268,274 **** + "iXW-FS", /* 48: X Window System Font Servers */ + "iXW-DM", /* 49: X Window System Display Managers */ + +! /* DHCP extensions (RFC-1533, sect. 9) */ + #endif + }; + #define KNOWN_OPTIONS (sizeof(rfc1048_opts) / sizeof(rfc1048_opts[0])) +--- 268,279 ---- + "iXW-FS", /* 48: X Window System Font Servers */ + "iXW-DM", /* 49: X Window System Display Managers */ + +! /* DHCP extensions (RFC-1533, sect. 9) PeP hic facet */ +! "iDHCPreq", /* 50: DHCP requested IP address */ +! "lDHCPlease", /* 51: DHCP lease time */ +! "bDHCPooptol", /* 52: DHCP option overload */ +! "bDHCPtype", /* 53: DHCP message type */ +! "iDHCPSid", /* 54: DHCP server ID */ + #endif + }; + #define KNOWN_OPTIONS (sizeof(rfc1048_opts) / sizeof(rfc1048_opts[0])) +diff -rc bootp-2.4.2/readfile.c bootp-2.4.3/readfile.c +*** bootp-2.4.2/readfile.c Wed Feb 15 21:45:25 1995 +--- bootp-2.4.3/readfile.c Thu Mar 16 08:46:17 1995 +*************** +*** 113,118 **** +--- 113,121 ---- + #define SYM_EXEC_FILE 33 /* YORK_EX_OPTION */ + #define SYM_MSG_SIZE 34 + #define SYM_MIN_WAIT 35 ++ #define SYM_DHCP_LEASE 36 /* RFC 1533 PeP hic facet */ ++ #define SYM_DHCP_IPRENEW 37 ++ #define SYM_DHCP_IPREBIND 38 + /* XXX - Add new tags here */ + + #define OP_ADDITION 1 /* Operations on tags */ +*************** +*** 161,166 **** +--- 164,172 ---- + {"df", SYM_DUMP_FILE}, + {"dn", SYM_DOMAIN_NAME}, + {"ds", SYM_DOMAIN_SERVER}, ++ #ifdef DHCP ++ {"dl", SYM_DHCP_LEASE}, /* PeP hic facet */ ++ #endif + {"ef", SYM_EXTEN_FILE}, + {"ex", SYM_EXEC_FILE}, /* YORK_EX_OPTION */ + {"gw", SYM_GATEWAY}, +*************** +*** 1125,1131 **** + PARSE_UINT(min_wait); + break; + +! /* XXX - Add new tags here */ + + default: + return E_UNKNOWN_SYMBOL; +--- 1131,1146 ---- + PARSE_UINT(min_wait); + break; + +! #ifdef DHCP +! /* PeP hic facet. */ +! case SYM_DHCP_LEASE: +! PARSE_UINT(dhcp_lease); +! break; +! +! /* XXX - Add new DHCP tags here */ +! #endif +! +! /* XXX - Add new tags here */ + + default: + return E_UNKNOWN_SYMBOL; +*************** +*** 1506,1511 **** +--- 1521,1527 ---- + DUP_COPY(min_wait); + + /* XXX - Add new tags here */ ++ DUP_COPY(dhcp_lease); /* PeP hic facet */ + + DUP_LINK(generic); + + -- 2.44.0