diff options
50 files changed, 103 insertions, 4651 deletions
diff --git a/com32/Makefile b/com32/Makefile index d2492359..0ded5c41 100644 --- a/com32/Makefile +++ b/com32/Makefile @@ -1,4 +1,4 @@ -SUBDIRS = libupload tools lib gpllib libutil modules mboot menu samples elflink elflink/modules rosh cmenu \ +SUBDIRS = libupload tools lib gpllib libutil modules mboot menu samples elflink rosh cmenu \ hdt gfxboot sysdump lua/src elflink/ldlinux all tidy dist clean spotless install: diff --git a/com32/cmenu/Makefile b/com32/cmenu/Makefile index 446bbcdd..00825b46 100644 --- a/com32/cmenu/Makefile +++ b/com32/cmenu/Makefile @@ -18,11 +18,11 @@ NOGPL := 1 # This must be defined before com32.mk is included -LIBS = libmenu/libmenu.a +LIBS = libmenu/libmenu.c32 topdir = ../.. MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk CFLAGS += -I./libmenu @@ -32,7 +32,7 @@ LIBMENU = libmenu/syslnx.o libmenu/com32io.o libmenu/tui.o \ CMENUS = $(patsubst %.c,%.c32,$(wildcard *.c)) IMENUS = $(patsubst %.menu,%.c32,$(wildcard *.menu)) -MENUS = $(CMENUS) $(IMENUS) +MENUS = $(CMENUS) $(IMENUS) $(LIBS) .SUFFIXES: .S .c .o .elf .c32 .menu @@ -42,16 +42,14 @@ MENUS = $(CMENUS) $(IMENUS) all: menus -libmenu/libmenu.a: $(LIBMENU) - -rm -f $@ - $(AR) cq $@ $^ - $(RANLIB) $@ +libmenu/libmenu.c32: $(LIBMENU) + $(LD) -shared $(LDFLAGS) -o $@ $^ tidy dist: - rm -f *.o *.lo *.a *.lst *.elf .*.d */.*.d + rm -f *.o *.lo *.c32 *.lst *.elf .*.d */.*.d libclean: - rm -f libmenu/*.o libmenu/*.a + rm -f libmenu/*.o libmenu/*.c32 clean: tidy menuclean libclean rm -f *.lss *.c32 *.com diff --git a/com32/elflink/ldlinux/Makefile b/com32/elflink/ldlinux/Makefile index 09aa4af4..8fe4d71d 100644 --- a/com32/elflink/ldlinux/Makefile +++ b/com32/elflink/ldlinux/Makefile @@ -14,7 +14,7 @@ topdir = ../../.. MAKEDIR = $(topdir)/mk include $(MAKEDIR)/elf.mk -CFLAGS += -I../modules -I$(topdir)/core/elflink -I$(topdir)/core/include +CFLAGS += -I$(topdir)/core/elflink -I$(topdir)/core/include all: ldlinux.c32 diff --git a/com32/elflink/modules/Makefile b/com32/elflink/modules/Makefile deleted file mode 100644 index 8a274aef..00000000 --- a/com32/elflink/modules/Makefile +++ /dev/null @@ -1,103 +0,0 @@ -## ----------------------------------------------------------------------- -## -## Copyright 2001-2008 H. Peter Anvin - All Rights Reserved -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation, Inc., 53 Temple Place Ste 330, -## Boston MA 02111-1307, USA; either version 2 of the License, or -## (at your option) any later version; incorporated herein by reference. -## -## ----------------------------------------------------------------------- - -topdir = ../../.. -MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/elf.mk - -CFLAGS += -I$(topdir)/core/elflink - -MODULES = hello.c32 sort.c32 mytest.c32 menumain.c32 printmsg.c32 background.c32 passwd.c32 sha1hash.c32 \ - unbase64.c32 sha512crypt.c32 md5.c32 crypt-md5.c32 sha256crypt.c32 get_key.c32 ansiraw.c32 test.c32 \ - meminfo.c32 menu.c32 drain.c32 vesainfo.c32 - -TESTFILES = - -all: $(MODULES) $(TESTFILES) - -test.c32 : test.o - $(LD) $(LDFLAGS) -o $@ $^ - -menu.c32 : menu.o - $(LD) $(LDFLAGS) -o $@ $^ - -hello.c32 : hello.o - $(LD) $(LDFLAGS) -o $@ $^ - -sort.c32 : sort.o - $(LD) $(LDFLAGS) -o $@ $^ - -mytest.c32 : mytest.o - $(LD) $(LDFLAGS) -o $@ $^ - -menumain.c32 : menumain.o - $(LD) $(LDFLAGS) -o $@ $^ - -printmsg.c32 : printmsg.o - $(LD) $(LDFLAGS) -o $@ $^ - -background.c32 : background.o - $(LD) $(LDFLAGS) -o $@ $^ - -drain.c32 : drain.o - $(LD) $(LDFLAGS) -o $@ $^ - -passwd.c32 : passwd.o - $(LD) $(LDFLAGS) -o $@ $^ - -sha1hash.c32 : sha1hash.o - $(LD) $(LDFLAGS) -o $@ $^ - -unbase64.c32 : unbase64.o - $(LD) $(LDFLAGS) -o $@ $^ - -sha512crypt.c32 : sha512crypt.o - $(LD) $(LDFLAGS) -o $@ $^ - -sha256crypt.c32 : sha256crypt.o - $(LD) $(LDFLAGS) -o $@ $^ - -md5.c32 : md5.o - $(LD) $(LDFLAGS) -o $@ $^ - -crypt-md5.c32 : crypt-md5.o - $(LD) $(LDFLAGS) -o $@ $^ - -get_key.c32 : get_key.o - $(LD) $(LDFLAGS) -o $@ $^ - -ansiraw.c32 : ansiraw.o - $(LD) $(LDFLAGS) -o $@ $^ - -meminfo.c32 : meminfo.o - $(LD) $(LDFLAGS) -o $@ $^ - -pcitest.c32 : pcitest.o - $(LD) $(LDFLAGS) -o $@ $^ - -vesainfo.c32 : vesainfo.o - $(LD) $(LDFLAGS) -o $@ $^ - -tidy dist: - rm -f *.o *.lo *.a *.lst .*.d - -clean: tidy - rm -f *.lss *.lnx *.com *.c32 - -spotless: clean - rm -f *~ \#* - -install: all - mkdir -m 755 -p $(INSTALLROOT)$(AUXDIR) - install -m 644 $(MODULES) $(INSTALLROOT)$(AUXDIR) - --include .*.d diff --git a/com32/elflink/modules/README b/com32/elflink/modules/README deleted file mode 100644 index 090313a7..00000000 --- a/com32/elflink/modules/README +++ /dev/null @@ -1 +0,0 @@ -This folder contains dynamically loadable ELF modules for SYSLINUX.
\ No newline at end of file diff --git a/com32/elflink/modules/ansiraw.c b/com32/elflink/modules/ansiraw.c deleted file mode 100644 index aca90ce6..00000000 --- a/com32/elflink/modules/ansiraw.c +++ /dev/null @@ -1,115 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2004-2008 H. Peter Anvin - All Rights Reserved - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall - * be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * ----------------------------------------------------------------------- */ - -/* - * ansiraw.c - * - * Configures the console for ANSI output in raw mode; versions - * for COM32 and Linux support. - */ - -#ifdef __COM32__ - -#include <stdio.h> -#include <unistd.h> -#include <console.h> -#include <sys/module.h> - -static int ansiraw_init(void) -{ - return 0; // Nothing to do; return success -} - -void console_ansi_raw(void) -{ - openconsole(&dev_rawcon_r, &dev_ansiserial_w); -} - -static void ansiraw_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(ansiraw_init); -MODULE_EXIT(ansiraw_exit); - -#else - -#include <stdio.h> -#include <termios.h> -#include <sys/module.h> - -static int ansiraw_init(void) -{ - return 0; // Nothing to do; return success -} - -static struct termios original_termios_settings; - -static void __attribute__ ((constructor)) console_init(void) -{ - tcgetattr(0, &original_termios_settings); -} - -static void __attribute__ ((destructor)) console_cleanup(void) -{ - tcsetattr(0, TCSANOW, &original_termios_settings); -} - -void console_ansi_raw(void) -{ - struct termios tio; - - /* Disable stdio buffering */ - setbuf(stdin, NULL); - setbuf(stdout, NULL); - setbuf(stderr, NULL); - - /* Set the termios flag so we behave the same as libcom32 */ - tcgetattr(0, &tio); - tio.c_iflag &= ~ICRNL; - tio.c_iflag |= IGNCR; - tio.c_lflag &= ~(ISIG | ICANON | ECHO); - if (!tio.c_oflag & OPOST) - tio.c_oflag = 0; - tio.c_oflag |= OPOST | ONLCR; - tio.c_cc[VMIN] = 0; - tio.c_cc[VTIME] = 1; /* Don't 100% busy-wait in Linux */ - tcsetattr(0, TCSAFLUSH, &tio); -} - -static void ansiraw_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(ansiraw_init); -MODULE_EXIT(ansiraw_exit); - -#endif diff --git a/com32/elflink/modules/background.c b/com32/elflink/modules/background.c deleted file mode 100644 index 467f6fd9..00000000 --- a/com32/elflink/modules/background.c +++ /dev/null @@ -1,57 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2008 H. Peter Anvin - All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston MA 02110-1301, USA; either version 2 of the License, or - * (at your option) any later version; incorporated herein by reference. - * - * ----------------------------------------------------------------------- */ - -#include <consoles.h> -#include <string.h> -#include <core-elf.h> -#include <syslinux/vesacon.h> -#include <sys/module.h> -#include "menu.h" - -static int background_init(void) -{ - return 0; // Nothing to do; return success -} - -const char *current_background = NULL; - -int draw_background(const char *what) -{ -#if 0 - if (!what) - return vesacon_default_background(); - else if (what[0] == '#') - return vesacon_set_background(parse_argb((char **)&what)); - else - return vesacon_load_background(what); -#endif - - return 0; -} - -void set_background(const char *new_background) -{ - if (!current_background || !new_background || - strcmp(current_background, new_background)) { - draw_background(new_background); - current_background = new_background; - } -} - -static void background_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(background_init); -MODULE_EXIT(background_exit); diff --git a/com32/elflink/modules/base64.h b/com32/elflink/modules/base64.h deleted file mode 100644 index b71855b8..00000000 --- a/com32/elflink/modules/base64.h +++ /dev/null @@ -1,51 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2005-2008 H. Peter Anvin - All Rights Reserved - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall - * be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * ----------------------------------------------------------------------- */ - -/* - * base64.h - * - * Simple routines for handing base64 text - */ - -#ifndef LIBUTIL_BASE64_H -#define LIBUTIL_BASE64_H - -#include <stddef.h> - -#define BASE64_PAD 0x10000 - -/* There is plenty of disagreement w.r.t. the last few characters... */ -#define BASE64_MIME ('+' + ('/' << 8)) -#define BASE64_SAFE ('-' + ('_' << 8)) -#define BASE64_CRYPT ('.' + ('/' << 8)) -#define BASE64_URL ('*' + ('-' << 8)) /* Haven't seen myself */ -#define BASE64_REGEX ('|' + ('-' << 8)) /* Ditto... */ - -size_t genbase64(char *output, const void *digest, size_t size, int flags); -size_t unbase64(unsigned char *, size_t, const char *); - -#endif diff --git a/com32/elflink/modules/crypt-md5.c b/com32/elflink/modules/crypt-md5.c deleted file mode 100644 index 08e36391..00000000 --- a/com32/elflink/modules/crypt-md5.c +++ /dev/null @@ -1,173 +0,0 @@ -/*- - * Copyright (c) 2003 Poul-Henning Kamp - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <inttypes.h> -#include <md5.h> -#include <string.h> -#include <sys/module.h> - -static int crypt_md5_init(void) -{ - return 0; // Nothing to do; return success -} - -/* - * UNIX password - */ - -static char *_crypt_to64(char *s, uint32_t v, int n) -{ - static const char itoa64[64] = "./0123456789" - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - - while (--n >= 0) { - *s++ = itoa64[v & 0x3f]; - v >>= 6; - } - return s; -} - -char *crypt_md5(const char *pw, const char *salt) -{ - MD5_CTX ctx, ctx1; - unsigned long l; - int sl, pl; - uint32_t i; - uint8_t final[MD5_SIZE]; - const char *sp; - static char passwd[120]; /* Output buffer */ - static const char magic[] = "$1$"; - char *p; - const int magic_len = sizeof magic - 1; - int pwlen = strlen(pw); - - /* Refine the Salt first */ - sp = salt; - - /* If it starts with the magic string, then skip that */ - if (!strncmp(sp, magic, magic_len)) - sp += magic_len; - - /* Compute the salt length: - it stops at the first '$', max 8 chars */ - for (sl = 0; sl < 8 && sp[sl] && sp[sl] != '$'; sl++) ; - - MD5Init(&ctx); - - /* The password first, since that is what is most unknown */ - MD5Update(&ctx, pw, pwlen); - - /* Then our magic string */ - MD5Update(&ctx, magic, magic_len); - - /* Then the raw salt */ - MD5Update(&ctx, sp, sl); - - /* Then just as many characters of the MD5(pw,salt,pw) */ - MD5Init(&ctx1); - MD5Update(&ctx1, pw, pwlen); - MD5Update(&ctx1, sp, sl); - MD5Update(&ctx1, pw, pwlen); - MD5Final(final, &ctx1); - for (pl = pwlen; pl > 0; pl -= MD5_SIZE) - MD5Update(&ctx, final, pl > MD5_SIZE ? MD5_SIZE : pl); - - /* Don't leave anything around in vm they could use. */ - memset(final, 0, sizeof final); - - /* Then something really weird... */ - for (i = pwlen; i; i >>= 1) - if (i & 1) - MD5Update(&ctx, final, 1); - else - MD5Update(&ctx, pw, 1); - - /* Now make the output string */ - p = passwd; - - memcpy(p, magic, magic_len); - p += magic_len; - - memcpy(p, sp, sl); - p += sl; - - *p++ = '$'; - - MD5Final(final, &ctx); - - /* - * and now, just to make sure things don't run too fast - * On a 60 Mhz Pentium this takes 34 msec, so you would - * need 30 seconds to build a 1000 entry dictionary... - */ - for (i = 0; i < 1000; i++) { - MD5Init(&ctx1); - if (i & 1) - MD5Update(&ctx1, pw, pwlen); - else - MD5Update(&ctx1, final, MD5_SIZE); - - if (i % 3) - MD5Update(&ctx1, sp, sl); - - if (i % 7) - MD5Update(&ctx1, pw, pwlen); - - if (i & 1) - MD5Update(&ctx1, final, MD5_SIZE); - else - MD5Update(&ctx1, pw, pwlen); - MD5Final(final, &ctx1); - } - - l = (final[0] << 16) | (final[6] << 8) | final[12]; - p = _crypt_to64(p, l, 4); - l = (final[1] << 16) | (final[7] << 8) | final[13]; - p = _crypt_to64(p, l, 4); - l = (final[2] << 16) | (final[8] << 8) | final[14]; - p = _crypt_to64(p, l, 4); - l = (final[3] << 16) | (final[9] << 8) | final[15]; - p = _crypt_to64(p, l, 4); - l = (final[4] << 16) | (final[10] << 8) | final[5]; - p = _crypt_to64(p, l, 4); - l = final[11]; - p = _crypt_to64(p, l, 2); - *p = '\0'; - - /* Don't leave anything around in vm they could use. */ - memset(final, 0, sizeof final); - - return passwd; -} - -static void crypt_md5_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(crypt_md5_init); -MODULE_EXIT(crypt_md5_exit); diff --git a/com32/elflink/modules/drain.c b/com32/elflink/modules/drain.c deleted file mode 100644 index 032003c9..00000000 --- a/com32/elflink/modules/drain.c +++ /dev/null @@ -1,40 +0,0 @@ -#include <stdio.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <sys/cpu.h> -#include <sys/module.h> - -static int drain_init(void) -{ - return 0; // Nothing to do; return success -} - -void drain_keyboard(void) -{ - /* Prevent "ghost typing" and keyboard buffer snooping */ - volatile char junk; - int rv; - - do { - rv = read(0, (char *)&junk, 1); - } while (rv > 0); - - junk = 0; - - cli(); - *(volatile uint8_t *)0x419 = 0; /* Alt-XXX keyboard area */ - *(volatile uint16_t *)0x41a = 0x1e; /* Keyboard buffer empty */ - *(volatile uint16_t *)0x41c = 0x1e; - memset((void *)0x41e, 0, 32); /* Clear the actual keyboard buffer */ - sti(); -} - -static void drain_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(drain_init); -MODULE_EXIT(drain_exit); diff --git a/com32/elflink/modules/get_key.c b/com32/elflink/modules/get_key.c deleted file mode 100644 index 5749b054..00000000 --- a/com32/elflink/modules/get_key.c +++ /dev/null @@ -1,187 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2004-2008 H. Peter Anvin - All Rights Reserved - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall - * be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * ----------------------------------------------------------------------- */ - -/* - * get_key.c - * - * Get a single key, and try to pick apart function key codes. - * This doesn't decode anywhere close to all possiblities, but - * hopefully is enough to be useful. - */ - -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> -#include <time.h> -#include <sys/times.h> -#include <getkey.h> -#include <libutil.h> -#include <sys/module.h> - -static int getkey_init(void) -{ - return 0; // Nothing to do; return success -} - -struct keycode { - int code; - int seqlen; - const unsigned char *seq; -}; - -#define MAXLEN 8 -#define CODE(x,y) { x, (sizeof y)-1, y } - -static const struct keycode keycodes[] = { - /* First, the BIOS combined codes */ - CODE(KEY_F1, "\0\x3B"), - CODE(KEY_F2, "\0\x3C"), - CODE(KEY_F3, "\0\x3D"), - CODE(KEY_F4, "\0\x3E"), - CODE(KEY_F5, "\0\x3F"), - CODE(KEY_F6, "\0\x40"), - CODE(KEY_F7, "\0\x41"), - CODE(KEY_F8, "\0\x42"), - CODE(KEY_F9, "\0\x43"), - CODE(KEY_F10, "\0\x44"), - CODE(KEY_F11, "\0\x85"), - CODE(KEY_F12, "\0\x86"), - - CODE(KEY_UP, "\0\x48"), - CODE(KEY_DOWN, "\0\x50"), - CODE(KEY_LEFT, "\0\x4B"), - CODE(KEY_RIGHT, "\0\x4D"), - CODE(KEY_PGUP, "\0\x49"), - CODE(KEY_PGDN, "\0\x51"), - CODE(KEY_HOME, "\0\x47"), - CODE(KEY_END, "\0\x4F"), - CODE(KEY_INSERT, "\0\x52"), - CODE(KEY_DELETE, "\0\x53"), - - /* Now, VT/xterm/Linux codes */ - CODE(KEY_F1, "\033[[A"), - CODE(KEY_F1, "\033OP"), - CODE(KEY_F2, "\033[[B"), - CODE(KEY_F2, "\033OQ"), - CODE(KEY_F3, "\033[[C"), - CODE(KEY_F3, "\033OR"), - CODE(KEY_F4, "\033[[D"), - CODE(KEY_F4, "\033OS"), - CODE(KEY_F5, "\033[[E"), - CODE(KEY_F5, "\033[15~"), - CODE(KEY_F6, "\033[17~"), - CODE(KEY_F7, "\033[18~"), - CODE(KEY_F8, "\033[19~"), - CODE(KEY_F9, "\033[20~"), - CODE(KEY_F10, "\033[21~"), - CODE(KEY_F11, "\033[23~"), - CODE(KEY_F12, "\033[24~"), - - CODE(KEY_UP, "\033[A"), - CODE(KEY_DOWN, "\033[B"), - CODE(KEY_LEFT, "\033[D"), - CODE(KEY_RIGHT, "\033[C"), - CODE(KEY_PGUP, "\033[5~"), - CODE(KEY_PGUP, "\033[V"), - CODE(KEY_PGDN, "\033[6~"), - CODE(KEY_PGDN, "\033[U"), - CODE(KEY_HOME, "\033[1~"), - CODE(KEY_HOME, "\033[H"), - CODE(KEY_END, "\033[4~"), - CODE(KEY_END, "\033[F"), - CODE(KEY_END, "\033OF"), - CODE(KEY_INSERT, "\033[2~"), - CODE(KEY_INSERT, "\033[@"), - CODE(KEY_DELETE, "\033[3~"), -}; - -#define NCODES ((int)(sizeof keycodes/sizeof(struct keycode))) - -#define KEY_TIMEOUT ((CLK_TCK+9)/10) - -int get_key(FILE * f, clock_t timeout) -{ - unsigned char buffer[MAXLEN]; - int nc, i, rv; - const struct keycode *kc; - int another; - unsigned char ch; - clock_t start; - - /* We typically start in the middle of a clock tick */ - if (timeout) - timeout++; - - nc = 0; - start = times(NULL); - do { - rv = read(fileno(f), &ch, 1); - if (rv == 0 || (rv == -1 && errno == EAGAIN)) { - clock_t lateness = times(NULL) - start; - if (nc && lateness > 1 + KEY_TIMEOUT) { - if (nc == 1) - return buffer[0]; /* timeout in sequence */ - else if (timeout && lateness > timeout) - return KEY_NONE; - } else if (!nc && timeout && lateness > timeout) - return KEY_NONE; /* timeout before sequence */ - - do_idle(); - - another = 1; - continue; - } - - start = times(NULL); - - buffer[nc++] = ch; - - another = 0; - for (i = 0, kc = keycodes; i < NCODES; i++, kc++) { - if (nc == kc->seqlen && !memcmp(buffer, kc->seq, nc)) - return kc->code; - else if (nc < kc->seqlen && !memcmp(buffer, kc->seq, nc)) { - another = 1; - break; - } - } - } while (another); - - /* We got an unrecognized sequence; return the first character */ - /* We really should remember this and return subsequent characters later */ - return buffer[0]; -} - -static void getkey_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(getkey_init); -MODULE_EXIT(getkey_exit); diff --git a/com32/elflink/modules/md5.c b/com32/elflink/modules/md5.c deleted file mode 100644 index c39bd9b7..00000000 --- a/com32/elflink/modules/md5.c +++ /dev/null @@ -1,288 +0,0 @@ -/* - * MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm - * - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All - * rights reserved. - * - * License to copy and use this software is granted provided that it - * is identified as the "RSA Data Security, Inc. MD5 Message-Digest - * Algorithm" in all material mentioning or referencing this software - * or this function. - * - * License is also granted to make and use derivative works provided - * that such works are identified as "derived from the RSA Data - * Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either - * the merchantability of this software or the suitability of this - * software for any particular purpose. It is provided "as is" - * without express or implied warranty of any kind. - * - * These notices must be retained in any copies of any part of this - * documentation and/or software. - * - * This code is the same as the code published by RSA Inc. It has been - * edited for clarity and style only. - */ - -#include <string.h> -#include <endian.h> -#include <md5.h> -#include <sys/module.h> - -static int md5_init(void) -{ - return 0; // Nothing to do; return success -} - -static void MD5Transform(uint32_t[4], const unsigned char[64]); - -#define Encode memcpy -#define Decode memcpy - -static unsigned char PADDING[64] = { - 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -/* F, G, H and I are basic MD5 functions. */ -#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) -#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) -#define H(x, y, z) ((x) ^ (y) ^ (z)) -#define I(x, y, z) ((y) ^ ((x) | (~z))) - -/* ROTATE_LEFT rotates x left n bits. */ -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) - -/* - * FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. - * Rotation is separate from addition to prevent recomputation. - */ -#define FF(a, b, c, d, x, s, ac) { \ - (a) += F ((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } -#define GG(a, b, c, d, x, s, ac) { \ - (a) += G ((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } -#define HH(a, b, c, d, x, s, ac) { \ - (a) += H ((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } -#define II(a, b, c, d, x, s, ac) { \ - (a) += I ((b), (c), (d)) + (x) + (uint32_t)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - } - -/* MD5 initialization. Begins an MD5 operation, writing a new context. */ - -void MD5Init(MD5_CTX * context) -{ - context->count[0] = context->count[1] = 0; - - /* Load magic initialization constants. */ - context->state[0] = 0x67452301; - context->state[1] = 0xefcdab89; - context->state[2] = 0x98badcfe; - context->state[3] = 0x10325476; -} - -/* - * MD5 block update operation. Continues an MD5 message-digest - * operation, processing another message block, and updating the - * context. - */ - -void MD5Update(MD5_CTX * context, const void *in, size_t inputLen) -{ - unsigned int i, idx, partLen; - const unsigned char *input = in; - - /* Compute number of bytes mod 64 */ - idx = (unsigned int)((context->count[0] >> 3) & 0x3F); - - /* Update number of bits */ - if ((context->count[0] += ((uint32_t) inputLen << 3)) - < ((uint32_t) inputLen << 3)) - context->count[1]++; - context->count[1] += ((uint32_t) inputLen >> 29); - - partLen = 64 - idx; - - /* Transform as many times as possible. */ - if (inputLen >= partLen) { - memcpy((void *)&context->buffer[idx], (const void *)input, partLen); - MD5Transform(context->state, context->buffer); - - for (i = partLen; i + 63 < inputLen; i += 64) - MD5Transform(context->state, &input[i]); - - idx = 0; - } else - i = 0; - - /* Buffer remaining input */ - memcpy((void *)&context->buffer[idx], (const void *)&input[i], - inputLen - i); -} - -/* - * MD5 padding. Adds padding followed by original length. - */ - -static void MD5Pad(MD5_CTX * context) -{ - unsigned char bits[8]; - unsigned int idx, padLen; - - /* Save number of bits */ - Encode(bits, context->count, 8); - - /* Pad out to 56 mod 64. */ - idx = (unsigned int)((context->count[0] >> 3) & 0x3f); - padLen = (idx < 56) ? (56 - idx) : (120 - idx); - MD5Update(context, PADDING, padLen); - - /* Append length (before padding) */ - MD5Update(context, bits, 8); -} - -/* - * MD5 finalization. Ends an MD5 message-digest operation, writing the - * the message digest and zeroizing the context. - */ - -void MD5Final(unsigned char digest[16], MD5_CTX * context) -{ - /* Do padding. */ - MD5Pad(context); - - /* Store state in digest */ - Encode(digest, context->state, 16); - - /* Zeroize sensitive information. */ - memset((void *)context, 0, sizeof(*context)); -} - -/* MD5 basic transformation. Transforms state based on block. */ - -static void MD5Transform(state, block) -uint32_t state[4]; -const unsigned char block[64]; -{ - uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16]; - - Decode(x, block, 64); - - /* Round 1 */ -#define S11 7 -#define S12 12 -#define S13 17 -#define S14 22 - FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */ - FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */ - FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */ - FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */ - FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */ - FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */ - FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */ - FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */ - FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */ - FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */ - FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ - FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ - FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ - FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ - FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ - FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ - - /* Round 2 */ -#define S21 5 -#define S22 9 -#define S23 14 -#define S24 20 - GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */ - GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */ - GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ - GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */ - GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */ - GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ - GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ - GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */ - GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */ - GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ - GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */ - GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */ - GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ - GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */ - GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */ - GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ - - /* Round 3 */ -#define S31 4 -#define S32 11 -#define S33 16 -#define S34 23 - HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */ - HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */ - HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ - HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ - HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */ - HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */ - HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */ - HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ - HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ - HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */ - HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */ - HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */ - HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */ - HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ - HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ - HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */ - - /* Round 4 */ -#define S41 6 -#define S42 10 -#define S43 15 -#define S44 21 - II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */ - II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */ - II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ - II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */ - II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ - II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */ - II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ - II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */ - II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */ - II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ - II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */ - II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ - II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */ - II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ - II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */ - II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */ - - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - - /* Zeroize sensitive information. */ - memset((void *)x, 0, sizeof(x)); -} - -static void md5_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(md5_init); -MODULE_EXIT(md5_exit); diff --git a/com32/elflink/modules/md5.h b/com32/elflink/modules/md5.h deleted file mode 100644 index db38c66d..00000000 --- a/com32/elflink/modules/md5.h +++ /dev/null @@ -1,46 +0,0 @@ -/* MD5.H - header file for MD5C.C - */ - -/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All -rights reserved. - -License to copy and use this software is granted provided that it -is identified as the "RSA Data Security, Inc. MD5 Message-Digest -Algorithm" in all material mentioning or referencing this software -or this function. - -License is also granted to make and use derivative works provided -that such works are identified as "derived from the RSA Data -Security, Inc. MD5 Message-Digest Algorithm" in all material -mentioning or referencing the derived work. - -RSA Data Security, Inc. makes no representations concerning either -the merchantability of this software or the suitability of this -software for any particular purpose. It is provided "as is" -without express or implied warranty of any kind. -These notices must be retained in any copies of any part of this -documentation and/or software. - */ - -#ifndef _LIBUTIL_MD5_H -#define _LIBUTIL_MD5_H - -#include <stddef.h> -#include <stdint.h> - -#define MD5_SIZE 16 /* 128 bits */ - -/* MD5 context. */ -typedef struct { - uint32_t state[4]; /* state (ABCD) */ - uint32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */ - unsigned char buffer[64]; /* input buffer */ -} MD5_CTX; - -void MD5Init(MD5_CTX *); -void MD5Update(MD5_CTX *, const void *, size_t); -void MD5Final(unsigned char[MD5_SIZE], MD5_CTX *); - -char *crypt_md5(const char *, const char *); - -#endif diff --git a/com32/elflink/modules/meminfo.c b/com32/elflink/modules/meminfo.c deleted file mode 100644 index 00d0e14d..00000000 --- a/com32/elflink/modules/meminfo.c +++ /dev/null @@ -1,130 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2008 H. Peter Anvin - All Rights Reserved - * Copyright 2009 Intel Corporation; author: H. Peter Anvin - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston MA 02110-1301, USA; either version 2 of the License, or - * (at your option) any later version; incorporated herein by reference. - * - * ----------------------------------------------------------------------- */ - -/* - * meminfo.c - * - * Dump the memory map of the system - */ -#include <inttypes.h> -#include <stdio.h> -#include <string.h> -#include <console.h> -#include <com32.h> - -struct e820_data { - uint64_t base; - uint64_t len; - uint32_t type; - uint32_t extattr; -} __attribute__ ((packed)); - -static const char *const e820_types[] = { - "usable", - "reserved", - "ACPI reclaim", - "ACPI NVS", - "unusable", -}; - -static void dump_e820(void) -{ - com32sys_t ireg, oreg; - struct e820_data ed; - uint32_t type; - void *low_ed; - - low_ed = lmalloc(sizeof ed); - if (!low_ed) - return; - - memset(&ireg, 0, sizeof ireg); - - ireg.eax.w[0] = 0xe820; - ireg.edx.l = 0x534d4150; - ireg.ecx.l = sizeof(struct e820_data); - ireg.edi.w[0] = OFFS(low_ed); - ireg.es = SEG(low_ed); - - memset(&ed, 0, sizeof ed); - ed.extattr = 1; - - do { - memcpy(low_ed, &ed, sizeof ed); - - __intcall(0x15, &ireg, &oreg); - if (oreg.eflags.l & EFLAGS_CF || - oreg.eax.l != 0x534d4150 || oreg.ecx.l < 20) - break; - - memcpy(&ed, low_ed, sizeof ed); - - if (oreg.ecx.l >= 24) { - /* ebx base length end type */ - printf("%8x %016llx %016llx %016llx %d [%x]", - ireg.ebx.l, ed.base, ed.len, ed.base + ed.len, ed.type, - ed.extattr); - } else { - /* ebx base length end */ - printf("%8x %016llx %016llx %016llx %d [-]", - ireg.ebx.l, ed.base, ed.len, ed.base + ed.len, ed.type); - ed.extattr = 1; - } - - type = ed.type - 1; - if (type < sizeof(e820_types) / sizeof(e820_types[0])) - printf(" %s", e820_types[type]); - - putchar('\n'); - - ireg.ebx.l = oreg.ebx.l; - } while (ireg.ebx.l); - - free(low_ed); -} - -static void dump_legacy(void) -{ - com32sys_t ireg, oreg; - uint16_t dosram = *(uint16_t *) 0x413; - struct { - uint16_t offs, seg; - } *const ivt = (void *)0; - - memset(&ireg, 0, sizeof ireg); - - __intcall(0x12, &ireg, &oreg); - - printf - ("INT 15h = %04x:%04x DOS RAM: %dK (0x%05x) INT 12h: %dK (0x%05x)\n", - ivt[0x15].seg, ivt[0x15].offs, dosram, dosram << 10, oreg.eax.w[0], - oreg.eax.w[0] << 10); - - ireg.eax.b[1] = 0x88; - __intcall(0x15, &ireg, &oreg); - - printf("INT 15 88: 0x%04x (%uK) ", oreg.eax.w[0], oreg.eax.w[0]); - - ireg.eax.w[0] = 0xe801; - __intcall(0x15, &ireg, &oreg); - - printf("INT 15 E801: 0x%04x (%uK) 0x%04x (%uK)\n", - oreg.ecx.w[0], oreg.ecx.w[0], oreg.edx.w[0], oreg.edx.w[0] << 6); -} - -int main(int argc, char **argv) -{ - dump_legacy(); - dump_e820(); - return 0; -} diff --git a/com32/elflink/modules/menu.c b/com32/elflink/modules/menu.c deleted file mode 100644 index d0134b39..00000000 --- a/com32/elflink/modules/menu.c +++ /dev/null @@ -1,18 +0,0 @@ -/* - * menu.c -- simple program to test menu_main() - */ - -#include <stdio.h> -#include <stdlib.h> -#include <core-elf.h> - -#include "menu.h" - -/* - * useage: menu.c32 [config file] - */ -int menu(int argc, char **argv) -{ - menu_main(argc, argv); - return 0; -} diff --git a/com32/elflink/modules/menu.h b/com32/elflink/modules/menu.h deleted file mode 100644 index e79fb3e0..00000000 --- a/com32/elflink/modules/menu.h +++ /dev/null @@ -1,218 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2004-2008 H. Peter Anvin - All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston MA 02110-1301, USA; either version 2 of the License, or - * (at your option) any later version; incorporated herein by reference. - * - * ----------------------------------------------------------------------- */ - -/* - * menu.h - * - * Header file for the simple menu system - */ - -#ifndef MENU_H -#define MENU_H - -#include <time.h> -#include <sys/time.h> -#include <sys/times.h> -#include <inttypes.h> -#include <unistd.h> -#include <colortbl.h> -#include <stdbool.h> -#include <setjmp.h> -#include "refstr.h" - -#ifndef CLK_TCK -# define CLK_TCK sysconf(_SC_CLK_TCK) -#endif - -struct menu; - -/* Note: the _UNRES variants must always be immediately after their - "normal" versions. */ -enum menu_action { - MA_NONE, /* Undefined value */ - MA_CMD, /* Execute a command */ - MA_DISABLED, /* Disabled menu entry */ - MA_SUBMENU, /* This is a submenu entry */ - MA_GOTO, /* Go to another menu */ - MA_GOTO_UNRES, /* Unresolved go to */ - MA_QUIT, /* Quit to CLI */ - MA_EXIT, /* Exit to higher-level menu */ - MA_EXIT_UNRES, /* Unresolved exit */ -}; - -struct menu_entry { - struct menu *menu; /* Parent menu */ - const char *displayname; - const char *label; - const char *passwd; - char *helptext; - const char *cmdline; - struct menu *submenu; - struct menu_entry *next; /* Linked list of all labels across menus */ - int entry; /* Entry number inside menu */ - enum menu_action action; - unsigned char hotkey; - bool save; /* Save this entry if selected */ -}; - -static inline bool is_disabled(struct menu_entry *me) -{ - return me->action == MA_DISABLED; -} - -extern const char *const kernel_types[]; - -/* Configurable integer parameters */ -enum parameter_number { - P_WIDTH, - P_MARGIN, - P_PASSWD_MARGIN, - P_MENU_ROWS, - P_TABMSG_ROW, - P_CMDLINE_ROW, - P_END_ROW, - P_PASSWD_ROW, - P_TIMEOUT_ROW, - P_HELPMSG_ROW, - P_HELPMSGEND_ROW, - P_HSHIFT, - P_VSHIFT, - P_HIDDEN_ROW, - - NPARAMS -}; - -/* Configurable messages */ -enum message_number { - MSG_TITLE, - MSG_AUTOBOOT, - MSG_TAB, - MSG_NOTAB, - MSG_PASSPROMPT, - - MSG_COUNT -}; - -struct messages { - const char *name; /* Message configuration name */ - const char *defmsg; /* Default message text */ -}; - -struct menu_parameter { - const char *name; - int value; -}; - -extern const struct menu_parameter mparm[NPARAMS]; - -struct fkey_help { - const char *textname; - const char *background; -}; - -struct menu { - struct menu *next; /* Linked list of all menus */ - const char *label; /* Goto label for this menu */ - struct menu *parent; - struct menu_entry *parent_entry; /* Entry for self in parent */ - - struct menu_entry **menu_entries; - struct menu_entry *menu_hotkeys[256]; - - const char *messages[MSG_COUNT]; - int mparm[NPARAMS]; - - int nentries; - int nentries_space; - int defentry; - int timeout; - - bool allowedit; - bool save; /* MENU SAVE default for this menu */ - - int curentry; - int curtop; - - const char *title; - const char *ontimeout; - const char *onerror; - const char *menu_master_passwd; - const char *menu_background; - - struct color_table *color_table; - - struct fkey_help fkeyhelp[12]; -}; - -extern struct menu *root_menu, *start_menu, *hide_menu, *menu_list; - -/* 2048 is the current definition inside syslinux */ -#define MAX_CMDLINE_LEN 2048 - -/* These are global parameters regardless of which menu we're displaying */ -extern int shiftkey; -extern int hiddenmenu; -extern long long totaltimeout; - -void parse_configs(char **argv); -extern int draw_background(const char *filename); - -static inline int my_isspace(char c) -{ - return (unsigned char)c <= ' '; -} - -int my_isxdigit(char c); -unsigned int hexval(char c); -unsigned int hexval2(const char *p); -uint32_t parse_argb(char **p); - -int menu_main(int argc, char *argv[]); -void console_prepare(void); -void console_cleanup(void); - -extern const int message_base_color, menu_color_table_size; -int mygetkey(clock_t timeout); -int show_message_file(const char *filename, const char *background); - -extern void print_labels(const char *prefix, size_t len); - -/* passwd.c */ -int passwd_compare(const char *passwd, const char *entry); - -/* colors.c */ -#define MSG_COLORS_DEF_FG 0x90ffffff -#define MSG_COLORS_DEF_BG 0x80ffffff -#define MSG_COLORS_DEF_SHADOW SHADOW_NORMAL -void set_msg_colors_global(struct color_table *tbl, - unsigned int fg, unsigned int bg, - enum color_table_shadow shadow); -struct color_table *default_color_table(void); -struct color_table *copy_color_table(const struct color_table *master); -extern const int message_base_color; - -/* background.c */ -extern const char *current_background; -void set_background(const char *new_background); - -extern struct menu_entry *find_label(const char *str); - -/* execute.c */ -void execute(const char *cmdline, enum kernel_type type); - -/* drain.c */ -void drain_keyboard(void); - -/* printmsg.c */ -int draw_message_file(const char *filename); - -#endif /* MENU_H */ diff --git a/com32/elflink/modules/menumain.c b/com32/elflink/modules/menumain.c deleted file mode 100644 index 4d00dc30..00000000 --- a/com32/elflink/modules/menumain.c +++ /dev/null @@ -1,977 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2004-2008 H. Peter Anvin - All Rights Reserved - * Copyright 2009 Intel Corporation; author: H. Peter Anvin - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston MA 02110-1301, USA; either version 2 of the License, or - * (at your option) any later version; incorporated herein by reference. - * - * ----------------------------------------------------------------------- */ - -/* - * menumain.c - * - * Simple menu system which displays a list and allows the user to select - * a command line and/or edit it. - */ - -#include <ctype.h> -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <consoles.h> -#include <getkey.h> -#include <minmax.h> -#include <setjmp.h> -#include <limits.h> -#include <com32.h> -#include <syslinux/adv.h> -#include <sys/module.h> -#include <core-elf.h> -#include <dprintf.h> - -#include "menu.h" -#include "cli.h" - -static jmp_buf timeout_jump; - -static int menumain_init(void) -{ - return 0; // Nothing to do; return success -} - -/* The symbol "cm" always refers to the current menu across this file... */ -static struct menu *cm; - -const struct menu_parameter mparm[NPARAMS] = { - [P_WIDTH] = {"width", 0}, - [P_MARGIN] = {"margin", 10}, - [P_PASSWD_MARGIN] = {"passwordmargin", 3}, - [P_MENU_ROWS] = {"rows", 12}, - [P_TABMSG_ROW] = {"tabmsgrow", 18}, - [P_CMDLINE_ROW] = {"cmdlinerow", 18}, - [P_END_ROW] = {"endrow", -1}, - [P_PASSWD_ROW] = {"passwordrow", 11}, - [P_TIMEOUT_ROW] = {"timeoutrow", 20}, - [P_HELPMSG_ROW] = {"helpmsgrow", 22}, - [P_HELPMSGEND_ROW] = {"helpmsgendrow", -1}, - [P_HSHIFT] = {"hshift", 0}, - [P_VSHIFT] = {"vshift", 0}, - [P_HIDDEN_ROW] = {"hiddenrow", -2}, -}; - -/* These macros assume "cm" is a pointer to the current menu */ -#define WIDTH (cm->mparm[P_WIDTH]) -#define MARGIN (cm->mparm[P_MARGIN]) -#define PASSWD_MARGIN (cm->mparm[P_PASSWD_MARGIN]) -#define MENU_ROWS (cm->mparm[P_MENU_ROWS]) -#define TABMSG_ROW (cm->mparm[P_TABMSG_ROW]+VSHIFT) -#define CMDLINE_ROW (cm->mparm[P_CMDLINE_ROW]+VSHIFT) -#define END_ROW (cm->mparm[P_END_ROW]) -#define PASSWD_ROW (cm->mparm[P_PASSWD_ROW]+VSHIFT) -#define TIMEOUT_ROW (cm->mparm[P_TIMEOUT_ROW]+VSHIFT) -#define HELPMSG_ROW (cm->mparm[P_HELPMSG_ROW]+VSHIFT) -#define HELPMSGEND_ROW (cm->mparm[P_HELPMSGEND_ROW]) -#define HSHIFT (cm->mparm[P_HSHIFT]) -#define VSHIFT (cm->mparm[P_VSHIFT]) -#define HIDDEN_ROW (cm->mparm[P_HIDDEN_ROW]) - -static char *pad_line(const char *text, int align, int width) -{ - static char buffer[MAX_CMDLINE_LEN]; - int n, p; - - if (width >= (int)sizeof buffer) - return NULL; /* Can't do it */ - - n = strlen(text); - if (n >= width) - n = width; - - memset(buffer, ' ', width); - buffer[width] = 0; - p = ((width - n) * align) >> 1; - memcpy(buffer + p, text, n); - - return buffer; -} - -/* Display an entry, with possible hotkey highlight. Assumes - that the current attribute is the non-hotkey one, and will - guarantee that as an exit condition as well. */ -static void -display_entry(const struct menu_entry *entry, const char *attrib, - const char *hotattrib, int width) -{ - const char *p = entry->displayname; - char marker; - - if (!p) - p = ""; - - switch (entry->action) { - case MA_SUBMENU: - marker = '>'; - break; - case MA_EXIT: - marker = '<'; - break; - default: - marker = 0; - break; - } - - if (marker) - width -= 2; - - while (width) { - if (*p) { - if (*p == '^') { - p++; - if (*p && ((unsigned char)*p & ~0x20) == entry->hotkey) { - fputs(hotattrib, stdout); - putchar(*p++); - fputs(attrib, stdout); - width--; - } - } else { - putchar(*p++); - width--; - } - } else { - putchar(' '); - width--; - } - } - - if (marker) { - putchar(' '); - putchar(marker); - } -} - -static void draw_row(int y, int sel, int top, int sbtop, int sbbot) -{ - int i = (y - 4 - VSHIFT) + top; - int dis = (i < cm->nentries) && is_disabled(cm->menu_entries[i]); - - printf("\033[%d;%dH\1#1\016x\017%s ", - y, MARGIN + 1 + HSHIFT, - (i == sel) ? "\1#5" : dis ? "\2#17" : "\1#3"); - - if (i >= cm->nentries) { - fputs(pad_line("", 0, WIDTH - 2 * MARGIN - 4), stdout); - } else { - display_entry(cm->menu_entries[i], - (i == sel) ? "\1#5" : dis ? "\2#17" : "\1#3", - (i == sel) ? "\1#6" : dis ? "\2#17" : "\1#4", - WIDTH - 2 * MARGIN - 4); - } - - if (cm->nentries <= MENU_ROWS) { - printf(" \1#1\016x\017"); - } else if (sbtop > 0) { - if (y >= sbtop && y <= sbbot) - printf(" \1#7\016a\017"); - else - printf(" \1#1\016x\017"); - } else { - putchar(' '); /* Don't modify the scrollbar */ - } -} - -int show_message_file(const char *filename, const char *background) -{ - int rv = KEY_NONE; - const char *old_background = NULL; - - if (background) { - old_background = current_background; - set_background(background); - } - - if (!(rv = draw_message_file(filename))) - rv = mygetkey(0); /* Wait for keypress */ - - if (old_background) - set_background(old_background); - - return rv; -} - -static int ask_passwd(const char *menu_entry) -{ - char user_passwd[WIDTH], *p; - int done; - int key; - int x; - int rv; - - printf("\033[%d;%dH\2#11\016l", PASSWD_ROW, PASSWD_MARGIN + 1); - for (x = 2; x <= WIDTH - 2 * PASSWD_MARGIN - 1; x++) - putchar('q'); - - printf("k\033[%d;%dHx", PASSWD_ROW + 1, PASSWD_MARGIN + 1); - for (x = 2; x <= WIDTH - 2 * PASSWD_MARGIN - 1; x++) - putchar(' '); - - printf("x\033[%d;%dHm", PASSWD_ROW + 2, PASSWD_MARGIN + 1); - for (x = 2; x <= WIDTH - 2 * PASSWD_MARGIN - 1; x++) - putchar('q'); - - printf("j\017\033[%d;%dH\2#12 %s \033[%d;%dH\2#13", - PASSWD_ROW, (WIDTH - (strlen(cm->messages[MSG_PASSPROMPT]) + 2)) / 2, - cm->messages[MSG_PASSPROMPT], PASSWD_ROW + 1, PASSWD_MARGIN + 3); - - drain_keyboard(); - - /* Actually allow user to type a password, then compare to the SHA1 */ - done = 0; - p = user_passwd; - - while (!done) { - key = mygetkey(0); - - switch (key) { - case KEY_ENTER: - case KEY_CTRL('J'): - done = 1; - break; - - case KEY_ESC: - case KEY_CTRL('C'): - p = user_passwd; /* No password entered */ - done = 1; - break; - - case KEY_BACKSPACE: - case KEY_DEL: - case KEY_DELETE: - if (p > user_passwd) { - printf("\b \b"); - p--; - } - break; - - case KEY_CTRL('U'): - while (p > user_passwd) { - printf("\b \b"); - p--; - } - break; - - default: - if (key >= ' ' && key <= 0xFF && - (p - user_passwd) < WIDTH - 2 * PASSWD_MARGIN - 5) { - *p++ = key; - putchar('*'); - } - break; - } - } - - if (p == user_passwd) - return 0; /* No password entered */ - - *p = '\0'; - - rv = (cm->menu_master_passwd && - passwd_compare(cm->menu_master_passwd, user_passwd)) - || (menu_entry && passwd_compare(menu_entry, user_passwd)); - - /* Clean up */ - memset(user_passwd, 0, WIDTH); - drain_keyboard(); - - return rv; -} - -static int draw_menu(int sel, int top, int edit_line) -{ - int x, y; - int sbtop = 0, sbbot = 0; - const char *tabmsg; - int tabmsg_len; - - if (cm->nentries > MENU_ROWS) { - int sblen = max(MENU_ROWS * MENU_ROWS / cm->nentries, 1); - sbtop = (MENU_ROWS - sblen + 1) * top / (cm->nentries - MENU_ROWS + 1); - sbbot = sbtop + sblen - 1; - sbtop += 4; - sbbot += 4; /* Starting row of scrollbar */ - } - - printf("\033[%d;%dH\1#1\016l", VSHIFT + 1, HSHIFT + MARGIN + 1); - for (x = 2 + HSHIFT; x <= (WIDTH - 2 * MARGIN - 1) + HSHIFT; x++) - putchar('q'); - - printf("k\033[%d;%dH\1#1x\017\1#2 %s \1#1\016x", - VSHIFT + 2, - HSHIFT + MARGIN + 1, pad_line(cm->title, 1, WIDTH - 2 * MARGIN - 4)); - - printf("\033[%d;%dH\1#1t", VSHIFT + 3, HSHIFT + MARGIN + 1); - for (x = 2 + HSHIFT; x <= (WIDTH - 2 * MARGIN - 1) + HSHIFT; x++) - putchar('q'); - fputs("u\017", stdout); - - for (y = 4 + VSHIFT; y < 4 + VSHIFT + MENU_ROWS; y++) - draw_row(y, sel, top, sbtop, sbbot); - - printf("\033[%d;%dH\1#1\016m", y, HSHIFT + MARGIN + 1); - for (x = 2 + HSHIFT; x <= (WIDTH - 2 * MARGIN - 1) + HSHIFT; x++) - putchar('q'); - fputs("j\017", stdout); - - if (edit_line && cm->allowedit && !cm->menu_master_passwd) - tabmsg = cm->messages[MSG_TAB]; - else - tabmsg = cm->messages[MSG_NOTAB]; - - tabmsg_len = strlen(tabmsg); - - printf("\1#8\033[%d;%dH%s", - TABMSG_ROW, 1 + HSHIFT + ((WIDTH - tabmsg_len) >> 1), tabmsg); - printf("\1#0\033[%d;1H", END_ROW); - return 0; -} - -static void display_help(const char *text) -{ - int row; - const char *p; - - if (!text) { - text = ""; - printf("\1#0\033[%d;1H", HELPMSG_ROW); - } else { - printf("\2#16\033[%d;1H", HELPMSG_ROW); - } - - for (p = text, row = HELPMSG_ROW; *p && row <= HELPMSGEND_ROW; p++) { - switch (*p) { - case '\r': - case '\f': - case '\v': - case '\033': - break; - case '\n': - printf("\033[K\033[%d;1H", ++row); - break; - default: - putchar(*p); - } - } - - fputs("\033[K", stdout); - - while (row <= HELPMSGEND_ROW) { - printf("\033[K\033[%d;1H", ++row); - } -} - -static void show_fkey(int key) -{ - int fkey; - - while (1) { - switch (key) { - case KEY_F1: - fkey = 0; - break; - case KEY_F2: - fkey = 1; - break; - case KEY_F3: - fkey = 2; - break; - case KEY_F4: - fkey = 3; - break; - case KEY_F5: - fkey = 4; - break; - case KEY_F6: - fkey = 5; - break; - case KEY_F7: - fkey = 6; - break; - case KEY_F8: - fkey = 7; - break; - case KEY_F9: - fkey = 8; - break; - case KEY_F10: - fkey = 9; - break; - case KEY_F11: - fkey = 10; - break; - case KEY_F12: - fkey = 11; - break; - default: - fkey = -1; - break; - } - - if (fkey == -1) - break; - - if (cm->fkeyhelp[fkey].textname) - key = show_message_file(cm->fkeyhelp[fkey].textname, - cm->fkeyhelp[fkey].background); - else - break; - } -} - -static inline int shift_is_held(void) -{ - uint8_t shift_bits = *(uint8_t *) 0x417; - - return !!(shift_bits & 0x5d); /* Caps/Scroll/Alt/Shift */ -} - -static void print_timeout_message(int tol, int row, const char *msg) -{ - char buf[256]; - int nc = 0, nnc; - const char *tp = msg; - char tc; - char *tq = buf; - - while ((size_t) (tq - buf) < (sizeof buf - 16) && (tc = *tp)) { - tp++; - if (tc == '#') { - nnc = sprintf(tq, "\2#15%d\2#14", tol); - tq += nnc; - nc += nnc - 8; /* 8 formatting characters */ - } else if (tc == '{') { - /* Deal with {singular[,dual],plural} constructs */ - struct { - const char *s, *e; - } tx[3]; - const char *tpp; - int n = 0; - - memset(tx, 0, sizeof tx); - - tx[0].s = tp; - - while (*tp && *tp != '}') { - if (*tp == ',' && n < 2) { - tx[n].e = tp; - n++; - tx[n].s = tp + 1; - } - tp++; - } - tx[n].e = tp; - - if (*tp) - tp++; /* Skip final bracket */ - - if (!tx[1].s) - tx[1] = tx[0]; - if (!tx[2].s) - tx[2] = tx[1]; - - /* Now [0] is singular, [1] is dual, and [2] is plural, - even if the user only specified some of them. */ - - switch (tol) { - case 1: - n = 0; - break; - case 2: - n = 1; - break; - default: - n = 2; - break; - } - - for (tpp = tx[n].s; tpp < tx[n].e; tpp++) { - if ((size_t) (tq - buf) < (sizeof buf)) { - *tq++ = *tpp; - nc++; - } - } - } else { - *tq++ = tc; - nc++; - } - } - *tq = '\0'; - - /* Let's hope 4 spaces on each side is enough... */ - printf("\033[%d;%dH\2#14 %s ", row, - HSHIFT + 1 + ((WIDTH - nc - 8) >> 1), buf); -} - -/* Set the background screen, etc. */ -static void prepare_screen_for_menu(void) -{ - console_color_table = cm->color_table; - console_color_table_size = menu_color_table_size; - set_background(cm->menu_background); -} - -static const char *do_hidden_menu(void) -{ - int key; - int timeout_left, this_timeout; - - clear_screen(); - - if (!setjmp(timeout_jump)) { - timeout_left = cm->timeout; - - while (!cm->timeout || timeout_left) { - int tol = timeout_left / CLK_TCK; - - print_timeout_message(tol, HIDDEN_ROW, cm->messages[MSG_AUTOBOOT]); - - this_timeout = min(timeout_left, CLK_TCK); - key = mygetkey(this_timeout); - - if (key != KEY_NONE) - return NULL; /* Key pressed */ - - timeout_left -= this_timeout; - } - } - - if (cm->ontimeout) - return cm->ontimeout; - else - return cm->menu_entries[cm->defentry]->cmdline; /* Default entry */ -} - -static const char *run_menu(void) -{ - int key; - int done = 0; - volatile int entry = cm->curentry; - int prev_entry = -1; - volatile int top = cm->curtop; - int prev_top = -1; - int clear = 1, to_clear; - const char *cmdline = NULL; - volatile clock_t key_timeout, timeout_left, this_timeout; - const struct menu_entry *me; - - /* Note: for both key_timeout and timeout == 0 means no limit */ - timeout_left = key_timeout = cm->timeout; - - /* If we're in shiftkey mode, exit immediately unless a shift key - is pressed */ - if (shiftkey && !shift_is_held()) { - return cm->menu_entries[cm->defentry]->cmdline; - } else { - shiftkey = 0; - } - - /* Do this before hiddenmenu handling, so we show the background */ - prepare_screen_for_menu(); - - /* Handle hiddenmenu */ - if (hiddenmenu) { - cmdline = do_hidden_menu(); - if (cmdline) - return cmdline; - - /* Otherwise display the menu now; the timeout has already been - cancelled, since the user pressed a key. */ - hiddenmenu = 0; - key_timeout = 0; - } - - /* Handle both local and global timeout */ - if (setjmp(timeout_jump)) { - entry = cm->defentry; - - if (top < 0 || top < entry - MENU_ROWS + 1) - top = max(0, entry - MENU_ROWS + 1); - else if (top > entry || top > max(0, cm->nentries - MENU_ROWS)) - top = min(entry, max(0, cm->nentries - MENU_ROWS)); - - draw_menu(cm->ontimeout ? -1 : entry, top, 1); - cmdline = - cm->ontimeout ? cm->ontimeout : cm->menu_entries[entry]->cmdline; - done = 1; - } - - while (!done) { - if (entry <= 0) { - entry = 0; - while (entry < cm->nentries && is_disabled(cm->menu_entries[entry])) - entry++; - } - if (entry >= cm->nentries) { - entry = cm->nentries - 1; - while (entry > 0 && is_disabled(cm->menu_entries[entry])) - entry--; - } - - me = cm->menu_entries[entry]; - - if (top < 0 || top < entry - MENU_ROWS + 1) - top = max(0, entry - MENU_ROWS + 1); - else if (top > entry || top > max(0, cm->nentries - MENU_ROWS)) - top = min(entry, max(0, cm->nentries - MENU_ROWS)); - - /* Start with a clear screen */ - if (clear) { - /* Clear and redraw whole screen */ - /* Enable ASCII on G0 and DEC VT on G1; do it in this order - to avoid confusing the Linux console */ - if (clear >= 2) - prepare_screen_for_menu(); - clear_screen(); - clear = 0; - prev_entry = prev_top = -1; - } - - if (top != prev_top) { - draw_menu(entry, top, 1); - display_help(me->helptext); - } else if (entry != prev_entry) { - draw_row(prev_entry - top + 4 + VSHIFT, entry, top, 0, 0); - draw_row(entry - top + 4 + VSHIFT, entry, top, 0, 0); - display_help(me->helptext); - } - - prev_entry = entry; - prev_top = top; - cm->curentry = entry; - cm->curtop = top; - - /* Cursor movement cancels timeout */ - if (entry != cm->defentry) - key_timeout = 0; - - if (key_timeout) { - int tol = timeout_left / CLK_TCK; - print_timeout_message(tol, TIMEOUT_ROW, cm->messages[MSG_AUTOBOOT]); - to_clear = 1; - } else { - to_clear = 0; - } - - this_timeout = min(min(key_timeout, timeout_left), (clock_t) CLK_TCK); - key = mygetkey(this_timeout); - - if (key != KEY_NONE) { - timeout_left = key_timeout; - if (to_clear) - printf("\033[%d;1H\1#0\033[K", TIMEOUT_ROW); - } - - switch (key) { - case KEY_NONE: /* Timeout */ - /* This is somewhat hacky, but this at least lets the user - know what's going on, and still deals with "phantom inputs" - e.g. on serial ports. - - Warning: a timeout will boot the default entry without any - password! */ - if (key_timeout) { - if (timeout_left <= this_timeout) - longjmp(timeout_jump, 1); - - timeout_left -= this_timeout; - } - break; - - case KEY_CTRL('L'): - clear = 1; - break; - - case KEY_ENTER: - case KEY_CTRL('J'): - key_timeout = 0; /* Cancels timeout */ - if (me->passwd) { - clear = 1; - done = ask_passwd(me->passwd); - } else { - done = 1; - } - cmdline = NULL; - if (done) { - switch (me->action) { - case MA_CMD: - cmdline = me->cmdline; - break; - case MA_SUBMENU: - case MA_GOTO: - case MA_EXIT: - done = 0; - clear = 2; - cm = me->submenu; - entry = cm->curentry; - top = cm->curtop; - break; - case MA_QUIT: - /* Quit menu system */ - done = 1; - clear = 1; - draw_row(entry - top + 4 + VSHIFT, -1, top, 0, 0); - break; - default: - done = 0; - break; - } - } - if (done && !me->passwd) { - /* Only save a new default if we don't have a password... */ - /* - if (me->save && me->label) { - syslinux_setadv(ADV_MENUSAVE, strlen(me->label), me->label); - syslinux_adv_write(); - } - */ - } - break; - - case KEY_UP: - case KEY_CTRL('P'): - while (entry > 0) { - entry--; - if (entry < top) - top -= MENU_ROWS; - if (!is_disabled(cm->menu_entries[entry])) - break; - } - break; - - case KEY_DOWN: - case KEY_CTRL('N'): - while (entry < cm->nentries - 1) { - entry++; - if (entry >= top + MENU_ROWS) - top += MENU_ROWS; - if (!is_disabled(cm->menu_entries[entry])) - break; - } - break; - - case KEY_PGUP: - case KEY_LEFT: - case KEY_CTRL('B'): - case '<': - entry -= MENU_ROWS; - top -= MENU_ROWS; - while (entry > 0 && is_disabled(cm->menu_entries[entry])) { - entry--; - if (entry < top) - top -= MENU_ROWS; - } - break; - - case KEY_PGDN: - case KEY_RIGHT: - case KEY_CTRL('F'): - case '>': - case ' ': - entry += MENU_ROWS; - top += MENU_ROWS; - while (entry < cm->nentries - 1 - && is_disabled(cm->menu_entries[entry])) { - entry++; - if (entry >= top + MENU_ROWS) - top += MENU_ROWS; - } - break; - - case '-': - while (entry > 0) { - entry--; - top--; - if (!is_disabled(cm->menu_entries[entry])) - break; - } - break; - - case '+': - while (entry < cm->nentries - 1) { - entry++; - top++; - if (!is_disabled(cm->menu_entries[entry])) - break; - } - break; - - case KEY_CTRL('A'): - case KEY_HOME: - top = entry = 0; - break; - - case KEY_CTRL('E'): - case KEY_END: - entry = cm->nentries - 1; - top = max(0, cm->nentries - MENU_ROWS); - break; - - case KEY_F1: - case KEY_F2: - case KEY_F3: - case KEY_F4: - case KEY_F5: - case KEY_F6: - case KEY_F7: - case KEY_F8: - case KEY_F9: - case KEY_F10: - case KEY_F11: - case KEY_F12: - show_fkey(key); - clear = 1; - break; - - case KEY_TAB: - if (cm->allowedit && me->action == MA_CMD) { - int ok = 1; - - key_timeout = 0; /* Cancels timeout */ - draw_row(entry - top + 4 + VSHIFT, -1, top, 0, 0); - - if (cm->menu_master_passwd) { - ok = ask_passwd(NULL); - clear_screen(); - draw_menu(-1, top, 0); - } else { - /* Erase [Tab] message and help text */ - printf("\033[%d;1H\1#0\033[K", TABMSG_ROW); - display_help(NULL); - } - - if (ok) { - cmdline = - edit_cmdline(me->cmdline, top, &draw_menu, &show_fkey); - done = !!cmdline; - clear = 1; /* In case we hit [Esc] and done is null */ - } else { - draw_row(entry - top + 4 + VSHIFT, entry, top, 0, 0); - } - } - break; - case KEY_CTRL('C'): /* Ctrl-C */ - case KEY_ESC: /* Esc */ - if (cm->parent) { - cm = cm->parent; - clear = 2; - entry = cm->curentry; - top = cm->curtop; - } else if (cm->allowedit) { - done = 1; - clear = 1; - key_timeout = 0; - - draw_row(entry - top + 4 + VSHIFT, -1, top, 0, 0); - - if (cm->menu_master_passwd) - done = ask_passwd(NULL); - } - break; - default: - if (key > 0 && key < 0xFF) { - key &= ~0x20; /* Upper case */ - if (cm->menu_hotkeys[key]) { - key_timeout = 0; - entry = cm->menu_hotkeys[key]->entry; - /* Should we commit at this point? */ - } - } - break; - } - } - - printf("\033[?25h"); /* Show cursor */ - - /* Return the label name so localboot and ipappend work */ - return cmdline; -} - -static void dump_menu(struct menu *menu) -{ - dprintf("will dump menu for %s:", menu->label); - printf("entries num: %d\n", menu->nentries); - printf("defentry: %d, nam = %s\n", - menu->defentry, menu->menu_entries[menu->defentry]->label); - //printf("save: %d\n", menu->save); - //printf("", menu->); - //printf("", menu->); - //printf("", menu->); -} - -int menu_main(int argc, char *argv[]) -{ - const char *cmdline; - struct menu *m; - int rows, cols; - int i; - - (void)argc; - - if (getscreensize(1, &rows, &cols)) { - /* Unknown screen size? */ - rows = 24; - cols = 80; - } - - /* - * If there is a config file given, parse it - * otherwise use the config already parsed - */ - if (argc == 2) - parse_configs(argv + 1); - - /* Some postprocessing for all menus */ - for (m = menu_list; m; m = m->next) { - if (!m->mparm[P_WIDTH]) - m->mparm[P_WIDTH] = cols; - - /* If anyone has specified negative parameters, consider them - relative to the bottom row of the screen. */ - for (i = 0; i < NPARAMS; i++) - if (m->mparm[i] < 0) - m->mparm[i] = max(m->mparm[i] + rows, 0); - } - - cm = start_menu; - if (!cm->nentries) { - fputs("Initial menu has no LABEL entries!\n", stdout); - return 1; /* Error! */ - } - - dump_menu(cm); - for (;;) { - cmdline = run_menu(); - - printf("\033[?25h\033[%d;1H\033[0m", END_ROW); - - if (cmdline) { - dprintf("cmdline = %s", cmdline); - execute(cmdline, KT_NONE); - if (cm->onerror) - execute(cm->onerror, KT_NONE); - } else { - return 0; /* Exit */ - } - } -} - -static void menumain_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(menumain_init); -MODULE_EXIT(menumain_exit); diff --git a/com32/elflink/modules/modules.dep b/com32/elflink/modules/modules.dep deleted file mode 100644 index 90feb0b4..00000000 --- a/com32/elflink/modules/modules.dep +++ /dev/null @@ -1,19 +0,0 @@ -ansiraw: -background: -crypt-md5: md5 -drain: -execute: -get_key: -hello: -md5: -menu: menumain -menumain: drain passwd background printmsg execute -mytest: ansiraw menumain -passwd: crypt-md5 sha1hash unbase64 sha256crypt sha512crypt -printmsg: -sha1hash: -sha256crypt: -sha512crypt: -sort: -test: -unbase64: diff --git a/com32/elflink/modules/mytest.c b/com32/elflink/modules/mytest.c deleted file mode 100644 index e8b5c1c0..00000000 --- a/com32/elflink/modules/mytest.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <stdio.h> -#include <stdbool.h> -#include <stdlib.h> -#include <string.h> -#include <minmax.h> -#include <console.h> -#include <consoles.h> -#include <alloca.h> -#include <inttypes.h> -#include <colortbl.h> -#include <getkey.h> -#include <setjmp.h> -#include <limits.h> -#include <com32.h> -#include <core-elf.h> -#include <syslinux/adv.h> -#include <syslinux/config.h> - -#include "menu.h" - -int main(int argc, char **argv) -{ - console_ansi_raw(); - //edit_cmdline("",1); - menu_main(argc, argv); - return 0; -} diff --git a/com32/elflink/modules/passwd.c b/com32/elflink/modules/passwd.c deleted file mode 100644 index d190b1c7..00000000 --- a/com32/elflink/modules/passwd.c +++ /dev/null @@ -1,112 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2004-2008 H. Peter Anvin - All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston MA 02110-1301, USA; either version 2 of the License, or - * (at your option) any later version; incorporated herein by reference. - * - * ----------------------------------------------------------------------- */ - -#include <string.h> -#include <xcrypt.h> -#include <sha1.h> -#include <base64.h> -#include <core-elf.h> -#include <sys/module.h> - -#include "menu.h" - -static int passwd_init(void) -{ - return 0; // Nothing to do; return success -} - -static int passwd_compare_sha1(const char *passwd, const char *entry) -{ - struct { - SHA1_CTX ctx; - unsigned char sha1[20], pwdsha1[20]; - } d; - const char *p; - int rv; - - SHA1Init(&d.ctx); - - if ((p = strchr(passwd + 3, '$'))) { - SHA1Update(&d.ctx, (void *)passwd + 3, p - (passwd + 3)); - p++; - } else { - p = passwd + 3; /* Assume no salt */ - } - - SHA1Update(&d.ctx, (void *)entry, strlen(entry)); - SHA1Final(d.sha1, &d.ctx); - - memset(d.pwdsha1, 0, 20); - unbase64(d.pwdsha1, 20, p); - - rv = !memcmp(d.sha1, d.pwdsha1, 20); - - memset(&d, 0, sizeof d); - return rv; -} - -static int passwd_compare_md5(const char *passwd, const char *entry) -{ - const char *crypted = crypt_md5(entry, passwd + 3); - int len = strlen(crypted); - - return !strncmp(crypted, passwd, len) && - (passwd[len] == '\0' || passwd[len] == '$'); -} - -static int passwd_compare_sha256(const char *passwd, const char *entry) -{ - const char *crypted = sha256_crypt(entry, passwd + 3); - int len = strlen(crypted); - - return !strncmp(crypted, passwd, len) && - (passwd[len] == '\0' || passwd[len] == '$'); -} - -static int passwd_compare_sha512(const char *passwd, const char *entry) -{ - const char *crypted = sha512_crypt(entry, passwd + 3); - int len = strlen(crypted); - - return !strncmp(crypted, passwd, len) && - (passwd[len] == '\0' || passwd[len] == '$'); -} - -int passwd_compare(const char *passwd, const char *entry) -{ - if (passwd[0] != '$' || !passwd[1] || passwd[2] != '$') { - /* Plaintext passwd, yuck! */ - return !strcmp(entry, passwd); - } else { - switch (passwd[1]) { - case '1': - return passwd_compare_md5(passwd, entry); - case '4': - return passwd_compare_sha1(passwd, entry); - case '5': - return passwd_compare_sha256(passwd, entry); - case '6': - return passwd_compare_sha512(passwd, entry); - default: - return 0; /* Unknown encryption algorithm -> false */ - } - } -} - -static void passwd_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(passwd_init); -MODULE_EXIT(passwd_exit); diff --git a/com32/elflink/modules/printmsg.c b/com32/elflink/modules/printmsg.c deleted file mode 100644 index e5fc62c6..00000000 --- a/com32/elflink/modules/printmsg.c +++ /dev/null @@ -1,116 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2004-2008 H. Peter Anvin - All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston MA 02110-1301, USA; either version 2 of the License, or - * (at your option) any later version; incorporated herein by reference. - * - * ----------------------------------------------------------------------- */ - -#include <ctype.h> -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <consoles.h> -#include <getkey.h> -#include <minmax.h> -#include <setjmp.h> -#include <limits.h> -#include <sha1.h> -#include <base64.h> -#include <colortbl.h> -#include <sys/module.h> -#ifdef __COM32__ -#include <com32.h> -#endif -#include <core-elf.h> - -#include "menu.h" - -static int printmsg_init(void) -{ - return 0; // Nothing to do; return success -} - -int draw_message_file(const char *filename) -{ - FILE *f; - int ch; - enum msgname_state { - st_init, /* Base state */ - st_si_1, /* <SI> digit 1 */ - st_si_2, /* <SI> digit 2 */ - st_skipline, /* Skip until NL */ - } state = st_init; - int eof = 0; - int attr = 0; - - f = fopen(filename, "r"); - if (!f) - return -1; - - /* Clear screen, hide cursor, default attribute */ - printf("\033e\033%%@\033)0\033(B\3#%03d\033[?25l\033[2J\033[H", - message_base_color + 0x07); - - while (!eof && (ch = getc(f)) != EOF) { - switch (state) { - case st_init: - switch (ch) { - case '\f': - fputs("\033[2J\033[H", stdout); - break; - case 15: /* SI */ - state = st_si_1; - break; - case 24: - state = st_skipline; - break; - case 26: - eof = 1; - break; - case '\a': - case '\n': - case '\r': - putchar(ch); - break; - default: - if (ch >= 32) - putchar(ch); - break; - } - break; - - case st_si_1: - attr = hexval(ch) << 4; - state = st_si_2; - break; - - case st_si_2: - attr |= hexval(ch); - printf("\3#%03d", attr + message_base_color); - state = st_init; - break; - - case st_skipline: - if (ch == '\n') - state = st_init; - break; - } - } - - fclose(f); - return 0; -} - -static void printmsg_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(printmsg_init); -MODULE_EXIT(printmsg_exit); diff --git a/com32/elflink/modules/refstr.h b/com32/elflink/modules/refstr.h deleted file mode 100644 index 7001d407..00000000 --- a/com32/elflink/modules/refstr.h +++ /dev/null @@ -1,40 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2008 H. Peter Anvin - All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston MA 02110-1301, USA; either version 2 of the License, or - * (at your option) any later version; incorporated herein by reference. - * - * ----------------------------------------------------------------------- */ - -/* - * refstr.h - * - * Simple reference-counted strings - */ - -#ifndef REFSTR_H -#define REFSTR_H - -#include <stddef.h> -#include <stdarg.h> - -static inline __attribute__ ((always_inline)) -const char *refstr_get(const char *r) -{ - if (r) - ((unsigned int *)r)[-1]++; - return r; -} - -void refstr_put(const char *); -char *refstr_alloc(size_t); -const char *refstrdup(const char *); -const char *refstrndup(const char *, size_t); -int rsprintf(const char **, const char *, ...); -int vrsprintf(const char **, const char *, va_list); - -#endif diff --git a/com32/elflink/modules/sha1.h b/com32/elflink/modules/sha1.h deleted file mode 100644 index 3b35e773..00000000 --- a/com32/elflink/modules/sha1.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef LIBUTIL_SHA1_H -#define LIBUTIL_SHA1_H - -#include <stdint.h> - -typedef struct { - uint32_t state[5]; - uint32_t count[2]; - unsigned char buffer[64]; -} SHA1_CTX; - -void SHA1Transform(uint32_t state[5], const unsigned char buffer[64]); -void SHA1Init(SHA1_CTX * context); -void SHA1Update(SHA1_CTX * context, const unsigned char *data, uint32_t len); /* - JHB */ -void SHA1Final(unsigned char digest[20], SHA1_CTX * context); - -#endif /* LIBUTIL_SHA1_H */ diff --git a/com32/elflink/modules/sha1hash.c b/com32/elflink/modules/sha1hash.c deleted file mode 100644 index cafdc46c..00000000 --- a/com32/elflink/modules/sha1hash.c +++ /dev/null @@ -1,347 +0,0 @@ -/* -SHA-1 in C -By Steve Reid <sreid@sea-to-sky.net> -100% Public Domain - ------------------ -Modified 7/98 -By James H. Brown <jbrown@burgoyne.com> -Still 100% Public Domain - -Corrected a problem which generated improper hash values on 16 bit machines -Routine SHA1Update changed from - void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int -len) -to - void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned -long len) - -The 'len' parameter was declared an int which works fine on 32 bit machines. -However, on 16 bit machines an int is too small for the shifts being done -against -it. This caused the hash function to generate incorrect values if len was -greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update(). - -Since the file IO in main() reads 16K at a time, any file 8K or larger would -be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million -"a"s). - -I also changed the declaration of variables i & j in SHA1Update to -unsigned long from unsigned int for the same reason. - -These changes should make no difference to any 32 bit implementations since -an -int and a long are the same size in those environments. - --- -I also corrected a few compiler warnings generated by Borland C. -1. Added #include <process.h> for exit() prototype -2. Removed unused variable 'j' in SHA1Final -3. Changed exit(0) to return(0) at end of main. - -ALL changes I made can be located by searching for comments containing 'JHB' ------------------ -Modified 8/98 -By Steve Reid <sreid@sea-to-sky.net> -Still 100% public domain - -1- Removed #include <process.h> and used return() instead of exit() -2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall) -3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net - ------------------ -Modified 4/01 -By Saul Kravitz <Saul.Kravitz@celera.com> -Still 100% PD -Modified to run on Compaq Alpha hardware. - ------------------ -Modified 2/03 -By H. Peter Anvin <hpa@zytor.com> -Still 100% PD -Modified to run on any hardware with <inttypes.h> and <netinet/in.h> -Changed the driver program - -*/ - -/* -Test Vectors (from FIPS PUB 180-1) -"abc" - A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D -"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" - 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 -A million repetitions of "a" - 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F -*/ - -/* #define SHA1HANDSOFF */ - -#include <stdio.h> -#include <string.h> -#include <inttypes.h> -#include <netinet/in.h> /* For htonl/ntohl/htons/ntohs */ -#include <sys/module.h> - -#include "sha1.h" - -static int sha1hash_init(void) -{ - return 0; // Nothing to do; return success -} - -#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) - -/* blk0() and blk() perform the initial expand. */ -/* I got the idea of expanding during the round function from SSLeay */ -#define blk0(i) (block->l[i] = ntohl(block->l[i])) -#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ - ^block->l[(i+2)&15]^block->l[i&15],1)) - -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); -#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); -#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); - -#ifdef VERBOSE /* SAK */ -void SHAPrintContext(SHA1_CTX * context, char *msg) -{ - printf("%s (%d,%d) %x %x %x %x %x\n", - msg, - context->count[0], context->count[1], - context->state[0], - context->state[1], - context->state[2], context->state[3], context->state[4]); -} -#endif - -/* Hash a single 512-bit block. This is the core of the algorithm. */ - -void SHA1Transform(uint32_t state[5], const unsigned char buffer[64]) -{ - uint32_t a, b, c, d, e; - typedef union { - unsigned char c[64]; - uint32_t l[16]; - } CHAR64LONG16; - CHAR64LONG16 *block; -#ifdef SHA1HANDSOFF - static unsigned char workspace[64]; - block = (CHAR64LONG16 *) workspace; - memcpy(block, buffer, 64); -#else - block = (CHAR64LONG16 *) buffer; -#endif - /* Copy context->state[] to working vars */ - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a, b, c, d, e, 0); - R0(e, a, b, c, d, 1); - R0(d, e, a, b, c, 2); - R0(c, d, e, a, b, 3); - R0(b, c, d, e, a, 4); - R0(a, b, c, d, e, 5); - R0(e, a, b, c, d, 6); - R0(d, e, a, b, c, 7); - R0(c, d, e, a, b, 8); - R0(b, c, d, e, a, 9); - R0(a, b, c, d, e, 10); - R0(e, a, b, c, d, 11); - R0(d, e, a, b, c, 12); - R0(c, d, e, a, b, 13); - R0(b, c, d, e, a, 14); - R0(a, b, c, d, e, 15); - R1(e, a, b, c, d, 16); - R1(d, e, a, b, c, 17); - R1(c, d, e, a, b, 18); - R1(b, c, d, e, a, 19); - R2(a, b, c, d, e, 20); - R2(e, a, b, c, d, 21); - R2(d, e, a, b, c, 22); - R2(c, d, e, a, b, 23); - R2(b, c, d, e, a, 24); - R2(a, b, c, d, e, 25); - R2(e, a, b, c, d, 26); - R2(d, e, a, b, c, 27); - R2(c, d, e, a, b, 28); - R2(b, c, d, e, a, 29); - R2(a, b, c, d, e, 30); - R2(e, a, b, c, d, 31); - R2(d, e, a, b, c, 32); - R2(c, d, e, a, b, 33); - R2(b, c, d, e, a, 34); - R2(a, b, c, d, e, 35); - R2(e, a, b, c, d, 36); - R2(d, e, a, b, c, 37); - R2(c, d, e, a, b, 38); - R2(b, c, d, e, a, 39); - R3(a, b, c, d, e, 40); - R3(e, a, b, c, d, 41); - R3(d, e, a, b, c, 42); - R3(c, d, e, a, b, 43); - R3(b, c, d, e, a, 44); - R3(a, b, c, d, e, 45); - R3(e, a, b, c, d, 46); - R3(d, e, a, b, c, 47); - R3(c, d, e, a, b, 48); - R3(b, c, d, e, a, 49); - R3(a, b, c, d, e, 50); - R3(e, a, b, c, d, 51); - R3(d, e, a, b, c, 52); - R3(c, d, e, a, b, 53); - R3(b, c, d, e, a, 54); - R3(a, b, c, d, e, 55); - R3(e, a, b, c, d, 56); - R3(d, e, a, b, c, 57); - R3(c, d, e, a, b, 58); - R3(b, c, d, e, a, 59); - R4(a, b, c, d, e, 60); - R4(e, a, b, c, d, 61); - R4(d, e, a, b, c, 62); - R4(c, d, e, a, b, 63); - R4(b, c, d, e, a, 64); - R4(a, b, c, d, e, 65); - R4(e, a, b, c, d, 66); - R4(d, e, a, b, c, 67); - R4(c, d, e, a, b, 68); - R4(b, c, d, e, a, 69); - R4(a, b, c, d, e, 70); - R4(e, a, b, c, d, 71); - R4(d, e, a, b, c, 72); - R4(c, d, e, a, b, 73); - R4(b, c, d, e, a, 74); - R4(a, b, c, d, e, 75); - R4(e, a, b, c, d, 76); - R4(d, e, a, b, c, 77); - R4(c, d, e, a, b, 78); - R4(b, c, d, e, a, 79); - /* Add the working vars back into context.state[] */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - /* Wipe variables */ - a = b = c = d = e = 0; -} - -/* SHA1Init - Initialize new context */ - -void SHA1Init(SHA1_CTX * context) -{ - /* SHA1 initialization constants */ - context->state[0] = 0x67452301; - context->state[1] = 0xEFCDAB89; - context->state[2] = 0x98BADCFE; - context->state[3] = 0x10325476; - context->state[4] = 0xC3D2E1F0; - context->count[0] = context->count[1] = 0; -} - -/* Run your data through this. */ - -void SHA1Update(SHA1_CTX * context, const unsigned char *data, uint32_t len) -{ /* - JHB */ - uint32_t i, j; /* JHB */ - -#ifdef VERBOSE - SHAPrintContext(context, "before"); -#endif - j = (context->count[0] >> 3) & 63; - if ((context->count[0] += len << 3) < (len << 3)) - context->count[1]++; - context->count[1] += (len >> 29); - if ((j + len) > 63) { - memcpy(&context->buffer[j], data, (i = 64 - j)); - SHA1Transform(context->state, context->buffer); - for (; i + 63 < len; i += 64) { - SHA1Transform(context->state, &data[i]); - } - j = 0; - } else - i = 0; - memcpy(&context->buffer[j], &data[i], len - i); -#ifdef VERBOSE - SHAPrintContext(context, "after "); -#endif -} - -/* Add padding and return the message digest. */ - -void SHA1Final(unsigned char digest[20], SHA1_CTX * context) -{ - uint32_t i; /* JHB */ - unsigned char finalcount[8]; - - for (i = 0; i < 8; i++) { - finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] - >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */ - } - SHA1Update(context, (unsigned char *)"\200", 1); - while ((context->count[0] & 504) != 448) { - SHA1Update(context, (unsigned char *)"\0", 1); - } - SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() - */ - for (i = 0; i < 20; i++) { - digest[i] = (unsigned char) - ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); - } - /* Wipe variables */ - i = 0; /* JHB */ - memset(context->buffer, 0, 64); - memset(context->state, 0, 20); - memset(context->count, 0, 8); - memset(finalcount, 0, 8); /* SWR */ -#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */ - SHA1Transform(context->state, context->buffer); -#endif -} - -/*************************************************************/ - -/* This is not quite the MIME base64 algorithm: it uses _ instead of /, - and instead of padding the output with = characters we just make the - output shorter. */ -char *mybase64(uint8_t digest[20]) -{ - static const char charz[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_"; - uint8_t input[21]; - static char output[28]; - int i, j; - uint8_t *p; - char *q; - uint32_t bv; - - memcpy(input, digest, 20); - input[20] = 0; /* Pad to multiple of 3 bytes */ - - p = input; - q = output; - for (i = 0; i < 7; i++) { - bv = (p[0] << 16) | (p[1] << 8) | p[2]; - p += 3; - for (j = 0; j < 4; j++) { - *q++ = charz[(bv >> 18) & 0x3f]; - bv <<= 6; - } - } - *--q = '\0'; /* The last character is not significant */ - return output; -} - -static void sha1hash_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(sha1hash_init); -MODULE_EXIT(sha1hash_exit); diff --git a/com32/elflink/modules/sha256crypt.c b/com32/elflink/modules/sha256crypt.c deleted file mode 100644 index 61b23f2a..00000000 --- a/com32/elflink/modules/sha256crypt.c +++ /dev/null @@ -1,559 +0,0 @@ -/* SHA256-based Unix crypt implementation. - Released into the Public Domain by Ulrich Drepper <drepper@redhat.com>. */ - -#include <alloca.h> -#include <endian.h> -#include <errno.h> -#include <limits.h> -#include <stdint.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <minmax.h> -#include <sys/types.h> -#include <sys/module.h> - -#include "xcrypt.h" - -static int sha256crypt_init(void) -{ - return 0; // Nothing to do; return success -} - -#define MIN(x,y) min(x,y) -#define MAX(x,y) max(x,y) - -/* Structure to save state of computation between the single steps. */ -struct sha256_ctx { - uint32_t H[8]; - - uint32_t total[2]; - uint32_t buflen; - char buffer[128]; /* NB: always correctly aligned for uint32_t. */ -}; - -#if __BYTE_ORDER == __LITTLE_ENDIAN -# define SWAP(n) \ - (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) -#else -# define SWAP(n) (n) -#endif - -/* This array contains the bytes used to pad the buffer to the next - 64-byte boundary. (FIPS 180-2:5.1.1) */ -static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; - -/* Constants for SHA256 from FIPS 180-2:4.2.2. */ -static const uint32_t K[64] = { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, - 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, - 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, - 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, - 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 -}; - -/* Process LEN bytes of BUFFER, accumulating context into CTX. - It is assumed that LEN % 64 == 0. */ -static void -sha256_process_block(const void *buffer, size_t len, struct sha256_ctx *ctx) -{ - unsigned int t; - const uint32_t *words = buffer; - size_t nwords = len / sizeof(uint32_t); - uint32_t a = ctx->H[0]; - uint32_t b = ctx->H[1]; - uint32_t c = ctx->H[2]; - uint32_t d = ctx->H[3]; - uint32_t e = ctx->H[4]; - uint32_t f = ctx->H[5]; - uint32_t g = ctx->H[6]; - uint32_t h = ctx->H[7]; - - /* First increment the byte count. FIPS 180-2 specifies the possible - length of the file up to 2^64 bits. Here we only compute the - number of bytes. Do a double word increment. */ - ctx->total[0] += len; - if (ctx->total[0] < len) - ++ctx->total[1]; - - /* Process all bytes in the buffer with 64 bytes in each round of - the loop. */ - while (nwords > 0) { - uint32_t W[64]; - uint32_t a_save = a; - uint32_t b_save = b; - uint32_t c_save = c; - uint32_t d_save = d; - uint32_t e_save = e; - uint32_t f_save = f; - uint32_t g_save = g; - uint32_t h_save = h; - - /* Operators defined in FIPS 180-2:4.1.2. */ -#define Ch(x, y, z) ((x & y) ^ (~x & z)) -#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) -#define S0(x) (CYCLIC (x, 2) ^ CYCLIC (x, 13) ^ CYCLIC (x, 22)) -#define S1(x) (CYCLIC (x, 6) ^ CYCLIC (x, 11) ^ CYCLIC (x, 25)) -#define R0(x) (CYCLIC (x, 7) ^ CYCLIC (x, 18) ^ (x >> 3)) -#define R1(x) (CYCLIC (x, 17) ^ CYCLIC (x, 19) ^ (x >> 10)) - - /* It is unfortunate that C does not provide an operator for - cyclic rotation. Hope the C compiler is smart enough. */ -#define CYCLIC(w, s) ((w >> s) | (w << (32 - s))) - - /* Compute the message schedule according to FIPS 180-2:6.2.2 step 2. */ - for (t = 0; t < 16; ++t) { - W[t] = SWAP(*words); - ++words; - } - for (t = 16; t < 64; ++t) - W[t] = R1(W[t - 2]) + W[t - 7] + R0(W[t - 15]) + W[t - 16]; - - /* The actual computation according to FIPS 180-2:6.2.2 step 3. */ - for (t = 0; t < 64; ++t) { - uint32_t T1 = h + S1(e) + Ch(e, f, g) + K[t] + W[t]; - uint32_t T2 = S0(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - } - - /* Add the starting values of the context according to FIPS 180-2:6.2.2 - step 4. */ - a += a_save; - b += b_save; - c += c_save; - d += d_save; - e += e_save; - f += f_save; - g += g_save; - h += h_save; - - /* Prepare for the next round. */ - nwords -= 16; - } - - /* Put checksum in context given as argument. */ - ctx->H[0] = a; - ctx->H[1] = b; - ctx->H[2] = c; - ctx->H[3] = d; - ctx->H[4] = e; - ctx->H[5] = f; - ctx->H[6] = g; - ctx->H[7] = h; -} - -/* Initialize structure containing state of computation. - (FIPS 180-2:5.3.2) */ -static void sha256_init_ctx(struct sha256_ctx *ctx) -{ - ctx->H[0] = 0x6a09e667; - ctx->H[1] = 0xbb67ae85; - ctx->H[2] = 0x3c6ef372; - ctx->H[3] = 0xa54ff53a; - ctx->H[4] = 0x510e527f; - ctx->H[5] = 0x9b05688c; - ctx->H[6] = 0x1f83d9ab; - ctx->H[7] = 0x5be0cd19; - - ctx->total[0] = ctx->total[1] = 0; - ctx->buflen = 0; -} - -/* Process the remaining bytes in the internal buffer and the usual - prolog according to the standard and write the result to RESBUF. - - IMPORTANT: On some systems it is required that RESBUF is correctly - aligned for a 32 bits value. */ -static void *sha256_finish_ctx(struct sha256_ctx *ctx, void *resbuf) -{ - unsigned int i; - /* Take yet unprocessed bytes into account. */ - uint32_t bytes = ctx->buflen; - size_t pad; - - /* Now count remaining bytes. */ - ctx->total[0] += bytes; - if (ctx->total[0] < bytes) - ++ctx->total[1]; - - pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; - memcpy(&ctx->buffer[bytes], fillbuf, pad); - - /* Put the 64-bit file length in *bits* at the end of the buffer. */ - *(uint32_t *) & ctx->buffer[bytes + pad + 4] = SWAP(ctx->total[0] << 3); - *(uint32_t *) & ctx->buffer[bytes + pad] = SWAP((ctx->total[1] << 3) | - (ctx->total[0] >> 29)); - - /* Process last bytes. */ - sha256_process_block(ctx->buffer, bytes + pad + 8, ctx); - - /* Put result from CTX in first 32 bytes following RESBUF. */ - for (i = 0; i < 8; ++i) - ((uint32_t *) resbuf)[i] = SWAP(ctx->H[i]); - - return resbuf; -} - -static void -sha256_process_bytes(const void *buffer, size_t len, struct sha256_ctx *ctx) -{ - /* When we already have some bits in our internal buffer concatenate - both inputs first. */ - if (ctx->buflen != 0) { - size_t left_over = ctx->buflen; - size_t add = 128 - left_over > len ? len : 128 - left_over; - - memcpy(&ctx->buffer[left_over], buffer, add); - ctx->buflen += add; - - if (ctx->buflen > 64) { - sha256_process_block(ctx->buffer, ctx->buflen & ~63, ctx); - - ctx->buflen &= 63; - /* The regions in the following copy operation cannot overlap. */ - memcpy(ctx->buffer, &ctx->buffer[(left_over + add) & ~63], - ctx->buflen); - } - - buffer = (const char *)buffer + add; - len -= add; - } - - /* Process available complete blocks. */ - if (len >= 64) { -/* To check alignment gcc has an appropriate operator. Other - compilers don't. */ -#if __GNUC__ >= 2 -# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint32_t) != 0) -#else -# define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint32_t) != 0) -#endif - if (UNALIGNED_P(buffer)) - while (len > 64) { - sha256_process_block(memcpy(ctx->buffer, buffer, 64), 64, ctx); - buffer = (const char *)buffer + 64; - len -= 64; - } else { - sha256_process_block(buffer, len & ~63, ctx); - buffer = (const char *)buffer + (len & ~63); - len &= 63; - } - } - - /* Move remaining bytes into internal buffer. */ - if (len > 0) { - size_t left_over = ctx->buflen; - - memcpy(&ctx->buffer[left_over], buffer, len); - left_over += len; - if (left_over >= 64) { - sha256_process_block(ctx->buffer, 64, ctx); - left_over -= 64; - memcpy(ctx->buffer, &ctx->buffer[64], left_over); - } - ctx->buflen = left_over; - } -} - -/* Define our magic string to mark salt for SHA256 "encryption" - replacement. */ -static const char sha256_salt_prefix[] = "$5$"; - -/* Prefix for optional rounds specification. */ -static const char sha256_rounds_prefix[] = "rounds="; - -/* Maximum salt string length. */ -#define SALT_LEN_MAX 16 -/* Default number of rounds if not explicitly specified. */ -#define ROUNDS_DEFAULT 5000 -/* Minimum number of rounds. */ -#define ROUNDS_MIN 1000 -/* Maximum number of rounds. */ -#define ROUNDS_MAX 999999999 - -/* Table with characters for base64 transformation. */ -static const char b64t[64] = - "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - -static char *sha256_crypt_r(const char *key, const char *salt, char *buffer, - int buflen) -{ - unsigned char alt_result[32] - __attribute__ ((__aligned__(__alignof__(uint32_t)))); - unsigned char temp_result[32] - __attribute__ ((__aligned__(__alignof__(uint32_t)))); - struct sha256_ctx ctx; - struct sha256_ctx alt_ctx; - size_t salt_len; - size_t key_len; - size_t cnt; - char *cp; - char *copied_key = NULL; - char *copied_salt = NULL; - char *p_bytes; - char *s_bytes; - /* Default number of rounds. */ - size_t rounds = ROUNDS_DEFAULT; - bool rounds_custom = false; - - /* Find beginning of salt string. The prefix should normally always - be present. Just in case it is not. */ - if (strncmp(sha256_salt_prefix, salt, sizeof(sha256_salt_prefix) - 1) == 0) - /* Skip salt prefix. */ - salt += sizeof(sha256_salt_prefix) - 1; - - if (strncmp(salt, sha256_rounds_prefix, sizeof(sha256_rounds_prefix) - 1) - == 0) { - const char *num = salt + sizeof(sha256_rounds_prefix) - 1; - char *endp; - unsigned long int srounds = strtoul(num, &endp, 10); - if (*endp == '$') { - salt = endp + 1; - rounds = MAX(ROUNDS_MIN, MIN(srounds, ROUNDS_MAX)); - rounds_custom = true; - } - } - - salt_len = MIN(strcspn(salt, "$"), SALT_LEN_MAX); - key_len = strlen(key); - - if ((key - (char *)0) % __alignof__(uint32_t) != 0) { - char *tmp = (char *)alloca(key_len + __alignof__(uint32_t)); - key = copied_key = memcpy(tmp + __alignof__(uint32_t) - - (tmp - (char *)0) % __alignof__(uint32_t), - key, key_len); - } - - if ((salt - (char *)0) % __alignof__(uint32_t) != 0) { - char *tmp = (char *)alloca(salt_len + __alignof__(uint32_t)); - salt = copied_salt = memcpy(tmp + __alignof__(uint32_t) - - (tmp - (char *)0) % __alignof__(uint32_t), - salt, salt_len); - } - - /* Prepare for the real work. */ - sha256_init_ctx(&ctx); - - /* Add the key string. */ - sha256_process_bytes(key, key_len, &ctx); - - /* The last part is the salt string. This must be at most 8 - characters and it ends at the first `$' character (for - compatibility with existing implementations). */ - sha256_process_bytes(salt, salt_len, &ctx); - - /* Compute alternate SHA256 sum with input KEY, SALT, and KEY. The - final result will be added to the first context. */ - sha256_init_ctx(&alt_ctx); - - /* Add key. */ - sha256_process_bytes(key, key_len, &alt_ctx); - - /* Add salt. */ - sha256_process_bytes(salt, salt_len, &alt_ctx); - - /* Add key again. */ - sha256_process_bytes(key, key_len, &alt_ctx); - - /* Now get result of this (32 bytes) and add it to the other - context. */ - sha256_finish_ctx(&alt_ctx, alt_result); - - /* Add for any character in the key one byte of the alternate sum. */ - for (cnt = key_len; cnt > 32; cnt -= 32) - sha256_process_bytes(alt_result, 32, &ctx); - sha256_process_bytes(alt_result, cnt, &ctx); - - /* Take the binary representation of the length of the key and for every - 1 add the alternate sum, for every 0 the key. */ - for (cnt = key_len; cnt > 0; cnt >>= 1) - if ((cnt & 1) != 0) - sha256_process_bytes(alt_result, 32, &ctx); - else - sha256_process_bytes(key, key_len, &ctx); - - /* Create intermediate result. */ - sha256_finish_ctx(&ctx, alt_result); - - /* Start computation of P byte sequence. */ - sha256_init_ctx(&alt_ctx); - - /* For every character in the password add the entire password. */ - for (cnt = 0; cnt < key_len; ++cnt) - sha256_process_bytes(key, key_len, &alt_ctx); - - /* Finish the digest. */ - sha256_finish_ctx(&alt_ctx, temp_result); - - /* Create byte sequence P. */ - cp = p_bytes = alloca(key_len); - for (cnt = key_len; cnt >= 32; cnt -= 32) - cp = mempcpy(cp, temp_result, 32); - memcpy(cp, temp_result, cnt); - - /* Start computation of S byte sequence. */ - sha256_init_ctx(&alt_ctx); - - /* For every character in the password add the entire password. */ - for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt) - sha256_process_bytes(salt, salt_len, &alt_ctx); - - /* Finish the digest. */ - sha256_finish_ctx(&alt_ctx, temp_result); - - /* Create byte sequence S. */ - cp = s_bytes = alloca(salt_len); - for (cnt = salt_len; cnt >= 32; cnt -= 32) - cp = mempcpy(cp, temp_result, 32); - memcpy(cp, temp_result, cnt); - - /* Repeatedly run the collected hash value through SHA256 to burn - CPU cycles. */ - for (cnt = 0; cnt < rounds; ++cnt) { - /* New context. */ - sha256_init_ctx(&ctx); - - /* Add key or last result. */ - if ((cnt & 1) != 0) - sha256_process_bytes(p_bytes, key_len, &ctx); - else - sha256_process_bytes(alt_result, 32, &ctx); - - /* Add salt for numbers not divisible by 3. */ - if (cnt % 3 != 0) - sha256_process_bytes(s_bytes, salt_len, &ctx); - - /* Add key for numbers not divisible by 7. */ - if (cnt % 7 != 0) - sha256_process_bytes(p_bytes, key_len, &ctx); - - /* Add key or last result. */ - if ((cnt & 1) != 0) - sha256_process_bytes(alt_result, 32, &ctx); - else - sha256_process_bytes(p_bytes, key_len, &ctx); - - /* Create intermediate result. */ - sha256_finish_ctx(&ctx, alt_result); - } - - /* Now we can construct the result string. It consists of three - parts. */ - cp = stpncpy(buffer, sha256_salt_prefix, MAX(0, buflen)); - buflen -= sizeof(sha256_salt_prefix) - 1; - - if (rounds_custom) { - int n = snprintf(cp, MAX(0, buflen), "%s%zu$", - sha256_rounds_prefix, rounds); - cp += n; - buflen -= n; - } - - cp = stpncpy(cp, salt, MIN((size_t) MAX(0, buflen), salt_len)); - buflen -= MIN((size_t) MAX(0, buflen), salt_len); - - if (buflen > 0) { - *cp++ = '$'; - --buflen; - } -#define b64_from_24bit(B2, B1, B0, N) \ - do { \ - unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \ - int n = (N); \ - while (n-- > 0 && buflen > 0) \ - { \ - *cp++ = b64t[w & 0x3f]; \ - --buflen; \ - w >>= 6; \ - } \ - } while (0) - - b64_from_24bit(alt_result[0], alt_result[10], alt_result[20], 4); - b64_from_24bit(alt_result[21], alt_result[1], alt_result[11], 4); - b64_from_24bit(alt_result[12], alt_result[22], alt_result[2], 4); - b64_from_24bit(alt_result[3], alt_result[13], alt_result[23], 4); - b64_from_24bit(alt_result[24], alt_result[4], alt_result[14], 4); - b64_from_24bit(alt_result[15], alt_result[25], alt_result[5], 4); - b64_from_24bit(alt_result[6], alt_result[16], alt_result[26], 4); - b64_from_24bit(alt_result[27], alt_result[7], alt_result[17], 4); - b64_from_24bit(alt_result[18], alt_result[28], alt_result[8], 4); - b64_from_24bit(alt_result[9], alt_result[19], alt_result[29], 4); - b64_from_24bit(0, alt_result[31], alt_result[30], 3); - if (buflen <= 0) { - errno = ERANGE; - buffer = NULL; - } else - *cp = '\0'; /* Terminate the string. */ - - /* Clear the buffer for the intermediate result so that people - attaching to processes or reading core dumps cannot get any - information. We do it in this way to clear correct_words[] - inside the SHA256 implementation as well. */ - sha256_init_ctx(&ctx); - sha256_finish_ctx(&ctx, alt_result); - memset(temp_result, '\0', sizeof(temp_result)); - memset(p_bytes, '\0', key_len); - memset(s_bytes, '\0', salt_len); - memset(&ctx, '\0', sizeof(ctx)); - memset(&alt_ctx, '\0', sizeof(alt_ctx)); - if (copied_key != NULL) - memset(copied_key, '\0', key_len); - if (copied_salt != NULL) - memset(copied_salt, '\0', salt_len); - - return buffer; -} - -/* This entry point is equivalent to the `crypt' function in Unix - libcs. */ -char *sha256_crypt(const char *key, const char *salt) -{ - /* We don't want to have an arbitrary limit in the size of the - password. We can compute an upper bound for the size of the - result in advance and so we can prepare the buffer we pass to - `sha256_crypt_r'. */ - static char *buffer; - static int buflen; - int needed = (sizeof(sha256_salt_prefix) - 1 - + sizeof(sha256_rounds_prefix) + 9 + 1 - + strlen(salt) + 1 + 43 + 1); - - if (buflen < needed) { - char *new_buffer = (char *)realloc(buffer, needed); - if (new_buffer == NULL) - return NULL; - - buffer = new_buffer; - buflen = needed; - } - - return sha256_crypt_r(key, salt, buffer, buflen); -} - -static void sha256crypt_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(sha256crypt_init); -MODULE_EXIT(sha256crypt_exit); diff --git a/com32/elflink/modules/sha512crypt.c b/com32/elflink/modules/sha512crypt.c deleted file mode 100644 index 617423c2..00000000 --- a/com32/elflink/modules/sha512crypt.c +++ /dev/null @@ -1,606 +0,0 @@ -/* SHA512-based Unix crypt implementation. - Released into the Public Domain by Ulrich Drepper <drepper@redhat.com>. */ - -#include <alloca.h> -#include <endian.h> -#include <errno.h> -#include <limits.h> -#include <stdbool.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <minmax.h> -#include <sys/types.h> -#include <sys/module.h> - -#include "xcrypt.h" - -static int sha512crypt_init() -{ - return 0; // Nothing to do; return success -} - -#define MIN(x,y) min(x,y) -#define MAX(x,y) max(x,y) - -/* Structure to save state of computation between the single steps. */ -struct sha512_ctx { - uint64_t H[8]; - - uint64_t total[2]; - uint64_t buflen; - char buffer[256]; /* NB: always correctly aligned for uint64_t. */ -}; - -#if __BYTE_ORDER == __LITTLE_ENDIAN -# define SWAP(n) \ - (((n) << 56) \ - | (((n) & 0xff00) << 40) \ - | (((n) & 0xff0000) << 24) \ - | (((n) & 0xff000000) << 8) \ - | (((n) >> 8) & 0xff000000) \ - | (((n) >> 24) & 0xff0000) \ - | (((n) >> 40) & 0xff00) \ - | ((n) >> 56)) -#else -# define SWAP(n) (n) -#endif - -/* This array contains the bytes used to pad the buffer to the next - 64-byte boundary. (FIPS 180-2:5.1.2) */ -static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ... */ }; - -/* Constants for SHA512 from FIPS 180-2:4.2.3. */ -static const uint64_t K[80] = { - UINT64_C(0x428a2f98d728ae22), UINT64_C(0x7137449123ef65cd), - UINT64_C(0xb5c0fbcfec4d3b2f), UINT64_C(0xe9b5dba58189dbbc), - UINT64_C(0x3956c25bf348b538), UINT64_C(0x59f111f1b605d019), - UINT64_C(0x923f82a4af194f9b), UINT64_C(0xab1c5ed5da6d8118), - UINT64_C(0xd807aa98a3030242), UINT64_C(0x12835b0145706fbe), - UINT64_C(0x243185be4ee4b28c), UINT64_C(0x550c7dc3d5ffb4e2), - UINT64_C(0x72be5d74f27b896f), UINT64_C(0x80deb1fe3b1696b1), - UINT64_C(0x9bdc06a725c71235), UINT64_C(0xc19bf174cf692694), - UINT64_C(0xe49b69c19ef14ad2), UINT64_C(0xefbe4786384f25e3), - UINT64_C(0x0fc19dc68b8cd5b5), UINT64_C(0x240ca1cc77ac9c65), - UINT64_C(0x2de92c6f592b0275), UINT64_C(0x4a7484aa6ea6e483), - UINT64_C(0x5cb0a9dcbd41fbd4), UINT64_C(0x76f988da831153b5), - UINT64_C(0x983e5152ee66dfab), UINT64_C(0xa831c66d2db43210), - UINT64_C(0xb00327c898fb213f), UINT64_C(0xbf597fc7beef0ee4), - UINT64_C(0xc6e00bf33da88fc2), UINT64_C(0xd5a79147930aa725), - UINT64_C(0x06ca6351e003826f), UINT64_C(0x142929670a0e6e70), - UINT64_C(0x27b70a8546d22ffc), UINT64_C(0x2e1b21385c26c926), - UINT64_C(0x4d2c6dfc5ac42aed), UINT64_C(0x53380d139d95b3df), - UINT64_C(0x650a73548baf63de), UINT64_C(0x766a0abb3c77b2a8), - UINT64_C(0x81c2c92e47edaee6), UINT64_C(0x92722c851482353b), - UINT64_C(0xa2bfe8a14cf10364), UINT64_C(0xa81a664bbc423001), - UINT64_C(0xc24b8b70d0f89791), UINT64_C(0xc76c51a30654be30), - UINT64_C(0xd192e819d6ef5218), UINT64_C(0xd69906245565a910), - UINT64_C(0xf40e35855771202a), UINT64_C(0x106aa07032bbd1b8), - UINT64_C(0x19a4c116b8d2d0c8), UINT64_C(0x1e376c085141ab53), - UINT64_C(0x2748774cdf8eeb99), UINT64_C(0x34b0bcb5e19b48a8), - UINT64_C(0x391c0cb3c5c95a63), UINT64_C(0x4ed8aa4ae3418acb), - UINT64_C(0x5b9cca4f7763e373), UINT64_C(0x682e6ff3d6b2b8a3), - UINT64_C(0x748f82ee5defb2fc), UINT64_C(0x78a5636f43172f60), - UINT64_C(0x84c87814a1f0ab72), UINT64_C(0x8cc702081a6439ec), - UINT64_C(0x90befffa23631e28), UINT64_C(0xa4506cebde82bde9), - UINT64_C(0xbef9a3f7b2c67915), UINT64_C(0xc67178f2e372532b), - UINT64_C(0xca273eceea26619c), UINT64_C(0xd186b8c721c0c207), - UINT64_C(0xeada7dd6cde0eb1e), UINT64_C(0xf57d4f7fee6ed178), - UINT64_C(0x06f067aa72176fba), UINT64_C(0x0a637dc5a2c898a6), - UINT64_C(0x113f9804bef90dae), UINT64_C(0x1b710b35131c471b), - UINT64_C(0x28db77f523047d84), UINT64_C(0x32caab7b40c72493), - UINT64_C(0x3c9ebe0a15c9bebc), UINT64_C(0x431d67c49c100d4c), - UINT64_C(0x4cc5d4becb3e42b6), UINT64_C(0x597f299cfc657e2a), - UINT64_C(0x5fcb6fab3ad6faec), UINT64_C(0x6c44198c4a475817) -}; - -/* Process LEN bytes of BUFFER, accumulating context into CTX. - It is assumed that LEN % 128 == 0. */ -static void -sha512_process_block(const void *buffer, size_t len, struct sha512_ctx *ctx) -{ - unsigned int t; - const uint64_t *words = buffer; - size_t nwords = len / sizeof(uint64_t); - uint64_t a = ctx->H[0]; - uint64_t b = ctx->H[1]; - uint64_t c = ctx->H[2]; - uint64_t d = ctx->H[3]; - uint64_t e = ctx->H[4]; - uint64_t f = ctx->H[5]; - uint64_t g = ctx->H[6]; - uint64_t h = ctx->H[7]; - - /* First increment the byte count. FIPS 180-2 specifies the possible - length of the file up to 2^128 bits. Here we only compute the - number of bytes. Do a double word increment. */ - ctx->total[0] += len; - if (ctx->total[0] < len) - ++ctx->total[1]; - - /* Process all bytes in the buffer with 128 bytes in each round of - the loop. */ - while (nwords > 0) { - uint64_t W[80]; - uint64_t a_save = a; - uint64_t b_save = b; - uint64_t c_save = c; - uint64_t d_save = d; - uint64_t e_save = e; - uint64_t f_save = f; - uint64_t g_save = g; - uint64_t h_save = h; - - /* Operators defined in FIPS 180-2:4.1.2. */ -#define Ch(x, y, z) ((x & y) ^ (~x & z)) -#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) -#define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39)) -#define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41)) -#define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7)) -#define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6)) - - /* It is unfortunate that C does not provide an operator for - cyclic rotation. Hope the C compiler is smart enough. */ -#define CYCLIC(w, s) ((w >> s) | (w << (64 - s))) - - /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */ - for (t = 0; t < 16; ++t) { - W[t] = SWAP(*words); - ++words; - } - for (t = 16; t < 80; ++t) - W[t] = R1(W[t - 2]) + W[t - 7] + R0(W[t - 15]) + W[t - 16]; - - /* The actual computation according to FIPS 180-2:6.3.2 step 3. */ - for (t = 0; t < 80; ++t) { - uint64_t T1 = h + S1(e) + Ch(e, f, g) + K[t] + W[t]; - uint64_t T2 = S0(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - } - - /* Add the starting values of the context according to FIPS 180-2:6.3.2 - step 4. */ - a += a_save; - b += b_save; - c += c_save; - d += d_save; - e += e_save; - f += f_save; - g += g_save; - h += h_save; - - /* Prepare for the next round. */ - nwords -= 16; - } - - /* Put checksum in context given as argument. */ - ctx->H[0] = a; - ctx->H[1] = b; - ctx->H[2] = c; - ctx->H[3] = d; - ctx->H[4] = e; - ctx->H[5] = f; - ctx->H[6] = g; - ctx->H[7] = h; -} - -/* Initialize structure containing state of computation. - (FIPS 180-2:5.3.3) */ -static void sha512_init_ctx(struct sha512_ctx *ctx) -{ - ctx->H[0] = UINT64_C(0x6a09e667f3bcc908); - ctx->H[1] = UINT64_C(0xbb67ae8584caa73b); - ctx->H[2] = UINT64_C(0x3c6ef372fe94f82b); - ctx->H[3] = UINT64_C(0xa54ff53a5f1d36f1); - ctx->H[4] = UINT64_C(0x510e527fade682d1); - ctx->H[5] = UINT64_C(0x9b05688c2b3e6c1f); - ctx->H[6] = UINT64_C(0x1f83d9abfb41bd6b); - ctx->H[7] = UINT64_C(0x5be0cd19137e2179); - - ctx->total[0] = ctx->total[1] = 0; - ctx->buflen = 0; -} - -/* Process the remaining bytes in the internal buffer and the usual - prolog according to the standard and write the result to RESBUF. - - IMPORTANT: On some systems it is required that RESBUF is correctly - aligned for a 32 bits value. */ -static void *sha512_finish_ctx(struct sha512_ctx *ctx, void *resbuf) -{ - unsigned int i; - /* Take yet unprocessed bytes into account. */ - uint64_t bytes = ctx->buflen; - size_t pad; - - /* Now count remaining bytes. */ - ctx->total[0] += bytes; - if (ctx->total[0] < bytes) - ++ctx->total[1]; - - pad = bytes >= 112 ? 128 + 112 - bytes : 112 - bytes; - memcpy(&ctx->buffer[bytes], fillbuf, pad); - - /* Put the 128-bit file length in *bits* at the end of the buffer. */ - *(uint64_t *) & ctx->buffer[bytes + pad + 8] = SWAP(ctx->total[0] << 3); - *(uint64_t *) & ctx->buffer[bytes + pad] = SWAP((ctx->total[1] << 3) | - (ctx->total[0] >> 61)); - - /* Process last bytes. */ - sha512_process_block(ctx->buffer, bytes + pad + 16, ctx); - - /* Put result from CTX in first 64 bytes following RESBUF. */ - for (i = 0; i < 8; ++i) - ((uint64_t *) resbuf)[i] = SWAP(ctx->H[i]); - - return resbuf; -} - -static void -sha512_process_bytes(const void *buffer, size_t len, struct sha512_ctx *ctx) -{ - /* When we already have some bits in our internal buffer concatenate - both inputs first. */ - if (ctx->buflen != 0) { - size_t left_over = ctx->buflen; - size_t add = 256 - left_over > len ? len : 256 - left_over; - - memcpy(&ctx->buffer[left_over], buffer, add); - ctx->buflen += add; - - if (ctx->buflen > 128) { - sha512_process_block(ctx->buffer, ctx->buflen & ~127, ctx); - - ctx->buflen &= 127; - /* The regions in the following copy operation cannot overlap. */ - memcpy(ctx->buffer, &ctx->buffer[(left_over + add) & ~127], - ctx->buflen); - } - - buffer = (const char *)buffer + add; - len -= add; - } - - /* Process available complete blocks. */ - if (len >= 128) { -#if !_STRING_ARCH_unaligned -/* To check alignment gcc has an appropriate operator. Other - compilers don't. */ -# if __GNUC__ >= 2 -# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint64_t) != 0) -# else -# define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint64_t) != 0) -# endif - if (UNALIGNED_P(buffer)) - while (len > 128) { - sha512_process_block(memcpy(ctx->buffer, buffer, 128), 128, - ctx); - buffer = (const char *)buffer + 128; - len -= 128; - } else -#endif - { - sha512_process_block(buffer, len & ~127, ctx); - buffer = (const char *)buffer + (len & ~127); - len &= 127; - } - } - - /* Move remaining bytes into internal buffer. */ - if (len > 0) { - size_t left_over = ctx->buflen; - - memcpy(&ctx->buffer[left_over], buffer, len); - left_over += len; - if (left_over >= 128) { - sha512_process_block(ctx->buffer, 128, ctx); - left_over -= 128; - memcpy(ctx->buffer, &ctx->buffer[128], left_over); - } - ctx->buflen = left_over; - } -} - -/* Define our magic string to mark salt for SHA512 "encryption" - replacement. */ -static const char sha512_salt_prefix[] = "$6$"; - -/* Prefix for optional rounds specification. */ -static const char sha512_rounds_prefix[] = "rounds="; - -/* Maximum salt string length. */ -#define SALT_LEN_MAX 16 -/* Default number of rounds if not explicitly specified. */ -#define ROUNDS_DEFAULT 5000 -/* Minimum number of rounds. */ -#define ROUNDS_MIN 1000 -/* Maximum number of rounds. */ -#define ROUNDS_MAX 999999999 - -/* Table with characters for base64 transformation. */ -static const char b64t[64] = - "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - -static char *sha512_crypt_r(const char *key, const char *salt, char *buffer, - int buflen) -{ - unsigned char alt_result[64] - __attribute__ ((__aligned__(__alignof__(uint64_t)))); - unsigned char temp_result[64] - __attribute__ ((__aligned__(__alignof__(uint64_t)))); - struct sha512_ctx ctx; - struct sha512_ctx alt_ctx; - size_t salt_len; - size_t key_len; - size_t cnt; - char *cp; - char *copied_key = NULL; - char *copied_salt = NULL; - char *p_bytes; - char *s_bytes; - /* Default number of rounds. */ - size_t rounds = ROUNDS_DEFAULT; - bool rounds_custom = false; - - /* Find beginning of salt string. The prefix should normally always - be present. Just in case it is not. */ - if (strncmp(sha512_salt_prefix, salt, sizeof(sha512_salt_prefix) - 1) == 0) - /* Skip salt prefix. */ - salt += sizeof(sha512_salt_prefix) - 1; - - if (strncmp(salt, sha512_rounds_prefix, sizeof(sha512_rounds_prefix) - 1) - == 0) { - const char *num = salt + sizeof(sha512_rounds_prefix) - 1; - char *endp; - unsigned long int srounds = strtoul(num, &endp, 10); - if (*endp == '$') { - salt = endp + 1; - rounds = MAX(ROUNDS_MIN, MIN(srounds, ROUNDS_MAX)); - rounds_custom = true; - } - } - - salt_len = MIN(strcspn(salt, "$"), SALT_LEN_MAX); - key_len = strlen(key); - - if ((key - (char *)0) % __alignof__(uint64_t) != 0) { - char *tmp = (char *)alloca(key_len + __alignof__(uint64_t)); - key = copied_key = memcpy(tmp + __alignof__(uint64_t) - - (tmp - (char *)0) % __alignof__(uint64_t), - key, key_len); - } - - if ((salt - (char *)0) % __alignof__(uint64_t) != 0) { - char *tmp = (char *)alloca(salt_len + __alignof__(uint64_t)); - salt = copied_salt = memcpy(tmp + __alignof__(uint64_t) - - (tmp - (char *)0) % __alignof__(uint64_t), - salt, salt_len); - } - - /* Prepare for the real work. */ - sha512_init_ctx(&ctx); - - /* Add the key string. */ - sha512_process_bytes(key, key_len, &ctx); - - /* The last part is the salt string. This must be at most 8 - characters and it ends at the first `$' character (for - compatibility with existing implementations). */ - sha512_process_bytes(salt, salt_len, &ctx); - - /* Compute alternate SHA512 sum with input KEY, SALT, and KEY. The - final result will be added to the first context. */ - sha512_init_ctx(&alt_ctx); - - /* Add key. */ - sha512_process_bytes(key, key_len, &alt_ctx); - - /* Add salt. */ - sha512_process_bytes(salt, salt_len, &alt_ctx); - - /* Add key again. */ - sha512_process_bytes(key, key_len, &alt_ctx); - - /* Now get result of this (64 bytes) and add it to the other - context. */ - sha512_finish_ctx(&alt_ctx, alt_result); - - /* Add for any character in the key one byte of the alternate sum. */ - for (cnt = key_len; cnt > 64; cnt -= 64) - sha512_process_bytes(alt_result, 64, &ctx); - sha512_process_bytes(alt_result, cnt, &ctx); - - /* Take the binary representation of the length of the key and for every - 1 add the alternate sum, for every 0 the key. */ - for (cnt = key_len; cnt > 0; cnt >>= 1) - if ((cnt & 1) != 0) - sha512_process_bytes(alt_result, 64, &ctx); - else - sha512_process_bytes(key, key_len, &ctx); - - /* Create intermediate result. */ - sha512_finish_ctx(&ctx, alt_result); - - /* Start computation of P byte sequence. */ - sha512_init_ctx(&alt_ctx); - - /* For every character in the password add the entire password. */ - for (cnt = 0; cnt < key_len; ++cnt) - sha512_process_bytes(key, key_len, &alt_ctx); - - /* Finish the digest. */ - sha512_finish_ctx(&alt_ctx, temp_result); - - /* Create byte sequence P. */ - cp = p_bytes = alloca(key_len); - for (cnt = key_len; cnt >= 64; cnt -= 64) - cp = mempcpy(cp, temp_result, 64); - memcpy(cp, temp_result, cnt); - - /* Start computation of S byte sequence. */ - sha512_init_ctx(&alt_ctx); - - /* For every character in the password add the entire password. */ - for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt) - sha512_process_bytes(salt, salt_len, &alt_ctx); - - /* Finish the digest. */ - sha512_finish_ctx(&alt_ctx, temp_result); - - /* Create byte sequence S. */ - cp = s_bytes = alloca(salt_len); - for (cnt = salt_len; cnt >= 64; cnt -= 64) - cp = mempcpy(cp, temp_result, 64); - memcpy(cp, temp_result, cnt); - - /* Repeatedly run the collected hash value through SHA512 to burn - CPU cycles. */ - for (cnt = 0; cnt < rounds; ++cnt) { - /* New context. */ - sha512_init_ctx(&ctx); - - /* Add key or last result. */ - if ((cnt & 1) != 0) - sha512_process_bytes(p_bytes, key_len, &ctx); - else - sha512_process_bytes(alt_result, 64, &ctx); - - /* Add salt for numbers not divisible by 3. */ - if (cnt % 3 != 0) - sha512_process_bytes(s_bytes, salt_len, &ctx); - - /* Add key for numbers not divisible by 7. */ - if (cnt % 7 != 0) - sha512_process_bytes(p_bytes, key_len, &ctx); - - /* Add key or last result. */ - if ((cnt & 1) != 0) - sha512_process_bytes(alt_result, 64, &ctx); - else - sha512_process_bytes(p_bytes, key_len, &ctx); - - /* Create intermediate result. */ - sha512_finish_ctx(&ctx, alt_result); - } - - /* Now we can construct the result string. It consists of three - parts. */ - cp = stpncpy(buffer, sha512_salt_prefix, MAX(0, buflen)); - buflen -= sizeof(sha512_salt_prefix) - 1; - - if (rounds_custom) { - int n = snprintf(cp, MAX(0, buflen), "%s%zu$", - sha512_rounds_prefix, rounds); - cp += n; - buflen -= n; - } - - cp = stpncpy(cp, salt, MIN((size_t) MAX(0, buflen), salt_len)); - buflen -= MIN((size_t) MAX(0, buflen), salt_len); - - if (buflen > 0) { - *cp++ = '$'; - --buflen; - } -#define b64_from_24bit(B2, B1, B0, N) \ - do { \ - unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \ - int n = (N); \ - while (n-- > 0 && buflen > 0) \ - { \ - *cp++ = b64t[w & 0x3f]; \ - --buflen; \ - w >>= 6; \ - } \ - } while (0) - - b64_from_24bit(alt_result[0], alt_result[21], alt_result[42], 4); - b64_from_24bit(alt_result[22], alt_result[43], alt_result[1], 4); - b64_from_24bit(alt_result[44], alt_result[2], alt_result[23], 4); - b64_from_24bit(alt_result[3], alt_result[24], alt_result[45], 4); - b64_from_24bit(alt_result[25], alt_result[46], alt_result[4], 4); - b64_from_24bit(alt_result[47], alt_result[5], alt_result[26], 4); - b64_from_24bit(alt_result[6], alt_result[27], alt_result[48], 4); - b64_from_24bit(alt_result[28], alt_result[49], alt_result[7], 4); - b64_from_24bit(alt_result[50], alt_result[8], alt_result[29], 4); - b64_from_24bit(alt_result[9], alt_result[30], alt_result[51], 4); - b64_from_24bit(alt_result[31], alt_result[52], alt_result[10], 4); - b64_from_24bit(alt_result[53], alt_result[11], alt_result[32], 4); - b64_from_24bit(alt_result[12], alt_result[33], alt_result[54], 4); - b64_from_24bit(alt_result[34], alt_result[55], alt_result[13], 4); - b64_from_24bit(alt_result[56], alt_result[14], alt_result[35], 4); - b64_from_24bit(alt_result[15], alt_result[36], alt_result[57], 4); - b64_from_24bit(alt_result[37], alt_result[58], alt_result[16], 4); - b64_from_24bit(alt_result[59], alt_result[17], alt_result[38], 4); - b64_from_24bit(alt_result[18], alt_result[39], alt_result[60], 4); - b64_from_24bit(alt_result[40], alt_result[61], alt_result[19], 4); - b64_from_24bit(alt_result[62], alt_result[20], alt_result[41], 4); - b64_from_24bit(0, 0, alt_result[63], 2); - - if (buflen <= 0) { - errno = ERANGE; - buffer = NULL; - } else - *cp = '\0'; /* Terminate the string. */ - - /* Clear the buffer for the intermediate result so that people - attaching to processes or reading core dumps cannot get any - information. We do it in this way to clear correct_words[] - inside the SHA512 implementation as well. */ - sha512_init_ctx(&ctx); - sha512_finish_ctx(&ctx, alt_result); - memset(temp_result, '\0', sizeof(temp_result)); - memset(p_bytes, '\0', key_len); - memset(s_bytes, '\0', salt_len); - memset(&ctx, '\0', sizeof(ctx)); - memset(&alt_ctx, '\0', sizeof(alt_ctx)); - if (copied_key != NULL) - memset(copied_key, '\0', key_len); - if (copied_salt != NULL) - memset(copied_salt, '\0', salt_len); - - return buffer; -} - -/* This entry point is equivalent to the `crypt' function in Unix - libcs. */ -char *sha512_crypt(const char *key, const char *salt) -{ - /* We don't want to have an arbitrary limit in the size of the - password. We can compute an upper bound for the size of the - result in advance and so we can prepare the buffer we pass to - `sha512_crypt_r'. */ - static char *buffer; - static int buflen; - int needed = (sizeof(sha512_salt_prefix) - 1 - + sizeof(sha512_rounds_prefix) + 9 + 1 - + strlen(salt) + 1 + 86 + 1); - - if (buflen < needed) { - char *new_buffer = (char *)realloc(buffer, needed); - if (new_buffer == NULL) - return NULL; - - buffer = new_buffer; - buflen = needed; - } - - return sha512_crypt_r(key, salt, buffer, buflen); -} - -static void sha512crypt_exit() -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(sha512crypt_init); -MODULE_EXIT(sha512crypt_exit); diff --git a/com32/elflink/modules/test.c b/com32/elflink/modules/test.c deleted file mode 100644 index 13892fb0..00000000 --- a/com32/elflink/modules/test.c +++ /dev/null @@ -1,109 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2007-2008 H. Peter Anvin - All Rights Reserved - * Copyright 2009 Intel Corporation; author: H. Peter Anvin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall - * be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * ----------------------------------------------------------------------- */ - -/* - * linux.c - * - * Sample module to load Linux kernels. This module can also create - * a file out of the DHCP return data if running under PXELINUX. - * - * If -dhcpinfo is specified, the DHCP info is written into the file - * /dhcpinfo.dat in the initramfs. - * - * Usage: linux.c32 [-dhcpinfo] kernel arguments... - */ - -#include <stdbool.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <console.h> -#include <syslinux/loadfile.h> -#include <syslinux/linux.h> -#include <dprintf.h> - -//const char *progname = "test.c32"; - -int main(int argc, char *argv[]) -{ - const char *kernel_name; - struct initramfs *initramfs; - char *cmdline; - char *boot_image; - void *kernel_data; - size_t kernel_len; - bool opt_quiet = false; - char **argp, *arg, *p; - - /* - while ((arg = *argp) && arg[0] == '-') { - if (!strcmp("-dhcpinfo", arg)) { - printf("haha\n"); - } else { - fprintf(stderr, "%s: unknown option: %s\n", progname, arg); - return 1; - } - argp++; - } - - if (!arg) { - fprintf(stderr, "%s: missing kernel name\n", progname); - return 1; - } - */ - - //kernel_name = arg; - kernel_name = "vmlinuz"; - - printf("Loading %s... ", kernel_name); - if (loadfile(kernel_name, &kernel_data, &kernel_len)) { - printf("failed!\n"); - goto bail; - } - printf("ok\n"); - - /* Initialize the initramfs chain */ - initramfs = initramfs_init(); - if (!initramfs) - goto bail; - - - if (initramfs_load_archive(initramfs, "initrd.gz")) - dprintf("initrd load failure\n"); - else - dprintf("initrd load success\n"); - - dprintf("1111"); - - /* This should not return... */ - syslinux_boot_linux(kernel_data, kernel_len, initramfs, cmdline); - -bail: - fprintf(stderr, "Kernel load failure (insufficient memory?)\n"); - return 1; -} diff --git a/com32/elflink/modules/unbase64.c b/com32/elflink/modules/unbase64.c deleted file mode 100644 index 86ddfc87..00000000 --- a/com32/elflink/modules/unbase64.c +++ /dev/null @@ -1,91 +0,0 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2005-2008 H. Peter Anvin - All Rights Reserved - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall - * be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * ----------------------------------------------------------------------- */ - -/* - * unbase64.c - * - * Convert a string in base64 format to a byte array. - */ - -#include <string.h> -#include <base64.h> -#include <sys/module.h> - -static int unbase64_init(void) -{ - return 0; // Nothing to do; return success -} - -static const unsigned char _base64chars[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -size_t unbase64(unsigned char *buffer, size_t bufsiz, const char *txt) -{ - unsigned int bits = 0; - int nbits = 0; - char base64tbl[256]; - int i; - char v; - size_t nbytes = 0; - - memset(base64tbl, -1, sizeof base64tbl); - - for (i = 0; _base64chars[i]; i++) { - base64tbl[_base64chars[i]] = i; - } - - /* Also support filesystem safe alternate base64 encoding */ - base64tbl['.'] = 62; - base64tbl['-'] = 62; - base64tbl['_'] = 63; - - while (*txt) { - if ((v = base64tbl[(unsigned char)*txt]) >= 0) { - bits <<= 6; - bits += v; - nbits += 6; - if (nbits >= 8) { - if (nbytes < bufsiz) - *buffer++ = (bits >> (nbits - 8)); - nbytes++; - nbits -= 8; - } - } - txt++; - } - - return nbytes; -} - -static void unbase64_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(unbase64_init); -MODULE_EXIT(unbase64_exit); diff --git a/com32/elflink/modules/vesainfo.c b/com32/elflink/modules/vesainfo.c deleted file mode 100644 index 86a43657..00000000 --- a/com32/elflink/modules/vesainfo.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * vesainfo.c - * - * Dump information about what VESA graphics modes are supported. - */ - -#include <string.h> -#include <stdio.h> -#include <console.h> -#include <com32.h> -#include <inttypes.h> -#include "../lib/sys/vesa/vesa.h" - -/* Wait for a keypress */ -static void wait_key(void) -{ - char ch; - while (fread(&ch, 1, 1, stdin) == 0) ; -} - -static void print_modes(void) -{ - static com32sys_t rm; - struct vesa_general_info *gi; - struct vesa_mode_info *mi; - uint16_t mode, *mode_ptr; - int lines; - - struct vesa_info *vesa; - - vesa = lmalloc(sizeof(*vesa)); - if (!vesa) { - printf("vesainfo.c32: fail in lmalloc\n"); - return; - } - gi = &vesa->gi; - mi = &vesa->mi; - - gi->signature = VBE2_MAGIC; /* Get VBE2 extended data */ - rm.eax.w[0] = 0x4F00; /* Get SVGA general information */ - rm.edi.w[0] = OFFS(gi); - rm.es = SEG(gi); - __intcall(0x10, &rm, &rm); - - if (rm.eax.w[0] != 0x004F) { - printf("No VESA BIOS detected\n"); - goto exit; - } else if (gi->signature != VESA_MAGIC) { - printf("VESA information structure has bad magic, trying anyway...\n"); - } - - printf("VBE version %d.%d\n" - "Mode attrib h_res v_res bpp layout rpos gpos bpos\n", - (gi->version >> 8) & 0xff, gi->version & 0xff); - - lines = 1; - - mode_ptr = GET_PTR(gi->video_mode_ptr); - - while ((mode = *mode_ptr++) != 0xFFFF) { - if (++lines >= 23) { - wait_key(); - lines = 0; - } - - rm.eax.w[0] = 0x4F01; /* Get SVGA mode information */ - rm.ecx.w[0] = mode; - rm.edi.w[0] = OFFS(mi); - rm.es = SEG(mi); - __intcall(0x10, &rm, &rm); - - /* Must be a supported mode */ - if (rm.eax.w[0] != 0x004f) - continue; - - printf("0x%04x 0x%04x %5u %5u %3u %6u %4u %4u %4u\n", - mode, mi->mode_attr, mi->h_res, mi->v_res, mi->bpp, - mi->memory_layout, mi->rpos, mi->gpos, mi->bpos); - } - -exit: - free(vesa); - return; -} - -int main(int argc, char **argv) -{ - print_modes(); - return 0; -} diff --git a/com32/gfxboot/Makefile b/com32/gfxboot/Makefile index 183115f4..f2a73762 100644 --- a/com32/gfxboot/Makefile +++ b/com32/gfxboot/Makefile @@ -13,13 +13,13 @@ topdir = ../.. MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk MODULES = gfxboot.c32 all: $(MODULES) -gfxboot.elf : gfxboot.o realmode_callback.o $(LIBS) $(C_LIBS) +gfxboot.c32 : gfxboot.o realmode_callback.o $(LIBS) $(C_LIBS) $(LD) $(LDFLAGS) -o $@ $^ realmode_callback.o: realmode_callback.asm @@ -31,7 +31,7 @@ realmode_callback.o: realmode_callback.asm $*.tmp $@ tidy dist: - rm -f *.o *.lo *.a *.lst *.elf .*.d *.tmp + rm -f *.o *.lo *.a *.lst .*.d *.tmp clean: tidy rm -f *.lnx diff --git a/com32/gpllib/Makefile b/com32/gpllib/Makefile index 4b7b8468..4f41ca8b 100644 --- a/com32/gpllib/Makefile +++ b/com32/gpllib/Makefile @@ -19,26 +19,24 @@ AUXDIR = $(DATADIR)/syslinux INCDIR = /usr/include COM32DIR = $(AUXDIR)/com32 -all: libcom32gpl.a +all: libcom32gpl.c32 -libcom32gpl.a : $(LIBOBJS) - rm -f $@ - $(AR) cq $@ $^ - $(RANLIB) $@ +libcom32gpl.c32 : $(LIBOBJS) + $(LD) -shared $(LDFLAGS) -o $@ $^ tidy dist clean: - find . \( -name \*.o -o -name \*.a -o -name .\*.d -o -name \*.tmp \) -print0 | \ + find . \( -name \*.o -o -name \*.c32 -o -name .\*.d -o -name \*.tmp \) -print0 | \ xargs -0r rm -f spotless: clean - rm -f *.a + rm -f *.c32 rm -f *~ \#* */*~ */\#* # Mixing in the GPL include files is suboptimal, but I'm not sure # there is a better way to do it. install: all mkdir -m 755 -p $(INSTALLROOT)$(COM32DIR) - install -m 644 libcom32gpl.a $(INSTALLROOT)$(COM32DIR) + install -m 644 libcom32gpl.c32 $(INSTALLROOT)$(COM32DIR) mkdir -p $(INSTALLROOT)$(COM32DIR)/include/ cp -r ../gplinclude $(INSTALLROOT)$(COM32DIR)/include/ diff --git a/com32/hdt/Makefile b/com32/hdt/Makefile index f1873465..65bc1c6c 100644 --- a/com32/hdt/Makefile +++ b/com32/hdt/Makefile @@ -17,7 +17,7 @@ topdir = ../.. MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk LIBS = ../cmenu/libmenu/libmenu.a ../libupload/libcom32upload.a CFLAGS += -I$(com32)/cmenu/libmenu -I$(com32) @@ -51,7 +51,7 @@ QEMU ?= qemu-kvm all: $(MODULES) $(TESTFILES) -hdt.elf : $(OBJS) $(LIBS) $(C_LIBS) +hdt.c32 : $(OBJS) $(LIBS) $(C_LIBS) $(LD) $(LDFLAGS) -o $@ $^ memtest: diff --git a/com32/elflink/modules/cli.h b/com32/include/cli.h index 513c1719..513c1719 100644 --- a/com32/elflink/modules/cli.h +++ b/com32/include/cli.h diff --git a/com32/elflink/modules/sort.h b/com32/include/sort.h index 0b495482..0b495482 100644 --- a/com32/elflink/modules/sort.h +++ b/com32/include/sort.h diff --git a/com32/lib/Makefile b/com32/lib/Makefile index 2ead4258..dac241ae 100644 --- a/com32/lib/Makefile +++ b/com32/lib/Makefile @@ -197,7 +197,6 @@ DYNLIBOBJS = \ LIBOBJS = \ - $(MINLIBOBJS) \ $(DYNLIBOBJS) BINDIR = /usr/bin @@ -207,12 +206,11 @@ AUXDIR = $(DATADIR)/syslinux INCDIR = /usr/include COM32DIR = $(AUXDIR)/com32 -all: libcom32.a libcom32min.a +all: libcom32.c32 libcom32min.a -libcom32.a : $(LIBOBJS) +libcom32.c32 : $(LIBOBJS) rm -f $@ - $(AR) cq $@ $^ - $(RANLIB) $@ + $(LD) -shared $(LDFLAGS) -o $@ $^ $(LIBMODULE_OBJS) : CFLAGS += -DELF_DEBUG libcom32min.a : $(MINLIBOBJS) @@ -231,7 +229,7 @@ spotless: clean install: all mkdir -m 755 -p $(INSTALLROOT)$(COM32DIR) - install -m 644 libcom32.a com32.ld $(INSTALLROOT)$(COM32DIR) + install -m 644 com32.ld $(INSTALLROOT)$(COM32DIR) -rm -rf $(INSTALLROOT)$(COM32DIR)/include cp -r ../include $(INSTALLROOT)$(COM32DIR) diff --git a/com32/libutil/Makefile b/com32/libutil/Makefile index 83e23a0a..5199253f 100644 --- a/com32/libutil/Makefile +++ b/com32/libutil/Makefile @@ -31,19 +31,18 @@ topdir = ../.. MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk LIBOBJS = ansiline.o ansiraw.o get_key.o keyname.o \ sha1hash.o unbase64.o \ - md5.o crypt-md5.o sha256crypt.o sha512crypt.o base64.o + md5.o crypt-md5.o sha256crypt.o sha512crypt.o base64.o \ + quicksort.o LNXLIBOBJS = $(patsubst %.o,%.lo,$(LIBOBJS)) -all: libutil_com.a libutil_lnx.a +all: libutil_com.c32 libutil_lnx.a -libutil_com.a: $(LIBOBJS) - rm -f $@ - $(AR) cq $@ $(LIBOBJS) - $(RANLIB) $@ +libutil_com.c32: $(LIBOBJS) + $(LD) $(LDFLAGS) -o $@ $^ libutil_lnx.a: $(LNXLIBOBJS) rm -f $@ diff --git a/com32/elflink/modules/sort.c b/com32/libutil/quicksort.c index f91cb603..32ac0f01 100644 --- a/com32/elflink/modules/sort.c +++ b/com32/libutil/quicksort.c @@ -6,15 +6,6 @@ */ #include <stdlib.h> -#include <sys/module.h> - -/** - * sort_init - Module entry point. - */ -static int sort_init(void) -{ - return 0; // Nothing to do; return success -} static inline void swap(int *x, int *y) { @@ -66,15 +57,3 @@ void quick_sort(int *nums, int count) { quick_sort_range(nums, 0, count - 1); } - -/** - * sort_exit - Module exit point. - */ -static void sort_exit(void) -{ - // Nothing to do -} - -// Define entry and exit points. -MODULE_INIT(sort_init); -MODULE_EXIT(sort_exit); diff --git a/com32/lua/src/Makefile b/com32/lua/src/Makefile index 14b0e33d..f1ffb7e6 100644 --- a/com32/lua/src/Makefile +++ b/com32/lua/src/Makefile @@ -17,7 +17,7 @@ topdir = ../../.. MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk LNXLIBS = @@ -30,7 +30,7 @@ TESTFILES = OBJS = lua.o -LIBLUA = liblua.a +LIBLUA = liblua.c32 LIBLUA_OBJS := lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o LIBLUA_OBJS += lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o @@ -50,15 +50,13 @@ CFLAGS += -DLUA_ANSI all: $(MODULES) $(TESTFILES) $(LIBLUA) : $(LIBLUA_OBJS) - rm -f $@ - $(AR) cq $@ $^ - $(RANLIB) $@ + $(LD) -shared $(LDFLAGS) -o $@ $^ -lua.elf : $(OBJS) $(LIBLUA) $(C_LIBS) +lua.c32 : $(OBJS) $(LIBLUA) $(C_LIBS) $(LD) $(LDFLAGS) -o $@ $^ tidy dist: - rm -f *.o *.lo *.a *.lst *.elf .*.d *.tmp + rm -f *.o *.lo *.lst *.elf .*.d *.tmp clean: tidy rm -f *.lnx diff --git a/com32/mboot/Makefile b/com32/mboot/Makefile index b7ee1154..02e9f49e 100644 --- a/com32/mboot/Makefile +++ b/com32/mboot/Makefile @@ -17,7 +17,7 @@ topdir = ../.. MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk LNXLIBS = ../libutil/libutil_lnx.a @@ -28,7 +28,7 @@ OBJS = mboot.o map.o mem.o initvesa.o apm.o solaris.o syslinux.o all: $(MODULES) $(TESTFILES) -mboot.elf : $(OBJS) $(C_LIBS) +mboot.c32 : $(OBJS) $(C_LIBS) $(LD) $(LDFLAGS) -o $@ $^ tidy dist: diff --git a/com32/menu/Makefile b/com32/menu/Makefile index b67b997d..5a9b3c6a 100644 --- a/com32/menu/Makefile +++ b/com32/menu/Makefile @@ -16,7 +16,7 @@ topdir = ../.. MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk LNXLIBS = ../libutil/libutil_lnx.a diff --git a/com32/modules/Makefile b/com32/modules/Makefile index e9ce1d1f..9d88d75b 100644 --- a/com32/modules/Makefile +++ b/com32/modules/Makefile @@ -17,32 +17,24 @@ topdir = ../.. MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk MODULES = chain.c32 config.c32 ethersel.c32 dmitest.c32 cpuidtest.c32 \ disk.c32 pcitest.c32 elf.c32 linux.c32 reboot.c32 pmload.c32 \ meminfo.c32 sdi.c32 sanboot.c32 ifcpu64.c32 vesainfo.c32 \ kbdmap.c32 cmd.c32 vpdtest.c32 host.c32 ls.c32 gpxecmd.c32 \ - ifcpu.c32 cpuid.c32 cat.c32 pwd.c32 ifplop.c32 zzjson.c32 whichsys.c32 + ifcpu.c32 cpuid.c32 cat.c32 pwd.c32 ifplop.c32 zzjson.c32 whichsys.c32 \ + hello.c32 TESTFILES = all: $(MODULES) $(TESTFILES) -pcitest.elf : pcitest.o $(LIBS) $(C_LIBS) - $(LD) $(LDFLAGS) -o $@ $^ - -cpuidtest.elf : cpuidtest.o $(GPLLIB) $(LIBS) $(C_LIBS) - $(LD) $(LDFLAGS) -o $@ $^ - .PRECIOUS: %.o dmitest.o: dmitest.c $(CC) $(CFLAGS) $(GPLINCLUDE) -c -o $@ $< -dmitest.elf : dmi_utils.o dmitest.o $(GPLLIB) $(LIBS) $(C_LIBS) - $(LD) $(LDFLAGS) -o $@ $^ - -ethersel.elf : ethersel.o $(LIBS) $(C_LIBS) +dmitest.c32 : dmi_utils.o dmitest.o $(GPLLIB) $(LIBS) $(C_LIBS) $(LD) $(LDFLAGS) -o $@ $^ tidy dist: diff --git a/com32/elflink/modules/hello.c b/com32/modules/hello.c index f28d38d3..f28d38d3 100644 --- a/com32/elflink/modules/hello.c +++ b/com32/modules/hello.c diff --git a/com32/modules/meminfo.c b/com32/modules/meminfo.c index 96006d4c..00d0e14d 100644 --- a/com32/modules/meminfo.c +++ b/com32/modules/meminfo.c @@ -42,27 +42,32 @@ static void dump_e820(void) com32sys_t ireg, oreg; struct e820_data ed; uint32_t type; + void *low_ed; + + low_ed = lmalloc(sizeof ed); + if (!low_ed) + return; memset(&ireg, 0, sizeof ireg); ireg.eax.w[0] = 0xe820; ireg.edx.l = 0x534d4150; ireg.ecx.l = sizeof(struct e820_data); - ireg.edi.w[0] = OFFS(__com32.cs_bounce); - ireg.es = SEG(__com32.cs_bounce); + ireg.edi.w[0] = OFFS(low_ed); + ireg.es = SEG(low_ed); memset(&ed, 0, sizeof ed); ed.extattr = 1; do { - memcpy(__com32.cs_bounce, &ed, sizeof ed); + memcpy(low_ed, &ed, sizeof ed); __intcall(0x15, &ireg, &oreg); if (oreg.eflags.l & EFLAGS_CF || oreg.eax.l != 0x534d4150 || oreg.ecx.l < 20) break; - memcpy(&ed, __com32.cs_bounce, sizeof ed); + memcpy(&ed, low_ed, sizeof ed); if (oreg.ecx.l >= 24) { /* ebx base length end type */ @@ -84,6 +89,8 @@ static void dump_e820(void) ireg.ebx.l = oreg.ebx.l; } while (ireg.ebx.l); + + free(low_ed); } static void dump_legacy(void) @@ -115,10 +122,9 @@ static void dump_legacy(void) oreg.ecx.w[0], oreg.ecx.w[0], oreg.edx.w[0], oreg.edx.w[0] << 6); } -int main(void) +int main(int argc, char **argv) { dump_legacy(); dump_e820(); - return 0; } diff --git a/com32/modules/vesainfo.c b/com32/modules/vesainfo.c index f9b25026..86a43657 100644 --- a/com32/modules/vesainfo.c +++ b/com32/modules/vesainfo.c @@ -20,25 +20,31 @@ static void wait_key(void) static void print_modes(void) { - static com32sys_t rm; - struct vesa_general_info *gi; - struct vesa_mode_info *mi; - uint16_t mode, *mode_ptr; - int lines; - - /* Allocate space in the bounce buffer for these structures */ - gi = &((struct vesa_info *)__com32.cs_bounce)->gi; - mi = &((struct vesa_info *)__com32.cs_bounce)->mi; - - gi->signature = VBE2_MAGIC; /* Get VBE2 extended data */ - rm.eax.w[0] = 0x4F00; /* Get SVGA general information */ - rm.edi.w[0] = OFFS(gi); - rm.es = SEG(gi); - __intcall(0x10, &rm, &rm); + static com32sys_t rm; + struct vesa_general_info *gi; + struct vesa_mode_info *mi; + uint16_t mode, *mode_ptr; + int lines; + + struct vesa_info *vesa; + + vesa = lmalloc(sizeof(*vesa)); + if (!vesa) { + printf("vesainfo.c32: fail in lmalloc\n"); + return; + } + gi = &vesa->gi; + mi = &vesa->mi; + + gi->signature = VBE2_MAGIC; /* Get VBE2 extended data */ + rm.eax.w[0] = 0x4F00; /* Get SVGA general information */ + rm.edi.w[0] = OFFS(gi); + rm.es = SEG(gi); + __intcall(0x10, &rm, &rm); if (rm.eax.w[0] != 0x004F) { printf("No VESA BIOS detected\n"); - return; + goto exit; } else if (gi->signature != VESA_MAGIC) { printf("VESA information structure has bad magic, trying anyway...\n"); } @@ -71,9 +77,13 @@ static void print_modes(void) mode, mi->mode_attr, mi->h_res, mi->v_res, mi->bpp, mi->memory_layout, mi->rpos, mi->gpos, mi->bpos); } + +exit: + free(vesa); + return; } -int main(void) +int main(int argc, char **argv) { print_modes(); return 0; diff --git a/com32/samples/Makefile b/com32/samples/Makefile index 76986d59..167c638c 100644 --- a/com32/samples/Makefile +++ b/com32/samples/Makefile @@ -16,7 +16,7 @@ topdir = ../.. MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk all: hello.c32 resolv.c32 serialinfo.c32 \ localboot.c32 \ diff --git a/com32/sysdump/Makefile b/com32/sysdump/Makefile index 98e7f15a..8763b3c8 100644 --- a/com32/sysdump/Makefile +++ b/com32/sysdump/Makefile @@ -17,7 +17,7 @@ topdir = ../.. MAKEDIR = $(topdir)/mk -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk -include $(topdir)/version.mk LIBS = ../libupload/libcom32upload.a @@ -45,11 +45,11 @@ CFLAGS += -DDATE='"$(DATE)"' all: $(MODULES) $(TESTFILES) -sysdump.elf : $(OBJS) $(LIBS) $(C_LIBS) +sysdump.c32 : $(OBJS) $(LIBS) $(C_LIBS) $(LD) $(LDFLAGS) -o $@ $^ tidy dist: - rm -f *.o *.lo *.a *.lst *.elf .*.d *.tmp + rm -f *.o *.lo *.a *.lst .*.d *.tmp clean: tidy rm -f *.lnx diff --git a/elf_gen_dep.sh b/elf_gen_dep.sh index dba990d4..1c357dbc 100755 --- a/elf_gen_dep.sh +++ b/elf_gen_dep.sh @@ -4,7 +4,7 @@ # Round 1: get all the loacl and external symbols ####################################################### -for i in com32/elflink/modules/*.c32 core/isolinux.elf core/pxelinux.elf com32/elflink/ldlinux/*.c32 +for i in core/isolinux.elf core/pxelinux.elf com32/*/*.c32 com32/*/*/*.c32 do # module=$(echo $i | sed "s/^\(.*\).o$/\1/") diff --git a/mk/com32.mk b/mk/com32.mk index 531459ed..262d2a6c 100644 --- a/mk/com32.mk +++ b/mk/com32.mk @@ -64,7 +64,7 @@ LNXSFLAGS = -g LNXLDFLAGS = -g C_LIBS = $(com32)/libutil/libutil_com.a $(GPLLIB) \ - $(com32)/lib/libcom32.a $(LIBGCC) + $(com32)/lib/libcom32.c32 $(LIBGCC) C_LNXLIBS = $(com32)/libutil/libutil_lnx.a .SUFFIXES: .lss .c .lo .o .elf .c32 .lnx @@ -33,10 +33,18 @@ GCCOPT += $(call gcc_ok,-mpreferred-stack-boundary=2,) com32 = $(topdir)/com32 +ifneq ($(NOGPL),1) +GPLLIB = $(com32)/gpllib/libcom32gpl.c32 +GPLINCLUDE = -I$(com32)/gplinclude +else +GPLLIB = +GPLINCLUDE = +endif + CFLAGS = $(GCCOPT) -W -Wall -march=i386 \ -fomit-frame-pointer -D__COM32__ -DDYNAMIC_MODULE \ -nostdinc -iwithprefix include \ - -I$(com32)/libutil/include -I$(com32)/include -I$(com32)/gplinclude + -I$(com32)/libutil/include -I$(com32)/include $(GPLINCLUDE) SFLAGS = $(GCCOPT) -D__COM32__ -march=i386 LDFLAGS = -m elf_i386 -shared --hash-style=gnu -T $(com32)/lib/elf32.ld LIBGCC := $(shell $(CC) $(GCCOPT) --print-libgcc) @@ -45,6 +53,10 @@ LNXCFLAGS = -I$(com32)/libutil/include -W -Wall -O -g -D_GNU_SOURCE LNXSFLAGS = -g LNXLDFLAGS = -g +C_LIBS = $(com32)/libutil/libutil_com.c32 $(GPLLIB) \ + $(com32)/lib/libcom32.c32 $(LIBGCC) +C_LNXLIBS = $(com32)/libutil/libutil_lnx.a + .SUFFIXES: .lss .c .o .PRECIOUS: %.o @@ -64,8 +76,8 @@ LNXLDFLAGS = -g $(CC) $(LNXCFLAGS) -c -o $@ $< .PRECIOUS: %.lnx -%.lnx: %.lo $(LNXLIBS) - $(CC) $(LNXLDFLAGS) -o $@ $^ +%.lnx: %.lo $(LNXLIBS) $(C_LNXLIBS) + $(CC) $(LNXCFLAGS) -o $@ $^ %.c32: %.o $(LD) $(LDFLAGS) -o $@ $^ @@ -15,7 +15,7 @@ ## ## Include the COM32 common configurables -include $(MAKEDIR)/com32.mk +include $(MAKEDIR)/elf.mk # CFLAGS = $(GCCOPT) $(GCCWARN) -march=i386 \ # -fomit-frame-pointer -D__COM32__ \ |