#include <string.h>
#include <sys/gpxe.h>
#include <syslinux/config.h>
#include <syslinux/pxe_api.h>
bool is_gpxe(void)
{
const struct syslinux_version *sv;
struct s_PXENV_FILE_CHECK_API *fca;
bool gpxe;
int err;
sv = syslinux_version();
if (sv->filesystem != SYSLINUX_FS_PXELINUX)
return false; /* Not PXELINUX */
fca = lzalloc(sizeof *fca);
if (!fca)
return false;
fca->Size = sizeof *fca;
fca->Magic = 0x91d447b2;
err = pxe_call(PXENV_FILE_API_CHECK, fca);
gpxe = true;
if (err)
gpxe = false; /* Cannot invoke PXE stack */
if (fca->Status)
gpxe = false; /* PXE failure */
if (fca->Magic != 0xe9c17b20)
gpxe = false; /* Incorrect magic */
if (fca->Size < sizeof *fca)
gpxe = false; /* Short return */
/* XXX: The APIs to test for should be a passed-in option */
if (!(fca->APIMask & (1 << 5)))
gpxe = false; /* No FILE EXEC */
lfree(fca);
return gpxe;
}