Syslinux library code
authorhpa <hpa>
Thu, 30 Jan 2003 01:47:48 +0000 (01:47 +0000)
committerhpa <hpa>
Thu, 30 Jan 2003 01:47:48 +0000 (01:47 +0000)
syslxmod.c [new file with mode: 0644]

diff --git a/syslxmod.c b/syslxmod.c
new file mode 100644 (file)
index 0000000..faf71d8
--- /dev/null
@@ -0,0 +1,107 @@
+#ident "$Id$"
+/* ----------------------------------------------------------------------- *
+ *   
+ *   Copyright 1998-2003 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., 675 Mass Ave, Cambridge MA 02139,
+ *   USA; either version 2 of the License, or (at your option) any later
+ *   version; incorporated herein by reference.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * syslxmod.c - Code to provide a SYSLINUX code set to an installer.
+ */
+
+#define _XOPEN_SOURCE 500      /* Required on glibc 2.x */
+#define _BSD_SOURCE
+#include <alloca.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <mntent.h>
+#include <paths.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "syslinux.h"
+
+enum bs_offsets {
+  bsJump          = 0x00,
+  bsOemName       = 0x03,
+  bsBytesPerSec   = 0x0b,
+  bsSecPerClust   = 0x0d,
+  bsResSectors    = 0x0e,
+  bsFATs          = 0x10,
+  bsRootDirEnts   = 0x11,
+  bsSectors       = 0x13,
+  bsMedia         = 0x15,
+  bsFATsecs       = 0x16,
+  bsSecPerTrack   = 0x18,
+  bsHeads         = 0x1a,
+  bsHiddenSecs    = 0x1c,
+  bsHugeSectors   = 0x20,
+  bsDriveNumber   = 0x24,
+  bsReserved1     = 0x25,
+  bsBootSignature = 0x26,
+  bsVolumeID      = 0x27,
+  bsVolumeLabel   = 0x2b,
+  bsFileSysType   = 0x36,
+  bsCode          = 0x3e,
+  bsSignature     = 0x1fe
+};
+
+#define bsHead      bsJump
+#define bsHeadLen   (bsBytesPerSec-bsHead)
+#define bsCodeLen   (bsSignature-bsCode)
+
+/*
+ * Access functions for littleendian numbers, possibly misaligned.
+ */
+static inline u_int16_t get_16(unsigned char *p)
+{
+  return (u_int16_t)p[0] + ((u_int16_t)p[1] << 8);
+}
+
+static inline u_int32_t get_32(unsigned char *p)
+{
+  return (u_int32_t)p[0] + ((u_int32_t)p[1] << 8) +
+    ((u_int32_t)p[2] << 16) + ((u_int32_t)p[3] << 24);
+}
+
+static inline void set_16(unsigned char *p, u_int16_t v)
+{
+  p[0] = (v & 0xff);
+  p[1] = ((v >> 8) & 0xff);
+}
+
+#if 0                          /* Not needed */
+static inline void set_32(unsigned char *p, u_int32_t v)
+{
+  p[0] = (v & 0xff);
+  p[1] = ((v >> 8) & 0xff);
+  p[2] = ((v >> 16) & 0xff);
+  p[3] = ((v >> 24) & 0xff);
+}
+#endif
+
+/* Patch the code so that we're running in stupid mode */
+void syslinux_make_stupid(void)
+{
+  /* Access only one sector at a time */
+  set_16(syslinux_ldlinux+PATCH_OFFSET, 1);
+}
+  
+void syslinux_make_bootsect(void *bs)
+{
+  unsigned char *bootsect = bs;
+
+  memcpy(bootsect+bsHead, syslinux_bootsect+bsHead, bsHeadLen);
+  memcpy(bootsect+bsCode, syslinux_bootsect+bsCode, bsCodeLen);
+}