summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--UPDATING6
-rw-r--r--lib/libstand/tftp.c20
-rw-r--r--sys/boot/i386/libi386/libi386.h1
-rw-r--r--sys/boot/i386/libi386/pxe.c26
-rw-r--r--sys/boot/i386/loader/main.c5
5 files changed, 26 insertions, 32 deletions
diff --git a/UPDATING b/UPDATING
index b02043904426e..52ce52ae9c5e6 100644
--- a/UPDATING
+++ b/UPDATING
@@ -31,6 +31,12 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW:
disable the most expensive debugging functionality run
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
+20151216:
+ The tftp loader (pxeboot) now uses the option root-path directive. As a
+ consequence it no longer looks for a pxeboot.4th file on the tftp
+ server. Instead it uses the regular /boot infrastructure as with the
+ other loaders.
+
20151211:
The code to start recording plug and play data into the modules has
been committed. While the old tools will properly build a new kernel,
diff --git a/lib/libstand/tftp.c b/lib/libstand/tftp.c
index 6527c4ed749cf..001cbfd6d1f01 100644
--- a/lib/libstand/tftp.c
+++ b/lib/libstand/tftp.c
@@ -399,6 +399,8 @@ tftp_open(const char *path, struct open_file *f)
struct tftp_handle *tftpfile;
struct iodesc *io;
int res;
+ size_t pathsize;
+ const char *extraslash;
if (strcmp(f->f_dev->dv_name, "net") != 0) {
#ifdef __i386__
@@ -424,10 +426,22 @@ tftp_open(const char *path, struct open_file *f)
io->destip = servip;
tftpfile->off = 0;
- tftpfile->path = strdup(path);
+ pathsize = (strlen(rootpath) + 1 + strlen(path) + 1) * sizeof(char);
+ tftpfile->path = malloc(pathsize);
if (tftpfile->path == NULL) {
- free(tftpfile);
- return(ENOMEM);
+ free(tftpfile);
+ return(ENOMEM);
+ }
+ if (rootpath[strlen(rootpath) - 1] == '/' || path[0] == '/')
+ extraslash = "";
+ else
+ extraslash = "/";
+ res = snprintf(tftpfile->path, pathsize, "%s%s%s",
+ rootpath, extraslash, path);
+ if (res < 0 || res > pathsize) {
+ free(tftpfile->path);
+ free(tftpfile);
+ return(ENOMEM);
}
res = tftp_makereq(tftpfile);
diff --git a/sys/boot/i386/libi386/libi386.h b/sys/boot/i386/libi386/libi386.h
index ce650ddfe5a69..839745d67abdd 100644
--- a/sys/boot/i386/libi386/libi386.h
+++ b/sys/boot/i386/libi386/libi386.h
@@ -123,5 +123,4 @@ int bi_load32(char *args, int *howtop, int *bootdevp, vm_offset_t *bip,
int bi_load64(char *args, vm_offset_t addr, vm_offset_t *modulep,
vm_offset_t *kernend, int add_smap);
-char *pxe_default_rc(void);
void pxe_enable(void *pxeinfo);
diff --git a/sys/boot/i386/libi386/pxe.c b/sys/boot/i386/libi386/pxe.c
index 1b255e9f5a210..0704672bea713 100644
--- a/sys/boot/i386/libi386/pxe.c
+++ b/sys/boot/i386/libi386/pxe.c
@@ -288,8 +288,10 @@ pxe_open(struct open_file *f, ...)
bootp(pxe_sock, BOOTP_PXE);
if (rootip.s_addr == 0)
rootip.s_addr = bootplayer.sip;
+#ifdef LOADER_NFS_SUPPORT
if (!rootpath[0])
strcpy(rootpath, PXENFSROOTPATH);
+#endif
for (i = 0; rootpath[i] != '\0' && i < FNAME_SIZE; i++)
if (rootpath[i] == ':')
@@ -317,6 +319,7 @@ pxe_open(struct open_file *f, ...)
setenv("boot.nfsroot.path", rootpath, 1);
#else
setenv("boot.netif.server", inet_ntoa(rootip), 1);
+ setenv("boot.tftproot.path", rootpath, 1);
#endif
setenv("dhcp.host-name", hostname, 1);
@@ -705,26 +708,3 @@ readudp(struct iodesc *h, void *pkt, size_t len, time_t timeout)
uh->uh_sport = udpread_p->s_port;
return udpread_p->buffer_size;
}
-
-char *
-pxe_default_rc(void)
-{
- char *rc;
- size_t count, rcsz;
-
- /* XXX It may not be a good idea to modify the PXE boot file. */
- rc = (char *)bootplayer.bootfile;
- rcsz = sizeof(bootplayer.bootfile);
-
- /* Ignore how we define rc and rcsz above -- it can change. */
- if (rcsz < 6)
- return (NULL);
- if (*rc == '\0') {
- strncpy(rc, "pxeboot", rcsz);
- rc[rcsz - 1] = '\0';
- }
- count = strlen(rc);
- strncat(rc, ".4th", rcsz - count - 1);
- printf("PXE: loading Forth from %s\n", rc);
- return (rc);
-}
diff --git a/sys/boot/i386/loader/main.c b/sys/boot/i386/loader/main.c
index 82465a3b05c0c..00873383e299b 100644
--- a/sys/boot/i386/loader/main.c
+++ b/sys/boot/i386/loader/main.c
@@ -196,11 +196,6 @@ main(void)
bios_getsmap();
-#ifdef LOADER_TFTP_SUPPORT
- if (kargs->bootflags & KARGS_FLAGS_PXE)
- interact(pxe_default_rc());
- else
-#endif
interact(NULL);
/* if we ever get here, it is an error */