--- lphdisk-0.9.1.ds1.orig/Makefile
+++ lphdisk-0.9.1.ds1/Makefile
@@ -7,34 +7,18 @@
INSTALL_PREFIX = /usr/local
CFLAGS = -g -Wall
-LIBS =
-
-LRMIDIR = lrmi-0.6m
+LDLIBS = -lx86
all: lphdisk
-lphdisk: lphdisk.o lrmi.o
- $(CC) $(CFLAGS) -o lphdisk lphdisk.o lrmi.o $(LIBS)
-
-lphdisk.o: lphdisk.c lrmi.h vbe.h
-
-lrmi.o:
- cd $(LRMIDIR) && $(MAKE) $@
- cp $(LRMIDIR)/lrmi.o .
-
-%.h: $(LRMIDIR)/%.h
- cp $^ $@
-
install: all
install -m 755 lphdisk $(INSTALL_PREFIX)/sbin
install -m 644 lphdisk.8 $(INSTALL_PREFIX)/man/man8
clean:
- cd $(LRMIDIR) && $(MAKE) $@
- rm -f *.o lrmi.h vbe.h
+ rm -f *.o
distclean: clean
- cd $(LRMIDIR) && $(MAKE) $@
rm -f lphdisk
.PHONY: all install clean distclean
--- lphdisk-0.9.1.ds1.orig/lphdisk.c
+++ lphdisk-0.9.1.ds1/lphdisk.c
@@ -19,8 +19,10 @@
Be careful!
*/
+#define _LARGEFILE64_SOURCE
#include <stdio.h>
#include <stdlib.h>
+#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdarg.h>
@@ -29,7 +31,7 @@
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/io.h>
-#include "lrmi.h"
+#include <libx86.h>
#include "vbe.h"
/* General Program Defines: */
@@ -100,58 +102,6 @@
/* General Purpose Utility Routines */
/*****************************************************************************/
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-/* The following is a hack to take advantage of the ext2 "_llseek" system */
-/* call to do seeks to "long long" offsets under linux (this is needed to */
-/* seek to sectors beyond 4194303 (2GB)). This isn't directly supported by */
-/* glibc, so we need to make our own interface function for it. We should */
-/* be able to get the _NR__llseek define from linux/unistd.h. From this we */
-/* can construct a wrapper to perform the right system call. */
-
-#include <linux/unistd.h> /* for __NR__llseek */
-
-typedef long long lloff_t;
-
-#ifdef __NR__llseek
-
-static _syscall5(int,_llseek, unsigned int,fd, unsigned long,offset_high,
- unsigned long,offset_low, lloff_t *,result,
- unsigned int,origin)
-
-lloff_t llseek (unsigned int fd, lloff_t offset, unsigned int origin) {
- lloff_t result;
- int retval;
-
- retval = _llseek (fd, ((unsigned long long) offset) >> 32,
- ((unsigned long long) offset) & 0xffffffff,
- &result, origin);
- return (retval == -1 ? (lloff_t) retval : result);
-}
-
-#else /* __NR__llseek */
-
-/* Somehow, __NR__llseek wasn't in linux/unistd.h. This shouldn't ever */
-/* happen, but better safe than sorry.. The best we can do is emulate it */
-/* with lseek, and hope we don't get an offset that's too large (throw an */
-/* error if we do) */
-
-lloff_t llseek (unsigned int fd, lloff_t offset, unsigned int origin) {
- off_t offt_offset = (off_t) offset;
-
- if ((lloff_t)offt_offset != offset) {
- /* converting to off_t and back yields different result, indicating an */
- /* overflow.. */
- errno = EINVAL;
- return -1;
- } else {
- return lseek(fd, offt_offset, origin);
- }
-}
-
-#endif /* __NR__llseek */
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
#define get16(p) get_int_le(p,2)
#define get32(p) get_int_le(p,4)
@@ -189,9 +139,9 @@
/* success, nonzero on error. */
int seek_sector (int fd, size_t secno) {
- lloff_t offset = (lloff_t) secno * SECTOR_SIZE;
+ off64_t offset = (off64_t) secno * SECTOR_SIZE;
- if (llseek(fd, offset, SEEK_SET) == (lloff_t) -1)
+ if (lseek64(fd, offset, SEEK_SET) == (off64_t) -1)
return -1;
return 0;
@@ -556,25 +506,29 @@
int meminfo_physmem(void) {
FILE *f;
- unsigned int size;
+ unsigned int size = 0;
int ramsize;
+ char s[128];
if (!(f = fopen(meminfo_filename, "r"))) {
debug("Unable to open %s: %s\n", meminfo_filename, strerror(errno));
return 0;
}
- fscanf(f, "%*[^\n]\n"); /* Read the header line and discard it */
- if (fscanf(f, "Mem: %u", &size) != 1) {
+ while (fgets(s, sizeof(s), f)) {
+ if (sscanf(s, "MemTotal: %u", &size) == 1) {
+ break;
+ }
+ }
+ if (size == 0) {
debug("Parse of %s failed.\n", meminfo_filename);
return 0;
}
fclose(f);
- /* convert to KB and then round up to the next power of 2 (since RAM */
+ /* size is in KB and then round up to the next power of 2 (since RAM */
/* sizes don't come in anything else, so this should correct for the */
/* kernel size, etc) */
- size >>= 10;
debug("%s reports memory size of %d KB", meminfo_filename, size);
for (ramsize = 1; size; size >>= 1) ramsize <<= 1;
@@ -718,22 +672,22 @@
{"force", 0, 0, 'f'},
{0,0,0,0}};
-const char usage_string[] = "\
-Usage: %1$s [options] [device]
-Prepare a hibernation partition for APM suspend-to-disk.
-
-options:
- -h, --help Display brief usage and option information (this screen)
- -p, --probeonly Only calculate and display required size, do not format
- -q, --quiet Turn off informational messages, useful for scripts
- -d, --debug Turn on (verbose) debugging messages
- -n, --nowrite Do not actually write to the disk
- -f, --force **DANGEROUS** Format without regard to potential problems
-
-'device' should be a raw disk device (not a partition). The default device
-is /dev/hda.
-
-(%2$s)\n\n";
+const char usage_string[] = ""
+"Usage: %1$s [options] [device]\n"
+"Prepare a hibernation partition for APM suspend-to-disk.\n"
+"\n"
+"options:\n"
+" -h, --help Display brief usage and option information (this screen)\n"
+" -p, --probeonly Only calculate and display required size, do not format\n"
+" -q, --quiet Turn off informational messages, useful for scripts\n"
+" -d, --debug Turn on (verbose) debugging messages\n"
+" -n, --nowrite Do not actually write to the disk\n"
+" -f, --force **DANGEROUS** Format without regard to potential problems\n"
+"\n"
+"'device' should be a raw disk device (not a partition). The default device\n"
+"is /dev/hda.\n"
+"\n"
+"(%2$s)\n\n";
void print_usage (void) {
char *progname = rindex(argv0, '/');
@@ -750,7 +704,7 @@
dev_t dev;
int partition;
int ramsize, vramsize, required_size;
- size_t required_sectors;
+ size_t required_sectors = 0;
argv0 = argv[0];
@@ -821,9 +775,9 @@
}
if (!required_size) {
- if (!quiet_flag) printf("Reccomended partition size is unknown.\n");
+ if (!quiet_flag) printf("Recommended partition size is unknown.\n");
} else {
- if (!quiet_flag) printf("Reccomended partition size is %d MB"
+ if (!quiet_flag) printf("Recommended partition size is %d MB"
" (%d sectors)\n", ((required_size+1023) >> 10),
required_sectors);
}
@@ -923,7 +877,7 @@
if ((pi[partition-1].size < required_sectors) && !quiet_flag) {
fprintf(stderr, "Warning: hibernate partition size (%d) is smaller than"
- " reccomended size (%d).\n", pi[partition-1].size,
+ " recommended size (%d).\n", pi[partition-1].size,
required_sectors);
}
--- lphdisk-0.9.1.ds1.orig/vbe.h
+++ lphdisk-0.9.1.ds1/vbe.h
@@ -0,0 +1,95 @@
+/*
+This file is in the public domain.
+*/
+
+#ifndef _VBE_H
+#define _VBE_H
+
+/* structures for vbe 2.0 */
+
+struct vbe_info_block {
+ char vbe_signature[4];
+ short vbe_version;
+ unsigned short oem_string_off;
+ unsigned short oem_string_seg;
+ int capabilities;
+ unsigned short video_mode_list_off;
+ unsigned short video_mode_list_seg;
+ short total_memory;
+ short oem_software_rev;
+ unsigned short oem_vendor_name_off;
+ unsigned short oem_vendor_name_seg;
+ unsigned short oem_product_name_off;
+ unsigned short oem_product_name_seg;
+ unsigned short oem_product_rev_off;
+ unsigned short oem_product_rev_seg;
+ char reserved[222];
+ char oem_data[256];
+} __attribute__ ((packed));
+
+#define VBE_ATTR_MODE_SUPPORTED (1 << 0)
+#define VBE_ATTR_TTY (1 << 2)
+#define VBE_ATTR_COLOR (1 << 3)
+#define VBE_ATTR_GRAPHICS (1 << 4)
+#define VBE_ATTR_NOT_VGA (1 << 5)
+#define VBE_ATTR_NOT_WINDOWED (1 << 6)
+#define VBE_ATTR_LINEAR (1 << 7)
+
+#define VBE_WIN_RELOCATABLE (1 << 0)
+#define VBE_WIN_READABLE (1 << 1)
+#define VBE_WIN_WRITEABLE (1 << 2)
+
+#define VBE_MODEL_TEXT 0
+#define VBE_MODEL_CGA 1
+#define VBE_MODEL_HERCULES 2
+#define VBE_MODEL_PLANAR 3
+#define VBE_MODEL_PACKED 4
+#define VBE_MODEL_256 5
+#define VBE_MODEL_RGB 6
+#define VBE_MODEL_YUV 7
+
+struct vbe_mode_info_block {
+ unsigned short mode_attributes;
+ unsigned char win_a_attributes;
+ unsigned char win_b_attributes;
+ unsigned short win_granularity;
+ unsigned short win_size;
+ unsigned short win_a_segment;
+ unsigned short win_b_segment;
+ unsigned short win_func_ptr_off;
+ unsigned short win_func_ptr_seg;
+ unsigned short bytes_per_scanline;
+ unsigned short x_resolution;
+ unsigned short y_resolution;
+ unsigned char x_char_size;
+ unsigned char y_char_size;
+ unsigned char number_of_planes;
+ unsigned char bits_per_pixel;
+ unsigned char number_of_banks;
+ unsigned char memory_model;
+ unsigned char bank_size;
+ unsigned char number_of_image_pages;
+ unsigned char res1;
+ unsigned char red_mask_size;
+ unsigned char red_field_position;
+ unsigned char green_mask_size;
+ unsigned char green_field_position;
+ unsigned char blue_mask_size;
+ unsigned char blue_field_position;
+ unsigned char rsvd_mask_size;
+ unsigned char rsvd_field_position;
+ unsigned char direct_color_mode_info;
+ unsigned int phys_base_ptr;
+ unsigned int offscreen_mem_offset;
+ unsigned short offscreen_mem_size;
+ unsigned char res2[206];
+} __attribute__ ((packed));
+
+struct vbe_palette_entry {
+ unsigned char blue;
+ unsigned char green;
+ unsigned char red;
+ unsigned char align;
+} __attribute__ ((packed));
+
+#endif