Example #1
0
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);
}