| #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; |
| } |