diff options
Diffstat (limited to 'tools/h5copy/h5copy.c')
-rw-r--r-- | tools/h5copy/h5copy.c | 605 |
1 files changed, 313 insertions, 292 deletions
diff --git a/tools/h5copy/h5copy.c b/tools/h5copy/h5copy.c index eb16754..3760d6f 100644 --- a/tools/h5copy/h5copy.c +++ b/tools/h5copy/h5copy.c @@ -13,7 +13,7 @@ * access to either file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - +#include "H5private.h" #include "h5tools.h" #include "h5tools_utils.h" #include <string.h> @@ -54,9 +54,8 @@ static struct long_options l_opts[] = { static void leave(int ret) { - h5tools_close(); - - exit(ret); + h5tools_close(); + exit(ret); } @@ -76,7 +75,7 @@ leave(int ret) static void usage (void) { - fprintf(stdout, "\ + fprintf(stdout, "\ usage: h5copy [OPTIONS] [OBJECTS...]\n\ OBJECTS\n\ -i, --input input file name\n\ @@ -144,45 +143,45 @@ usage: h5copy [OPTIONS] [OBJECTS...]\n\ static int parse_flag(const char* str_flag, unsigned *flag) { - unsigned fla=0; - - if (strcmp(str_flag,"shallow")==0) - { - fla = H5O_COPY_SHALLOW_HIERARCHY_FLAG; - } - else if (strcmp(str_flag,"soft")==0) - { - fla = H5O_COPY_EXPAND_SOFT_LINK_FLAG; - } - else if (strcmp(str_flag,"ext")==0) - { - fla = H5O_COPY_EXPAND_EXT_LINK_FLAG; - } - else if (strcmp(str_flag,"ref")==0) - { - fla = H5O_COPY_EXPAND_REFERENCE_FLAG; - } - else if (strcmp(str_flag,"noattr")==0) - { - fla = H5O_COPY_WITHOUT_ATTR_FLAG; - } - else if (strcmp(str_flag,"allflags")==0) - { - fla = H5O_COPY_ALL; - } - else if (strcmp(str_flag,"nullmsg")==0) - { - fla = H5O_COPY_PRESERVE_NULL_FLAG; - } - else - { - error_msg("Error in input flag\n"); - return -1; - } - - *flag = (*flag) | fla; - - return 0; + unsigned fla=0; + + if (HDstrcmp(str_flag,"shallow")==0) + { + fla = H5O_COPY_SHALLOW_HIERARCHY_FLAG; + } + else if (HDstrcmp(str_flag,"soft")==0) + { + fla = H5O_COPY_EXPAND_SOFT_LINK_FLAG; + } + else if (HDstrcmp(str_flag,"ext")==0) + { + fla = H5O_COPY_EXPAND_EXT_LINK_FLAG; + } + else if (HDstrcmp(str_flag,"ref")==0) + { + fla = H5O_COPY_EXPAND_REFERENCE_FLAG; + } + else if (HDstrcmp(str_flag,"noattr")==0) + { + fla = H5O_COPY_WITHOUT_ATTR_FLAG; + } + else if (HDstrcmp(str_flag,"allflags")==0) + { + fla = H5O_COPY_ALL; + } + else if (HDstrcmp(str_flag,"nullmsg")==0) + { + fla = H5O_COPY_PRESERVE_NULL_FLAG; + } + else + { + error_msg("Error in input flag\n"); + return -1; + } + + *flag = (*flag) | fla; + + return 0; } /*------------------------------------------------------------------------- @@ -200,141 +199,147 @@ static int parse_flag(const char* str_flag, unsigned *flag) int main (int argc, const char *argv[]) { - hid_t fid_src=-1; - hid_t fid_dst=-1; - char *fname_src=NULL; - char *fname_dst=NULL; - char *oname_src=NULL; - char *oname_dst=NULL; - unsigned flag=0; - unsigned verbose=0; - unsigned parents=0; - hid_t ocpl_id = (-1); /* Object copy property list */ - hid_t lcpl_id = (-1); /* Link creation property list */ - char str_flag[20]; - int opt; - int li_ret; - h5tool_link_info_t linkinfo; - - h5tools_setprogname(PROGRAMNAME); - h5tools_setstatus(EXIT_SUCCESS); -/* initialize h5tools lib */ - h5tools_init(); - - /* Check for no command line parameters */ - if(argc == 1) { - usage(); - leave(EXIT_FAILURE); - } /* end if */ - - /* parse command line options */ - while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) - { - switch ((char)opt) - { - case 'd': - oname_dst = strdup(opt_arg); - break; - - case 'f': - /* validate flag */ - if (parse_flag(opt_arg,&flag)<0) - { - usage(); - leave(EXIT_FAILURE); - } - strcpy(str_flag,opt_arg); - break; - - case 'h': - usage(); - leave(EXIT_SUCCESS); - break; - - case 'i': - fname_src = strdup(opt_arg); - break; - - case 'o': - fname_dst = strdup(opt_arg); - break; - - case 'p': - parents = 1; - break; - - case 's': - oname_src = strdup(opt_arg); - break; - - case 'V': - print_version(h5tools_getprogname()); - leave(EXIT_SUCCESS); - break; - - case 'v': - verbose = 1; - break; - - default: - usage(); - leave(EXIT_FAILURE); - } - } - -/*------------------------------------------------------------------------- - * check for missing file/object names - *-------------------------------------------------------------------------*/ - - if (fname_src==NULL) - { - error_msg("Input file name missing\n"); - usage(); - leave(EXIT_FAILURE); - } - - if (fname_dst==NULL) - { - error_msg("Output file name missing\n"); - usage(); - leave(EXIT_FAILURE); - } - - if (oname_src==NULL) - { - error_msg("Source object name missing\n"); - usage(); - leave(EXIT_FAILURE); - } - - if (oname_dst==NULL) - { - error_msg("Destination object name missing\n"); - usage(); - leave(EXIT_FAILURE); - } - - -/*------------------------------------------------------------------------- - * open input file - *-------------------------------------------------------------------------*/ + hid_t fid_src=-1; + hid_t fid_dst=-1; + char *fname_src=NULL; + char *fname_dst=NULL; + char *oname_src=NULL; + char *oname_dst=NULL; + unsigned flag=0; + unsigned verbose=0; + unsigned parents=0; + hid_t ocpl_id = (-1); /* Object copy property list */ + hid_t lcpl_id = (-1); /* Link creation property list */ + char str_flag[20]; + int opt; + int li_ret; + h5tool_link_info_t linkinfo; + int i, len; + char *str_ptr=NULL; + + h5tools_setprogname(PROGRAMNAME); + h5tools_setstatus(EXIT_SUCCESS); + /* initialize h5tools lib */ + h5tools_init(); + + /* init linkinfo struct */ + HDmemset(&linkinfo, 0, sizeof(h5tool_link_info_t)); + + /* Check for no command line parameters */ + if(argc == 1) + { + usage(); + leave(EXIT_FAILURE); + } /* end if */ - fid_src = h5tools_fopen(fname_src, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, 0); + /* parse command line options */ + while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) + { + switch ((char)opt) + { + case 'd': + oname_dst = HDstrdup(opt_arg); + break; + + case 'f': + /* validate flag */ + if (parse_flag(opt_arg,&flag)<0) + { + usage(); + leave(EXIT_FAILURE); + } + HDstrcpy(str_flag,opt_arg); + break; + + case 'h': + usage(); + leave(EXIT_SUCCESS); + break; + + case 'i': + fname_src = HDstrdup(opt_arg); + break; + + case 'o': + fname_dst = HDstrdup(opt_arg); + break; + + case 'p': + parents = 1; + break; + + case 's': + oname_src = HDstrdup(opt_arg); + break; + + case 'V': + print_version(h5tools_getprogname()); + leave(EXIT_SUCCESS); + break; + + case 'v': + verbose = 1; + break; + + default: + usage(); + leave(EXIT_FAILURE); + } + } /* end of while */ /*------------------------------------------------------------------------- - * test for error in opening input file + * check for missing file/object names *-------------------------------------------------------------------------*/ - if (fid_src==-1) - { - error_msg("Could not open input file <%s>...Exiting\n", fname_src); - if (fname_src) - free(fname_src); - leave(EXIT_FAILURE); - } -/*------------------------------------------------------------------------- - * open output file - *-------------------------------------------------------------------------*/ + if (fname_src==NULL) + { + error_msg("Input file name missing\n"); + usage(); + leave(EXIT_FAILURE); + } + + if (fname_dst==NULL) + { + error_msg("Output file name missing\n"); + usage(); + leave(EXIT_FAILURE); + } + + if (oname_src==NULL) + { + error_msg("Source object name missing\n"); + usage(); + leave(EXIT_FAILURE); + } + + if (oname_dst==NULL) + { + error_msg("Destination object name missing\n"); + usage(); + leave(EXIT_FAILURE); + } + + + /*------------------------------------------------------------------------- + * open input file + *-------------------------------------------------------------------------*/ + + fid_src = h5tools_fopen(fname_src, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, 0); + + /*------------------------------------------------------------------------- + * test for error in opening input file + *-------------------------------------------------------------------------*/ + if (fid_src==-1) + { + error_msg("Could not open input file <%s>...Exiting\n", fname_src); + if (fname_src) + HDfree(fname_src); + leave(EXIT_FAILURE); + } + + /*------------------------------------------------------------------------- + * open output file + *-------------------------------------------------------------------------*/ /* Attempt to open an existing HDF5 file first */ fid_dst = h5tools_fopen(fname_dst, H5F_ACC_RDWR, H5P_DEFAULT, NULL, NULL, 0); @@ -344,49 +349,46 @@ main (int argc, const char *argv[]) if(fid_dst < 0) fid_dst = H5Fcreate(fname_dst, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT); -/*------------------------------------------------------------------------- - * test for error in opening output file - *-------------------------------------------------------------------------*/ - if (fid_dst==-1) - { - error_msg("Could not open output file <%s>...Exiting\n", fname_dst); - if (fname_src) - free(fname_src); - if (fname_dst) - free(fname_dst); - leave(EXIT_FAILURE); - } - -/*------------------------------------------------------------------------- - * print some info - *-------------------------------------------------------------------------*/ - - if (verbose) - { - printf("Copying file <%s> and object <%s> to file <%s> and object <%s>\n", - fname_src, - oname_src, - fname_dst, - oname_dst); - if (flag) - printf("Using %s flag\n", str_flag); - } - - -/*------------------------------------------------------------------------- - * create property lists for copy - *-------------------------------------------------------------------------*/ - - /* create property to pass copy options */ - if ( (ocpl_id = H5Pcreate(H5P_OBJECT_COPY)) < 0) - goto error; + /*------------------------------------------------------------------------- + * test for error in opening output file + *-------------------------------------------------------------------------*/ + if (fid_dst==-1) + { + error_msg("Could not open output file <%s>...Exiting\n", fname_dst); + if (fname_src) + HDfree(fname_src); + if (fname_dst) + HDfree(fname_dst); + leave(EXIT_FAILURE); + } + + /*------------------------------------------------------------------------- + * print some info + *-------------------------------------------------------------------------*/ + + if (verbose) + { + printf("Copying file <%s> and object <%s> to file <%s> and object <%s>\n", + fname_src, oname_src, fname_dst, oname_dst); + if (flag) + printf("Using %s flag\n", str_flag); + } + + + /*------------------------------------------------------------------------- + * create property lists for copy + *-------------------------------------------------------------------------*/ + + /* create property to pass copy options */ + if ( (ocpl_id = H5Pcreate(H5P_OBJECT_COPY)) < 0) + goto error; - /* set options for object copy */ - if (flag) - { - if ( H5Pset_copy_object(ocpl_id, flag) < 0) - goto error; - } + /* set options for object copy */ + if (flag) + { + if ( H5Pset_copy_object(ocpl_id, flag) < 0) + goto error; + } /* Create link creation property list */ if((lcpl_id = H5Pcreate(H5P_LINK_CREATE)) < 0) { @@ -406,88 +408,107 @@ main (int argc, const char *argv[]) if(verbose) printf("%s: Creating parent groups\n", h5tools_getprogname()); } /* end if */ - -/*------------------------------------------------------------------------- - * do the copy - *-------------------------------------------------------------------------*/ - /* init linkinfo struct */ - memset(&linkinfo, 0, sizeof(h5tool_link_info_t)); + else /* error, if parent groups doesn't already exist in destination file */ + { + len = HDstrlen(oname_dst); + /* check if all the parents groups exist. skip root group */ + for (i = 1; i < len; i++) + { + if ('/'==oname_dst[i]) + { + str_ptr = (char*)HDcalloc((size_t)i+1, sizeof(char)); + HDstrncpy (str_ptr, oname_dst, (size_t)i); + str_ptr[i]='\0'; + if (H5Lexists(fid_dst, str_ptr, H5P_DEFAULT) <= 0) + { + error_msg("group <%s> doesn't exist. Use -p to create parent groups.\n", str_ptr); + HDfree(str_ptr); + goto error; + } + HDfree(str_ptr); + } + } + } + + /*------------------------------------------------------------------------- + * do the copy + *-------------------------------------------------------------------------*/ - if(verbose) - linkinfo.opt.msg_mode = 1; + if(verbose) + linkinfo.opt.msg_mode = 1; - li_ret = H5tools_get_symlink_info(fid_src, oname_src, &linkinfo, 1); - if (li_ret == 0) /* dangling link */ - { - if(H5Lcopy(fid_src, oname_src, - fid_dst, oname_dst, - H5P_DEFAULT, H5P_DEFAULT) < 0) - goto error; - } - else /* valid link */ - { - if (H5Ocopy(fid_src, /* Source file or group identifier */ - oname_src, /* Name of the source object to be copied */ - fid_dst, /* Destination file or group identifier */ - oname_dst, /* Name of the destination object */ - ocpl_id, /* Object copy property list */ - lcpl_id)<0) /* Link creation property list */ - goto error; - } - - /* free link info path */ - if (linkinfo.trg_path) - free(linkinfo.trg_path); - - /* close propertis */ - if(H5Pclose(ocpl_id)<0) - goto error; - if(H5Pclose(lcpl_id)<0) - goto error; - - /* close files */ - if (H5Fclose(fid_src)<0) - goto error; - if (H5Fclose(fid_dst)<0) - goto error; - - if (fname_src) - free(fname_src); - if (fname_dst) - free(fname_dst); - if (oname_dst) - free(oname_dst); - if (oname_src) - free(oname_src); - - h5tools_close(); - - return EXIT_SUCCESS; + li_ret = H5tools_get_symlink_info(fid_src, oname_src, &linkinfo, 1); + if (li_ret == 0) /* dangling link */ + { + if(H5Lcopy(fid_src, oname_src, + fid_dst, oname_dst, + H5P_DEFAULT, H5P_DEFAULT) < 0) + goto error; + } + else /* valid link */ + { + if (H5Ocopy(fid_src, /* Source file or group identifier */ + oname_src, /* Name of the source object to be copied */ + fid_dst, /* Destination file or group identifier */ + oname_dst, /* Name of the destination object */ + ocpl_id, /* Object copy property list */ + lcpl_id)<0) /* Link creation property list */ + goto error; + } + + /* free link info path */ + if (linkinfo.trg_path) + HDfree(linkinfo.trg_path); + + /* close propertis */ + if(H5Pclose(ocpl_id)<0) + goto error; + if(H5Pclose(lcpl_id)<0) + goto error; + + /* close files */ + if (H5Fclose(fid_src)<0) + goto error; + if (H5Fclose(fid_dst)<0) + goto error; + + if (fname_src) + HDfree(fname_src); + if (fname_dst) + HDfree(fname_dst); + if (oname_dst) + HDfree(oname_dst); + if (oname_src) + HDfree(oname_src); + + h5tools_close(); + + return EXIT_SUCCESS; error: - printf("Error in copy...Exiting\n"); + printf("Error in copy...Exiting\n"); - /* free link info path */ - if (linkinfo.trg_path) - free(linkinfo.trg_path); + /* free link info path */ + if (linkinfo.trg_path) + HDfree(linkinfo.trg_path); H5E_BEGIN_TRY { - H5Pclose(ocpl_id); - H5Pclose(lcpl_id); - H5Fclose(fid_src); - H5Fclose(fid_dst); - } H5E_END_TRY; - if (fname_src) - free(fname_src); - if (fname_dst) - free(fname_dst); - if (oname_dst) - free(oname_dst); - if (oname_src) - free(oname_src); - - h5tools_close(); - - return EXIT_FAILURE; + H5Pclose(ocpl_id); + H5Pclose(lcpl_id); + H5Fclose(fid_src); + H5Fclose(fid_dst); + } H5E_END_TRY; + if (fname_src) + HDfree(fname_src); + if (fname_dst) + HDfree(fname_dst); + if (oname_dst) + HDfree(oname_dst); + if (oname_src) + HDfree(oname_src); + + h5tools_close(); + + return EXIT_FAILURE; } |