diff options
Diffstat (limited to 'tools/h5copy/h5copy.c')
-rw-r--r-- | tools/h5copy/h5copy.c | 534 |
1 files changed, 0 insertions, 534 deletions
diff --git a/tools/h5copy/h5copy.c b/tools/h5copy/h5copy.c deleted file mode 100644 index 5371a21..0000000 --- a/tools/h5copy/h5copy.c +++ /dev/null @@ -1,534 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * 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> -#include <stdlib.h> - -/* Name of tool */ -#define PROGRAMNAME "h5copy" - -/* command-line options: short and long-named parameters */ -static const char *s_opts = "d:f:hi:o:ps:vVE"; -static struct long_options l_opts[] = { - { "destination", require_arg, 'd' }, - { "flag", require_arg, 'f' }, - { "help", no_arg, 'h' }, - { "input", require_arg, 'i' }, - { "output", require_arg, 'o' }, - { "parents", no_arg, 'p' }, - { "source", require_arg, 's' }, - { "verbose", no_arg, 'v' }, - { "version", no_arg, 'V' }, - { "enable-error-stack", no_arg, 'E' }, - { NULL, 0, '\0' } -}; -char *fname_src = NULL; -char *fname_dst = NULL; -char *oname_src = NULL; -char *oname_dst = NULL; -char *str_flag = NULL; - -/*------------------------------------------------------------------------- - * Function: leave - * - * Purpose: Shutdown MPI & HDF5 and call exit() - * - * Return: Does not return - * - * Programmer: Quincey Koziol - * Saturday, 31. January 2004 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -static void -leave(int ret) -{ - if (fname_src) - HDfree(fname_src); - if (fname_dst) - HDfree(fname_dst); - if (oname_dst) - HDfree(oname_dst); - if (oname_src) - HDfree(oname_src); - if (str_flag) - HDfree(str_flag); - - h5tools_close(); - HDexit(ret); -} - - -/*------------------------------------------------------------------------- - * Function: usage - * - * Purpose: Prints a usage message on stderr and then returns. - * - * Return: void - * - * Programmer: Pedro Vicente Nunes, 7/8/2006 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -static void -usage (void) -{ - FLUSHSTREAM(rawoutstream); - PRINTVALSTREAM(rawoutstream, "\n"); - PRINTVALSTREAM(rawoutstream, "usage: h5copy [OPTIONS] [OBJECTS...]\n"); - PRINTVALSTREAM(rawoutstream, " OBJECTS\n"); - PRINTVALSTREAM(rawoutstream, " -i, --input input file name\n"); - PRINTVALSTREAM(rawoutstream, " -o, --output output file name\n"); - PRINTVALSTREAM(rawoutstream, " -s, --source source object name\n"); - PRINTVALSTREAM(rawoutstream, " -d, --destination destination object name\n"); - PRINTVALSTREAM(rawoutstream, " OPTIONS\n"); - PRINTVALSTREAM(rawoutstream, " -h, --help Print a usage message and exit\n"); - PRINTVALSTREAM(rawoutstream, " -p, --parents No error if existing, make parent groups as needed\n"); - PRINTVALSTREAM(rawoutstream, " -v, --verbose Print information about OBJECTS and OPTIONS\n"); - PRINTVALSTREAM(rawoutstream, " -V, --version Print version number and exit\n"); - PRINTVALSTREAM(rawoutstream, " -f, --flag Flag type\n\n"); - PRINTVALSTREAM(rawoutstream, " Flag type is one of the following strings:\n\n"); - PRINTVALSTREAM(rawoutstream, " shallow Copy only immediate members for groups\n\n"); - PRINTVALSTREAM(rawoutstream, " soft Expand soft links into new objects\n\n"); - PRINTVALSTREAM(rawoutstream, " ext Expand external links into new objects\n\n"); - PRINTVALSTREAM(rawoutstream, " ref Copy references and any referenced objects, i.e., objects\n"); - PRINTVALSTREAM(rawoutstream, " that the references point to.\n"); - PRINTVALSTREAM(rawoutstream, " Referenced objects are copied in addition to the objects\n"); - PRINTVALSTREAM(rawoutstream, " specified on the command line and reference datasets are\n"); - PRINTVALSTREAM(rawoutstream, " populated with correct reference values. Copies of referenced\n"); - PRINTVALSTREAM(rawoutstream, " datasets outside the copy range specified on the command line\n"); - PRINTVALSTREAM(rawoutstream, " will normally have a different name from the original.\n"); - PRINTVALSTREAM(rawoutstream, " (Default:Without this option, reference value(s) in any\n"); - PRINTVALSTREAM(rawoutstream, " reference datasets are set to NULL and referenced objects are\n"); - PRINTVALSTREAM(rawoutstream, " not copied unless they are otherwise within the copy range\n"); - PRINTVALSTREAM(rawoutstream, " specified on the command line.)\n\n"); - PRINTVALSTREAM(rawoutstream, " noattr Copy object without copying attributes\n\n"); - PRINTVALSTREAM(rawoutstream, " allflags Switches all flags from the default to the non-default setting\n\n"); - PRINTVALSTREAM(rawoutstream, " These flag types correspond to the following API symbols\n\n"); - PRINTVALSTREAM(rawoutstream, " H5O_COPY_SHALLOW_HIERARCHY_FLAG\n"); - PRINTVALSTREAM(rawoutstream, " H5O_COPY_EXPAND_SOFT_LINK_FLAG\n"); - PRINTVALSTREAM(rawoutstream, " H5O_COPY_EXPAND_EXT_LINK_FLAG\n"); - PRINTVALSTREAM(rawoutstream, " H5O_COPY_EXPAND_REFERENCE_FLAG\n"); - PRINTVALSTREAM(rawoutstream, " H5O_COPY_WITHOUT_ATTR_FLAG\n"); - PRINTVALSTREAM(rawoutstream, " H5O_COPY_ALL\n"); -} - - - -/*------------------------------------------------------------------------- - * Function: parse_flag - * - * Purpose: read the flag -f STRING - * - * STRING is one of the following (API symbol and description) - * - * shallow H5O_COPY_SHALLOW_HIERARCHY_FLAG: Copy only immediate members for groups - * soft H5O_COPY_EXPAND_SOFT_LINK_FLAG: Expand soft links into new objects - * ext H5O_COPY_EXPAND_EXT_LINK_FLAG: Expand external links into new objects - * ref H5O_COPY_EXPAND_OBJ_REFERENCE_FLAG: Copy objects that are pointed by references - * noattr H5O_COPY_WITHOUT_ATTR_FLAG Copy object without copying attributes - * allflags Switches all flags from the default to the non-default setting - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: Pedro Vicente Nunes, 7/8/2006 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - - -static int parse_flag(const char* s_flag, unsigned *flag) -{ - unsigned fla=0; - - if (HDstrcmp(s_flag,"shallow")==0) - { - fla = H5O_COPY_SHALLOW_HIERARCHY_FLAG; - } - else if (HDstrcmp(s_flag,"soft")==0) - { - fla = H5O_COPY_EXPAND_SOFT_LINK_FLAG; - } - else if (HDstrcmp(s_flag,"ext")==0) - { - fla = H5O_COPY_EXPAND_EXT_LINK_FLAG; - } - else if (HDstrcmp(s_flag,"ref")==0) - { - fla = H5O_COPY_EXPAND_REFERENCE_FLAG; - } - else if (HDstrcmp(s_flag,"noattr")==0) - { - fla = H5O_COPY_WITHOUT_ATTR_FLAG; - } - else if (HDstrcmp(s_flag,"allflags")==0) - { - fla = H5O_COPY_ALL; - } - else if (HDstrcmp(s_flag,"nullmsg")==0) - { - fla = H5O_COPY_PRESERVE_NULL_FLAG; - } - else - { - error_msg("Error in input flag\n"); - return -1; - } - - *flag = (*flag) | fla; - - return 0; -} - -/*------------------------------------------------------------------------- - * Function: main - * - * Purpose: main program - * - * Programmer: Pedro Vicente Nunes - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -int -main (int argc, const char *argv[]) -{ - int ret_value = 0; /*no need to LEAVE() on ERROR: HERR_INIT(int, SUCCEED) */ - H5E_auto2_t func; - H5E_auto2_t tools_func; - void *edata; - void *tools_edata; - hid_t fid_src = -1; - hid_t fid_dst = -1; - 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 */ - int opt; - int li_ret; - h5tool_link_info_t linkinfo; - - h5tools_setprogname(PROGRAMNAME); - h5tools_setstatus(EXIT_SUCCESS); - - /* Disable error reporting */ - H5Eget_auto2(H5E_DEFAULT, &func, &edata); - H5Eset_auto2(H5E_DEFAULT, NULL, NULL); - - /* Initialize h5tools lib */ - h5tools_init(); - - /* Disable tools error reporting */ - H5Eget_auto2(H5tools_ERR_STACK_g, &tools_func, &tools_edata); - H5Eset_auto2(H5tools_ERR_STACK_g, NULL, NULL); - - /* 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 */ - - /* 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); - } - str_flag = HDstrdup(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; - - case 'E': - enable_error_stack = TRUE; - break; - - default: - usage(); - leave(EXIT_FAILURE); - } - } /* end of while */ - -/*------------------------------------------------------------------------- - * 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); - } - - if (enable_error_stack) { - H5Eset_auto2(H5E_DEFAULT, func, edata); - H5Eset_auto2(H5tools_ERR_STACK_g, tools_func, tools_edata); - } - - /*------------------------------------------------------------------------- - * open output file - *-------------------------------------------------------------------------*/ - - /* Attempt to open an existing HDF5 file first. Need to open the dst file - before the src file just in case that the dst and src are the same file - */ - fid_dst = h5tools_fopen(fname_dst, H5F_ACC_RDWR, H5P_DEFAULT, NULL, NULL, 0); - - /*------------------------------------------------------------------------- - * 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); - leave(EXIT_FAILURE); - } - - - /*------------------------------------------------------------------------- - * create an output file when failed to open it - *-------------------------------------------------------------------------*/ - - /* If we couldn't open an existing file, try creating file */ - /* (use "EXCL" instead of "TRUNC", so we don't blow away existing non-HDF5 file) */ - 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); - 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) { - HDassert(str_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) - HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pcreate failed"); - - /* set options for object copy */ - if (flag) - { - if ( H5Pset_copy_object(ocpl_id, flag) < 0) - HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pset_copy_object failed"); - } - - /* Create link creation property list */ - if((lcpl_id = H5Pcreate(H5P_LINK_CREATE)) < 0) { - error_msg("Could not create link creation property list\n"); - HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pcreate failed"); - } /* end if */ - - /* Check for creating intermediate groups */ - if(parents) { - /* Set the intermediate group creation property */ - if(H5Pset_create_intermediate_group(lcpl_id, 1) < 0) { - error_msg("Could not set property for creating parent groups\n"); - HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pset_create_intermediate_group failed"); - } /* end if */ - - /* Display some output if requested */ - if(verbose) - printf("%s: Creating parent groups\n", h5tools_getprogname()); - } /* end if */ - else /* error, if parent groups doesn't already exist in destination file */ - { - size_t i, len; - - len = HDstrlen(oname_dst); - - /* check if all the parents groups exist. skip root group */ - for (i = 1; i < len; i++) - { - if ('/'==oname_dst[i]) - { - char *str_ptr; - - str_ptr = (char *)HDcalloc(i + 1, sizeof(char)); - HDstrncpy(str_ptr, oname_dst, 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); - HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Lexists failed"); - } - HDfree(str_ptr); - } - } - } - - /*------------------------------------------------------------------------- - * do the copy - *-------------------------------------------------------------------------*/ - - 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) - HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Lcopy failed"); - } - 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 */ - HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Ocopy failed"); - } - - /* free link info path */ - if (linkinfo.trg_path) - HDfree(linkinfo.trg_path); - - /* close propertis */ - if(H5Pclose(ocpl_id)<0) - HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pclose failed"); - if(H5Pclose(lcpl_id)<0) - HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Pclose failed"); - - /* close files */ - if (H5Fclose(fid_src)<0) - HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Fclose failed"); - if (H5Fclose(fid_dst)<0) - HGOTO_ERROR(EXIT_FAILURE, H5E_tools_min_id_g, "H5Fclose failed"); - - leave(EXIT_SUCCESS); - -done: - printf("Error in copy...Exiting\n"); - - /* 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; - - leave(ret_value); -} - |