pxeboot: make the tftp loader use the option root-path directive
pxeboot in tftp loader mode (when built with LOADER_TFTP_SUPPORT) now prefix all the path to open with the path obtained via the option 'root-path' directive. This allows to be able to use the traditional content /boot out of box. Meaning it now works pretty much like all other loaders. It simplifies hosting hosting multiple version of FreeBSD on a tftp server. As a consequence, pxeboot does not look anymore for a pxeboot.4th (which was never provided) Note: that pxeboot in tftp loader mode is not built by default. Reviewed by: rpokala Relnotes: yes Sponsored by: Gandi.net Differential Revision: https://reviews.freebsd.org/D4590
This commit is contained in:
parent
54f97d1eef
commit
4d6ab32f99
6
UPDATING
6
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,
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user