void do_undump(char *filename) { int fd, r; fd = open(filename, O_RDONLY); if (fd == -1) { perror("open"); exit(1); } r = vmaundump(fd); /* not reached if no error */ perror("VMAD_DO_DUMP"); exit(1); }
int main(int argc, char *argv[]) { int fd, r,c ; int dump=-1; int dump_flags = 0; int fpop = 0; char *filename = DEFAULT_FILE; while ((c=getopt(argc, argv, "hvf:Fduelox")) != EOF) { switch (c) { case 'h': case 'v': usage(argv[0]); exit(0); case 'f': filename = optarg; break; case 'd': dump = 0; break; case 'u': dump = 1; break; case 'x': dump = 2; break; case 'e': dump_flags |= VMAD_DUMP_EXEC; break; case 'l': dump_flags |= VMAD_DUMP_LIBS; break; case 'o': dump_flags |= VMAD_DUMP_OTHER; break; case 'F': fpop = 1; break; default: exit(1); } } if (fpop) { double a, b; a = 5.3; b = getpid(); c = a * b; } switch (dump) { case 0: /* Set a sighandler to test sighandler save/restore */ signal(SIGUSR1, (void (*)(int)) sighandler); do_dump(filename, dump_flags); break; case 1: printf("Undumping from: %s\n", filename); fd = open(filename, O_RDONLY); if (fd == -1) { perror("open"); exit(1); } r = vmaundump(fd); printf("VMAD_DO_UNDUMP failed: err=%d (%s)\n", errno, strerror(errno)); break; case 2: do_execdump(filename, dump_flags, argv); break; default: usage(argv[0]); exit(0); } exit(1); }