wok-next rev 19669
syslinux: kbd 2.0.3 support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Mar 17 19:37:21 2017 +0100 (2017-03-17) |
parents | 5d48570cca72 |
children | 58556ca016f4 |
files | syslinux/receipt syslinux/stuff/extra/fs.u syslinux/stuff/extra/keytab-lilo.u |
line diff
1.1 --- a/syslinux/receipt Fri Mar 17 16:21:35 2017 +0200 1.2 +++ b/syslinux/receipt Fri Mar 17 19:37:21 2017 +0100 1.3 @@ -24,7 +24,7 @@ 1.4 patch -p 0 < $stuff/extra/loadhigh.u 1.5 patch -p 0 < $stuff/extra/iso9660.u 1.6 patch -p 0 < $stuff/extra/readconfig.u 1.7 - #patch -p 0 < $stuff/extra/fs.u 1.8 + patch -p 0 < $stuff/extra/keytab-lilo.u 1.9 cp -f $stuff/slitaz-next/miniacc.h $src/lzo/src/ # use latest https://raw.githubusercontent.com/upx/upx/master/src/miniacc.h 1.10 cp $stuff/tools/isohybrid.sh . 1.11 cp $stuff/extra/md5sum.c com32/modules
2.1 --- a/syslinux/stuff/extra/fs.u Fri Mar 17 16:21:35 2017 +0200 2.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 2.3 @@ -1,347 +0,0 @@ 2.4 ---- core/fs/fs.c 2.5 -+++ core/fs/fs.c 2.6 -@@ -1,10 +1,16 @@ 2.7 -+#include <sys/file.h> 2.8 - #include <stdio.h> 2.9 - #include <stdbool.h> 2.10 - #include <string.h> 2.11 -+#include <unistd.h> 2.12 - #include <dprintf.h> 2.13 -+#include "core.h" 2.14 -+#include "dev.h" 2.15 - #include "fs.h" 2.16 - #include "cache.h" 2.17 - 2.18 -+char *PATH; 2.19 -+ 2.20 - /* The currently mounted filesystem */ 2.21 - struct fs_info *this_fs = NULL; /* Root filesystem */ 2.22 - 2.23 -@@ -76,19 +82,30 @@ 2.24 - } 2.25 - 2.26 - /* 2.27 -- * Convert between a 16-bit file handle and a file structure 2.28 -+ * Find and open the configuration file 2.29 - */ 2.30 -- 2.31 --void pm_load_config(com32sys_t *regs) 2.32 -+int open_config(void) 2.33 - { 2.34 -- int err; 2.35 -+ int fd, handle; 2.36 -+ struct file_info *fp; 2.37 - 2.38 -- err = this_fs->fs_ops->load_config(); 2.39 -+ fd = opendev(&__file_dev, NULL, O_RDONLY); 2.40 -+ if (fd < 0) 2.41 -+ return -1; 2.42 - 2.43 -- if (err) 2.44 -- printf("ERROR: No configuration file found\n"); 2.45 -+ fp = &__file_info[fd]; 2.46 - 2.47 -- set_flags(regs, err ? EFLAGS_ZF : 0); 2.48 -+ handle = this_fs->fs_ops->open_config(&fp->i.fd); 2.49 -+ if (handle < 0) { 2.50 -+ close(fd); 2.51 -+ errno = ENOENT; 2.52 -+ return -1; 2.53 -+ } 2.54 -+ 2.55 -+ fp->i.offset = 0; 2.56 -+ fp->i.nbytes = 0; 2.57 -+ 2.58 -+ return fd; 2.59 - } 2.60 - 2.61 - void pm_mangle_name(com32sys_t *regs) 2.62 -@@ -202,11 +219,10 @@ 2.63 - 2.64 - int searchdir(const char *name) 2.65 - { 2.66 -- struct inode *inode = NULL; 2.67 -- struct inode *parent = NULL; 2.68 -+ static char root_name[] = "/"; 2.69 - struct file *file; 2.70 -- char *pathbuf = NULL; 2.71 -- char *part, *p, echar; 2.72 -+ char *path, *inode_name, *next_inode_name; 2.73 -+ struct inode *tmp, *inode = NULL; 2.74 - int symlink_count = MAX_SYMLINK_CNT; 2.75 - 2.76 - dprintf("searchdir: %s root: %p cwd: %p\n", 2.77 -@@ -228,113 +244,165 @@ 2.78 - 2.79 - /* else, try the generic-path-lookup method */ 2.80 - 2.81 -- parent = get_inode(this_fs->cwd); 2.82 -- p = pathbuf = strdup(name); 2.83 -- if (!pathbuf) 2.84 -- goto err; 2.85 -+ /* Copy the path */ 2.86 -+ path = strdup(name); 2.87 -+ if (!path) { 2.88 -+ dprintf("searchdir: Couldn't copy path\n"); 2.89 -+ goto err_path; 2.90 -+ } 2.91 - 2.92 -- do { 2.93 -- got_link: 2.94 -- if (*p == '/') { 2.95 -- put_inode(parent); 2.96 -- parent = get_inode(this_fs->root); 2.97 -+ /* Work with the current directory, by default */ 2.98 -+ inode = get_inode(this_fs->cwd); 2.99 -+ if (!inode) { 2.100 -+ dprintf("searchdir: Couldn't use current directory\n"); 2.101 -+ goto err_curdir; 2.102 -+ } 2.103 -+ 2.104 -+ for (inode_name = path; inode_name; inode_name = next_inode_name) { 2.105 -+ /* Root directory? */ 2.106 -+ if (inode_name[0] == '/') { 2.107 -+ next_inode_name = inode_name + 1; 2.108 -+ inode_name = root_name; 2.109 -+ } else { 2.110 -+ /* Find the next inode name */ 2.111 -+ next_inode_name = strchr(inode_name + 1, '/'); 2.112 -+ if (next_inode_name) { 2.113 -+ /* Terminate the current inode name and point to next */ 2.114 -+ *next_inode_name++ = '\0'; 2.115 -+ } 2.116 - } 2.117 -+ if (next_inode_name) { 2.118 -+ /* Advance beyond redundant slashes */ 2.119 -+ while (*next_inode_name == '/') 2.120 -+ next_inode_name++; 2.121 - 2.122 -- do { 2.123 -- inode = get_inode(parent); 2.124 -+ /* Check if we're at the end */ 2.125 -+ if (*next_inode_name == '\0') 2.126 -+ next_inode_name = NULL; 2.127 -+ } 2.128 -+ dprintf("searchdir: inode_name: %s\n", inode_name); 2.129 -+ if (next_inode_name) 2.130 -+ dprintf("searchdir: Remaining: %s\n", next_inode_name); 2.131 - 2.132 -- while (*p == '/') 2.133 -- p++; 2.134 -+ /* Root directory? */ 2.135 -+ if (inode_name[0] == '/') { 2.136 -+ /* Release any chain that's already been established */ 2.137 -+ put_inode(inode); 2.138 -+ inode = get_inode(this_fs->root); 2.139 -+ continue; 2.140 -+ } 2.141 - 2.142 -- if (!*p) 2.143 -- break; 2.144 -+ /* Current directory? */ 2.145 -+ if (!strncmp(inode_name, ".", sizeof ".")) 2.146 -+ continue; 2.147 - 2.148 -- part = p; 2.149 -- while ((echar = *p) && echar != '/') 2.150 -- p++; 2.151 -- *p++ = '\0'; 2.152 -+ /* Parent directory? */ 2.153 -+ if (!strncmp(inode_name, "..", sizeof "..")) { 2.154 -+ /* If there is no parent, just ignore it */ 2.155 -+ if (!inode->parent) 2.156 -+ continue; 2.157 - 2.158 -- if (part[0] == '.' && part[1] == '.' && part[2] == '\0') { 2.159 -- if (inode->parent) { 2.160 -- put_inode(parent); 2.161 -- parent = get_inode(inode->parent); 2.162 -- put_inode(inode); 2.163 -- inode = NULL; 2.164 -- if (!echar) { 2.165 -- /* Terminal double dots */ 2.166 -- inode = parent; 2.167 -- parent = inode->parent ? 2.168 -- get_inode(inode->parent) : NULL; 2.169 -- } 2.170 -- } 2.171 -- } else if (part[0] != '.' || part[1] != '\0') { 2.172 -- inode = this_fs->fs_ops->iget(part, parent); 2.173 -- if (!inode) 2.174 -- goto err; 2.175 -- if (inode->mode == DT_LNK) { 2.176 -- char *linkbuf, *q; 2.177 -- int name_len = echar ? strlen(p) : 0; 2.178 -- int total_len = inode->size + name_len + 2; 2.179 -- int link_len; 2.180 -+ /* Add a reference to the parent so we can release the child */ 2.181 -+ tmp = get_inode(inode->parent); 2.182 - 2.183 -- if (!this_fs->fs_ops->readlink || 2.184 -- --symlink_count == 0 || /* limit check */ 2.185 -- total_len > MAX_SYMLINK_BUF) 2.186 -- goto err; 2.187 -+ /* Releasing the child will drop the parent back down to 1 */ 2.188 -+ put_inode(inode); 2.189 - 2.190 -- linkbuf = malloc(total_len); 2.191 -- if (!linkbuf) 2.192 -- goto err; 2.193 -+ inode = tmp; 2.194 -+ continue; 2.195 -+ } 2.196 - 2.197 -- link_len = this_fs->fs_ops->readlink(inode, linkbuf); 2.198 -- if (link_len <= 0) { 2.199 -- free(linkbuf); 2.200 -- goto err; 2.201 -- } 2.202 -+ /* Anything else */ 2.203 -+ tmp = inode; 2.204 -+ inode = this_fs->fs_ops->iget(inode_name, inode); 2.205 -+ if (!inode) { 2.206 -+ /* Failure. Release the chain */ 2.207 -+ put_inode(tmp); 2.208 -+ break; 2.209 -+ } 2.210 - 2.211 -- q = linkbuf + link_len; 2.212 -+ /* Sanity-check */ 2.213 -+ if (inode->parent && inode->parent != tmp) { 2.214 -+ dprintf("searchdir: iget returned a different parent\n"); 2.215 -+ put_inode(inode); 2.216 -+ inode = NULL; 2.217 -+ put_inode(tmp); 2.218 -+ break; 2.219 -+ } 2.220 -+ inode->parent = tmp; 2.221 -+ inode->name = strdup(inode_name); 2.222 -+ dprintf("searchdir: path component: %s\n", inode->name); 2.223 - 2.224 -- if (echar) { 2.225 -- if (link_len > 0 && q[-1] != '/') 2.226 -- *q++ = '/'; 2.227 -+ /* Symlink handling */ 2.228 -+ if (inode->mode == DT_LNK) { 2.229 -+ char *new_path; 2.230 -+ int new_len, copied; 2.231 - 2.232 -- memcpy(q, p, name_len+1); 2.233 -- } else { 2.234 -- *q = '\0'; 2.235 -- } 2.236 -+ /* target path + NUL */ 2.237 -+ new_len = inode->size + 1; 2.238 - 2.239 -- free(pathbuf); 2.240 -- p = pathbuf = linkbuf; 2.241 -- put_inode(inode); 2.242 -- inode = NULL; 2.243 -- goto got_link; 2.244 -- } 2.245 -+ if (next_inode_name) { 2.246 -+ /* target path + slash + remaining + NUL */ 2.247 -+ new_len += strlen(next_inode_name) + 1; 2.248 -+ } 2.249 - 2.250 -- inode->name = strdup(part); 2.251 -- dprintf("path component: %s\n", inode->name); 2.252 -+ if (!this_fs->fs_ops->readlink || 2.253 -+ /* limit checks */ 2.254 -+ --symlink_count == 0 || 2.255 -+ new_len > MAX_SYMLINK_BUF) 2.256 -+ goto err_new_len; 2.257 - 2.258 -- inode->parent = parent; 2.259 -- parent = NULL; 2.260 -+ new_path = malloc(new_len); 2.261 -+ if (!new_path) 2.262 -+ goto err_new_path; 2.263 - 2.264 -- if (!echar) 2.265 -- break; 2.266 -+ copied = this_fs->fs_ops->readlink(inode, new_path); 2.267 -+ if (copied <= 0) 2.268 -+ goto err_copied; 2.269 -+ new_path[copied] = '\0'; 2.270 -+ dprintf("searchdir: Symlink: %s\n", new_path); 2.271 - 2.272 -- if (inode->mode != DT_DIR) 2.273 -- goto err; 2.274 -- 2.275 -- parent = inode; 2.276 -- inode = NULL; 2.277 -+ if (next_inode_name) { 2.278 -+ new_path[copied] = '/'; 2.279 -+ strcpy(new_path + copied + 1, next_inode_name); 2.280 -+ dprintf("searchdir: New path: %s\n", new_path); 2.281 - } 2.282 -- } while (echar); 2.283 -- } while (0); 2.284 - 2.285 -- free(pathbuf); 2.286 -- pathbuf = NULL; 2.287 -- put_inode(parent); 2.288 -- parent = NULL; 2.289 -+ free(path); 2.290 -+ path = next_inode_name = new_path; 2.291 - 2.292 -- if (!inode) 2.293 -+ /* Add a reference to the parent so we can release the child */ 2.294 -+ tmp = get_inode(inode->parent); 2.295 -+ 2.296 -+ /* Releasing the child will drop the parent back down to 1 */ 2.297 -+ put_inode(inode); 2.298 -+ 2.299 -+ inode = tmp; 2.300 -+ continue; 2.301 -+err_copied: 2.302 -+ free(new_path); 2.303 -+err_new_path: 2.304 -+err_new_len: 2.305 -+ put_inode(inode); 2.306 -+ inode = NULL; 2.307 -+ break; 2.308 -+ } 2.309 -+ 2.310 -+ /* If there's more to process, this should be a directory */ 2.311 -+ if (next_inode_name && inode->mode != DT_DIR) { 2.312 -+ dprintf("searchdir: Expected a directory\n"); 2.313 -+ put_inode(inode); 2.314 -+ inode = NULL; 2.315 -+ break; 2.316 -+ } 2.317 -+ } 2.318 -+err_curdir: 2.319 -+ free(path); 2.320 -+err_path: 2.321 -+ if (!inode) { 2.322 -+ dprintf("searchdir: Not found\n"); 2.323 - goto err; 2.324 -+ } 2.325 - 2.326 - file->inode = inode; 2.327 - file->offset = 0; 2.328 -@@ -342,10 +410,6 @@ 2.329 - return file_to_handle(file); 2.330 - 2.331 - err: 2.332 -- put_inode(inode); 2.333 -- put_inode(parent); 2.334 -- if (pathbuf) 2.335 -- free(pathbuf); 2.336 - _close_file(file); 2.337 - err_no_close: 2.338 - return -1; 2.339 -@@ -483,6 +547,11 @@ 2.340 - fs.root = fs.fs_ops->iget_root(&fs); 2.341 - fs.cwd = get_inode(fs.root); 2.342 - dprintf("init: root inode %p, cwd inode %p\n", fs.root, fs.cwd); 2.343 -+ } 2.344 -+ 2.345 -+ if (fs.fs_ops->chdir_start) { 2.346 -+ if (fs.fs_ops->chdir_start() < 0) 2.347 -+ printf("Failed to chdir to start directory\n"); 2.348 - } 2.349 - 2.350 - SectorShift = fs.sector_shift;
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/syslinux/stuff/extra/keytab-lilo.u Fri Mar 17 19:37:21 2017 +0100 3.3 @@ -0,0 +1,14 @@ 3.4 +--- utils/keytab-lilo 3.5 ++++ utils/keytab-lilo 3.6 +@@ -48,9 +48,9 @@ 3.7 + $empty = 1; 3.8 + while (<FILE>) { 3.9 + chop; 3.10 +- if (/^(static\s+)?u_short\s+(\S+)_map\[\S*\]\s+=\s+{\s*$/) { 3.11 ++ if (/^(static\s+)?(u_|unsigned )short\s+(\S+)_map\[\S*\]\s+=\s+{\s*$/) { 3.12 + die "active at beginning of map" if defined $current; 3.13 +- $current = $pfx.":".$2; 3.14 ++ $current = $pfx.":".$3; 3.15 + next; 3.16 + } 3.17 + undef $current if /^};\s*$/;