FiberBundleHDF5  FiberHDF5 Documentation, Revision 2026
High-Performance Fiber Bundle Data Model for Scientific Visualization
Loading...
Searching...
No Matches
F5X.c
Go to the documentation of this file.
1#define _WIN32_WINNT 0x0501
2
3
4#if defined(_WIN32)
5
6#include <ws2tcpip.h>
7#define USE_WINDOWS_SOCKETS
8#define ioctl_socket(a, b, c) ioctlsocket (a, b, (u_long *) (c))
9
10#elif defined(_AIX)
11
12#define _ALL_SOURCE
13#define _XOPEN_SOURCE
14#define _UNIX03
15#include <sys/types.h>
16#include <sys/socket.h>
17#include <sys/socketvar.h>
18#include <netdb.h>
19#include <errno.h>
20#include <unistd.h>
21
22#define INVALID_SOCKET -1
23#define WSAGetLastError() errno
24#define closesocket(fd) close(fd)
25#define ioctl_socket(a, b, c) ioctl(a, b, c)
26
27#else
28
29#ifndef _POSIX_SOURCE
30#define _POSIX_SOURCE
31#endif
32
33#include <netdb.h>
34#include <netinet/in.h>
35#include <errno.h>
36#include <unistd.h>
37
38#define INVALID_SOCKET -1
39#define WSAGetLastError() errno
40#define closesocket(fd) close(fd)
41#define ioctl_socket(a, b, c) ioctl(a, b, c)
42
43#endif
44
45#include <string.h>
46
47#include "F5X.h"
48#include "F5private.h"
49#include "F5defs.h"
50/* erik commented --< */
51/* #if defined(__APPLE__) && defined(__MACH__) && defined(__POWERPC__) */
52#include <stdlib.h>
53/* #else */
54/* #include <malloc.h> */
55/* #endif */
56/* >-- */
57#include <assert.h>
58
59hid_t F5Gappend(hid_t loc_id, const char *name)
60{
61 return F5Gappend_hinted_creation(loc_id, name, -1, -1);
62}
63
64
65hid_t F5Gcreate(hid_t loc_id, const char *name,
66 int est_num_entries, int est_name_len )
67{
68hid_t id;
69hid_t lcpl_id = H5Pcreate(H5P_LINK_CREATE);
70 H5Pset_char_encoding(lcpl_id, H5T_CSET_UTF8);
71
72hid_t gcpl_id = H5Pcreate( H5P_GROUP_CREATE );
73
74 if (est_num_entries>=0 && est_name_len >=0)
75 {
76 H5Pset_est_link_info( gcpl_id, (unsigned) est_num_entries, (unsigned) est_name_len );
77 }
78 H5Pset_link_creation_order( gcpl_id, H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED );
79
80 id = H5Gcreate2(loc_id, name, lcpl_id, gcpl_id, H5P_DEFAULT);
81
82 H5Pclose( gcpl_id );
83 H5Pclose( lcpl_id );
84 return id;
85}
86
87hid_t F5Gappend_hinted_creation(hid_t loc_id, const char *name,
88 int est_num_entries, int est_name_len )
89{
90hid_t id;
91
92 F5printf(30, "F5Gappend(%lli,%s)", loc_id, name);
93
94 H5E_BEGIN_TRY
95 id = H5Gopen2(loc_id, name, H5P_DEFAULT );
96 H5E_END_TRY
97
98 if (id<0)
99 {
100 id = F5Gcreate(loc_id, name, est_num_entries, est_name_len );
101 if (id<0)
102 {
103 F5printf(0, "F5Gcreate(`%s') failed on ID %d!\n", name, (int)loc_id);
104 }
105 }
106
107 if (id<0)
108 F5printf(0, "F5Gappend(%lli,%s) FAILED", loc_id, name);
109
110 return id;
111}
112
113hid_t F5Gappend_tree(hid_t loc_id, const char *name)
114{
115char *tree = strdup(name);
116char *ptr = strtok(tree, "/");
117hid_t group_id = loc_id;
118 while(ptr)
119 {
120 hid_t subgroup_id = F5Gappend(group_id, ptr);
121
122 F5printf(0, "F5Gappend_tree - %s", ptr);
123
124 if (group_id != loc_id)
125 H5Gclose( group_id );
126
127 group_id = subgroup_id;
128
129 ptr = strtok(0, "/");
130 }
131
132 free(tree);
133 return group_id;
134}
135
136hid_t F5Gappend_external(hid_t loc_id, const char *name,
137 const char *target_file_name,
138 const char *target_obj_name,
139 const char *prefix )
140{
141herr_t external_err;
142hid_t id;
143 H5E_BEGIN_TRY
144 id = H5Gopen2(loc_id, name, H5P_DEFAULT);
145 H5E_END_TRY
146 if (id>=0)
147 return id;
148
149
150/* link creation property list used in creating the new link. */
151/*
152If crt_intermed_group is non-positive, the H5G_CRT_INTMD_GROUP, if present, will be removed from lcpl_id. Missing intermediate groups will not be created upon calls to functions such as those listed above that use lcpl_id.
153 herr_t H5Pset_create_intermediate_group( hid_t lcpl_id, unsigned crt_intermed_group )
154*/
155hid_t lcpl_id = H5Pcreate(H5P_LINK_CREATE);
156 H5Pset_char_encoding( lcpl_id, H5T_CSET_UTF8 );
157
158/*
159 herr_t H5Pset_elink_cb( hid_t lapl_id, H5L_elink_traverse_t func, void *op_data )
160 Purpose:
161 Sets the external link traversal callback function in a link access property list.
162
163 herr_t H5Pset_elink_fapl( hid_t lapl_id, hid_t fapl_id )
164 Purpose:
165Sets a file access property list for use in accessing a file pointed to by an external link.
166*/
167hid_t lapl_id = H5Pcreate( H5P_LINK_ACCESS );
168
169 if (prefix && *prefix)
170 H5Pset_elink_prefix( lapl_id, prefix );
171
172/*
173 The library opens target file target_file_name with the file access property list that is set via H5Pset_elink_fapl when the external link link_name is accessed. If no such property list is set, the library uses the file access property list associated with the file of link_loc_id to open the target file.
174*/
175 external_err = H5Lcreate_external( target_file_name, target_obj_name,
176 loc_id, name, lcpl_id, lapl_id );
177 H5Pclose(lcpl_id);
178 H5Pclose(lapl_id);
179
180 H5E_BEGIN_TRY
181 id = H5Gopen2(loc_id, name, H5P_DEFAULT);
182 H5E_END_TRY
183 if (id<0)
184 {
185 hid_t ExternalFileID, ExternalFileGroup;
186 F5printf(0, "F5Gappend_external(%lli,%s, target_file_name=%s,target_obj_name=%s,prefix=%s) INFO - No external file yet, thus- CREATING external file structure", loc_id, name,
187 target_file_name,
188 target_obj_name,
189 prefix );
190 ExternalFileID = F5append( target_file_name );
191 if (ExternalFileID<0)
192 {
193 F5printf(0, "F5GappendExternal(%lli,%s, target_file_name=%s,target_obj_name=%s,prefix=%s) FAILED CREATING external file", loc_id, name,
194 target_file_name,
195 target_obj_name,
196 prefix );
197 }
198
199 ExternalFileGroup = F5Gappend_tree(ExternalFileID, target_obj_name);
200
201 if (ExternalFileGroup<0)
202 {
203 F5printf(0, "F5GappendExternal(%lli,%s, target_file_name=%s,target_obj_name=%s,prefix=%s) FAILED CREATING external file group", loc_id, name,
204 target_file_name,
205 target_obj_name,
206 prefix );
207 }
208
209 H5Gclose( ExternalFileGroup );
210 H5Fclose( ExternalFileID );
211
212 id = H5Gopen2(loc_id, name, H5P_DEFAULT);
213 if (id<0)
214 {
215 F5printf(0, "F5GappendExternal(%lli,%s, target_file_name=%s,target_obj_name=%s,prefix=%s) FAILED CREATING external file structure", loc_id, name,
216 target_file_name,
217 target_obj_name,
218 prefix );
219 }
220 }
221
222 return id;
223}
224
225hid_t F5append(const char *filename )
226{
227hid_t id;
228
229 H5E_BEGIN_TRY
230 id = H5Fcreate (filename, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT);
231 H5E_END_TRY
232
233 if (id<0)
234 return H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT);
235
236 return id;
237}
238
239hid_t F5Dappend(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t create_plist_id )
240{
241hid_t id;
242
243 H5E_BEGIN_TRY
244 id = H5Dopen2(loc_id, name, H5P_DEFAULT );
245 H5E_END_TRY
246
247 if (id>0)
248 {
249 hid_t FileSpace_id = H5Dget_space( id );
250 hssize_t NewPoints = H5Sget_simple_extent_npoints( space_id );
251 hssize_t OldPoints = H5Sget_simple_extent_npoints( FileSpace_id );
252 F5printf(41, "F5Dappend(%lli,%s,...) opening existing dataset...", loc_id, name);
253 H5Sclose( FileSpace_id );
254
255 if (NewPoints != OldPoints)
256 {
257 hid_t lapl_id = H5P_DEFAULT;
258
259 F5printf(0, "PERFORMANCE WARNING: F5Dappend(,%s,,NewSize=%lld,...) modifying dataset to different size, it is %lld currently (%s to %u%%).",
260 name, (long long)NewPoints, (long long)OldPoints,
261 (NewPoints<OldPoints)?"shrink":"grow", (int)(100*NewPoints)/OldPoints );
262 H5Dclose(id);
263 id = -1;
264 H5Ldelete( loc_id, name, lapl_id );
265 }
266 }
267
268 if (id<0)
269 {
270 F5printf(41, "F5Dappend(%lli,%s,...) could not open existing dataset...", loc_id, name);
271 id = H5Dcreate2(loc_id, name, type_id, space_id, H5P_DEFAULT, create_plist_id, H5P_DEFAULT) ;
272 if (id<0)
273 F5printf(41, "F5Dappend(%lli,%s,...) could not create dataset...", loc_id, name);
274 }
275 return id;
276}
277
278hid_t F5Dcreate(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t create_plist_id )
279{
280hid_t id;
281 H5E_BEGIN_TRY
282 id = H5Dcreate2(loc_id, name, type_id, space_id, H5P_DEFAULT, create_plist_id, H5P_DEFAULT) ;
283 H5E_END_TRY
284 if (id<0)
285 {
286 F5printf(10, "F5Dcreate(%d,%s,...) could not create dataset, dataset already exists, deleting it...", (int)(loc_id), name);
287 H5Ldelete( loc_id, name, H5P_DEFAULT );
288 id = H5Dcreate2(loc_id, name, type_id, space_id, H5P_DEFAULT, create_plist_id, H5P_DEFAULT);
289 }
290
291 if (id<0)
292 F5printf(0, "F5Dcreate(%d,%s,...) could not create dataset, not even after deletion...", (int)(loc_id), name);
293
294 return id;
295}
296
297hid_t F5Gtry_to_open(hid_t location, const char*name)
298{
299hid_t retval;
300 H5E_BEGIN_TRY
301 retval = H5Gopen2(location, name, H5P_DEFAULT);
302 H5E_END_TRY
303
304 return retval;
305}
306
307int F5Gexist(hid_t location, const char*name)
308{
309hid_t retval;
310
311 H5E_BEGIN_TRY
312 retval = H5Gopen2(location, name, H5P_DEFAULT);
313 H5E_END_TRY
314
315 if (retval>=0)
316 H5Gclose(retval);
317
318 return retval>=0;
319}
320
321int F5Dexist(hid_t location, const char*name)
322{
323hid_t retval;
324
325 H5E_BEGIN_TRY
326 retval = H5Dopen2(location, name, H5P_DEFAULT);
327 H5E_END_TRY
328
329 if (retval>=0)
330 H5Dclose(retval);
331
332 return retval>=0;
333}
334
335hid_t F5Dtry_to_open(hid_t location, const char*name)
336{
337hid_t retval;
338
339 H5E_BEGIN_TRY
340 retval = H5Dopen2(location, name, H5P_DEFAULT);
341 H5E_END_TRY
342
343 return retval;
344}
345
346
347herr_t F5Xclose(hid_t obj_id /*, H5I_type_t* pret_type_id */)
348{
349 /* Get the type */
350 H5I_type_t ObjectType = H5Iget_type(obj_id);
351
352 /* Return it to the caller, if wanted
353 if (pret_type_id)
354 (*pret_type_id) = ObjectType; */
355
356 /* Call the appropriate closing func */
357 switch (ObjectType)
358 {
359 case H5I_FILE:
360 return H5Fclose(obj_id);
361
362 case H5I_GROUP:
363 return H5Gclose(obj_id);
364
365 case H5I_DATATYPE:
366 return H5Tclose(obj_id);
367
368 case H5I_DATASPACE:
369 return H5Sclose(obj_id);
370
371 case H5I_DATASET:
372 return H5Dclose(obj_id);
373
374 case H5I_ATTR:
375 return H5Aclose(obj_id);
376
377 case H5I_BADID:
378 return -1;
379
380 default:
381 printf ("INTERNAL ERROR F5Xclose(): unknown type %d\n", ObjectType);
382 return -1;
383 }
384}
385
386
387
388/*******************************************************************************/
389
391{
392#if defined(_WINDOWS)
393WSADATA wsaData;
394WORD wVersionRequested = MAKEWORD( 2, 2 );
395int err = WSAStartup( wVersionRequested, &wsaData );
396 switch(err)
397 {
398 case 0:
399 break;
400
401 default:
402 puts("windows sockets error");
403 break;
404 }
405#endif
406}
407
409{
410#if defined(_WINDOWS)
411 WSACleanup( );
412#endif
413}
414
415int F5connect(const char*url)
416{
417#ifndef NI_MAXHOST
418#define NI_MAXHOST 10000
419#endif
420
421char hostname[NI_MAXHOST];
422char *p, *command;
423
424const char*service = "6666";
425int sockfd = 0;
426struct addrinfo *res;
427struct addrinfo *r;
428int error;
429int commandlen = 0;
430
431 /*
432 URL chopping: get hostname and service name
433 */
434 if ( strncmp( url, "hdf5://", 7 ) != 0
435 &&
436 strncmp( url, "HDF5://", 7 ) != 0 )
437 {
438 return 0;
439 }
440 url += 7;
441
442 strcpy(hostname, url);
443 p = strchr(hostname,':');
444 if (p)
445 {
446 *p = '\0';
447 p++;
448 service = p;
449 }
450
451 command = strchr(p?p:hostname,'/');
452 if (command)
453 {
454 *command++ = '\0';
455 commandlen = strlen(command);
456 }
457
458
459/***************************************/
460 error = getaddrinfo(hostname, service, NULL, &res);
461 switch(error)
462 {
463 case EAI_AGAIN: /* case WSATRY_AGAIN: */
464 printf("CANNOT open HDF5 stream from `%s' %s: "
465 "A temporary failure in name resolution occurred.\n", hostname, service);
466 return -1;
467
468 case EAI_BADFLAGS:/* WSAEINVAL */
469 printf("CANNOT open HDF5 stream from `%s' %s: "
470 "An invalid value was provided for the ai_flags member of the hints parameter.\n",
471 hostname, service);
472 return -1;
473
474 case EAI_FAIL:/* WSANO_RECOVERY */
475 printf("CANNOT open HDF5 stream from `%s' %s:"
476 " A nonrecoverable failure in name resolution occurred.\n",
477 hostname, service);
478 return -1;
479
480/*
481EAI_FAMILY WSAEAFNOSUPPORT The ai_family member of the hints parameter is not supported.
482EAI_MEMORY WSA_NOT_ENOUGH_MEMORY A memory allocation failure occurred.
483*/
484 case EAI_NONAME: /* WSAHOST_NOT_FOUND */
485 printf("CANNOT open HDF5 stream from `%s' %s: "
486 "The name does not resolve for the supplied parameters "
487 "or the nodename and servname parameters were not provided.\n", hostname, service);
488 return -1;
489
490 case EAI_SERVICE: /* WSATYPE_NOT_FOUND */
491 printf("CANNOT open HDF5 stream from `%s' %s: "
492 "The servname parameter is not supported for the specified "
493 "ai_socktype member of the hints parameter.\n", hostname, service);
494 return -1;
495
496/*EAI_SOCKTYPE WSAESOCKTNOSUPPORT The ai_socktype member of the hints parameter is not supported. */
497
498 default:
499 printf("CANNOT open HDF5 stream from `%s' %s: error code %d\n", hostname, service, error);
500 return -1;
501
502 case 0: /* no error */
503 F5printf(10, "HDF5 stream to `%s' %s: addrinfo ok, proceeding\n", hostname, service);
504 break;
505 }
506
507
508 for(r = res; r; r = r->ai_next)
509 {
510 int cerror;
511 sockfd = socket(r->ai_family,
512 r->ai_socktype,
513 r->ai_protocol);
514
515 if (sockfd <= 0 || sockfd==(int)INVALID_SOCKET)
516 {
517 printf("HDF5 stream: FAILED to open connection\n");
518 continue;
519 }
520
521 F5printf(5, "F5connect: Created socket for HDF5 stream from `%s':%s...\n", hostname, service );
522
523 cerror = connect(sockfd, r->ai_addr, r->ai_addrlen);
524 F5printf(5, "F5connect: Connected to `%s':%s...\n", hostname, service );
525 if (cerror)
526 {
527 cerror = WSAGetLastError();
528 switch( cerror )
529 {
530#if defined(_WINDOWS)
531 case WSAECONNREFUSED:
532#else
533 case ECONNREFUSED:
534#endif
535 printf("HDF5 stream to `%s' %s: connection refused.\n", hostname, service);
536 break;
537/*
538// case WSAEADDRNOTAVAIL:
539// printf("HDF5 stream to `%s' %s: The remote address is not a valid address.\n", hostname, service);
540// break;
541
542// case WSAEFAULT:
543// case WSAENETUNREACH:
544// case WSAEHOSTUNREACH:
545// printf("HDF5 stream to `%s' %s: A socket operation was attempted to an unreachable host.\n", hostname, service);
546// break;
547*/
548 default:
549 perror("CANNOT connect to HDF5 stream");
550 printf("HDF5 stream to `%s' %s: error code %d.\n", hostname, service, cerror);
551 continue;
552 }
553 closesocket( sockfd );
554 sockfd = 0;
555 continue;
556 }
557 break;
558 }
559 freeaddrinfo(res);
560
561 if (sockfd<=0)
562 {
563 puts("HDF5 URL: could not open valid connection.");
564 return -1;
565 }
566
567 if (commandlen>0)
568 {
569 int werr;
570 F5printf(1, "Sending HDF5 Request `%s'\n", command );
571
572 werr = send(sockfd, command, commandlen, 0);
573 if (werr<0)
574 perror("Sending HDF5 Request");
575 else if (werr != commandlen)
576 F5printf(1,"Warning: Only sent %d of %d bytes during HDF5 Request transfer\n", werr, commandlen);
577 }
578 return sockfd;
579}
580
581
582void F5closesocket(int socket)
583{
584 if (socket>0)
585 closesocket(socket);
586}
587
588
589hid_t F5open(const char *filename, int socket )
590{
591#ifdef H5_HAVE_STREAM
592hid_t proplist = H5Pcreate (H5P_FILE_ACCESS);
593hid_t file_id;
594
595H5FD_stream_fapl_t fapl;
596 fapl.increment = 1024*1024;
597 fapl.do_socket_io = 1;
598 fapl.socket = socket;
599 fapl.backlog = 0;
600 fapl.broadcast_fn = 0;
601 if (socket>0)
602 {
603 if (H5Pset_fapl_stream ( proplist, &fapl)<0)
604 {
605 puts("HDF5: Problem in H5Pset_fapl_stream ()!");
606 }
607 file_id = H5Fopen("/dev/null", H5F_ACC_RDONLY, proplist);
608 H5Pclose (proplist);
609 if (file_id<0)
610 {
611 puts("Problem Receiving HDF5 Stream Data...");
612 return -1;
613 }
614 return file_id;
615 }
616#endif
617 return H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT);
618}
619
620
621int F5listen(const char *service)
622{
623struct addrinfo hints, *res, *ressave;
624int n, sockfd = -1;
625
626 memset(&hints, 0, sizeof(struct addrinfo));
627
628 /*
629 AI_PASSIVE flag: the resulting address is used to bind
630 to a socket for accepting incoming connections.
631 So, when the hostname==NULL, getaddrinfo function will
632 return one entry per allowed protocol family containing
633 the unspecified address for that family.
634 */
635 hints.ai_flags = AI_PASSIVE;
636 hints.ai_family = AF_INET;
637 hints.ai_socktype = SOCK_STREAM;
638 hints.ai_protocol = IPPROTO_TCP;
639
640 n = getaddrinfo( NULL, service, &hints, &res);
641
642 if (n<0)
643 {
644 return n;
645 }
646
647 ressave = res;
648
649 /*
650 Try open socket with each address getaddrinfo returned,
651 until getting a valid listening socket.
652 */
653 while (res)
654 {
655 sockfd = socket(res->ai_family,
656 res->ai_socktype,
657 res->ai_protocol);
658
659 if (!(sockfd < 0))
660 {
661 if (bind(sockfd, res->ai_addr, res->ai_addrlen) == 0)
662 break;
663
664 closesocket(sockfd);
665 sockfd=-1;
666 }
667 res = res->ai_next;
668 }
669
670 if (sockfd < 0)
671 {
672 freeaddrinfo(ressave);
673 F5printf(1, "F5listen(): could not open socket\n");
674 return -1;
675 }
676
677
678 {
679 struct linger wait_on_close;
680 wait_on_close.l_onoff = 1; /* yes, wait on close */
681 wait_on_close.l_linger = 1; /* and wait for 1 second */
682 setsockopt (sockfd, SOL_SOCKET, SO_LINGER,
683 (const char*)&wait_on_close, sizeof (wait_on_close));
684/*
685// Erik says: the variables "on" and "port" are undeclared
686//#ifdef SO_REUSEPORT
687// if (setsockopt (sockfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(int)) < 0)
688// {
689// printf("Couldn't set SO_REUSEPORT to port %u: %s",
690// port, strerror (errno));
691// closesocket (sockfd);
692// return -1;
693// }
694//#endif
695*/
696 }
697
698 listen(sockfd, SOMAXCONN);
699
700 freeaddrinfo(ressave);
701
702 return sockfd;
703}
H5Tclose(type_id)
name
Definition F5P.c:82
free(name)
#define INVALID_SOCKET
Definition F5X.c:38
#define WSAGetLastError()
Definition F5X.c:39
hid_t F5Gappend_tree(hid_t loc_id, const char *name)
Definition F5X.c:113
#define NI_MAXHOST
#define closesocket(fd)
Definition F5X.c:40
#define F5printf(verbosity,...)
Definition F5private.h:60
hid_t F5Dappend(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t create_plist_id)
Definition F5X.c:239
#define H5Gclose(x)
Definition F5X.h:144
hid_t F5Gcreate(hid_t loc_id, const char *name, int est_num_entries, int est_name_len)
Definition F5X.c:65
hid_t F5Gappend_external(hid_t loc_id, const char *name, const char *target_file_name, const char *target_obj_name, const char *prefix)
Definition F5X.c:136
int F5listen(const char *service)
Definition F5X.c:621
void F5socket_init()
Definition F5X.c:390
hid_t F5append(const char *filename)
Definition F5X.c:225
hid_t F5open(const char *filename, int socket)
Definition F5X.c:589
void F5socket_cleanup()
Definition F5X.c:408
void F5closesocket(int socket)
Definition F5X.c:582
int F5Gexist(hid_t location, const char *name)
Definition F5X.c:307
hid_t F5Dcreate(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t create_plist_id)
Definition F5X.c:278
int F5Dexist(hid_t location, const char *name)
Definition F5X.c:321
int F5connect(const char *url)
Definition F5X.c:415
hid_t F5Dtry_to_open(hid_t location, const char *name)
Definition F5X.c:335
hid_t F5Gtry_to_open(hid_t location, const char *name)
Definition F5X.c:297
herr_t F5Xclose(hid_t obj_id)
Definition F5X.c:347
hid_t F5Gappend(hid_t loc_id, const char *name)
Definition F5X.c:59
hid_t F5Gappend_hinted_creation(hid_t loc_id, const char *name, int est_num_entries, int est_name_len)
Definition F5X.c:87