--- uml_moo.c.orig Wed Sep 3 12:38:48 2003 +++ uml_moo.c Wed Sep 3 21:17:55 2003 @@ -38,7 +38,7 @@ static inline void ubd_set_bit(int bit, data[n] |= (1 << off); } -int create_backing_file(char *in, char *out) +int create_backing_file(char *in, char *out, char *old) { int cow_fd, back_fd, in_fd, out_fd; struct stat buf; @@ -65,10 +65,15 @@ int create_backing_file(char *in, char * exit(1); } + if(old != NULL) { + backing_file = old; + } + if(stat(backing_file, &buf) < 0) { perror("Stating backing file"); exit(1); } + if(buf.st_size != size){ fprintf(stderr,"Size mismatch (%ld vs %ld) of COW header " "vs backing file \"%s\"\n", (long int) size, @@ -192,13 +197,15 @@ int create_backing_file(char *in, char * int Usage(char *prog) { fprintf(stderr, "%s usage:\n", prog); - fprintf(stderr, "\t%s \n", prog); - fprintf(stderr, "\t%s -d \n", prog); + fprintf(stderr, "\t%s [ -O ] \n", prog); + fprintf(stderr, "\t%s [ -O ] -d \n", prog); fprintf(stderr, "Creates a new filesystem image from the COW file " "and its backing file.\n"); fprintf(stderr, "Specifying -d will cause a destructive, in-place " "merge of the COW file into\n"); fprintf(stderr, "its current backing file\n"); + fprintf(stderr, "Specifying -O overrides the backing_file\n"); + fprintf(stderr, "field specified in the COW file.\n"); fprintf(stderr, "%s supports version 1 and 2 COW files.\n", prog); exit(1); } @@ -206,6 +213,7 @@ int Usage(char *prog) { int main(int argc, char **argv) { char *prog = argv[0]; + char *real_backing_file = NULL; int in_place = 0; argv++; @@ -220,13 +228,23 @@ int main(int argc, char **argv) argc--; } + if(!strcmp(argv[0], "-O")){ + real_backing_file = argv[1]; + argv++; + argc--; + + argv++; + argc--; + + } + if(in_place){ if(argc != 1) Usage(prog); - create_backing_file(argv[0], NULL); + create_backing_file(argv[0], NULL, real_backing_file); } else { if(argc != 2) Usage(prog); - create_backing_file(argv[0], argv[1]); + create_backing_file(argv[0], argv[1], real_backing_file); } return 0; }