summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/boot/i386/libi386/pxe.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/sys/boot/i386/libi386/pxe.c b/sys/boot/i386/libi386/pxe.c
index b78508a..a0f66a7 100644
--- a/sys/boot/i386/libi386/pxe.c
+++ b/sys/boot/i386/libi386/pxe.c
@@ -413,6 +413,22 @@ struct nfs_iodesc {
/* structure truncated here */
};
extern struct nfs_iodesc nfs_root_node;
+extern int rpc_port;
+
+static void
+pxe_rpcmountcall()
+{
+ struct iodesc *d;
+ int error;
+
+ if (!(d = socktodesc(pxe_sock)))
+ return;
+ d->myport = htons(--rpc_port);
+ d->destip = rootip;
+ if ((error = nfs_getrootfh(d, rootpath, nfs_root_node.fh)) != 0)
+ printf("NFS MOUNT RPC error: %d\n", error);
+ nfs_root_node.iodesc = d;
+}
static void
pxe_setnfshandle(char *rootpath)
@@ -421,6 +437,14 @@ pxe_setnfshandle(char *rootpath)
u_char *fh;
char buf[2 * NFS_FHSIZE + 3], *cp;
+ /*
+ * If NFS files were never opened, we need to do mount call
+ * ourselves. Use nfs_root_node.iodesc as flag indicating
+ * previous NFS usage.
+ */
+ if (nfs_root_node.iodesc == NULL)
+ pxe_rpcmountcall();
+
fh = &nfs_root_node.fh[0];
buf[0] = 'X';
cp = &buf[1];
OpenPOWER on IntegriCloud