SIONlib  1.6.1
Scalable I/O library for parallel access to task-local files
sion_file.c
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2015 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include <time.h>
13 #include <assert.h>
14 
15 #include <sys/types.h>
16 #include <sys/stat.h>
17 #include <fcntl.h>
18 #include <unistd.h>
19 
20 #include "sion.h"
21 #include "sion_debug.h"
22 #include "sion_internal.h"
23 #include "sion_file.h"
24 
25 
26 
35 _sion_fileptr *_sion_file_open(const char *fname, unsigned int flags, unsigned int addflags) {
36 
37  _sion_fileptr *sion_fileptr;
38 
39  /* allocate file pointer structure */
40  sion_fileptr = _sion_file_alloc_and_init_sion_fileptr();
41 
42  if(flags & SION_FILE_FLAG_ANSI) {
43  sion_fileptr->flags |= SION_FILE_FLAG_ANSI;
44  if(flags & SION_FILE_FLAG_WRITE) {
45  sion_fileptr->flags |= SION_FILE_FLAG_WRITE;
46 
47  if(flags & SION_FILE_FLAG_CREATE) {
48  sion_fileptr->flags |= SION_FILE_FLAG_CREATE;
49  sion_fileptr->fileptr=_sion_file_open_ansi_write_create(fname,addflags);
50  } else {
51  sion_fileptr->fileptr=_sion_file_open_ansi_write_existing(fname,addflags);
52  }
53  } else {
54  sion_fileptr->flags |= SION_FILE_FLAG_READ;
55  sion_fileptr->fileptr=_sion_file_open_ansi_read(fname,addflags);
56  }
57  } else {
58  if (flags & SION_FILE_FLAG_POSIX) {
59  sion_fileptr->flags |= SION_FILE_FLAG_POSIX;
60 
61  if(flags & SION_FILE_FLAG_WRITE) {
62  sion_fileptr->flags |= SION_FILE_FLAG_WRITE;
63  if(flags & SION_FILE_FLAG_CREATE) {
64  sion_fileptr->flags |= SION_FILE_FLAG_CREATE;
65  sion_fileptr->fd=_sion_file_open_posix_write_create(fname,addflags);
66  } else {
67  sion_fileptr->fd=_sion_file_open_posix_write_existing(fname,addflags);
68  }
69  } else {
70  sion_fileptr->flags |= SION_FILE_FLAG_READ;
71  sion_fileptr->fd=_sion_file_open_posix_read(fname,addflags);
72  }
73  }
74  }
75 
76  /* could not open ANSI file */
77  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI ) {
78  if(!sion_fileptr->fileptr) {
79  free(sion_fileptr);
80  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"error: could not open file (ANSI), %s %d %d, aborting ...\n", fname, flags, addflags);
81  return(NULL);
82  }
83  }
84 
85  /* could not open POSIX file */
86  if(sion_fileptr->flags & SION_FILE_FLAG_POSIX ) {
87  if(sion_fileptr->fd<0) {
88  free(sion_fileptr);
89  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"error: could not open file (POSIX), %s %d %d, aborting ...\n", fname, flags, addflags);
90  return(NULL);
91  }
92  }
93 
94  /* unknown mode? */
95  if(sion_fileptr->flags == 0) {
96  free(sion_fileptr);
97  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"internal error: unknown open type, %s %d %d, aborting ...\n", fname, flags, addflags);
98  return(NULL);
99  }
100 
101  return(sion_fileptr);
102 }
103 
104 
105 #define DFUNCTION "_sion_file_close"
106 
112 int _sion_file_close( _sion_fileptr *sion_fileptr ) {
113  int rc = SION_SUCCESS;
114  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
115  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
116  _sion_file_close_ansi(sion_fileptr->second_fileptr);
117  sion_fileptr->second_fileptr=NULL;
118  }
119  rc=_sion_file_close_ansi(sion_fileptr->fileptr);
120  sion_fileptr->fileptr=NULL;
121  }
122  if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
123  rc=_sion_file_close_posix(sion_fileptr->fd);
124  }
125 
126  DPRINTFP((32, DFUNCTION, -1, "free now fileptr=%x %d rc=%d\n",sion_fileptr,sion_fileptr->flags,rc));
127 
128  free(sion_fileptr);
129 
130  return (rc);
131 }
132 #undef DFUNCTION
133 
142 sion_int64 _sion_file_write(const void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr ) {
143  sion_int64 bytes_written=0;
144  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
145  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) bytes_written=_sion_file_write_ansi(data,bytes,sion_fileptr->second_fileptr);
146  else bytes_written=_sion_file_write_ansi(data,bytes,sion_fileptr->fileptr);
147  } else if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
148  bytes_written=_sion_file_write_posix(data,bytes,sion_fileptr->fd);
149  } else {
150  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_file_write: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags));
151  }
152  return(bytes_written);
153 }
154 
163 sion_int64 _sion_file_read(void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr ) {
164 
165  sion_int64 bytes_read=0;
166  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
167  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) bytes_read=_sion_file_read_ansi(data,bytes,sion_fileptr->second_fileptr);
168  else bytes_read=_sion_file_read_ansi(data,bytes,sion_fileptr->fileptr);
169  } else if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
170  bytes_read=_sion_file_read_posix(data,bytes,sion_fileptr->fd);
171  } else {
172  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_file_read: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags));
173  }
174  return (bytes_read);
175 }
176 
177 
184 long _sion_file_get_opt_blksize( _sion_fileptr *sion_fileptr ) {
185  long opt_size=SION_SIZE_NOT_VALID;
186 
187  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
188  opt_size=_sion_file_get_opt_blksize_ansi(sion_fileptr->fileptr);
189  }
190 
191  if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
192  opt_size=_sion_file_get_opt_blksize_posix(sion_fileptr->fd);
193  }
194 
195  return (opt_size);
196 }
197 
204 int _sion_file_stat_file(const char *fname) {
205  struct stat sbuf;
206  int file_exists=0;
207 
208 #if defined(_SION_LINUX)
209  if (stat(fname, &sbuf) == 0) file_exists=1;
210 #elif defined(_SION_DARWIN)
211  if (stat(fname, &sbuf) == 0) file_exists=1;
212 #elif defined(_SION_AIX)
213  if (stat(fname, &sbuf) == 0) file_exists=1;
214 #elif defined(_SION_BGL)
215  if (stat(fname, &sbuf) == 0) file_exists=1;
216 #elif defined(_SION_BGP)
217  if (stat(fname, &sbuf) == 0) file_exists=1;
218 #elif defined(_SION_BGQ)
219  if (stat(fname, &sbuf) == 0) file_exists=1;
220 #elif defined(_SION_XT)
221  if (stat(fname, &sbuf) == 0) file_exists=1;
222 #endif
223  return (file_exists);
224 }
225 
233 sion_int64 _sion_file_set_position( _sion_fileptr *sion_fileptr, sion_int64 startpointer ) {
234  sion_int64 posinfile=SION_SIZE_NOT_VALID;
235 
236  /* needed to flush data written before set fp to new position */
237 #ifdef FLUSH_BEFORE_SETPOS
238  _sion_flush_file_fp(sion_fileptr);
239 #endif
240 
241  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
242  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
243  posinfile=_sion_file_set_position_ansi(sion_fileptr->second_fileptr, startpointer);
244  } else {
245  posinfile=_sion_file_set_position_ansi(sion_fileptr->fileptr, startpointer);
246  }
247  }
248 
249  if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
250  posinfile=_sion_file_set_position_posix(sion_fileptr->fd, startpointer);
251  }
252 
253  return (posinfile);
254 }
255 
256 
263 sion_int64 _sion_file_get_position( _sion_fileptr *sion_fileptr ) {
264  sion_int64 posinfile=SION_SIZE_NOT_VALID;
265 
266  /* needed to flush data written before set fp to new position */
267 #ifdef FLUSH_BEFORE_SETPOS
268  _sion_flush_file(sion_fileptr);
269 #endif
270 
271  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
272  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
273  posinfile=_sion_file_get_position_ansi(sion_fileptr->second_fileptr);
274  } else {
275  posinfile=_sion_file_get_position_ansi(sion_fileptr->fileptr);
276  }
277  }
278 
279  if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
280  posinfile=_sion_file_get_position_posix(sion_fileptr->fd);
281  }
282 
283  return (posinfile);
284 }
285 
286 
293 int _sion_file_flush( _sion_fileptr *sion_fileptr ) {
294  int rc=SION_SUCCESS;
295 
296  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
297  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
298  rc=_sion_file_flush_ansi(sion_fileptr->second_fileptr);
299  } else {
300  rc=_sion_file_flush_ansi(sion_fileptr->fileptr);
301  }
302  }
303 
304  if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
305  rc=_sion_file_flush_posix(sion_fileptr->fd);
306  }
307 
308  return (rc);
309 }
310 
317 int _sion_file_purge( _sion_fileptr *sion_fileptr ) {
318  int rc=SION_SUCCESS;
319 
320  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
321  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
322  rc=_sion_file_purge_ansi(sion_fileptr->second_fileptr);
323  } else {
324  rc=_sion_file_purge_ansi(sion_fileptr->fileptr);
325  }
326  }
327 
328  if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
329  rc=_sion_file_purge_posix(sion_fileptr->fd);
330  }
331 
332  return (rc);
333 }
334 
343 int _sion_file_set_buffer(_sion_fileptr *sion_fileptr, char *buffer, sion_int32 buffer_size) {
344 
345  int rc=SION_SUCCESS;
346 
347  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
348  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
349  rc=_sion_file_set_buffer_ansi(sion_fileptr->second_fileptr, buffer, buffer_size);
350  } else {
351  rc=_sion_file_set_buffer_ansi(sion_fileptr->fileptr, buffer, buffer_size);
352  }
353  }
354 
355  if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
356  rc=_sion_file_set_buffer_posix(sion_fileptr->fd, buffer, buffer_size);
357  }
358 
359  return (rc);
360 
361 }
362 
370 int _sion_file_set_second_fileptr( _sion_fileptr *sion_fileptr, FILE* fileptr) {
371  int rc=SION_SUCCESS;
372  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
373  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
374  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"internal error: second fileptr already set, aborting ...\n"));
375  }
376  sion_fileptr->flags |= SION_FILE_FLAG_SCNDANSI;
377  sion_fileptr->second_fileptr=fileptr;
378  } else {
379  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"internal error: second fileptr could not be set for POSIX file, aborting ...\n"));
380  }
381  return (rc);
382 }
383 
390 int _sion_file_unset_second_fileptr( _sion_fileptr *sion_fileptr) {
391  int rc=SION_SUCCESS;
392  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
393  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
394  sion_fileptr->flags &= ~SION_FILE_FLAG_SCNDANSI;
395  sion_fileptr->second_fileptr=NULL;
396  } else {
397  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"internal error: second fileptr was not set, aborting ...\n"));
398  }
399  } else {
400  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"internal error: second fileptr could not be unset for POSIX file, aborting ...\n"));
401  }
402  return (rc);
403 }
404 
411 int _sion_file_get_fd( _sion_fileptr *sion_fileptr) {
412  int fd=SION_ID_UNDEF;
413  if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
414  fd=sion_fileptr->fd;
415  }
416  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
417  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
418  fd=fileno(sion_fileptr->second_fileptr);
419  } else {
420  fd=fileno(sion_fileptr->fileptr);
421  }
422  }
423 
424  return (fd);
425 }
426 
427 
428 
429 /* ********************************************************************************************** */
430 /* *** INTERFACE Functions */
431 /* ********************************************************************************************** */
432 
440 FILE *_sion_file_open_ansi_write_create(const char *fname, unsigned int addflags) {
441  FILE *fileptr=NULL;
442 #if defined(_SION_LINUX)
443  fileptr = fopen(fname, "w");
444 #elif defined(_SION_DARWIN)
445  fileptr = fopen(fname, "w");
446 #elif defined(_SION_AIX)
447  {
448  int fd_oflag = 0;
449  int fd;
450 
451  fd_oflag |= O_CREAT | O_RDWR;
452  fd = open64(fname, fd_oflag, 0664);
453 
454  fileptr = fdopen(fd, "w");
455 
456  }
457 #elif defined(_SION_BGL)
458  fileptr = fopen(fname, "w");
459 #elif defined(_SION_BGP)
460  {
461  int fd_oflag = 0;
462  int fd;
463 
464  fd_oflag |= O_CREAT | O_RDWR;
465  fd = open64(fname, fd_oflag, 0664);
466 
467  fileptr = fdopen(fd, "w");
468 
469  }
470 #elif defined(_SION_BGQ)
471  {
472  int fd_oflag = 0;
473  int fd;
474 
475  fd_oflag |= O_CREAT | O_RDWR;
476  fd = open64(fname, fd_oflag, 0664);
477 
478  fileptr = fdopen(fd, "w");
479 
480  }
481 #elif defined(_SION_XT)
482  fileptr = fopen(fname, "w");
483 #endif
484  return (fileptr);
485 }
486 
494 FILE *_sion_file_open_ansi_write_existing(const char *fname, unsigned int addflags) {
495  FILE *fileptr=NULL;
496 #if defined(_SION_LINUX)
497  /* changed from w to r+ to prevent time truncation of empty existing file */
498  fileptr = fopen(fname, "r+");
499 #elif defined(_SION_DARWIN)
500  fileptr = fopen(fname, "r+");
501 #elif defined(_SION_AIX)
502  {
503  int fd_oflag = 0;
504  int fd;
505 
506  fd_oflag |= O_CREAT | O_RDWR;
507  fd = open64(fname, fd_oflag, 0664);
508 
509  fileptr = fdopen(fd, "r+");
510 
511  }
512 #elif defined(_SION_BGL)
513  fileptr = fopen(fname, "r+");
514 #elif defined(_SION_BGP)
515  {
516  int fd_oflag = 0;
517  int fd;
518 
519  fd_oflag |= O_RDWR;
520  fd = open64(fname, fd_oflag, 0664);
521 
522  fileptr = fdopen(fd, "r+");
523 
524  }
525 #elif defined(_SION_BGQ)
526  {
527  int fd_oflag = 0;
528  int fd;
529 
530  fd_oflag |= O_RDWR;
531  fd = open64(fname, fd_oflag, 0664);
532 
533  fileptr = fdopen(fd, "r+");
534 
535  }
536 #elif defined(_SION_XT)
537  fileptr = fopen(fname, "r+");
538 #endif
539  return (fileptr);
540 }
541 
542 
550 FILE *_sion_file_open_ansi_read(const char *fname, unsigned int addflags) {
551  FILE *fileptr=NULL;
552 #if defined(_SION_LINUX)
553  fileptr = fopen(fname, "r");
554 #elif defined(_SION_DARWIN)
555  fileptr = fopen(fname, "r");
556 #elif defined(_SION_AIX)
557  {
558  int fd_oflag = 0;
559  int fd;
560 
561  fd_oflag |= O_RDONLY;
562  fd = open64(fname, fd_oflag, 0664);
563 
564  fileptr = fdopen(fd, "r");
565 
566  }
567 #elif defined(_SION_BGL)
568  fileptr = fopen(fname, "r");
569 #elif defined(_SION_BGP)
570  {
571  int fd_oflag = 0;
572  int fd;
573 
574  fd_oflag |= O_RDONLY;
575  fd = open64(fname, fd_oflag, 0664);
576 
577  fileptr = fdopen(fd, "r");
578 
579  }
580 #elif defined(_SION_BGQ)
581  {
582  int fd_oflag = 0;
583  int fd;
584 
585  fd_oflag |= O_RDONLY;
586  fd = open64(fname, fd_oflag, 0664);
587 
588  fileptr = fdopen(fd, "r");
589 
590  }
591 #elif defined(_SION_XT)
592  fileptr = fopen(fname, "r");
593 #endif
594  return (fileptr);
595 }
596  int _sion_file_close_ansi(FILE *fileptr) {
603  int rc=SION_SUCCESS;
604  int frc;
605 #if defined(_SION_LINUX)
606  frc= fclose(fileptr);
607 #elif defined(_SION_DARWIN)
608  frc= fclose(fileptr);
609 #elif defined(_SION_AIX)
610  frc= fclose(fileptr);
611 #elif defined(_SION_BGL)
612  frc= fclose(fileptr);
613 #elif defined(_SION_BGP)
614  frc= fclose(fileptr);
615 #elif defined(_SION_BGQ)
616  frc= fclose(fileptr);
617 #elif defined(_SION_XT)
618  frc= fclose(fileptr);
619 #endif
620  if(frc) rc=SION_NOT_SUCCESS;
621  return(rc);
622 }
623 
630 long _sion_file_get_opt_blksize_ansi( FILE *fileptr ) {
631  struct stat sbuf;
632  int fd;
633  long opt_size=SION_SIZE_NOT_VALID;
634 
635  fd = fileno(fileptr);
636 
637 #if defined(_SION_LINUX)
638  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
639 #elif defined(_SION_DARWIN)
640  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
641 #elif defined(_SION_AIX)
642  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
643 #elif defined(_SION_BGL)
644  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
645 #elif defined(_SION_BGP)
646  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
647 #elif defined(_SION_BGQ)
648  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
649 #elif defined(_SION_XT)
650  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
651 #endif
652  return (opt_size);
653 }
654 
662 sion_int64 _sion_file_set_position_ansi(FILE *fileptr, sion_int64 startpointer) {
663 
664  sion_int64 newpos = SION_SIZE_NOT_VALID;
665 
666  DPRINTFP((32, "_sion_set_position_ansi", -1, "enter (to %lld) (to %ld)\n", (long long) startpointer, (long) startpointer));
667 
668 #if defined(_SION_LINUX)
669  {
670  off_t offset = (off_t) startpointer;
671  off_t result;
672  int fd;
673  fd = fileno(fileptr);
674  if (offset != startpointer) {
675  DPRINTFP((32, "_sion_set_position_ansi", -1, "_sion_set_position_ansi: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
676  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
677  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"_sion_set_position_ansi: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
678  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
679  }
680  newpos = result = lseek(fd, offset, SEEK_SET);
681  DPRINTFP((1024, "_sion_set_position_ansi", -1, "set position=%lld (LINUX)\n", (long long) result));
682  }
683 #elif defined(_SION_DARWIN)
684  {
685  off_t offset = (off_t) startpointer;
686  off_t result;
687  if (offset != startpointer) {
688  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"_sion_set_position_ansi: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
689  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
690  }
691  newpos = result = fseek(fileptr, offset, SEEK_SET);
692  DPRINTFP((1024, "_sion_set_position_ansi", -1, "set position=%lld (LINUX)\n", (long long) result));
693  }
694 #elif defined(_SION_AIX)
695  off64_t offset = (off_t) startpointer;
696  off64_t result;
697  if (offset != startpointer) {
698  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"_sion_set_position_ansi: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
699  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
700  }
701  result = fseeko64(fileptr, offset, SEEK_SET);
702  newpos = result = ftello64(fileptr);
703 #elif defined(_SION_BGL)
704  off_t offset = (off_t) startpointer;
705  off_t result;
706  int fd;
707  if (offset != startpointer) {
708  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"_sion_set_position_ansi: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
709  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
710  }
711  fd = fileno(fileptr);
712  newpos = result = lseek(fd, offset, SEEK_SET);
713 #elif defined(_SION_BGP)
714  off_t offset = (off_t) startpointer;
715  off_t result;
716  int fd;
717  if (offset != startpointer) {
718  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"_sion_set_position_ansi: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
719  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
720  }
721  fd = fileno(fileptr);
722  newpos = result = lseek(fd, offset, SEEK_SET);
723 #elif defined(_SION_BGQ)
724  off_t offset = (off_t) startpointer;
725  off_t result;
726  int fd;
727  if (offset != startpointer) {
728  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"_sion_set_position_ansi: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
729  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
730  }
731  fd = fileno(fileptr);
732  newpos = result = lseek(fd, offset, SEEK_SET);
733 #elif defined(_SION_XT)
734  {
735  off_t offset = (off_t) startpointer;
736  off_t result;
737  int fd;
738  if (offset != startpointer) {
739  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"_sion_set_position_ansi: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
740  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
741  }
742  fd = fileno(fileptr);
743  newpos = result = lseek(fd, offset, SEEK_SET);
744  }
745 #endif
746  DPRINTFP((32, "_sion_set_position_ansi", -1, "leave (to %lld)\n",(long long) startpointer));
747 
748  return (newpos);
749 }
750 
751 
758 sion_int64 _sion_file_get_position_ansi(FILE *fileptr) {
759 
760  sion_int64 result;
761 #if defined(_SION_LINUX)
762  {
763  off_t resulto;
764  int fd = fileno(fileptr);
765  resulto = lseek(fd,0,SEEK_CUR);
766  result = (sion_int64) resulto;
767  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (LINUX)\n", (long) result));
768  }
769 #elif defined(_SION_DARWIN)
770  {
771  off_t resulto;
772  resulto = ftello(fileptr);
773  result = (sion_int64) resulto;
774  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (DARWIN)\n", (long) result));
775  }
776 #elif defined(_SION_AIX)
777  {
778  result = ftell(fileptr);
779  DPRINTFP((4096, "_sion_get_position", -1, "got position=%lld (AIX)\n", result));
780  }
781 #elif defined(_SION_BGL)
782  {
783  off_t resulto;
784  int fd = fileno(fileptr);
785  resulto = lseek(fd, 0, SEEK_CUR);
786  result = (sion_int64) resulto;
787  DPRINTFP((4096, "_sion_get_position", -1, "got position=%lld (BGL)\n", result));
788  }
789 #elif defined(_SION_BGP)
790  {
791  off_t resulto;
792  int fd = fileno(fileptr);
793  resulto = lseek(fd, 0, SEEK_CUR);
794  result = (sion_int64) resulto;
795  DPRINTFP((4096, "_sion_get_position", -1, "got position=%lld (BGP)\n", result));
796  }
797 #elif defined(_SION_BGQ)
798  {
799  off_t resulto;
800  int fd = fileno(fileptr);
801  resulto = lseek(fd, 0, SEEK_CUR);
802  result = (sion_int64) resulto;
803  DPRINTFP((4096, "_sion_get_position", -1, "got position=%lld (BGQ)\n", result));
804  }
805 #elif defined(_SION_XT)
806  {
807  off_t resulto;
808  int fd = fileno(fileptr);
809  resulto = lseek(fd, 0, SEEK_CUR);
810  result = (sion_int64) resulto;
811  DPRINTFP((4096, "_sion_get_position", -1, "got position=%lld (XT)\n", result));
812  }
813 #endif
814 
815  return (result);
816 }
817 
818 
825 int _sion_file_flush_ansi(FILE *fileptr) {
826 
827  int rc = SION_SUCCESS;
828  int frc;
829 
830 #if defined(_SION_BGP)
831  frc=fflush(fileptr);
832 #elif defined(_SION_BGQ)
833  frc=fflush(fileptr);
834 #else
835  frc=fflush(fileptr);
836 #endif
837  if(frc) rc=SION_NOT_SUCCESS;
838  return (rc);
839 }
840 
841 
848 int _sion_file_purge_ansi(FILE *fileptr) {
849 
850  int rc = SION_SUCCESS;
851  int frc;
852 
853 #if defined(_SION_BGP)
854  /* 1: int fd = fileno(fileptr); */
855  /* fsync(fd); */
856  /* 2: __fpurge(fileptr); */
857  /* restored to fflush due to a not working fpurge in scalasca */
858  frc=fflush(fileptr);
859 #elif defined(_SION_BGQ)
860  /* 1: int fd = fileno(fileptr); */
861  /* fsync(fd); */
862  /* 2: __fpurge(fileptr); */
863  /* restored to fflush due to a not working fpurge in scalasca */
864  frc=fflush(fileptr);
865 #else
866  frc=fflush(fileptr);
867 #endif
868 
869  if(frc) rc=SION_NOT_SUCCESS;
870  return (rc);
871 }
872 
873 
874 
875 
884 int _sion_file_set_buffer_ansi(FILE *fileptr, char *buffer, sion_int32 buffer_size) {
885 
886  int rc = SION_SUCCESS;
887  int frc;
888 
889  DPRINTFP((32, "_sion_file_set_buffer", -1, "set buffer of fileptr\n"));
890 #if defined(_SION_BGP)
891  frc=setvbuf(fileptr, buffer, _IOFBF, (size_t) buffer_size);
892 #elif defined(_SION_BGQ)
893  frc=setvbuf(fileptr, buffer, _IOFBF, (size_t) buffer_size);
894 #elif defined(_SION_AIX)
895  frc=setvbuf(fileptr, buffer, _IOFBF, (size_t) buffer_size);
896 #else
897  frc=setvbuf(fileptr, buffer, _IOFBF, (size_t) buffer_size);
898 #endif
899 
900  if(frc) rc=SION_NOT_SUCCESS;
901  return (rc);
902 }
903 
904 
913 sion_int64 _sion_file_write_ansi(const void *data, sion_int64 bytes, FILE *fileptr ) {
914  sion_int64 left,bsumwrote;
915  size_t bwrite, bwrote;
916  char *dataptr;
917 
918  left = bytes;
919  bsumwrote = 0;
920  dataptr = (char*) data;
921 
922  while (left > 0) {
923  bwrite = left;
924  bwrote = fwrite(dataptr, 1, bwrite, fileptr);
925  left -= bwrote;
926  dataptr += bwrote;
927  bsumwrote += bwrote;
928  }
929  return (bsumwrote);
930 }
931 
940 sion_int64 _sion_file_read_ansi(void *data, sion_int64 bytes, FILE *fileptr ) {
941 
942  sion_int64 left,bsumread;
943  size_t btoread, bread;
944  char *dataptr;
945 
946  left = bytes;
947  bsumread = 0;
948  dataptr = (char*) data;
949  bread = 0;
950 
951  while ((left > 0) && (!feof(fileptr))) {
952  btoread = left;
953  bread = fread(dataptr, 1, btoread, fileptr);
954  left -= bread;
955  dataptr += bread;
956  bsumread += bread;
957  }
958  return (bsumread);
959 }
960 
961 
962 
963 
971 int _sion_file_open_posix_write_create(const char *fname, unsigned int addflags) {
972 
973  int fd;
974  int fd_oflag = 0;
975 
976 #if defined(_SION_LINUX)
977  fd_oflag |= O_CREAT | O_RDWR;
978  fd = open(fname, fd_oflag, 0664);
979 #elif defined(_SION_DARWIN)
980  fd_oflag |= O_CREAT | O_RDWR;
981  fd = open(fname, fd_oflag, 0664);
982 #elif defined(_SION_AIX)
983  fd_oflag |= O_CREAT | O_RDWR;
984  fd = open64(fname, fd_oflag, 0664);
985 #elif defined(_SION_BGL)
986  fd_oflag |= O_CREAT | O_RDWR;
987  fd = open64(fname, fd_oflag, 0664);
988 #elif defined(_SION_BGP)
989  fd_oflag |= O_CREAT | O_RDWR;
990  fd = open64(fname, fd_oflag, 0664);
991 #elif defined(_SION_BGQ)
992  fd_oflag |= O_CREAT | O_RDWR;
993  fd = open64(fname, fd_oflag, 0664);
994 #elif defined(_SION_XT)
995  fd_oflag |= O_CREAT | O_RDWR;
996  fd = open64(fname, fd_oflag, 0664);
997 #endif
998  return (fd);
999 }
1000 
1008 int _sion_file_open_posix_write_existing(const char *fname, unsigned int addflags) {
1009 
1010  int fd;
1011  int fd_oflag = 0;
1012 
1013 #if defined(_SION_LINUX)
1014  fd_oflag |= O_RDWR;
1015  fd = open(fname, fd_oflag, 0664);
1016 #elif defined(_SION_DARWIN)
1017  fd_oflag |= O_RDWR;
1018  fd = open(fname, fd_oflag, 0664);
1019 #elif defined(_SION_AIX)
1020  fd_oflag |= O_RDWR;
1021  fd = open64(fname, fd_oflag, 0664);
1022 #elif defined(_SION_BGL)
1023  fd_oflag |= O_RDWR;
1024  fd = open64(fname, fd_oflag, 0664);
1025 #elif defined(_SION_BGP)
1026  fd_oflag |= O_RDWR;
1027  fd = open64(fname, fd_oflag, 0664);
1028 #elif defined(_SION_BGQ)
1029  fd_oflag |= O_RDWR;
1030  fd = open64(fname, fd_oflag, 0664);
1031 #elif defined(_SION_XT)
1032  fd_oflag |= O_RDWR|O_NOATIME;
1033  fd = open64(fname, fd_oflag, 0664);
1034 #endif
1035  return (fd);
1036 }
1037 
1045 int _sion_file_open_posix_read(const char *fname, unsigned int addflags) {
1046  int fd;
1047  int fd_oflag = 0;
1048 
1049 #if defined(_SION_LINUX)
1050  fd_oflag |= O_RDONLY;
1051  fd = open(fname, fd_oflag, 0664);
1052 #elif defined(_SION_DARWIN)
1053  fd_oflag |= O_RDONLY;
1054  fd = open(fname, fd_oflag, 0664);
1055 #elif defined(_SION_AIX)
1056  fd_oflag |= O_RDONLY;
1057  fd = open64(fname, fd_oflag, 0664);
1058 #elif defined(_SION_BGL)
1059  fd_oflag |= O_RDONLY;
1060  fd = open64(fname, fd_oflag, 0664);
1061 #elif defined(_SION_BGP)
1062  fd_oflag |= O_RDONLY;
1063  fd = open64(fname, fd_oflag, 0664);
1064 #elif defined(_SION_BGQ)
1065  fd_oflag |= O_RDONLY;
1066  fd = open64(fname, fd_oflag, 0664);
1067 #elif defined(_SION_XT)
1068  fd_oflag |= O_RDONLY|O_NOATIME;
1069  fd = open(fname, fd_oflag, 0664);
1070 #endif
1071  return (fd);
1072 }
1073 
1074 
1075 
1082 int _sion_file_close_posix(int fd) {
1083  int rc=SION_SUCCESS;
1084  int frc;
1085 
1086 #if defined(_SION_LINUX)
1087  frc= close(fd);
1088 #elif defined(_SION_DARWIN)
1089  frc= close(fd);
1090 #elif defined(_SION_AIX)
1091  frc= close(fd);
1092 #elif defined(_SION_BGL)
1093  frc= close(fd);
1094 #elif defined(_SION_BGP)
1095  frc= close(fd);
1096 #elif defined(_SION_BGQ)
1097  frc= close(fd);
1098 #elif defined(_SION_XT)
1099  frc= close(fd);
1100 #endif
1101 
1102  if(frc) rc=SION_NOT_SUCCESS;
1103  return(rc);
1104 }
1105 
1112 long _sion_file_get_opt_blksize_posix( int fd ) {
1113  struct stat sbuf;
1114  long opt_size=SION_SIZE_NOT_VALID;
1115 
1116 #if defined(_SION_LINUX)
1117  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
1118 #elif defined(_SION_DARWIN)
1119  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
1120 #elif defined(_SION_AIX)
1121  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
1122 #elif defined(_SION_BGL)
1123  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
1124 #elif defined(_SION_BGP)
1125  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
1126 #elif defined(_SION_BGQ)
1127  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
1128 #elif defined(_SION_XT)
1129  if (fstat(fd, &sbuf) == 0) opt_size=(long) sbuf.st_blksize;
1130 #endif
1131  return (opt_size);
1132 }
1133 
1134 
1135 
1143 sion_int64 _sion_file_set_position_posix(int fd, sion_int64 startpointer) {
1144  sion_int64 newpos = SION_SIZE_NOT_VALID;
1145 
1146  DPRINTFP((32, "_sion_set_position_posix", -1, "enter (to %lld)\n", (long long) startpointer));
1147 
1148 #if defined(_SION_LINUX)
1149  {
1150  off_t offset = (off_t) startpointer;
1151  off_t result;
1152  if (offset != startpointer) {
1153  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_set_position_posix: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
1154  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
1155  }
1156  newpos = result = lseek(fd, offset, SEEK_SET);
1157  DPRINTFP((4096, "_sion_set_position_posix", -1, "set position=%lld (LINUX)\n", (long long) result));
1158  }
1159 #elif defined(_SION_DARWIN)
1160  {
1161  off_t offset = (off_t) startpointer;
1162  off_t result;
1163  if (offset != startpointer) {
1164  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_set_position_posix: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
1165  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
1166  }
1167  newpos = result = lseek(fd, offset, SEEK_SET);
1168  DPRINTFP((4096, "_sion_set_position_posix", -1, "set position=%lld (LINUX)\n", (long long) result));
1169  }
1170 #elif defined(_SION_AIX)
1171  off64_t offset = (off_t) startpointer;
1172  off64_t result;
1173  if (offset != startpointer) {
1174  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_set_position_posix: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
1175  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
1176  }
1177  newpos = result = lseek(fd, offset, SEEK_SET);
1178 #elif defined(_SION_BGL)
1179  off_t offset = (off_t) startpointer;
1180  off_t result;
1181  if (offset != startpointer) {
1182  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_set_position_posix: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
1183  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
1184  }
1185  newpos = result = lseek(fd, offset, SEEK_SET);
1186 #elif defined(_SION_BGP)
1187  off_t offset = (off_t) startpointer;
1188  off_t result;
1189  if (offset != startpointer) {
1190  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_set_position_posix: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
1191  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
1192  }
1193  newpos = result = lseek(fd, offset, SEEK_SET);
1194 #elif defined(_SION_BGQ)
1195  off_t offset = (off_t) startpointer;
1196  off_t result;
1197  if (offset != startpointer) {
1198  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_set_position_posix: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
1199  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
1200  }
1201  newpos = result = lseek(fd, offset, SEEK_SET);
1202 #elif defined(_SION_XT)
1203  {
1204  off_t offset = (off_t) startpointer;
1205  off_t result;
1206  if (offset != startpointer) {
1207  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_set_position_posix: cannot set position to %ld (%lu),%lld (%lu) offset conversion error\n",
1208  offset, (unsigned long) sizeof(offset), startpointer, (unsigned long) sizeof(startpointer)));
1209  }
1210  newpos = result = lseek(fd, offset, SEEK_SET);
1211  }
1212 #endif
1213  DPRINTFP((32, "_sion_set_position_posix", -1, "leave (to %lld)\n",(long long) startpointer));
1214 
1215  return (newpos);
1216 }
1217 
1224 sion_int64 _sion_file_get_position_posix(int fd) {
1225 
1226  sion_int64 result=SION_SIZE_NOT_VALID;
1227 
1228 #if defined(_SION_LINUX)
1229  {
1230  off_t resulto;
1231  resulto = lseek(fd,0,SEEK_CUR);
1232  result = (sion_int64) resulto;
1233  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (LINUX)\n", (long) result));
1234  }
1235 #elif defined(_SION_DARWIN)
1236  {
1237  off_t resulto;
1238  resulto = lseek(fd,0,SEEK_CUR);
1239  /* resulto = ftello(fileptr); */
1240  result = (sion_int64) resulto;
1241  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (DARWIN)\n", (long) result));
1242  }
1243 #elif defined(_SION_AIX)
1244  {
1245  off_t resulto;
1246  resulto = lseek(fd,0,SEEK_CUR);
1247  /* resulto = ftello(fileptr); */
1248  result = (sion_int64) resulto;
1249  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (AIX)\n", (long) result));
1250  }
1251 #elif defined(_SION_BGL)
1252  {
1253  off_t resulto;
1254  int fd = fileno(fileptr);
1255  resulto = lseek(fd, 0, SEEK_CUR);
1256  result = (sion_int64) resulto;
1257  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (BGL)\n", (long) result));
1258  }
1259 #elif defined(_SION_BGP)
1260  {
1261  off_t resulto;
1262  resulto = lseek(fd, 0, SEEK_CUR);
1263  result = (sion_int64) resulto;
1264  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (BGP)\n", (long) result));
1265  }
1266 #elif defined(_SION_BGQ)
1267  {
1268  off_t resulto;
1269  resulto = lseek(fd, 0, SEEK_CUR);
1270  result = (sion_int64) resulto;
1271  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (BGQ)\n", (long) result));
1272  }
1273 #elif defined(_SION_XT)
1274  {
1275  off_t resulto;
1276  int fd = fileno(fileptr);
1277  resulto = lseek(fd, 0, SEEK_CUR);
1278  result = (sion_int64) resulto;
1279  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (XT)\n", (long) result));
1280  }
1281 #endif
1282 
1283  return (result);
1284 }
1285 
1292 int _sion_file_flush_posix(int fd) {
1293 
1294  int rc = SION_SUCCESS;
1295  int frc;
1296 #if defined(_SION_BGP)
1297  frc=fsync(fd);
1298 #elif defined(_SION_BGQ)
1299  /* BGQ 20.09.13: bad fsync performance since V1R2M1, try without */
1300  /* rc=fsync(fd); */
1301 #else
1302  frc=fsync(fd);
1303 #endif
1304 
1305  if(frc) rc=SION_NOT_SUCCESS;
1306  return (rc);
1307 }
1308 
1317 int _sion_file_purge_posix(int fd) {
1318 
1319  int rc = SION_SUCCESS;
1320  int frc;
1321 #if defined(_SION_BGP)
1322  frc=fsync(fd);
1323 #elif defined(_SION_BGQ)
1324  /* BGQ 20.09.13: bad fsync performance since V1R2M1, try without */
1325  /* rc=fsync(fd); */
1326 #else
1327  frc=fsync(fd);
1328 #endif
1329 
1330  if(frc) rc=SION_NOT_SUCCESS;
1331  return (rc);
1332 }
1333 
1342 int _sion_file_set_buffer_posix(int fd, char *buffer, sion_int32 buffer_size) {
1343 
1344  int rc = SION_SUCCESS;
1345  int frc = 0;
1346  DPRINTFP((32, "_sion_file_set_buffer", -1, "set buffer of fileptr\n"));
1347 #if defined(_SION_BGP)
1348 #elif defined(_SION_AIX)
1349 #else
1350 #endif
1351  if(frc) rc=SION_NOT_SUCCESS;
1352  return (rc);
1353 }
1354 
1363 sion_int64 _sion_file_write_posix(const void *data, sion_int64 bytes, int fd ) {
1364  sion_int64 left,bsumwrote;
1365  size_t bwrite, bwrote;
1366  char *dataptr;
1367 
1368  left = bytes;
1369  bsumwrote = 0;
1370  dataptr = (char*) data;
1371 
1372  while (left > 0) {
1373  bwrite = left;
1374  bwrote = write(fd, dataptr, bwrite);
1375  left -= bwrote;
1376  dataptr += bwrote;
1377  bsumwrote += bwrote;
1378  }
1379  return (bsumwrote);
1380 }
1381 
1390 sion_int64 _sion_file_read_posix(void *data, sion_int64 bytes, int fd ) {
1391 
1392  sion_int64 left,bsumread;
1393  size_t btoread, bread;
1394  char *dataptr;
1395 
1396  left = bytes;
1397  bsumread = 0;
1398  dataptr = (char*) data;
1399  bread = 0;
1400 
1401  while (left > 0) {
1402  btoread = left;
1403  bread = read(fd, dataptr, btoread);
1404  if(bread>0) {
1405  left -= bread;
1406  dataptr += bread;
1407  bsumread += bread;
1408  } else {
1409  if(bread==0) return(bsumread);
1410  else return(bread);
1411  }
1412  }
1413  return (bsumread);
1414 }
1415 
1420 _sion_fileptr *_sion_file_alloc_and_init_sion_fileptr() {
1421  _sion_fileptr *sion_fileptr;
1422 
1423  sion_fileptr = (_sion_fileptr *) malloc(sizeof(_sion_fileptr));
1424  if (sion_fileptr == NULL) {
1425  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"cannot allocate _sion_fileptr structure of size %lu (_sion_fileptr), aborting ...\n",
1426  (unsigned long) sizeof(_sion_fileptr));
1427  return(NULL);
1428  }
1429  sion_fileptr->fileptr = NULL;
1430  sion_fileptr->second_fileptr = NULL;
1431  sion_fileptr->fd = -1;
1432  sion_fileptr->flags = 0;
1433 
1434  return (sion_fileptr);
1435 }
1436 
1437 #define STR_PRT(X) case X: return # X
1438 char* _sion_fileptrflags_to_str (unsigned int flag) {
1439  switch (flag) {
1440  STR_PRT(SION_FILE_FLAG_ANSI);
1441  STR_PRT(SION_FILE_FLAG_SCNDANSI);
1442  STR_PRT(SION_FILE_FLAG_POSIX);
1443  STR_PRT(SION_FILE_FLAG_CREATE);
1444  STR_PRT(SION_FILE_FLAG_WRITE);
1445  STR_PRT(SION_FILE_FLAG_READ);
1446  }
1447  return "";
1448 }
1449 
1450 char* _sion_get_fileptr_desc(_sion_fileptr *sion_fileptr) {
1451  int flags;
1452  if(!sion_fileptr) return("<undefined>");
1453  flags = sion_fileptr->flags;
1454 
1455  if(flags & SION_FILE_FLAG_ANSI) {
1456  if(flags & SION_FILE_FLAG_WRITE) {
1457  if(flags & SION_FILE_FLAG_CREATE) {
1458  return("<ANSI,WRITE,CREATE>");
1459  } else {
1460  return("<ANSI,WRITE>");
1461  }
1462  } else {
1463  return("<ANSI,READ>");
1464  }
1465  } else {
1466  if (flags & SION_FILE_FLAG_POSIX) {
1467  if(flags & SION_FILE_FLAG_WRITE) {
1468  if(flags & SION_FILE_FLAG_CREATE) {
1469  return("<POSIX,WRITE,CREATE>");
1470  } else {
1471  return("<POSIX,WRITE>");
1472  }
1473  } else {
1474  return("<POSIX,READ>");
1475  }
1476  }
1477  }
1478  return("<unknown>");
1479 
1480 }
int _sion_file_stat_file(const char *fname)
Check if file exists (LARGE_FILE support on BlueGene)
Definition: sion_file.c:204