.mangle_name = generic_mangle_name,
.next_extent = btrfs_next_extent,
.readdir = btrfs_readdir,
- .load_config = generic_load_config
+ .open_config = generic_open_config
};
.getfssec = generic_getfssec,
.close_file = generic_close_file,
.mangle_name = generic_mangle_name,
- .load_config = generic_load_config,
+ .open_config = generic_open_config,
.iget_root = ext2_iget_root,
.iget = ext2_iget,
.readlink = ext2_readlink,
.getfssec = generic_getfssec,
.close_file = generic_close_file,
.mangle_name = vfat_mangle_name,
- .load_config = generic_load_config,
+ .open_config = generic_open_config,
.readdir = vfat_readdir,
.iget_root = vfat_iget_root,
.iget = vfat_iget,
#include <stdbool.h>
#include <string.h>
#include <dprintf.h>
+#include "core.h"
#include "fs.h"
#include "cache.h"
}
/*
- * Convert between a 16-bit file handle and a file structure
+ * Find and open the configuration file
*/
-
-void pm_load_config(com32sys_t *regs)
+int open_config(struct com32_filedata *filedata)
{
- int err;
-
- err = this_fs->fs_ops->load_config();
-
- if (err)
- printf("ERROR: No configuration file found\n");
-
- set_flags(regs, err ? EFLAGS_ZF : 0);
+ return this_fs->fs_ops->open_config(filedata);
}
void pm_mangle_name(com32sys_t *regs)
#include <cache.h>
#include <disk.h>
#include <fs.h>
+#include <stdlib.h>
#include "iso9660_fs.h"
/* Convert to lower case string */
}
/* Load the config file, return 1 if failed, or 0 */
-static int iso_load_config(void)
+static int iso_open_config(struct com32_filedata *filedata)
{
static const char *search_directories[] = {
"/boot/isolinux",
NULL
};
- return search_config(search_directories, filenames);
+ return search_config(filedata, search_directories, filenames);
}
static int iso_fs_init(struct fs_info *fs)
.getfssec = generic_getfssec,
.close_file = generic_close_file,
.mangle_name = generic_mangle_name,
- .load_config = iso_load_config,
+ .open_config = iso_open_config,
.iget_root = iso_iget_root,
.iget = iso_iget,
.readdir = iso_readdir,
* directory, followed by a set of fallback directories. If found,
* set the current working directory to match.
*/
-int generic_load_config(void)
+int generic_open_config(struct com32_filedata *filedata)
{
static const char *search_directories[] = {
NULL, /* CurrentDirName */
dprintf("CurrentDirName: \"%s\"\n", CurrentDirName);
- return search_config(search_directories, filenames);
+ return search_config(filedata, search_directories, filenames);
}
* of directories. If found, set the current working directory to
* match.
*/
-int search_config(const char *search_directories[], const char *filenames[])
+int search_config(struct com32_filedata *filedata,
+ const char *search_directories[], const char *filenames[])
{
char confignamebuf[FILENAME_MAX];
- com32sys_t regs;
const char *sd, **sdp;
const char *sf, **sfp;
for (sdp = search_directories; (sd = *sdp); sdp++) {
for (sfp = filenames; (sf = *sfp); sfp++) {
- memset(®s, 0, sizeof regs);
snprintf(confignamebuf, sizeof confignamebuf,
"%s%s%s",
sd, (*sd && sd[strlen(sd)-1] == '/') ? "" : "/",
sf);
realpath(ConfigName, confignamebuf, FILENAME_MAX);
- regs.edi.w[0] = OFFS_WRT(ConfigName, 0);
dprintf("Config search: %s\n", ConfigName);
- call16(core_open, ®s, ®s);
- if (!(regs.eflags.l & EFLAGS_ZF)) {
+ if (!open_file(ConfigName, filedata)) {
chdir(sd);
return 0; /* Got it */
}
return 0;
}
- /*
- * try to load a config file, if found, return 1, or return 0
- *
- */
-static int try_load(char *config_name)
-{
- com32sys_t regs;
-
- printf("Trying to load: %-50s ", config_name);
- pxe_mangle_name(KernelName, config_name);
-
- memset(®s, 0, sizeof regs);
- regs.edi.w[0] = OFFS_WRT(KernelName, 0);
- call16(core_open, ®s, ®s);
- if (regs.eflags.l & EFLAGS_ZF) {
- strcpy(ConfigName, KernelName);
- printf("\r");
- return 0;
- } else {
- printf("ok\n");
- return 1;
- }
-}
-
-
-/* Load the config file, return 1 if failed, or 0 */
-static int pxe_load_config(void)
+/* Load the config file, return -1 if failed, or 0 */
+static int pxe_open_config(struct com32_filedata *filedata)
{
const char *cfgprefix = "pxelinux.cfg/";
const char *default_str = "default";
get_prefix();
if (DHCPMagic & 0x02) {
/* We got a DHCP option, try it first */
- if (try_load(ConfigName))
+ if (!open_file(ConfigName, filedata))
return 0;
}
/* Try loading by UUID */
if (have_uuid) {
strcpy(config_file, UUID_str);
- if (try_load(ConfigName))
+ if (!open_file(ConfigName, filedata))
return 0;
}
/* Try loading by MAC address */
strcpy(config_file, MAC_str);
- if (try_load(ConfigName))
+ if (!open_file(ConfigName, filedata))
return 0;
/* Nope, try hexadecimal IP prefixes... */
last = &config_file[8];
while (tries) {
*last = '\0'; /* Zero-terminate string */
- if (try_load(ConfigName))
+ if (!open_file(ConfigName, filedata))
return 0;
last--; /* Drop one character */
tries--;
/* Final attempt: "default" string */
strcpy(config_file, default_str);
- if (try_load(ConfigName))
+ if (!open_file(ConfigName, filedata))
return 0;
printf("%-68s\n", "Unable to locate configuration file");
.getfssec = pxe_getfssec,
.close_file = pxe_close_file,
.mangle_name = pxe_mangle_name,
- .load_config = pxe_load_config,
+ .open_config = pxe_open_config,
};
void (*mangle_name)(char *, const char *);
size_t (*realpath)(struct fs_info *, char *, const char *, size_t);
int (*chdir)(struct fs_info *, const char *);
- int (*load_config)(void);
+ int (*open_config)(struct com32_filedata *);
struct inode * (*iget_root)(struct fs_info *);
struct inode * (*iget)(const char *, struct inode *);
void generic_mangle_name(char *, const char *);
/* loadconfig.c */
-int search_config(const char *search_directores[], const char *filenames[]);
-int generic_load_config(void);
+int search_config(struct com32_filedata *filedata,
+ const char *search_directores[], const char *filenames[]);
+int generic_open_config(struct com32_filedata *filedata);
/* close.c */
void generic_close_file(struct file *file);
%endmacro
;
-; Load configuration file
-;
- pm_call pm_load_config
- jz no_config_file
-
-;
; Now we have the config file open. Parse the config file and
; run the user interface.
;