diff options
Diffstat (limited to 'usr.sbin/diskless_cfg/diskless_cfg.c')
| -rw-r--r-- | usr.sbin/diskless_cfg/diskless_cfg.c | 86 |
1 files changed, 48 insertions, 38 deletions
diff --git a/usr.sbin/diskless_cfg/diskless_cfg.c b/usr.sbin/diskless_cfg/diskless_cfg.c index 3cf21379470f..7678ff54675f 100644 --- a/usr.sbin/diskless_cfg/diskless_cfg.c +++ b/usr.sbin/diskless_cfg/diskless_cfg.c @@ -18,6 +18,11 @@ Based loosely on the 4.4BSD diskless setup code #include <rpc/types.h> #include <sys/errno.h> #include <nfs/nfs.h> +#ifdef __SVR4 +/* Solaris: compile with -lbsm -lnsl -lsocket */ +#define getfh nfs_getfh +#define bcopy(a,b,c) memcpy(b,a,c) +#endif #endif #ifdef i386 /* Native 386bsd system */ @@ -50,6 +55,7 @@ struct nfs_diskless nfs_diskless; #define KW_HOSTNAME 7 #define KW_KERNEL 8 #define KW_GATEWAY 9 +#define KW_SERVER 10 struct { char *name; @@ -63,11 +69,12 @@ struct { { "-wsize", KW_WSIZE }, { "-hostname", KW_HOSTNAME }, { "-gateway", KW_GATEWAY }, + { "-server", KW_SERVER }, { NULL, KW_HELP } }; char *hostname = "386bsd"; -char *gateway = NULL; +char gateway[256]; char cfg[64]; char *rootpath = "/var/386bsd"; char *swappath = "/var/swap/386bsd"; @@ -86,7 +93,7 @@ main(argc, argv) char *p, *q; netmask = 0; - bzero(&nfs_diskless, 0, sizeof(struct nfs_diskless)); + 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; @@ -107,24 +114,6 @@ main(argc, argv) 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]); - exit(2); - } - if ((hp = gethostbyname(servername)) == NULL) { - fprintf(stderr,"%s: unable to get host address\n",argv[0]); - exit(2); - } - p = servername; - while (*p && (*p != '.')) p++; - *p = 0; - nfs_diskless.swap_saddr.sa_data[0] = nfs_diskless.root_saddr.sa_data[0] - = NFS_SOCKET >> 8; - nfs_diskless.swap_saddr.sa_data[1] = nfs_diskless.root_saddr.sa_data[1] - = NFS_SOCKET & 0x00FF; - 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); - i = 1; while (i < argc) { cmd = KW_HELP; @@ -174,28 +163,49 @@ main(argc, argv) hostname = argv[i+1]; i += 2; break; + case KW_SERVER: + strcpy(servername,argv[i+1]); + i += 2; + break; case KW_GATEWAY: - gateway = argv[i+1]; + strcpy(gateway,argv[i+1]); i += 2; break; } } - if(gateway) - { - if (gethostname(gateway, 256) < 0) { - fprintf(stderr,"%s: unable to get gateway host name\n",argv[0]); - exit(2); - } - if ((hp = gethostbyname(gateway)) == NULL) { - fprintf(stderr,"%s: unable to get gateway host address\n",argv[0]); - exit(2); - } - 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); + + if (!*servername && gethostname(servername, sizeof servername) < 0) { + fprintf(stderr,"%s: unable to get host server name\n",argv[0]); + exit(2); + } + if ((hp = gethostbyname(servername)) == NULL) { + fprintf(stderr,"%s: unable to get host address\n",argv[0]); + exit(2); + } + p = servername; + while (*p && (*p != '.')) p++; + *p = 0; + nfs_diskless.swap_saddr.sa_data[0] = nfs_diskless.root_saddr.sa_data[0] + = NFS_SOCKET >> 8; + nfs_diskless.swap_saddr.sa_data[1] = nfs_diskless.root_saddr.sa_data[1] + = NFS_SOCKET & 0x00FF; + 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); + + if (!*gateway && gethostname(gateway, sizeof gateway) < 0) { + fprintf(stderr,"%s: unable to get gateway host name\n",argv[0]); + exit(2); } + if ((hp = gethostbyname(gateway)) == NULL) { + fprintf(stderr,"%s: unable to get gateway host address\n",argv[0]); + exit(2); + } + 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); @@ -219,7 +229,7 @@ main(argc, argv) 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", + fprintf(stderr,"%s: unable to stat root '%s'\n", argv[0],rootpath); exit(2); } @@ -238,7 +248,7 @@ main(argc, argv) 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", + fprintf(stderr,"%s: unable to stat swap '%s'\n", argv[0],swappath); exit(2); } |
