- assuming that longs have 64 bits on alpha and sparc64 and 32 bits elsewhere.
-
- The bad part is that we need to know this since the kernel will
- refuse a swap space if it is too large.
-*/
-/* patch from jj - why does this differ from the above? */
-#if defined(__alpha__)
-#define V1_MAX_PAGES ((1 << 24) - 1)
-#elif defined(__mips__)
-#define V1_MAX_PAGES ((1 << 17) - 1)
-#elif defined(__sparc_v9__)
-#define V1_MAX_PAGES ((3 << 29) - 1)
-#elif defined(__sparc__)
-#define V1_MAX_PAGES (pagesize == 8192 ? ((3 << 29) - 1) : ((1 << 18) - 1))
-#else
-#define V1_MAX_PAGES V1_OLD_MAX_PAGES
-#endif
-/* man page now says:
-The maximum useful size of a swap area now depends on the architecture.
-It is roughly 2GB on i386, PPC, m68k, ARM, 1GB on sparc, 512MB on mips,
-128GB on alpha and 3TB on sparc64.
-*/
-
-#define MAX_BADPAGES ((pagesize-1024-128*sizeof(int)-10)/sizeof(int))
-
-static void bit_set(unsigned int *addr, unsigned int nr)
-{
- unsigned int r, m;
-
- addr += nr / (8 * sizeof(int));
-
- r = *addr;
- m = 1 << (nr & (8 * sizeof(int) - 1));
-
- *addr = r | m;
-}
-
-static int bit_test_and_clear(unsigned int *addr, unsigned int nr)
-{
- unsigned int r, m;
-
- addr += nr / (8 * sizeof(int));
-
- r = *addr;
- m = 1 << (nr & (8 * sizeof(int) - 1));
-
- *addr = r & ~m;
- return (r & m) != 0;
-}
-
-
-void die(const char *str)
-{
- fprintf(stderr, "%s: %s\n", applet_name, str);
- exit(FALSE);
-}
-
-void page_ok(int page)
-{
- if (version == 0)
- bit_set(signature_page, page);
-}
-
-void page_bad(int page)
-{
- if (version == 0)
- bit_test_and_clear(signature_page, page);
- else {
- if (badpages == MAX_BADPAGES)
- die("too many bad pages");
- p->badpages[badpages] = page;
- }
- badpages++;
-}
-
-void check_blocks(void)
-{
- unsigned int current_page;
- int do_seek = 1;
- char *buffer;
-
- buffer = xmalloc(pagesize);
- current_page = 0;
- while (current_page < PAGES) {
- if (!check) {
- page_ok(current_page++);
- continue;
- }
- if (do_seek && lseek(DEV, current_page * pagesize, SEEK_SET) !=
- current_page * pagesize)
- die("seek failed in check_blocks");
- if ((do_seek = (pagesize != read(DEV, buffer, pagesize)))) {
- page_bad(current_page++);
- continue;
- }
- page_ok(current_page++);
- }
- if (badpages == 1)
- printf("one bad page\n");
- else if (badpages > 1)
- printf("%d bad pages\n", badpages);
-}
-
-static long valid_offset(int fd, int offset)
-{
- char ch;
-
- if (lseek(fd, offset, 0) < 0)
- return 0;
- if (read(fd, &ch, 1) < 1)
- return 0;
- return 1;
-}
-
-static int find_size(int fd)
-{
- unsigned int high, low;
-
- low = 0;
- for (high = 1; high > 0 && valid_offset(fd, high); high *= 2)
- low = high;
- while (low < high - 1) {
- const int mid = (low + high) / 2;
-
- if (valid_offset(fd, mid))
- low = mid;
- else
- high = mid;
- }
- return (low + 1);
-}
-
-/* return size in pages, to avoid integer overflow */
-static long get_size(const char *file)
-{
- int fd;
- long size;
-
- fd = open(file, O_RDONLY);
- if (fd < 0) {
- perror(file);
- exit(1);
- }
- if (ioctl(fd, BLKGETSIZE, &size) >= 0) {
- int sectors_per_page = pagesize / 512;
-
- size /= sectors_per_page;
- } else {
- size = find_size(fd) / pagesize;
- }
- close(fd);
- return size;
-}