home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-386-Vol-2of3.iso
/
b
/
bootp.zip
/
BOOTP.C
next >
Wrap
Text File
|
1992-03-19
|
6KB
|
252 lines
/*
BOOTP - resident BOOTP service.
written by Bruce Campbell, WATSTAR Office, Engineering Computing, University
of Waterloo.
This program is a TSR that watches for any packet driver application sending
out a BOOTP request. When it is seen, this program fakes the upcalls to
make it seem like a real BOOTP response.
Usage:
BOOTP options...
where options can be:
QUIET - so that is loads without screen activity
MYIP=ip_number
MY=ip_number
PC_IP=ip_number - these 3 do the same thing, that is, set your local IP number
SERV=ip_number - sets the IP number of the server supposedly responding
SIP=ip_number - sets the IP number of a gateway
HW=hardware_address - physical address of the server supposedly responding
MASK=subnet_mask - sets the subnet mask on magic cookie (63.82.53.63) BOOTPs
NAME=ip_number - sets the name server on magic cookie (63.82.53.63) BOOTPs
GATE=ip_number - sets the gateway on magic cookie (63.82.53.63) BOOTPs
EXTRA=xx,xx,xx,xx etc - fills in the vendor field with more stuff on magic cookie (63.82.53.63) BOOTPs
@filename - a filename full of more options like above (not recursive!)
- multiple @filename options can be specified on the command line
if the SERV, SIP, NAME or GATE are set to 255.255.255.255, an ip number is
created for the field automatically which consists of the local ip anded with
the subnet mask plus 1.
The ip_number, hardware_address, and subnet_mask are specified as nnn.nnn.nnn.nnn
or a hexadecimal address like x628462FE
Questions etc. mail to BRUCE@DEVELOPMENT.WATSTAR.uwaterloo.ca
Other issues: The upcalls are done during the transmit. So if an application
sends a BOOTP and immediately clears all received packets, it will not see the
BOOTP response. This could be fixed by deferring the upcalls to a timer tick
mechanism, however, it works for everything I've tried so far anyway.
Example usage:
bootp my=129.97.20.102 @defaults
where the file 'defaults' contains:
serv=129.97.20.1
sip=129.97.20.1
hw=xc800c700
gate=129.97.20.1
name=129.97.129.140
name=129.97.128.152
mask=255.255.254.0
extra=8,4,129.97.128.152
Notice how 2 name servers are given. Also, a quote server has been given
using the "extra" option.
See RFC1084 and RFC 951 for more information on BOOTP
Source code freely available. Distribute freely. Make any changes.
Please leave my name on it though.
*/
extern unsigned long rdvct();
extern newpack();
extern char *strstr();
extern unsigned long oldpack;
extern char *nval();
extern unsigned long your_ip;
extern unsigned long server_ip;
extern unsigned long gateway_ip;
extern unsigned long server_hw;
extern unsigned char vendor[];
#define CMDLEN 2048
unsigned char tmpcmd[CMDLEN];
#define MAXG 7
unsigned long auto_create( inip, msk )
unsigned long inip;
unsigned long msk;
{
if( inip == 0x0FFFFFFFFl )
return( (your_ip & msk) + 0x001000000l );
else
return( inip );
}
install_wpack( cmd )
char *cmd;
{
unsigned int vec;
char *ts;
unsigned long tmpl;
char *tp;
int i, j;
int numgates = 0;
int numnames = 0;
unsigned long gates[MAXG];
unsigned long names[MAXG];
unsigned long *llp;
unsigned long submask = 0x000FEFFFFl;
int quiet = 0;
int handle;
strupr( cmd );
strcpy( tmpcmd, cmd );
strcat( tmpcmd, " " );
tp = cmd;
while( tp = strstr( tp, "@" ) )
{
tp++;
if( ts = strstr( tp, " " ) ) *ts = 0;
handle = bopen( tp );
if( handle == -1 )
{
pmsg( "Unable to open " );
pmsg( tp );
pmsg( "\r\n" );
if( ts ) *ts = 0x020;
continue;
}
if( ts ) *ts = 0x020;
i = strlen( tmpcmd );
while( i < (CMDLEN-1) )
{
j = bread( handle );
if( j == -1 ) break;
j = toupper( j & 0x07F );
if( j == 0x01A ) break;
if( iscntrl( j ) ) j = 0x020;
tmpcmd[i++] = j;
tmpcmd[i] = 0;
}
bclose( handle );
}
if( strstr( tmpcmd, "QUIET" ) ) quiet = 1;
do_one_arg( tmpcmd, "MY=", &your_ip, 4 );
do_one_arg( tmpcmd, "MYIP=", &your_ip, 4 );
do_one_arg( tmpcmd, "PC_IP=", &your_ip, 4 );
do_one_arg( tmpcmd, "SERV=", &server_ip, 4 );
do_one_arg( tmpcmd, "SIP=", &gateway_ip, 4 );
do_one_arg( tmpcmd, "HW=", &server_hw, 4 );
do_one_arg( tmpcmd, "MASK=", &submask, 4 );
server_ip = auto_create( server_ip, submask );
gateway_ip = auto_create( gateway_ip, submask );
while( tp = strstr( tmpcmd, "NAME=" ) )
{
do_one_arg( tmpcmd, "NAME=", &tmpl, 4 );
tmpl = auto_create( tmpl, submask );
names[numnames++] = tmpl;
if( numnames >= MAXG ) break;
tp[0] = 'n';
}
while( tp = strstr( tmpcmd, "GATE=" ) )
{
do_one_arg( tmpcmd, "GATE=", &tmpl, 4 );
tmpl = auto_create( tmpl, submask );
gates[numgates++] = tmpl;
if( numgates >= MAXG ) break;
tp[0] = 'g';
}
i = 0;
vendor[i+0] = 1;
vendor[i+1] = 4;
llp = &vendor[i+2];
llp[0] = submask;
i += (2 + vendor[i+1]);
if( numgates )
{
vendor[i+0] = 3;
vendor[i+1] = numgates*4;
llp = &vendor[i+2];
for( j=0; j<numgates; j++ ) llp[j] = gates[j];
i += (2 + vendor[i+1]);
}
if( numnames )
{
vendor[i+0] = 6;
vendor[i+1] = numnames*4;
llp = &vendor[i+2];
for( j=0; j<numnames; j++ ) llp[j] = names[j];
i += (2 + vendor[i+1]);
}
if( tp = strstr( tmpcmd, "EXTRA=" ) )
{
tp += 6;
while( tp && *tp && (i<59) )
{
tp = nval( tp, &tmpl );
if( tp ) vendor[i++] = tmpl;
}
}
vendor[i+0] = 255;
if( !quiet )
{
pmsg( " Your_ip=" );
printa( your_ip, 8 );
pmsg( " Server_ip=" );
printa( server_ip, 8 );
pmsg( " Gateway_ip=" );
printa( gateway_ip, 8 );
pmsg( " Server_hw=" );
printa( server_hw, 8 );
pmsg( " Vendor=" );
for( j=0; j<i; j++ )
{
printa( (unsigned long) vendor[j], 2 );
pmsg( "." );
}
pmsg( "\r\n" );
}
for( vec=0x060; vec<=0x080; vec++ )
{
oldpack = rdvct( vec );
if( !oldpack ) continue;
if( bufcmp( oldpack+3l, "PKT DRVR", readds(), 9 ) ) continue;
if( !bufcmp( oldpack+12l, "BOOTP by Bruce Campbell", readds(), 24 ) )
{
if( !quiet ) pmsg( "BOOTP already loaded\r\n" );
return(1);
}
wrtvct( vec, newpack, readcs() );
return(0);
}
if( !quiet ) pmsg( "No packet driver(s) found\r\n" );
return(2);
}