/*************************************************************************
Diskless Configuration Program
Based loosely on the 4.4BSD diskless setup code
Solaris 2.3: compile with -lbsm -lnsl -lsocket.
*************************************************************************/
#define bcopy(a,b,c) memcpy(b,a,c)
#ifdef i386 /* Native 386bsd system */
#include <nfs/nfsdiskless.h>
#else /* Other Host system */
#ifndef i386 /* Most other systems BIG ENDIAN */
struct nfs_diskless nfs_diskless
;
{ "-intf", KW_INTERFACE
},
{ "-rootfs", KW_ROOTFS
},
{ "-netmask", KW_NETMASK
},
{ "-hostname", KW_HOSTNAME
},
{ "-gateway", KW_GATEWAY
},
char *hostname
= "386bsd";
char *rootpath
= "/var/386bsd";
char *swappath
= "/var/swap/386bsd";
unsigned int broadcast
, netmask
, myip
;
memset(&nfs_diskless
, 0, sizeof(struct nfs_diskless
));
strcpy(nfs_diskless
.myif
.ifra_name
,"ed0");
nfs_diskless
.myif
.ifra_addr
.sa_len
= sizeof(struct sockaddr
);
nfs_diskless
.myif
.ifra_addr
.sa_family
= AF_INET
;
nfs_diskless
.myif
.ifra_broadaddr
.sa_len
= sizeof(struct sockaddr
);
nfs_diskless
.myif
.ifra_broadaddr
.sa_family
= AF_INET
;
nfs_diskless
.myif
.ifra_mask
.sa_len
= sizeof(struct sockaddr
);
nfs_diskless
.myif
.ifra_mask
.sa_family
= AF_UNSPEC
;
nfs_diskless
.swap_args
.sotype
= i386order(SOCK_DGRAM
);
nfs_diskless
.swap_args
.flags
= i386order(NFSMNT_WSIZE
| NFSMNT_RSIZE
);
nfs_diskless
.swap_args
.timeo
= i386order(10);
nfs_diskless
.swap_args
.retrans
= i386order(100);
nfs_diskless
.swap_saddr
.sa_len
= sizeof(struct sockaddr
);
nfs_diskless
.swap_saddr
.sa_family
= AF_INET
;
nfs_diskless
.root_args
.sotype
= i386order(SOCK_DGRAM
);
nfs_diskless
.root_args
.flags
= i386order(NFSMNT_WSIZE
| NFSMNT_RSIZE
);
nfs_diskless
.root_args
.timeo
= i386order(10);
nfs_diskless
.root_args
.retrans
= i386order(100);
nfs_diskless
.root_saddr
.sa_len
= sizeof(struct sockaddr
);
nfs_diskless
.root_saddr
.sa_family
= AF_INET
;
if (gethostname(servername
, 256) < 0) {
fprintf(stderr
,"%s: unable to get host server name\n",argv
[0]);
if ((hp
= gethostbyname(servername
)) == NULL
) {
fprintf(stderr
,"%s: unable to get host address\n",argv
[0]);
while (*p
&& (*p
!= '.')) p
++;
nfs_diskless
.swap_saddr
.sa_data
[0] = nfs_diskless
.root_saddr
.sa_data
[0]
nfs_diskless
.swap_saddr
.sa_data
[1] = nfs_diskless
.root_saddr
.sa_data
[1]
bcopy(*hp
->h_addr_list
, &nfs_diskless
.swap_saddr
.sa_data
[2], 4);
bcopy(*hp
->h_addr_list
, &nfs_diskless
.root_saddr
.sa_data
[2], 4);
for (j
=0; keywords
[j
].name
; j
++) {
if (!strcmp(keywords
[j
].name
, argv
[i
])) {
cmd
= keywords
[j
].keyval
;
if (strlen(argv
[i
+1]) >= IFNAMSIZ
) {
"%s: interface name '%s' too long.\n",
strcpy(nfs_diskless
.myif
.ifra_name
, argv
[i
+1]);
netmask
= inet_addr(argv
[i
+1]);
if (gethostname(gateway
, 256) < 0) {
fprintf(stderr
,"%s: unable to get gateway host name\n",argv
[0]);
if ((hp
= gethostbyname(gateway
)) == NULL
) {
fprintf(stderr
,"%s: unable to get gateway host address\n",argv
[0]);
nfs_diskless
.mygateway
.sa_len
= sizeof(struct sockaddr
);
nfs_diskless
.mygateway
.sa_family
= AF_INET
;
nfs_diskless
.mygateway
.sa_data
[0] = NFS_SOCKET
>> 8;
nfs_diskless
.mygateway
.sa_data
[1] = NFS_SOCKET
& 0x00FF;
bcopy(*hp
->h_addr_list
, &nfs_diskless
.mygateway
.sa_data
[2], 4);
nfs_diskless
.swap_args
.rsize
= i386order(rsize
);
nfs_diskless
.swap_args
.wsize
= i386order(wsize
);
nfs_diskless
.root_args
.rsize
= i386order(rsize
);
nfs_diskless
.root_args
.wsize
= i386order(wsize
);
if ((hp
= gethostbyname(hostname
)) == NULL
) {
fprintf(stderr
,"%s: unable to get diskless address\n",argv
[0]);
bcopy(*hp
->h_addr_list
, &nfs_diskless
.myif
.ifra_addr
.sa_data
[2], 4);
net
= nfs_diskless
.myif
.ifra_addr
.sa_data
[2];
netmask
= inet_addr("255.0.0.0");
netmask
= inet_addr("255.255.0.0");
else netmask
= inet_addr("255.255.255.0");
bcopy(*hp
->h_addr_list
, &myip
, 4);
broadcast
= (myip
& netmask
) | ~netmask
;
bcopy(&broadcast
, &nfs_diskless
.myif
.ifra_broadaddr
.sa_data
[2], 4);
bcopy(&netmask
, &nfs_diskless
.myif
.ifra_mask
.sa_data
[2], 4);
if (stat(rootpath
, &statbuf
) < 0) {
fprintf(stderr
,"%s: unable to stat '%s'\n",
if (!S_ISDIR(statbuf
.st_mode
)) {
fprintf(stderr
,"%s: '%s' is not a directory\n",
if (getfh(rootpath
, (fhandle_t
*)nfs_diskless
.root_fh
) < 0) {
fprintf(stderr
,"%s: unable to get handle for '%s'\n",
sprintf(buf
,"%s:%s",servername
, rootpath
);
strcpy(nfs_diskless
.root_hostnam
,buf
);
printf("root is on %s\n",nfs_diskless
.root_hostnam
);
if (stat(swappath
, &statbuf
) < 0) {
fprintf(stderr
,"%s: unable to stat '%s'\n",
if (!S_ISREG(statbuf
.st_mode
)) {
fprintf(stderr
,"%s: '%s' is not a regular file\n",
if (getfh(swappath
, (fhandle_t
*)nfs_diskless
.swap_fh
) < 0) {
fprintf(stderr
,"%s: unable to get handle for '%s'\n",
sprintf(buf
,"%s:%s",servername
, swappath
);
strcpy(nfs_diskless
.swap_hostnam
,buf
);
printf("swap is on %s\n",nfs_diskless
.swap_hostnam
);
sprintf(cfg
,"cfg.%d.%d.%d.%d",
((int)nfs_diskless
.myif
.ifra_addr
.sa_data
[2]) & 0x00FF,
((int)nfs_diskless
.myif
.ifra_addr
.sa_data
[3]) & 0x00FF,
((int)nfs_diskless
.myif
.ifra_addr
.sa_data
[4]) & 0x00FF,
((int)nfs_diskless
.myif
.ifra_addr
.sa_data
[5]) & 0x00FF);
if ((fd
= open(cfg
, O_WRONLY
| O_CREAT
| O_TRUNC
, 0644)) < 0) {
fprintf(stderr
,"%s: unable to open/create %s\n",
if (write(fd
, &nfs_diskless
, sizeof(struct nfs_diskless
)) !=
sizeof(struct nfs_diskless
)) {
fprintf(stderr
,"%s: unable to write to '%s'\n",
/********************************************************************
HELP - Print help message
********************************************************************/
fprintf(stderr
,"%s: invalid keyword '%s' or not enough parameters\n",prog
,keywd
);
fprintf(stderr
," valid keywords: ");
for (i
=0; keywords
[i
].name
; i
++) fprintf(stderr
,"%s ", keywords
[i
].name
);
/*********************************************************************
*********************************************************************/
return( ((i
>> 24) & 0x000000FF) |
((i
>> 8) & 0x0000FF00) |
((i
<< 8) & 0x00FF0000) |
((i
<< 24) & 0xFF000000));