cr_request_checkpoint");
return rc;
}
return my_args.cr_fd;
}
int
crut_checkpoint_wait(cr_checkpoint_handle_t *handle_p, int fd) {
int rc, save_err;
do {
rc = cr_poll_checkpoint(handle_p, NULL);
if (rc < 0) {
if ((rc == CR_POLL_CHKPT_ERR_POST) && (errno == CR_ERESTARTED)) {
/* restarting -- not an error */
rc = 1; /* Signify RESTART to caller */
} else if (errno == EINTR) {
/* poll was interrupted by a signal -- retry */
continue;
} else {
/* return the error to caller */
break;
}
} else if (rc == 0) {
fprintf(stderr, "cr_poll_checkpoint returned unexpected 0\n");
rc = -1;
goto out;
} else {
rc = 0; /* Signify CONTINUE to caller */
}
} while (rc < 0);
save_err = errno;
#if 0 // Nothing in the testsuite needs this, but your APP might want it.
(void)fsync(fd);
#endif
(void)close(fd);
errno = save_err;
out:
return rc;
}
int
crut_checkpoint_block(const char *filename) {
cr_checkpoint_handle_t my_handle;
int ret, fd, save_err;
fd = crut_checkpoint_request(&my_handle, filename);
if (fd < 0) return fd;
ret = crut_checkpoint_wait(&my_handle, fd);
save_err = errno;
(void)close(fd);
errno = save_err;
return ret;
}