Group :: System/Base
RPM: lphdisk
Main Changelog Spec Patches Sources Download Gear Bugs and FR Repocop
Patch: lphdisk-0.9.1-debian-syscall-llseek.diff
Download
Download
--- lphdisk-0.9.1.orig/lphdisk.c
+++ lphdisk-0.9.1/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>
@@ -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);
}