home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
unix
/
volume27
/
bootp-2.2.B
/
patch01
< prev
next >
Wrap
Text File
|
1993-10-19
|
10KB
|
350 lines
Newsgroups: comp.sources.unix
From: gwr@mc.com (Gordon W. Ross)
Subject: v27i076: bootp-2.2 - RFC 1048 "bootp" server (w/ vendor extensions), Patch01
Sender: unix-sources-moderator@gw.home.vix.com
Approved: vixie@gw.home.vix.com
Submitted-By: gwr@mc.com (Gordon W. Ross)
Posting-Number: Volume 27, Issue 76
Archive-Name: bootp-2.2.B/patch01
I didn't have a Solaris machine to test on when I merge in the
Solaris support changes and, well, I botched it. Sorry.
(On Solaris, it dumps core while composing the first reply.)
Here are changes to make bootp-2.2.B _really_ work on Solaris.
Your copy becomes version 2.2.C after these chages.
Gordon W. Ross Mercury Computer Systems
gwr@mc.com 199 Riverneck Road
508-256-1300 Chelmsford, MA 01824-2820
diff -rcw bootp-2.2.B/Makefile bootp-2.2.C/Makefile
*** bootp-2.2.B/Makefile Thu Oct 7 15:30:56 1993
--- bootp-2.2.C/Makefile Thu Oct 14 19:21:29 1993
***************
*** 20,26 ****
# Uncomment these lines for SunOS 4.X
SYSDEFS= -DSUNOS4
# Uncomment these lines for SVR4 (or Solaris 2.X)
! # SYSDEFS= -DSVR4 # -Dsparc -Dsun -Dunix ?XXX?
# SYSLIBS= -lsocket -lnsl
INSTALL=/usr/bin/install
--- 20,26 ----
# Uncomment these lines for SunOS 4.X
SYSDEFS= -DSUNOS4
# Uncomment these lines for SVR4 (or Solaris 2.X)
! # SYSDEFS= -DSVR4
# SYSLIBS= -lsocket -lnsl
INSTALL=/usr/bin/install
diff -rcw bootp-2.2.B/Version.c bootp-2.2.C/Version.c
*** bootp-2.2.B/Version.c Thu Oct 7 16:11:18 1993
--- bootp-2.2.C/Version.c Thu Oct 14 19:40:01 1993
***************
*** 41,48 ****
*/
#ifndef lint
! char sccsid[] = "@(#)bootpd 2.2.B %VERSION% %WHOANDWHERE%\n";
! char rcsid[] = "$Header: Version 2.2.B from gwr@mc.com $";
#endif /* not lint */
! char Version[] = "bootpd 2.2.B %VERSION%\n\t%WHOANDWHERE%\n";
--- 41,48 ----
*/
#ifndef lint
! char sccsid[] = "@(#)bootpd 2.2.C %VERSION% %WHOANDWHERE%\n";
! char rcsid[] = "$Header: Version 2.2.C from gwr@mc.com $";
#endif /* not lint */
! char Version[] = "bootpd 2.2.C %VERSION%\n\t%WHOANDWHERE%\n";
diff -rcw bootp-2.2.B/bootpd.c bootp-2.2.C/bootpd.c
*** bootp-2.2.B/bootpd.c Fri Oct 8 11:34:30 1993
--- bootp-2.2.C/bootpd.c Thu Oct 14 19:27:24 1993
***************
*** 85,93 ****
#include <signal.h>
#include <stdio.h>
#ifdef SVR4
! #include <sys/termios.h> /* Why? */
#include <string.h>
- #include <sys/fcntl.h> /* Why? */
#else
#include <strings.h>
#endif
--- 85,93 ----
#include <signal.h>
#include <stdio.h>
#ifdef SVR4
! #include <sys/fcntl.h> /* for O_RDONLY, etc */
! #include <sys/termios.h> /* for TIOCNOTTY */
#include <string.h>
#else
#include <strings.h>
#endif
***************
*** 120,126 ****
#define bcopy(a,b,c) memcpy(b,a,c)
#define bzero(p,l) memset(p,0,l)
#define bcmp(a,b,c) memcmp(a,b,c)
! #define index(a,b) strchr(a,b)
#endif
--- 120,126 ----
#define bcopy(a,b,c) memcpy(b,a,c)
#define bzero(p,l) memset(p,0,l)
#define bcmp(a,b,c) memcmp(a,b,c)
! #define index strchr
#endif
***************
*** 162,169 ****
* Internet socket and interface config structures
*/
! struct sockaddr server_addr;
! struct sockaddr client_addr;
struct ifreq ifreq[10]; /* Holds interface configuration */
struct ifconf ifconf; /* Int. config ioctl block (pnts to ifreq) */
struct arpreq arpreq; /* Arp request ioctl block */
--- 162,169 ----
* Internet socket and interface config structures
*/
! struct sockaddr_in server_addr;
! struct sockaddr_in client_addr;
struct ifreq ifreq[10]; /* Holds interface configuration */
struct ifconf ifconf; /* Int. config ioctl block (pnts to ifreq) */
struct arpreq arpreq; /* Arp request ioctl block */
***************
*** 243,249 ****
struct timeval actualtimeout, *timeout;
struct bootp *bp;
struct servent *servp;
- struct sockaddr_in *s_sin;
char *stmp;
int n, sa_len, ca_len;
int nfound, readfds;
--- 243,248 ----
***************
*** 253,259 ****
actualtimeout.tv_usec = 0L;
actualtimeout.tv_sec = 60 * DEFAULT_TIMEOUT;
timeout = &actualtimeout;
- s_sin = (struct sockaddr_in *) &server_addr;
/* Get space for receiving packets and composing replies. */
pktbuf = malloc(MAXPKT);
--- 252,257 ----
***************
*** 271,284 ****
bzero((char *) &server_addr, sa_len);
errno = 0;
standalone = TRUE;
! if (getsockname(s, &server_addr, &sa_len) == 0) {
/*
* Descriptor 0 is a socket. Assume we are a child of inetd.
*/
! if (s_sin->sin_family == AF_INET) {
standalone = FALSE;
! bootps_port = ntohs(s_sin->sin_port);
} else {
report(LOG_INFO, "getsockname: not an INET socket\n");
}
}
--- 269,283 ----
bzero((char *) &server_addr, sa_len);
errno = 0;
standalone = TRUE;
! if (getsockname(s, (struct sockaddr *) &server_addr, &sa_len) == 0) {
/*
* Descriptor 0 is a socket. Assume we are a child of inetd.
*/
! if (server_addr.sin_family == AF_INET) {
standalone = FALSE;
! bootps_port = ntohs(server_addr.sin_port);
} else {
+ /* Some other type of socket? */
report(LOG_INFO, "getsockname: not an INET socket\n");
}
}
***************
*** 470,479 ****
/*
* Bind socket to BOOTPS port.
*/
! s_sin->sin_family = AF_INET;
! s_sin->sin_addr.s_addr = INADDR_ANY;
! s_sin->sin_port = htons(bootps_port);
! if (bind(s, &server_addr, sizeof(*s_sin)) < 0) {
report(LOG_ERR, "bind: %s\n", get_network_errmsg());
exit(1);
}
--- 469,480 ----
/*
* Bind socket to BOOTPS port.
*/
! server_addr.sin_family = AF_INET;
! server_addr.sin_addr.s_addr = INADDR_ANY;
! server_addr.sin_port = htons(bootps_port);
! if (bind(s, (struct sockaddr *) &server_addr,
! sizeof(server_addr)) < 0)
! {
report(LOG_ERR, "bind: %s\n", get_network_errmsg());
exit(1);
}
***************
*** 538,544 ****
exit(0);
}
ca_len = sizeof(client_addr);
! n = recvfrom(s, pktbuf, MAXPKT, 0, &client_addr, &ca_len);
if (n <= 0) {
continue;
}
--- 539,546 ----
exit(0);
}
ca_len = sizeof(client_addr);
! n = recvfrom(s, pktbuf, MAXPKT, 0,
! (struct sockaddr *) &client_addr, &ca_len);
if (n <= 0) {
continue;
}
***************
*** 860,871 ****
int forward;
{
register struct bootp *bp = (struct bootp *) pktbuf;
! struct in_addr dst; /* XXX */
! struct sockaddr_in *c_sin;
! c_sin = (struct sockaddr_in *) &client_addr;
!
! c_sin->sin_port = htons(bootpc_port);
/*
* If the client IP address is specified, use that
* else if gateway IP address is specified, use that
--- 862,870 ----
int forward;
{
register struct bootp *bp = (struct bootp *) pktbuf;
! struct in_addr dst;
! client_addr.sin_port = htons(bootpc_port);
/*
* If the client IP address is specified, use that
* else if gateway IP address is specified, use that
***************
*** 876,882 ****
dst = bp->bp_ciaddr;
} else if (bp->bp_giaddr.s_addr && forward == 0) {
dst = bp->bp_giaddr;
! c_sin->sin_port = htons(bootps_port);
} else {
dst = bp->bp_yiaddr;
setarp(&dst, bp->bp_chaddr, bp->bp_hlen);
--- 875,881 ----
dst = bp->bp_ciaddr;
} else if (bp->bp_giaddr.s_addr && forward == 0) {
dst = bp->bp_giaddr;
! client_addr.sin_port = htons(bootps_port);
} else {
dst = bp->bp_yiaddr;
setarp(&dst, bp->bp_chaddr, bp->bp_hlen);
***************
*** 925,934 ****
}
}
! c_sin->sin_addr = dst;
/* Send reply with same size packet as request used. */
if (sendto(s, pktbuf, pktlen, 0,
! &client_addr, sizeof(*c_sin)) < 0) {
report(LOG_ERR, "sendto: %s\n", get_network_errmsg());
}
} /* sendreply */
--- 924,935 ----
}
}
! client_addr.sin_addr = dst;
/* Send reply with same size packet as request used. */
if (sendto(s, pktbuf, pktlen, 0,
! (struct sockaddr *) &client_addr,
! sizeof(client_addr)) < 0)
! {
report(LOG_ERR, "sendto: %s\n", get_network_errmsg());
}
} /* sendreply */
***************
*** 965,980 ****
{
struct sockaddr_in *si;
bzero((caddr_t)&arpreq, sizeof(arpreq));
arpreq.arp_pa.sa_family = AF_INET;
si = (struct sockaddr_in *) &arpreq.arp_pa;
si->sin_addr = *ia;
! arpreq.arp_flags = ATF_INUSE | ATF_COM;
!
bcopy(ha, arpreq.arp_ha.sa_data, len);
if (ioctl(s, SIOCSARP, (caddr_t)&arpreq) < 0) {
report(LOG_ERR, "ioctl(SIOCSARP): %s\n", get_network_errmsg());
}
--- 966,987 ----
{
struct sockaddr_in *si;
+ if (debug > 1)
+ report(LOG_INFO, "setarp %s %s (l=%d)\n",
+ inet_ntoa(*ia), haddrtoa(ha, 1), len);
+
bzero((caddr_t)&arpreq, sizeof(arpreq));
+ arpreq.arp_flags = ATF_INUSE | ATF_COM;
+ /* Set up the protocol address. */
arpreq.arp_pa.sa_family = AF_INET;
si = (struct sockaddr_in *) &arpreq.arp_pa;
si->sin_addr = *ia;
! /* Set up the hardware address. */
bcopy(ha, arpreq.arp_ha.sa_data, len);
+ /* XXX - Why does this fail on Solaris 2.X ? (ENXIO) */
if (ioctl(s, SIOCSARP, (caddr_t)&arpreq) < 0) {
report(LOG_ERR, "ioctl(SIOCSARP): %s\n", get_network_errmsg());
}
***************
*** 1308,1313 ****
--- 1315,1325 ----
* One could append additional options when there is room after the
* end record but this implementation does not do so. One would need
* a way to know which options should be "forced" into the list.
+ *
+ * This function is now not really correct. The client only gets
+ * to set the magic number, not the data. Oddball clients can be
+ * supported using the "arbitrary vendor data" feature, so this
+ * code should be reverted back to the CMU version. <gwr@mc.com>
*/
void dovend_rfc1048(bp, hp, bootsize)
register struct bootp *bp;
***************
*** 1320,1325 ****
--- 1332,1338 ----
char *tmpstr;
unsigned long ul;
unsigned short us;
+ extern char *index();
/*
* Compute pointers to beginning and end of option area.