diff options
Diffstat (limited to 'contrib/syslinux-4.02/core/fs/lib')
-rw-r--r-- | contrib/syslinux-4.02/core/fs/lib/close.c | 9 | ||||
-rw-r--r-- | contrib/syslinux-4.02/core/fs/lib/loadconfig.c | 34 | ||||
-rw-r--r-- | contrib/syslinux-4.02/core/fs/lib/mangle.c | 47 | ||||
-rw-r--r-- | contrib/syslinux-4.02/core/fs/lib/searchconfig.c | 40 |
4 files changed, 130 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/core/fs/lib/close.c b/contrib/syslinux-4.02/core/fs/lib/close.c new file mode 100644 index 0000000..279598b --- /dev/null +++ b/contrib/syslinux-4.02/core/fs/lib/close.c @@ -0,0 +1,9 @@ +#include "fs.h" + +void generic_close_file(struct file *file) +{ + if (file->inode) { + file->offset = 0; + put_inode(file->inode); + } +} diff --git a/contrib/syslinux-4.02/core/fs/lib/loadconfig.c b/contrib/syslinux-4.02/core/fs/lib/loadconfig.c new file mode 100644 index 0000000..c9652b6 --- /dev/null +++ b/contrib/syslinux-4.02/core/fs/lib/loadconfig.c @@ -0,0 +1,34 @@ +#include <dprintf.h> +#include <stdio.h> +#include <string.h> +#include <core.h> +#include <fs.h> + +/* + * Standard version of load_config for extlinux/syslinux filesystems. + * + * This searches for extlinux.conf and syslinux.cfg in the install + * directory, followed by a set of fallback directories. If found, + * set the current working directory to match. + */ +int generic_load_config(void) +{ + static const char *search_directories[] = { + NULL, /* CurrentDirName */ + "/boot/syslinux", + "/syslinux", + "/", + NULL + }; + static const char *filenames[] = { + "extlinux.conf", + "syslinux.cfg", + NULL + }; + + search_directories[0] = CurrentDirName; + + dprintf("CurrentDirName: \"%s\"\n", CurrentDirName); + + return search_config(search_directories, filenames); +} diff --git a/contrib/syslinux-4.02/core/fs/lib/mangle.c b/contrib/syslinux-4.02/core/fs/lib/mangle.c new file mode 100644 index 0000000..813099f --- /dev/null +++ b/contrib/syslinux-4.02/core/fs/lib/mangle.c @@ -0,0 +1,47 @@ +/** + * mangle_name: + * + * Mangle a filename pointed to by src into a buffer pointed + * to by dst; ends on encountering any whitespace. + * dst is preserved. + * + * This verifies that a filename is < FILENAME_MAX characters, + * doesn't contain whitespace, zero-pads the output buffer, + * and removes redundant slashes. + * + */ + +#include <string.h> +#include "fs.h" + +void generic_mangle_name(char *dst, const char *src) +{ + char *p = dst; + int i = FILENAME_MAX-1; + + while (not_whitespace(*src)) { + if (*src == '/') { + if (src[1] == '/') { + src++; + i--; + continue; + } + } + i--; + *dst++ = *src++; + } + + while (1) { + if (dst == p) + break; + if (dst[-1] != '/') + break; + + dst--; + i++; + } + + i++; + for (; i > 0; i --) + *dst++ = '\0'; +} diff --git a/contrib/syslinux-4.02/core/fs/lib/searchconfig.c b/contrib/syslinux-4.02/core/fs/lib/searchconfig.c new file mode 100644 index 0000000..24bfde3 --- /dev/null +++ b/contrib/syslinux-4.02/core/fs/lib/searchconfig.c @@ -0,0 +1,40 @@ +#include <dprintf.h> +#include <stdio.h> +#include <string.h> +#include <core.h> +#include <fs.h> + +/* + * Common implementation of load_config + * + * This searches for a specified set of filenames in a specified set + * of directories. If found, set the current working directory to + * match. + */ +int search_config(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)) { + chdir(sd); + return 0; /* Got it */ + } + } + } + + return -1; +} |