--- Begin Message ---
Source: libminc
Version: 2.3.00-3
Severity: important
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Hi,
Please find attached a patch to support building against HDF5-1.10 currently in
experimental. This patch is a backport of two upstream commits related to
hdf5-1.10 support. Please see upstream ticket #74 [1].
[1] https://github.com/BIC-MNI/libminc/issues/74
I intend to request a transition slot this week, and will NMU if need be.
Thanks,
_g.
- -- System Information:
Debian Release: stretch/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 4.6.0-1-amd64 (SMP w/2 CPU cores)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
-----BEGIN PGP SIGNATURE-----
iQEcBAEBCAAGBQJYDnQdAAoJEO/obGx//s+DMucIAKfPWkyHBDzPJIaB4OCqp6dk
kwZPq8YbvikQL+y71IXLDNncxytiqQpakbLHhcokK/+DqZu6c5j1tNOnQTRvgaXc
oCfLd4Fh5/bYtAGs1TtnCw0FEje3qUtA4in4TEy9lKcuXwVHYrrFOxqiv1N4Xznj
GbpvIEjM1nR4IIP2s4zs0ZM0Q437bEV6rZejWnKypB9AlHAQafx2Cf/zG82oYlHX
AlqnjUJW3Uoc0IBe6RvOFvt8LHG1vm8HSy+zQBeLGGCoC8b5qc7xiCQVu01G5+sR
eocifRf60srli2i4sB0uUsDE1EpE6D+jBRQY/Kw6QNSqbO2g7x5dNvT8BC2zgoA=
=JOhL
-----END PGP SIGNATURE-----
diff -Nru libminc-2.3.00/debian/changelog libminc-2.3.00/debian/changelog
--- libminc-2.3.00/debian/changelog 2016-09-02 09:40:37.000000000 +0200
+++ libminc-2.3.00/debian/changelog 2016-10-20 19:31:12.000000000 +0200
@@ -1,3 +1,10 @@
+libminc (2.3.00-3.1) unstable; urgency=medium
+
+ * Non-maintainer upload
+ * New patch to support HDF5 1.10
+
+ -- Gilles Filippini <[email protected]> Thu, 20 Oct 2016 19:31:10 +0200
+
libminc (2.3.00-3) unstable; urgency=medium
* Wrote watch file
diff -Nru libminc-2.3.00/debian/patches/hdf5-1.10-support.patch libminc-2.3.00/debian/patches/hdf5-1.10-support.patch
--- libminc-2.3.00/debian/patches/hdf5-1.10-support.patch 1970-01-01 01:00:00.000000000 +0100
+++ libminc-2.3.00/debian/patches/hdf5-1.10-support.patch 2016-10-20 20:37:42.000000000 +0200
@@ -0,0 +1,451 @@
+Description: don't assume hid_t === int since this is no longer true
+ in HDF5 1.10.
+ This is a backport of upstream commits d99dd01 and 92ba4fa related
+ to issue #74 [1].
+ .
+ [1] https://github.com/BIC-MNI/libminc/issues/74
+Index: libminc-2.3.00/libsrc/hdf_convenience.c
+===================================================================
+--- libminc-2.3.00.orig/libsrc/hdf_convenience.c
++++ libminc-2.3.00/libsrc/hdf_convenience.c
+@@ -45,7 +45,8 @@ struct m2_dim {
+
+ static struct m2_file {
+ struct m2_file *link;
+- hid_t fd;
++ int fd; /* our fake file id */
++ hid_t file_id; /* actual hdf5 file id */
+ int wr_ok; /* non-zero if write OK */
+ int resolution; /* Resolution setting. */
+ int nvars;
+@@ -74,18 +75,20 @@ hdf_id_check(int fd)
+ }
+
+ static struct m2_file *
+-hdf_id_add(int fd)
++hdf_id_add(hid_t file_id)
+ {
+ struct m2_file *new;
++ static unsigned short _id = 0; /* at most 2^16 id's */
+
+ new = (struct m2_file *) malloc(sizeof (struct m2_file));
+ if (new != NULL) {
+- new->fd = fd;
++ new->fd = HDF5_ID_MIN + _id++;
++ new->file_id = file_id;
+ new->resolution = 0;
+ new->nvars = 0;
+ new->ndims = 0;
+ new->link =_m2_list;
+- new->grp_id = H5Gopen1(fd, MI2_GRPNAME);
++ new->grp_id = H5Gopen1(file_id, MI2_GRPNAME);
+ new->comp_type = MI2_COMP_UNKNOWN;
+ new->comp_param = 0;
+ new->chunk_type = MI2_CHUNK_UNKNOWN;
+@@ -99,7 +102,7 @@ hdf_id_add(int fd)
+ return (new);
+ }
+
+-static int
++static int
+ hdf_id_del(int fd)
+ {
+ struct m2_file *curr, *prev;
+@@ -142,6 +145,7 @@ hdf_id_del(int fd)
+ }
+
+ H5Gclose(curr->grp_id);
++ H5Fclose(curr->file_id);
+ free(curr);
+ return (MI_NOERROR);
+ }
+@@ -187,7 +191,7 @@ hdf_var_add(struct m2_file *file, const
+ strncpy(new->name, name, NC_MAX_NAME - 1);
+ strncpy(new->path, path, NC_MAX_NAME - 1);
+ new->is_cmpd = 0;
+- new->dset_id = H5Dopen1(file->fd, path);
++ new->dset_id = H5Dopen1(file->file_id, path);
+ new->ftyp_id = H5Dget_type(new->dset_id);
+ new->mtyp_id = H5Tget_native_type(new->ftyp_id, H5T_DIR_ASCEND);
+ new->fspc_id = H5Dget_space(new->dset_id);
+@@ -490,7 +494,7 @@ hdf_attinq(int fd, int varid, const char
+ return (MI_ERROR);
+ }
+
+- if (varid == NC_GLOBAL) {
++ if (varid == NC_GLOBAL || varid == MI_ROOTVARIABLE_ID) {
+ var = NULL;
+ loc_id = file->grp_id;
+ }
+@@ -591,7 +595,7 @@ hdf_attinq(int fd, int varid, const char
+ }
+
+ static int
+-hdf_put_dimorder(struct m2_file *file, int dst_id, int ndims,
++hdf_put_dimorder(struct m2_file *file, hid_t dst_id, int ndims,
+ const int *dims_ptr)
+ {
+ int i;
+@@ -626,6 +630,9 @@ hdf_put_dimorder(struct m2_file *file, i
+ if (att_id >= 0) {
+ H5Awrite(att_id, typ_id, str_buf);
+ }
++ else {
++ fprintf(stderr, "Failed to create dimorder %lx\n", dst_id);
++ }
+
+ H5Aclose(att_id);
+ H5Sclose(spc_id);
+@@ -634,7 +641,7 @@ hdf_put_dimorder(struct m2_file *file, i
+ }
+
+ static int
+-hdf_get_dimorder(struct m2_file *file, int dst_id, int ndims, int *dims_ptr)
++hdf_get_dimorder(struct m2_file *file, hid_t dst_id, int ndims, int *dims_ptr)
+ {
+ char *str_ptr;
+ char *tmp_ptr;
+@@ -974,7 +981,7 @@ hdf_attget(int fd, int varid, const char
+ return (MI_ERROR);
+ }
+
+- if (varid == NC_GLOBAL) {
++ if (varid == NC_GLOBAL || varid == MI_ROOTVARIABLE_ID) {
+ var = NULL;
+ loc_id = file->grp_id;
+ }
+@@ -1120,11 +1127,11 @@ hdf_attput(int fd, int varid, const char
+ H5Pclose(new_plst_id);
+ H5Sclose(var->fspc_id);
+
+- if (H5Gunlink(fd, var->path) < 0) {
++ if (H5Gunlink(file->file_id, var->path) < 0) {
+ milog_message(MI_MSG_SNH);
+ }
+
+- if (H5Gmove2(file->grp_id, temp, fd, var->path) < 0) {
++ if (H5Gmove2(file->grp_id, temp, file->file_id, var->path) < 0) {
+ milog_message(MI_MSG_SNH);
+ }
+
+@@ -1196,7 +1203,7 @@ hdf_attput(int fd, int varid, const char
+ att_id = H5Acreate2(loc_id, attnm, ftyp_id, spc_id, H5P_DEFAULT, H5P_DEFAULT);
+
+ if (att_id < 0)
+- goto cleanup;
++ goto cleanup;
+
+ /* Save the value.
+ */
+@@ -1261,10 +1268,10 @@ int
+ hdf_vardef(int fd, const char *varnm, nc_type vartype, int ndims,
+ const int *dimids)
+ {
+- int dst_id = -1;
+- int typ_id = -1;
+- int spc_id = -1;
+- int prp_id = -1;
++ hid_t dst_id = -1;
++ hid_t typ_id = -1;
++ hid_t spc_id = -1;
++ hid_t prp_id = -1;
+ int status = MI_ERROR;
+ int i;
+ long length;
+@@ -1392,7 +1399,7 @@ hdf_vardef(int fd, const char *varnm, nc
+ }
+
+ H5E_BEGIN_TRY {
+- dst_id = H5Dcreate2(fd, varpath, typ_id, spc_id, H5P_DEFAULT, prp_id, H5P_DEFAULT);
++ dst_id = H5Dcreate2(file->file_id, varpath, typ_id, spc_id, H5P_DEFAULT, prp_id, H5P_DEFAULT);
+ } H5E_END_TRY;
+
+ if (dst_id < 0) {
+@@ -1465,10 +1472,10 @@ hdf_varget(int fd, int varid, const long
+ void *val_ptr)
+ {
+ int status = MI_ERROR;
+- int dst_id = -1;
+- int typ_id = -1;
+- int fspc_id = -1;
+- int mspc_id = -1;
++ hid_t dst_id = -1;
++ hid_t typ_id = -1;
++ hid_t fspc_id = -1;
++ hid_t mspc_id = -1;
+ int i;
+ int ndims;
+ hsize_t fstart[MAX_VAR_DIMS];
+@@ -1560,8 +1567,8 @@ hdf_varget(int fd, int varid, const long
+ }
+
+ int
+-hdf_varputg(int fd, int varid, const long *start,
+- const long *edges, const long *stride,
++hdf_varputg(int fd, int varid, const long *start,
++ const long *edges, const long *stride,
+ const long *map, const void *value)
+ {
+ int status = MI_ERROR; /* Assume guilty */
+@@ -1577,10 +1584,10 @@ hdf_varputg(int fd, int varid, const lon
+
+ struct m2_var *varp;
+ struct m2_file *file;
+- int dst_id = -1;
+- int typ_id = -1;
+- int fspc_id = -1;
+- int mspc_id = -1;
++ hid_t dst_id = -1;
++ hid_t typ_id = -1;
++ hid_t fspc_id = -1;
++ hid_t mspc_id = -1;
+
+ if ((file = hdf_id_check(fd)) == NULL) {
+ return (MI_ERROR);
+@@ -1747,8 +1754,8 @@ hdf_varputg(int fd, int varid, const lon
+ }
+
+ int
+-hdf_vargetg(int fd, int varid, const long *start,
+- const long *edges, const long *stride,
++hdf_vargetg(int fd, int varid, const long *start,
++ const long *edges, const long *stride,
+ const long *map, void *value)
+ {
+ int status = MI_NOERROR;
+@@ -1910,10 +1917,10 @@ hdf_varput(int fd, int varid, const long
+ const void *val_ptr)
+ {
+ int status = MI_ERROR;
+- int dst_id;
+- int typ_id;
+- int fspc_id;
+- int mspc_id = -1;
++ hid_t dst_id;
++ hid_t typ_id;
++ hid_t fspc_id;
++ hid_t mspc_id = -1;
+ int i;
+ int ndims;
+ hsize_t fstart[MAX_VAR_DIMS];
+@@ -2085,6 +2092,7 @@ herr_t hdf_copy_attr(hid_t in_id, const
+ * don't overwrite the existing value.
+ */
+ status = MI_NOERROR;
++ fprintf(stderr, "Failed to create attribute '%s'\n", attr_name);
+ goto cleanup;
+ }
+
+@@ -2195,7 +2203,7 @@ hdf_open_dsets(struct m2_file *file, hid
+ int
+ hdf_open(const char *path, int mode)
+ {
+- hid_t fd;
++ hid_t file_id;
+ hid_t grp_id;
+ hid_t dset_id;
+ struct m2_file *file;
+@@ -2210,28 +2218,28 @@ hdf_open(const char *path, int mode)
+
+ prp_id = H5Pcreate(H5P_FILE_ACCESS);
+ H5Pset_fapl_mmap(prp_id, 8192, 1);
+- fd = H5Fopen(path, mode & 0x7FFF, prp_id);
++ file_id = H5Fopen(path, mode & 0x7FFF, prp_id);
+ H5Pclose(prp_id);
+ }
+ else {
+- fd = H5Fopen(path, mode, H5P_DEFAULT);
++ file_id = H5Fopen(path, mode, H5P_DEFAULT);
+ }
+ #else
+- fd = H5Fopen(path, mode, H5P_DEFAULT);
++ file_id = H5Fopen(path, mode, H5P_DEFAULT);
+ #endif
+ } H5E_END_TRY;
+
+- if (fd < 0) {
++ if (file_id < 0) {
+ return (MI_ERROR);
+ }
+
+- file = hdf_id_add(fd); /* Add it to the list */
++ file = hdf_id_add(file_id); /* Add it to the list */
+ file->wr_ok = (mode & H5F_ACC_RDWR) != 0;
+
+ /* Open the image variables.
+ */
+ H5E_BEGIN_TRY {
+- dset_id = H5Dopen1(fd, "/minc-2.0/image/0/image");
++ dset_id = H5Dopen1(file_id, "/minc-2.0/image/0/image");
+ if (dset_id >= 0) {
+ hid_t type_id;
+ int is_compound = 0;
+@@ -2262,7 +2270,7 @@ hdf_open(const char *path, int mode)
+ H5Dclose(dset_id);
+ }
+
+- dset_id = H5Dopen1(fd, "/minc-2.0/image/0/image-min");
++ dset_id = H5Dopen1(file_id, "/minc-2.0/image/0/image-min");
+ if (dset_id >= 0) {
+ hdf_get_diminfo(dset_id, &ndims, dims);
+ hdf_var_add(file, MIimagemin, "/minc-2.0/image/0/image-min",
+@@ -2270,7 +2278,7 @@ hdf_open(const char *path, int mode)
+ H5Dclose(dset_id);
+ }
+
+- dset_id = H5Dopen1(fd, "/minc-2.0/image/0/image-max");
++ dset_id = H5Dopen1(file_id, "/minc-2.0/image/0/image-max");
+ if (dset_id >= 0) {
+ hdf_get_diminfo(dset_id, &ndims, dims);
+ hdf_var_add(file, MIimagemax, "/minc-2.0/image/0/image-max",
+@@ -2281,16 +2289,16 @@ hdf_open(const char *path, int mode)
+
+ /* Open all of the datasets in the "dimensions" category.
+ */
+- grp_id = H5Gopen2(fd, "/minc-2.0/dimensions", H5P_DEFAULT);
++ grp_id = H5Gopen2(file_id, "/minc-2.0/dimensions", H5P_DEFAULT);
+ hdf_open_dsets(file, grp_id, "/minc-2.0/dimensions/", 1);
+ H5Gclose(grp_id);
+
+ /* Open all of the datasets in the "info" category.
+ */
+- grp_id = H5Gopen2(fd, "/minc-2.0/info", H5P_DEFAULT);
++ grp_id = H5Gopen2(file_id, "/minc-2.0/info", H5P_DEFAULT);
+ hdf_open_dsets(file, grp_id, "/minc-2.0/info/", 0);
+ H5Gclose(grp_id);
+- return (fd);
++ return (file->fd);
+ }
+
+ /** Create an HDF5 file. */
+@@ -2298,7 +2306,7 @@ int
+ hdf_create(const char *path, int cmode, struct mi2opts *opts_ptr)
+ {
+ hid_t grp_id;
+- hid_t fd;
++ hid_t file_id;
+ hid_t tmp_id;
+ struct m2_file *file;
+ hid_t hdf_gpid;
+@@ -2319,10 +2327,10 @@ hdf_create(const char *path, int cmode,
+ H5Pset_libver_bounds (fpid, H5F_LIBVER_18, H5F_LIBVER_18);
+
+ H5E_BEGIN_TRY {
+- fd = H5Fcreate(path, cmode, H5P_DEFAULT, fpid);
++ file_id = H5Fcreate(path, cmode, H5P_DEFAULT, fpid);
+ } H5E_END_TRY;
+- if (fd < 0) {
+- fprintf(stderr, "Error creating HDF file '%s' with mode '%x', result %d\n", path, cmode, fd);
++ if (file_id < 0) {
++ fprintf(stderr, "Error creating HDF file '%s' with mode '%x', result %d\n", path, cmode, (int)file_id);
+ H5Eprint1(stderr);
+ return (MI_ERROR);
+ }
+@@ -2332,7 +2340,7 @@ hdf_create(const char *path, int cmode,
+ /* Create the default groups.
+ * Should we use a non-zero value for size_hint (parameter 3)???
+ */
+- if ((grp_id = H5Gcreate2(fd, MI2_GRPNAME, H5P_DEFAULT, hdf_gpid, H5P_DEFAULT)) < 0) {
++ if ((grp_id = H5Gcreate2(file_id, MI2_GRPNAME, H5P_DEFAULT, hdf_gpid, H5P_DEFAULT)) < 0) {
+ fprintf(stderr, "Error creating groups on line %d\n", __LINE__);
+ H5Eprint1(stderr);
+ return (MI_ERROR);
+@@ -2369,7 +2377,7 @@ hdf_create(const char *path, int cmode,
+ H5Gclose(tmp_id);
+ H5Gclose(grp_id);
+
+- file = hdf_id_add(fd); /* Add it to the list */
++ file = hdf_id_add(file_id); /* Add it to the list */
+ if (file == NULL) {
+ fprintf(stderr, "Error adding ID to list.\n");
+ H5Eprint1(stderr);
+@@ -2384,7 +2392,7 @@ hdf_create(const char *path, int cmode,
+ file->chunk_type = opts_ptr->chunk_type;
+ file->chunk_param = opts_ptr->chunk_param;
+ }
+- return ((int) fd);
++ return (file->fd);
+ }
+
+ int
+@@ -2392,7 +2400,6 @@ hdf_close(int fd)
+ {
+ hdf_dim_commit(fd); /* Make sure all dimensions were saved. */
+ hdf_id_del(fd); /* Delete it from the list. */
+- H5Fclose(fd);
+ return (MI_NOERROR);
+ }
+
+@@ -2412,4 +2419,22 @@ hdf_access(const char *path)
+ return (status > 0); /* Return non-zero if success */
+ }
+
++/*
++ * Flushes the hdf file to disk
++ */
++int
++hdf_flush(int fd)
++{
++ struct m2_file *file;
++ if ((file = hdf_id_check(fd))!=NULL ) {
++ /* Commit the (entire) file to disk. */
++ if (H5Fflush(file->file_id, H5F_SCOPE_GLOBAL) < 0) {
++ return MI_ERROR;
++ }
++ return MI_NOERROR;
++ }
++ return MI_ERROR;
++}
++
++
+ #endif /* MINC2 defined */
+Index: libminc-2.3.00/libsrc/hdf_convenience.h
+===================================================================
+--- libminc-2.3.00.orig/libsrc/hdf_convenience.h
++++ libminc-2.3.00/libsrc/hdf_convenience.h
+@@ -49,4 +49,5 @@ extern int hdf_open(const char *path, in
+ extern int hdf_create(const char *path, int mode, struct mi2opts *opts_ptr);
+ extern int hdf_close(int fd);
+ extern int hdf_access(const char *path);
++extern int hdf_flush(int fd);
+
+Index: libminc-2.3.00/libsrc/minc_compat.c
+===================================================================
+--- libminc-2.3.00.orig/libsrc/minc_compat.c
++++ libminc-2.3.00/libsrc/minc_compat.c
+@@ -358,14 +358,9 @@ MI2redef(int fd)
+ MNCAPI int
+ MI2sync(int fd)
+ {
+- if (MI2_ISH5OBJ(fd)) {
++ if (MI2_ISH5OBJ(fd) ) {
+ /* Commit the (entire) file to disk. */
+- if (H5Fflush(fd, H5F_SCOPE_GLOBAL) < 0) {
+- return (MI_ERROR);
+- }
+- else {
+- return (MI_NOERROR);
+- }
++ return hdf_flush(fd);
+ }
+ else {
+ return (ncsync(fd));
+Index: libminc-2.3.00/libsrc/minc.h
+===================================================================
+--- libminc-2.3.00.orig/libsrc/minc.h
++++ libminc-2.3.00/libsrc/minc.h
+@@ -617,7 +617,13 @@ struct mi2opts {
+ int chunk_param;
+ };
+
+-#define MI2_ISH5OBJ(x) (H5Iget_type(x) > 0)
++/* This is hackish in that it assumes that all NetCDF handles returned
++ * by ncopen/nccreate will be small integers. Historically this is
++ * true, but it could break someday. We used to use an HDF5 call, but
++ * that broke when HDF5 switched from 32 to 64 bits for hid_t.
++ */
++#define HDF5_ID_MIN 0x30000000
++#define MI2_ISH5OBJ(x) (x >= HDF5_ID_MIN)
+
+ MNCAPI int micreatex(const char *path, int cmode, struct mi2opts *opts_ptr);
+
diff -Nru libminc-2.3.00/debian/patches/libhdf5-1.10.patch libminc-2.3.00/debian/patches/libhdf5-1.10.patch
--- libminc-2.3.00/debian/patches/libhdf5-1.10.patch 1970-01-01 01:00:00.000000000 +0100
+++ libminc-2.3.00/debian/patches/libhdf5-1.10.patch 2016-10-20 19:29:50.000000000 +0200
@@ -0,0 +1,26 @@
+Index: libminc-2.3.00/libsrc/hdf_convenience.c
+===================================================================
+--- libminc-2.3.00.orig/libsrc/hdf_convenience.c
++++ libminc-2.3.00/libsrc/hdf_convenience.c
+@@ -74,7 +74,7 @@ hdf_id_check(int fd)
+ }
+
+ static struct m2_file *
+-hdf_id_add(int fd)
++hdf_id_add(hid_t fd)
+ {
+ struct m2_file *new;
+
+Index: libminc-2.3.00/libsrc/netcdf_convenience.c
+===================================================================
+--- libminc-2.3.00.orig/libsrc/netcdf_convenience.c
++++ libminc-2.3.00/libsrc/netcdf_convenience.c
+@@ -595,7 +595,7 @@ MNCAPI int miopen(const char *path, int
+ #if MINC2
+ MNCAPI int micreatex(const char *path, int cmode, struct mi2opts *opts_ptr)
+ {
+- int fd;
++ hid_t fd;
+
+ MI_SAVE_ROUTINE_NAME("micreate");
+
diff -Nru libminc-2.3.00/debian/patches/series libminc-2.3.00/debian/patches/series
--- libminc-2.3.00/debian/patches/series 2016-08-25 15:25:30.000000000 +0200
+++ libminc-2.3.00/debian/patches/series 2016-10-20 20:26:41.000000000 +0200
@@ -3,3 +3,4 @@
use-system-nifti
fix-endian-issues-label-data.patch
Use-system-FindHDF5-CMake-module.patch
+hdf5-1.10-support.patch
diff -Nru libminc-2.3.00/debian/patches/upstream-92ba4fa.patch libminc-2.3.00/debian/patches/upstream-92ba4fa.patch
--- libminc-2.3.00/debian/patches/upstream-92ba4fa.patch 1970-01-01 01:00:00.000000000 +0100
+++ libminc-2.3.00/debian/patches/upstream-92ba4fa.patch 2016-10-20 20:24:44.000000000 +0200
@@ -0,0 +1,70 @@
+From 92ba4fa2b8b88e02d5372b93a92a02f4e62385bc Mon Sep 17 00:00:00 2001
+From: "Vladimir S. FONOV" <[email protected]>
+Date: Thu, 8 Sep 2016 15:01:42 -0400
+Subject: [PATCH] Fixing function forgotten in
+ d99dd01632dbcb62870870557b333142b9117e9a , related to #74
+
+---
+ libsrc/hdf_convenience.c | 18 ++++++++++++++++++
+ libsrc/hdf_convenience.h | 1 +
+ libsrc/minc_compat.c | 9 ++-------
+ 3 files changed, 21 insertions(+), 7 deletions(-)
+
+Index: libminc-2.3.00/libsrc/hdf_convenience.c
+===================================================================
+--- libminc-2.3.00.orig/libsrc/hdf_convenience.c
++++ libminc-2.3.00/libsrc/hdf_convenience.c
+@@ -2412,4 +2412,22 @@ hdf_access(const char *path)
+ return (status > 0); /* Return non-zero if success */
+ }
+
++/*
++ * Flushes the hdf file to disk
++ */
++int
++hdf_flush(int fd)
++{
++ struct m2_file *file;
++ if ((file = hdf_id_check(fd))!=NULL ) {
++ /* Commit the (entire) file to disk. */
++ if (H5Fflush(file->file_id, H5F_SCOPE_GLOBAL) < 0) {
++ return MI_ERROR;
++ }
++ return MI_NOERROR;
++ }
++ return MI_ERROR;
++}
++
++
+ #endif /* MINC2 defined */
+Index: libminc-2.3.00/libsrc/hdf_convenience.h
+===================================================================
+--- libminc-2.3.00.orig/libsrc/hdf_convenience.h
++++ libminc-2.3.00/libsrc/hdf_convenience.h
+@@ -49,4 +49,5 @@ extern int hdf_open(const char *path, in
+ extern int hdf_create(const char *path, int mode, struct mi2opts *opts_ptr);
+ extern int hdf_close(int fd);
+ extern int hdf_access(const char *path);
++extern int hdf_flush(int fd);
+
+Index: libminc-2.3.00/libsrc/minc_compat.c
+===================================================================
+--- libminc-2.3.00.orig/libsrc/minc_compat.c
++++ libminc-2.3.00/libsrc/minc_compat.c
+@@ -358,14 +358,9 @@ MI2redef(int fd)
+ MNCAPI int
+ MI2sync(int fd)
+ {
+- if (MI2_ISH5OBJ(fd)) {
++ if (MI2_ISH5OBJ(fd) ) {
+ /* Commit the (entire) file to disk. */
+- if (H5Fflush(fd, H5F_SCOPE_GLOBAL) < 0) {
+- return (MI_ERROR);
+- }
+- else {
+- return (MI_NOERROR);
+- }
++ return hdf_flush(fd);
+ }
+ else {
+ return (ncsync(fd));
diff -Nru libminc-2.3.00/debian/patches/upstream-d99dd01.patch libminc-2.3.00/debian/patches/upstream-d99dd01.patch
--- libminc-2.3.00/debian/patches/upstream-d99dd01.patch 1970-01-01 01:00:00.000000000 +0100
+++ libminc-2.3.00/debian/patches/upstream-d99dd01.patch 2016-10-20 20:24:12.000000000 +0200
@@ -0,0 +1,402 @@
+From d99dd01632dbcb62870870557b333142b9117e9a Mon Sep 17 00:00:00 2001
+From: "Robert D. Vincent" <[email protected]>
+Date: Wed, 27 Jul 2016 08:15:04 -0400
+Subject: [PATCH] Fix #74, don't assume hid_t === int since this is no longer
+ true in HDF5 1.10.
+
+---
+ libsrc/hdf_convenience.c | 121 +++++++++++++++++++++++++----------------------
+ libsrc/minc.h | 8 +++-
+ 2 files changed, 71 insertions(+), 58 deletions(-)
+
+Index: libminc-2.3.00/libsrc/hdf_convenience.c
+===================================================================
+--- libminc-2.3.00.orig/libsrc/hdf_convenience.c
++++ libminc-2.3.00/libsrc/hdf_convenience.c
+@@ -45,7 +45,8 @@ struct m2_dim {
+
+ static struct m2_file {
+ struct m2_file *link;
+- hid_t fd;
++ int fd; /* our fake file id */
++ hid_t file_id; /* actual hdf5 file id */
+ int wr_ok; /* non-zero if write OK */
+ int resolution; /* Resolution setting. */
+ int nvars;
+@@ -74,18 +75,20 @@ hdf_id_check(int fd)
+ }
+
+ static struct m2_file *
+-hdf_id_add(int fd)
++hdf_id_add(hid_t file_id)
+ {
+ struct m2_file *new;
++ static unsigned short _id = 0; /* at most 2^16 id's */
+
+ new = (struct m2_file *) malloc(sizeof (struct m2_file));
+ if (new != NULL) {
+- new->fd = fd;
++ new->fd = HDF5_ID_MIN + _id++;
++ new->file_id = file_id;
+ new->resolution = 0;
+ new->nvars = 0;
+ new->ndims = 0;
+ new->link =_m2_list;
+- new->grp_id = H5Gopen1(fd, MI2_GRPNAME);
++ new->grp_id = H5Gopen1(file_id, MI2_GRPNAME);
+ new->comp_type = MI2_COMP_UNKNOWN;
+ new->comp_param = 0;
+ new->chunk_type = MI2_CHUNK_UNKNOWN;
+@@ -99,7 +102,7 @@ hdf_id_add(int fd)
+ return (new);
+ }
+
+-static int
++static int
+ hdf_id_del(int fd)
+ {
+ struct m2_file *curr, *prev;
+@@ -142,6 +145,7 @@ hdf_id_del(int fd)
+ }
+
+ H5Gclose(curr->grp_id);
++ H5Fclose(curr->file_id);
+ free(curr);
+ return (MI_NOERROR);
+ }
+@@ -187,7 +191,7 @@ hdf_var_add(struct m2_file *file, const
+ strncpy(new->name, name, NC_MAX_NAME - 1);
+ strncpy(new->path, path, NC_MAX_NAME - 1);
+ new->is_cmpd = 0;
+- new->dset_id = H5Dopen1(file->fd, path);
++ new->dset_id = H5Dopen1(file->file_id, path);
+ new->ftyp_id = H5Dget_type(new->dset_id);
+ new->mtyp_id = H5Tget_native_type(new->ftyp_id, H5T_DIR_ASCEND);
+ new->fspc_id = H5Dget_space(new->dset_id);
+@@ -490,7 +494,7 @@ hdf_attinq(int fd, int varid, const char
+ return (MI_ERROR);
+ }
+
+- if (varid == NC_GLOBAL) {
++ if (varid == NC_GLOBAL || varid == MI_ROOTVARIABLE_ID) {
+ var = NULL;
+ loc_id = file->grp_id;
+ }
+@@ -591,7 +595,7 @@ hdf_attinq(int fd, int varid, const char
+ }
+
+ static int
+-hdf_put_dimorder(struct m2_file *file, int dst_id, int ndims,
++hdf_put_dimorder(struct m2_file *file, hid_t dst_id, int ndims,
+ const int *dims_ptr)
+ {
+ int i;
+@@ -626,6 +630,9 @@ hdf_put_dimorder(struct m2_file *file, i
+ if (att_id >= 0) {
+ H5Awrite(att_id, typ_id, str_buf);
+ }
++ else {
++ fprintf(stderr, "Failed to create dimorder %lx\n", dst_id);
++ }
+
+ H5Aclose(att_id);
+ H5Sclose(spc_id);
+@@ -634,7 +641,7 @@ hdf_put_dimorder(struct m2_file *file, i
+ }
+
+ static int
+-hdf_get_dimorder(struct m2_file *file, int dst_id, int ndims, int *dims_ptr)
++hdf_get_dimorder(struct m2_file *file, hid_t dst_id, int ndims, int *dims_ptr)
+ {
+ char *str_ptr;
+ char *tmp_ptr;
+@@ -974,7 +981,7 @@ hdf_attget(int fd, int varid, const char
+ return (MI_ERROR);
+ }
+
+- if (varid == NC_GLOBAL) {
++ if (varid == NC_GLOBAL || varid == MI_ROOTVARIABLE_ID) {
+ var = NULL;
+ loc_id = file->grp_id;
+ }
+@@ -1120,11 +1127,11 @@ hdf_attput(int fd, int varid, const char
+ H5Pclose(new_plst_id);
+ H5Sclose(var->fspc_id);
+
+- if (H5Gunlink(fd, var->path) < 0) {
++ if (H5Gunlink(file->file_id, var->path) < 0) {
+ milog_message(MI_MSG_SNH);
+ }
+
+- if (H5Gmove2(file->grp_id, temp, fd, var->path) < 0) {
++ if (H5Gmove2(file->grp_id, temp, file->file_id, var->path) < 0) {
+ milog_message(MI_MSG_SNH);
+ }
+
+@@ -1196,7 +1203,7 @@ hdf_attput(int fd, int varid, const char
+ att_id = H5Acreate2(loc_id, attnm, ftyp_id, spc_id, H5P_DEFAULT, H5P_DEFAULT);
+
+ if (att_id < 0)
+- goto cleanup;
++ goto cleanup;
+
+ /* Save the value.
+ */
+@@ -1261,10 +1268,10 @@ int
+ hdf_vardef(int fd, const char *varnm, nc_type vartype, int ndims,
+ const int *dimids)
+ {
+- int dst_id = -1;
+- int typ_id = -1;
+- int spc_id = -1;
+- int prp_id = -1;
++ hid_t dst_id = -1;
++ hid_t typ_id = -1;
++ hid_t spc_id = -1;
++ hid_t prp_id = -1;
+ int status = MI_ERROR;
+ int i;
+ long length;
+@@ -1392,7 +1399,7 @@ hdf_vardef(int fd, const char *varnm, nc
+ }
+
+ H5E_BEGIN_TRY {
+- dst_id = H5Dcreate2(fd, varpath, typ_id, spc_id, H5P_DEFAULT, prp_id, H5P_DEFAULT);
++ dst_id = H5Dcreate2(file->file_id, varpath, typ_id, spc_id, H5P_DEFAULT, prp_id, H5P_DEFAULT);
+ } H5E_END_TRY;
+
+ if (dst_id < 0) {
+@@ -1465,10 +1472,10 @@ hdf_varget(int fd, int varid, const long
+ void *val_ptr)
+ {
+ int status = MI_ERROR;
+- int dst_id = -1;
+- int typ_id = -1;
+- int fspc_id = -1;
+- int mspc_id = -1;
++ hid_t dst_id = -1;
++ hid_t typ_id = -1;
++ hid_t fspc_id = -1;
++ hid_t mspc_id = -1;
+ int i;
+ int ndims;
+ hsize_t fstart[MAX_VAR_DIMS];
+@@ -1560,8 +1567,8 @@ hdf_varget(int fd, int varid, const long
+ }
+
+ int
+-hdf_varputg(int fd, int varid, const long *start,
+- const long *edges, const long *stride,
++hdf_varputg(int fd, int varid, const long *start,
++ const long *edges, const long *stride,
+ const long *map, const void *value)
+ {
+ int status = MI_ERROR; /* Assume guilty */
+@@ -1577,10 +1584,10 @@ hdf_varputg(int fd, int varid, const lon
+
+ struct m2_var *varp;
+ struct m2_file *file;
+- int dst_id = -1;
+- int typ_id = -1;
+- int fspc_id = -1;
+- int mspc_id = -1;
++ hid_t dst_id = -1;
++ hid_t typ_id = -1;
++ hid_t fspc_id = -1;
++ hid_t mspc_id = -1;
+
+ if ((file = hdf_id_check(fd)) == NULL) {
+ return (MI_ERROR);
+@@ -1747,8 +1754,8 @@ hdf_varputg(int fd, int varid, const lon
+ }
+
+ int
+-hdf_vargetg(int fd, int varid, const long *start,
+- const long *edges, const long *stride,
++hdf_vargetg(int fd, int varid, const long *start,
++ const long *edges, const long *stride,
+ const long *map, void *value)
+ {
+ int status = MI_NOERROR;
+@@ -1910,10 +1917,10 @@ hdf_varput(int fd, int varid, const long
+ const void *val_ptr)
+ {
+ int status = MI_ERROR;
+- int dst_id;
+- int typ_id;
+- int fspc_id;
+- int mspc_id = -1;
++ hid_t dst_id;
++ hid_t typ_id;
++ hid_t fspc_id;
++ hid_t mspc_id = -1;
+ int i;
+ int ndims;
+ hsize_t fstart[MAX_VAR_DIMS];
+@@ -2085,6 +2092,7 @@ herr_t hdf_copy_attr(hid_t in_id, const
+ * don't overwrite the existing value.
+ */
+ status = MI_NOERROR;
++ fprintf(stderr, "Failed to create attribute '%s'\n", attr_name);
+ goto cleanup;
+ }
+
+@@ -2195,7 +2203,7 @@ hdf_open_dsets(struct m2_file *file, hid
+ int
+ hdf_open(const char *path, int mode)
+ {
+- hid_t fd;
++ hid_t file_id;
+ hid_t grp_id;
+ hid_t dset_id;
+ struct m2_file *file;
+@@ -2210,28 +2218,28 @@ hdf_open(const char *path, int mode)
+
+ prp_id = H5Pcreate(H5P_FILE_ACCESS);
+ H5Pset_fapl_mmap(prp_id, 8192, 1);
+- fd = H5Fopen(path, mode & 0x7FFF, prp_id);
++ file_id = H5Fopen(path, mode & 0x7FFF, prp_id);
+ H5Pclose(prp_id);
+ }
+ else {
+- fd = H5Fopen(path, mode, H5P_DEFAULT);
++ file_id = H5Fopen(path, mode, H5P_DEFAULT);
+ }
+ #else
+- fd = H5Fopen(path, mode, H5P_DEFAULT);
++ file_id = H5Fopen(path, mode, H5P_DEFAULT);
+ #endif
+ } H5E_END_TRY;
+
+- if (fd < 0) {
++ if (file_id < 0) {
+ return (MI_ERROR);
+ }
+
+- file = hdf_id_add(fd); /* Add it to the list */
++ file = hdf_id_add(file_id); /* Add it to the list */
+ file->wr_ok = (mode & H5F_ACC_RDWR) != 0;
+
+ /* Open the image variables.
+ */
+ H5E_BEGIN_TRY {
+- dset_id = H5Dopen1(fd, "/minc-2.0/image/0/image");
++ dset_id = H5Dopen1(file_id, "/minc-2.0/image/0/image");
+ if (dset_id >= 0) {
+ hid_t type_id;
+ int is_compound = 0;
+@@ -2262,7 +2270,7 @@ hdf_open(const char *path, int mode)
+ H5Dclose(dset_id);
+ }
+
+- dset_id = H5Dopen1(fd, "/minc-2.0/image/0/image-min");
++ dset_id = H5Dopen1(file_id, "/minc-2.0/image/0/image-min");
+ if (dset_id >= 0) {
+ hdf_get_diminfo(dset_id, &ndims, dims);
+ hdf_var_add(file, MIimagemin, "/minc-2.0/image/0/image-min",
+@@ -2270,7 +2278,7 @@ hdf_open(const char *path, int mode)
+ H5Dclose(dset_id);
+ }
+
+- dset_id = H5Dopen1(fd, "/minc-2.0/image/0/image-max");
++ dset_id = H5Dopen1(file_id, "/minc-2.0/image/0/image-max");
+ if (dset_id >= 0) {
+ hdf_get_diminfo(dset_id, &ndims, dims);
+ hdf_var_add(file, MIimagemax, "/minc-2.0/image/0/image-max",
+@@ -2281,16 +2289,16 @@ hdf_open(const char *path, int mode)
+
+ /* Open all of the datasets in the "dimensions" category.
+ */
+- grp_id = H5Gopen2(fd, "/minc-2.0/dimensions", H5P_DEFAULT);
++ grp_id = H5Gopen2(file_id, "/minc-2.0/dimensions", H5P_DEFAULT);
+ hdf_open_dsets(file, grp_id, "/minc-2.0/dimensions/", 1);
+ H5Gclose(grp_id);
+
+ /* Open all of the datasets in the "info" category.
+ */
+- grp_id = H5Gopen2(fd, "/minc-2.0/info", H5P_DEFAULT);
++ grp_id = H5Gopen2(file_id, "/minc-2.0/info", H5P_DEFAULT);
+ hdf_open_dsets(file, grp_id, "/minc-2.0/info/", 0);
+ H5Gclose(grp_id);
+- return (fd);
++ return (file->fd);
+ }
+
+ /** Create an HDF5 file. */
+@@ -2298,7 +2306,7 @@ int
+ hdf_create(const char *path, int cmode, struct mi2opts *opts_ptr)
+ {
+ hid_t grp_id;
+- hid_t fd;
++ hid_t file_id;
+ hid_t tmp_id;
+ struct m2_file *file;
+ hid_t hdf_gpid;
+@@ -2319,10 +2327,10 @@ hdf_create(const char *path, int cmode,
+ H5Pset_libver_bounds (fpid, H5F_LIBVER_18, H5F_LIBVER_18);
+
+ H5E_BEGIN_TRY {
+- fd = H5Fcreate(path, cmode, H5P_DEFAULT, fpid);
++ file_id = H5Fcreate(path, cmode, H5P_DEFAULT, fpid);
+ } H5E_END_TRY;
+- if (fd < 0) {
+- fprintf(stderr, "Error creating HDF file '%s' with mode '%x', result %d\n", path, cmode, fd);
++ if (file_id < 0) {
++ fprintf(stderr, "Error creating HDF file '%s' with mode '%x', result %d\n", path, cmode, (int)file_id);
+ H5Eprint1(stderr);
+ return (MI_ERROR);
+ }
+@@ -2332,7 +2340,7 @@ hdf_create(const char *path, int cmode,
+ /* Create the default groups.
+ * Should we use a non-zero value for size_hint (parameter 3)???
+ */
+- if ((grp_id = H5Gcreate2(fd, MI2_GRPNAME, H5P_DEFAULT, hdf_gpid, H5P_DEFAULT)) < 0) {
++ if ((grp_id = H5Gcreate2(file_id, MI2_GRPNAME, H5P_DEFAULT, hdf_gpid, H5P_DEFAULT)) < 0) {
+ fprintf(stderr, "Error creating groups on line %d\n", __LINE__);
+ H5Eprint1(stderr);
+ return (MI_ERROR);
+@@ -2369,7 +2377,7 @@ hdf_create(const char *path, int cmode,
+ H5Gclose(tmp_id);
+ H5Gclose(grp_id);
+
+- file = hdf_id_add(fd); /* Add it to the list */
++ file = hdf_id_add(file_id); /* Add it to the list */
+ if (file == NULL) {
+ fprintf(stderr, "Error adding ID to list.\n");
+ H5Eprint1(stderr);
+@@ -2384,7 +2392,7 @@ hdf_create(const char *path, int cmode,
+ file->chunk_type = opts_ptr->chunk_type;
+ file->chunk_param = opts_ptr->chunk_param;
+ }
+- return ((int) fd);
++ return (file->fd);
+ }
+
+ int
+@@ -2392,7 +2400,6 @@ hdf_close(int fd)
+ {
+ hdf_dim_commit(fd); /* Make sure all dimensions were saved. */
+ hdf_id_del(fd); /* Delete it from the list. */
+- H5Fclose(fd);
+ return (MI_NOERROR);
+ }
+
+Index: libminc-2.3.00/libsrc/minc.h
+===================================================================
+--- libminc-2.3.00.orig/libsrc/minc.h
++++ libminc-2.3.00/libsrc/minc.h
+@@ -617,7 +617,13 @@ struct mi2opts {
+ int chunk_param;
+ };
+
+-#define MI2_ISH5OBJ(x) (H5Iget_type(x) > 0)
++/* This is hackish in that it assumes that all NetCDF handles returned
++ * by ncopen/nccreate will be small integers. Historically this is
++ * true, but it could break someday. We used to use an HDF5 call, but
++ * that broke when HDF5 switched from 32 to 64 bits for hid_t.
++ */
++#define HDF5_ID_MIN 0x30000000
++#define MI2_ISH5OBJ(x) (x >= HDF5_ID_MIN)
+
+ MNCAPI int micreatex(const char *path, int cmode, struct mi2opts *opts_ptr);
+
diff -Nru libminc-2.3.00/debian/rules libminc-2.3.00/debian/rules
--- libminc-2.3.00/debian/rules 2015-09-05 08:03:54.000000000 +0200
+++ libminc-2.3.00/debian/rules 2016-10-20 19:29:50.000000000 +0200
@@ -1,5 +1,6 @@
#! /usr/bin/make -f
+export DEB_CPPFLAGS_MAINT_APPEND := -Wconversion
ARCH = $(shell dpkg-architecture -qDEB_TARGET_MULTIARCH)
--- End Message ---