Split the opening of resume_dev and retrieval of the header from read_image into a new function. That way we can do something else if everything is OK, but there just isn't an image. The new function return ENOMEDIUM in case of no image, better suggestions welcome.
diff -u ../suspend-cvs-1/resume.c ./resume.c --- ../suspend-cvs-1/resume.c 2007-01-15 16:52:19.000000000 +0100 +++ ./resume.c 2007-01-20 13:57:36.000000000 +0100 @@ -531,18 +531,12 @@ } #endif -static int read_image(int dev, char *resume_dev_name) +static int open_resume_dev(char *resume_dev_name, + struct swsusp_header *swsusp_header) { - static struct swsusp_header swsusp_header; - static struct swap_map_handle handle; - static unsigned char orig_checksum[16], checksum[16]; - int fd, ret, error = 0; - struct swsusp_info *header = mem_pool; - char *buffer = (char *)mem_pool + page_size; - unsigned int nr_pages; unsigned int size = sizeof(struct swsusp_header); unsigned int shift = (resume_offset + 1) * page_size - size; - char c; + int fd, ret; fd = open(resume_dev_name, O_RDWR); if (fd < 0) { @@ -552,15 +546,34 @@ } if (lseek(fd, shift, SEEK_SET) != shift) return -EIO; - ret = read(fd, &swsusp_header, size); + ret = read(fd, swsusp_header, size); if (ret == size) { - if (memcmp(SWSUSP_SIG, swsusp_header.sig, 10)) - return -EINVAL; + if (memcmp(SWSUSP_SIG, swsusp_header->sig, 10)) { + close(fd); + return -ENOMEDIUM; + } } else { - error = ret < 0 ? ret : -EIO; + ret = ret < 0 ? ret : -EIO; + return ret; } - if (!error) - error = read_area(fd, header, swsusp_header.image, page_size); + + return fd; +} + +static int read_image(int dev, int fd, struct swsusp_header *swsusp_header) +{ + static struct swap_map_handle handle; + static unsigned char orig_checksum[16], checksum[16]; + int ret, error = 0; + struct swsusp_info *header = mem_pool; + char *buffer = (char *)mem_pool + page_size; + unsigned int nr_pages; + unsigned int size = sizeof(struct swsusp_header); + unsigned int shift = (resume_offset + 1) * page_size - size; + char c; + + error = read_area(fd, header, swsusp_header->image, page_size); + if (!error) { if(header->image_flags & IMAGE_CHECKSUM) { memcpy(orig_checksum, header->checksum, 16); @@ -686,11 +699,11 @@ } } /* Reset swap signature now */ - memcpy(swsusp_header.sig, swsusp_header.orig_sig, 10); + memcpy(swsusp_header->sig, swsusp_header->orig_sig, 10); if (lseek(fd, shift, SEEK_SET) != shift) { error = -EIO; } else { - ret = write(fd, &swsusp_header, size); + ret = write(fd, swsusp_header, size); if (ret != size) { error = ret < 0 ? -errno : -EIO; fprintf(stderr, @@ -813,8 +826,9 @@ { unsigned int mem_size; struct stat stat_buf; - int dev; + int dev, resume_dev; int n, error, orig_loglevel; + static struct swsusp_header swsusp_header; error = get_config(argc, argv); if (error) @@ -869,27 +883,41 @@ goto Free; } - splash_prepare(&splash, splash_param); - splash.progress(5); dev = open(snapshot_dev_name, O_WRONLY); if (dev < 0) { error = ENOENT; goto Free; } - error = read_image(dev, resume_dev_name); + + resume_dev = open_resume_dev(resume_dev_name, &swsusp_header); + if (resume_dev == -ENOMEDIUM) { + error = 0; + goto Close; + } else if (resume_dev < 0) { + error = -resume_dev; + goto Close; + } + + splash_prepare(&splash, splash_param); + splash.progress(5); + + error = read_image(dev, resume_dev, &swsusp_header); if (error) { fprintf(stderr, "resume: Could not read the image\n"); error = -error; - goto Close; + goto Close_splash; } + if (freeze(dev)) { error = errno; fprintf(stderr, "resume: Could not freeze processes\n"); - goto Close; + goto Close_splash; } atomic_restore(dev); unfreeze(dev); + +Close_splash: splash.finish(); Close: close(dev); ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Suspend-devel mailing list Suspend-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/suspend-devel