Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37858164
en ru br
ALT Linux repos
5.0: 0.9.1-alt6
4.1: 0.9.1-alt5
4.0: 0.9.1-alt4
3.0: 0.9.1-alt2

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


--- 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);
   }
 
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin