15 #include <sys/types.h> 21 #include "sion_debug.h" 22 #include "sion_internal.h" 23 #include "sion_file.h" 35 _sion_fileptr *_sion_file_open(
const char *fname,
unsigned int flags,
unsigned int addflags) {
40 sion_fileptr = _sion_file_alloc_and_init_sion_fileptr();
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;
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);
51 sion_fileptr->fileptr=_sion_file_open_ansi_write_existing(fname,addflags);
54 sion_fileptr->flags |= SION_FILE_FLAG_READ;
55 sion_fileptr->fileptr=_sion_file_open_ansi_read(fname,addflags);
58 if (flags & SION_FILE_FLAG_POSIX) {
59 sion_fileptr->flags |= SION_FILE_FLAG_POSIX;
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);
67 sion_fileptr->fd=_sion_file_open_posix_write_existing(fname,addflags);
70 sion_fileptr->flags |= SION_FILE_FLAG_READ;
71 sion_fileptr->fd=_sion_file_open_posix_read(fname,addflags);
77 if(sion_fileptr->flags & SION_FILE_FLAG_ANSI ) {
78 if(!sion_fileptr->fileptr) {
80 _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"error: could not open file (ANSI), %s %d %d, aborting ...\n", fname, flags, addflags);
86 if(sion_fileptr->flags & SION_FILE_FLAG_POSIX ) {
87 if(sion_fileptr->fd<0) {
89 _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"error: could not open file (POSIX), %s %d %d, aborting ...\n", fname, flags, addflags);
95 if(sion_fileptr->flags == 0) {
97 _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: unknown open type, %s %d %d, aborting ...\n", fname, flags, addflags);
101 return(sion_fileptr);
105 #define DFUNCTION "_sion_file_close" 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;
119 rc=_sion_file_close_ansi(sion_fileptr->fileptr);
120 sion_fileptr->fileptr=NULL;
122 if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
123 rc=_sion_file_close_posix(sion_fileptr->fd);
126 DPRINTFP((32, DFUNCTION, -1,
"free now fileptr=%x %d rc=%d\n",sion_fileptr,sion_fileptr->flags,rc));
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);
150 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_file_write: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags));
152 return(bytes_written);
163 sion_int64 _sion_file_read(
void *data, sion_int64 bytes,
_sion_fileptr *sion_fileptr ) {
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);
172 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_file_read: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags));
184 long _sion_file_get_opt_blksize(
_sion_fileptr *sion_fileptr ) {
185 long opt_size=SION_SIZE_NOT_VALID;
187 if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
188 opt_size=_sion_file_get_opt_blksize_ansi(sion_fileptr->fileptr);
191 if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
192 opt_size=_sion_file_get_opt_blksize_posix(sion_fileptr->fd);
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;
223 return (file_exists);
233 sion_int64 _sion_file_set_position(
_sion_fileptr *sion_fileptr, sion_int64 startpointer ) {
234 sion_int64 posinfile=SION_SIZE_NOT_VALID;
237 #ifdef FLUSH_BEFORE_SETPOS 238 _sion_flush_file_fp(sion_fileptr);
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);
245 posinfile=_sion_file_set_position_ansi(sion_fileptr->fileptr, startpointer);
249 if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
250 posinfile=_sion_file_set_position_posix(sion_fileptr->fd, startpointer);
263 sion_int64 _sion_file_get_position(
_sion_fileptr *sion_fileptr ) {
264 sion_int64 posinfile=SION_SIZE_NOT_VALID;
267 #ifdef FLUSH_BEFORE_SETPOS 268 _sion_flush_file(sion_fileptr);
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);
275 posinfile=_sion_file_get_position_ansi(sion_fileptr->fileptr);
279 if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
280 posinfile=_sion_file_get_position_posix(sion_fileptr->fd);
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);
300 rc=_sion_file_flush_ansi(sion_fileptr->fileptr);
304 if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
305 rc=_sion_file_flush_posix(sion_fileptr->fd);
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);
324 rc=_sion_file_purge_ansi(sion_fileptr->fileptr);
328 if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
329 rc=_sion_file_purge_posix(sion_fileptr->fd);
343 int _sion_file_set_buffer(
_sion_fileptr *sion_fileptr,
char *buffer, sion_int32 buffer_size) {
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);
351 rc=_sion_file_set_buffer_ansi(sion_fileptr->fileptr, buffer, buffer_size);
355 if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
356 rc=_sion_file_set_buffer_posix(sion_fileptr->fd, buffer, buffer_size);
370 int _sion_file_set_second_fileptr(
_sion_fileptr *sion_fileptr, FILE* fileptr) {
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"));
376 sion_fileptr->flags |= SION_FILE_FLAG_SCNDANSI;
377 sion_fileptr->second_fileptr=fileptr;
379 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: second fileptr could not be set for POSIX file, aborting ...\n"));
390 int _sion_file_unset_second_fileptr(
_sion_fileptr *sion_fileptr) {
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;
397 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: second fileptr was not set, aborting ...\n"));
400 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: second fileptr could not be unset for POSIX file, aborting ...\n"));
412 int fd=SION_ID_UNDEF;
413 if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
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);
420 fd=fileno(sion_fileptr->fileptr);
440 FILE *_sion_file_open_ansi_write_create(
const char *fname,
unsigned int addflags) {
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) 451 fd_oflag |= O_CREAT | O_RDWR;
452 fd = open64(fname, fd_oflag, 0664);
454 fileptr = fdopen(fd,
"w");
457 #elif defined(_SION_BGL) 458 fileptr = fopen(fname,
"w");
459 #elif defined(_SION_BGP) 464 fd_oflag |= O_CREAT | O_RDWR;
465 fd = open64(fname, fd_oflag, 0664);
467 fileptr = fdopen(fd,
"w");
470 #elif defined(_SION_BGQ) 475 fd_oflag |= O_CREAT | O_RDWR;
476 fd = open64(fname, fd_oflag, 0664);
478 fileptr = fdopen(fd,
"w");
481 #elif defined(_SION_XT) 482 fileptr = fopen(fname,
"w");
494 FILE *_sion_file_open_ansi_write_existing(
const char *fname,
unsigned int addflags) {
496 #if defined(_SION_LINUX) 498 fileptr = fopen(fname,
"r+");
499 #elif defined(_SION_DARWIN) 500 fileptr = fopen(fname,
"r+");
501 #elif defined(_SION_AIX) 506 fd_oflag |= O_CREAT | O_RDWR;
507 fd = open64(fname, fd_oflag, 0664);
509 fileptr = fdopen(fd,
"r+");
512 #elif defined(_SION_BGL) 513 fileptr = fopen(fname,
"r+");
514 #elif defined(_SION_BGP) 520 fd = open64(fname, fd_oflag, 0664);
522 fileptr = fdopen(fd,
"r+");
525 #elif defined(_SION_BGQ) 531 fd = open64(fname, fd_oflag, 0664);
533 fileptr = fdopen(fd,
"r+");
536 #elif defined(_SION_XT) 537 fileptr = fopen(fname,
"r+");
550 FILE *_sion_file_open_ansi_read(
const char *fname,
unsigned int addflags) {
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) 561 fd_oflag |= O_RDONLY;
562 fd = open64(fname, fd_oflag, 0664);
564 fileptr = fdopen(fd,
"r");
567 #elif defined(_SION_BGL) 568 fileptr = fopen(fname,
"r");
569 #elif defined(_SION_BGP) 574 fd_oflag |= O_RDONLY;
575 fd = open64(fname, fd_oflag, 0664);
577 fileptr = fdopen(fd,
"r");
580 #elif defined(_SION_BGQ) 585 fd_oflag |= O_RDONLY;
586 fd = open64(fname, fd_oflag, 0664);
588 fileptr = fdopen(fd,
"r");
591 #elif defined(_SION_XT) 592 fileptr = fopen(fname,
"r");
596 int _sion_file_close_ansi(FILE *fileptr) {
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);
620 if(frc) rc=SION_NOT_SUCCESS;
630 long _sion_file_get_opt_blksize_ansi( FILE *fileptr ) {
633 long opt_size=SION_SIZE_NOT_VALID;
635 fd = fileno(fileptr);
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;
662 sion_int64 _sion_file_set_position_ansi(FILE *fileptr, sion_int64 startpointer) {
664 sion_int64 newpos = SION_SIZE_NOT_VALID;
666 DPRINTFP((32,
"_sion_set_position_ansi", -1,
"enter (to %lld) (to %ld)\n", (
long long) startpointer, (
long) startpointer));
668 #if defined(_SION_LINUX) 670 off_t offset = (off_t) startpointer;
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)));
680 newpos = result = lseek(fd, offset, SEEK_SET);
681 DPRINTFP((1024,
"_sion_set_position_ansi", -1,
"set position=%lld (LINUX)\n", (
long long) result));
683 #elif defined(_SION_DARWIN) 685 off_t offset = (off_t) startpointer;
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)));
691 newpos = result = fseek(fileptr, offset, SEEK_SET);
692 DPRINTFP((1024,
"_sion_set_position_ansi", -1,
"set position=%lld (LINUX)\n", (
long long) result));
694 #elif defined(_SION_AIX) 695 off64_t offset = (off_t) startpointer;
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)));
701 result = fseeko64(fileptr, offset, SEEK_SET);
702 newpos = result = ftello64(fileptr);
703 #elif defined(_SION_BGL) 704 off_t offset = (off_t) startpointer;
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)));
711 fd = fileno(fileptr);
712 newpos = result = lseek(fd, offset, SEEK_SET);
713 #elif defined(_SION_BGP) 714 off_t offset = (off_t) startpointer;
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)));
721 fd = fileno(fileptr);
722 newpos = result = lseek(fd, offset, SEEK_SET);
723 #elif defined(_SION_BGQ) 724 off_t offset = (off_t) startpointer;
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)));
731 fd = fileno(fileptr);
732 newpos = result = lseek(fd, offset, SEEK_SET);
733 #elif defined(_SION_XT) 735 off_t offset = (off_t) startpointer;
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)));
742 fd = fileno(fileptr);
743 newpos = result = lseek(fd, offset, SEEK_SET);
746 DPRINTFP((32,
"_sion_set_position_ansi", -1,
"leave (to %lld)\n",(
long long) startpointer));
758 sion_int64 _sion_file_get_position_ansi(FILE *fileptr) {
761 #if defined(_SION_LINUX) 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));
769 #elif defined(_SION_DARWIN) 772 resulto = ftello(fileptr);
773 result = (sion_int64) resulto;
774 DPRINTFP((4096,
"_sion_get_position", -1,
"get position=%ld (DARWIN)\n", (
long) result));
776 #elif defined(_SION_AIX) 778 result = ftell(fileptr);
779 DPRINTFP((4096,
"_sion_get_position", -1,
"got position=%lld (AIX)\n", result));
781 #elif defined(_SION_BGL) 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));
789 #elif defined(_SION_BGP) 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));
797 #elif defined(_SION_BGQ) 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));
805 #elif defined(_SION_XT) 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));
825 int _sion_file_flush_ansi(FILE *fileptr) {
827 int rc = SION_SUCCESS;
830 #if defined(_SION_BGP) 832 #elif defined(_SION_BGQ) 837 if(frc) rc=SION_NOT_SUCCESS;
848 int _sion_file_purge_ansi(FILE *fileptr) {
850 int rc = SION_SUCCESS;
853 #if defined(_SION_BGP) 859 #elif defined(_SION_BGQ) 869 if(frc) rc=SION_NOT_SUCCESS;
884 int _sion_file_set_buffer_ansi(FILE *fileptr,
char *buffer, sion_int32 buffer_size) {
886 int rc = SION_SUCCESS;
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);
897 frc=setvbuf(fileptr, buffer, _IOFBF, (
size_t) buffer_size);
900 if(frc) rc=SION_NOT_SUCCESS;
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;
920 dataptr = (
char*) data;
924 bwrote = fwrite(dataptr, 1, bwrite, fileptr);
940 sion_int64 _sion_file_read_ansi(
void *data, sion_int64 bytes, FILE *fileptr ) {
942 sion_int64 left,bsumread;
943 size_t btoread, bread;
948 dataptr = (
char*) data;
951 while ((left > 0) && (!feof(fileptr))) {
953 bread = fread(dataptr, 1, btoread, fileptr);
971 int _sion_file_open_posix_write_create(
const char *fname,
unsigned int addflags) {
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);
1008 int _sion_file_open_posix_write_existing(
const char *fname,
unsigned int addflags) {
1013 #if defined(_SION_LINUX) 1015 fd = open(fname, fd_oflag, 0664);
1016 #elif defined(_SION_DARWIN) 1018 fd = open(fname, fd_oflag, 0664);
1019 #elif defined(_SION_AIX) 1021 fd = open64(fname, fd_oflag, 0664);
1022 #elif defined(_SION_BGL) 1024 fd = open64(fname, fd_oflag, 0664);
1025 #elif defined(_SION_BGP) 1027 fd = open64(fname, fd_oflag, 0664);
1028 #elif defined(_SION_BGQ) 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);
1045 int _sion_file_open_posix_read(
const char *fname,
unsigned int addflags) {
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);
1082 int _sion_file_close_posix(
int fd) {
1083 int rc=SION_SUCCESS;
1086 #if defined(_SION_LINUX) 1088 #elif defined(_SION_DARWIN) 1090 #elif defined(_SION_AIX) 1092 #elif defined(_SION_BGL) 1094 #elif defined(_SION_BGP) 1096 #elif defined(_SION_BGQ) 1098 #elif defined(_SION_XT) 1102 if(frc) rc=SION_NOT_SUCCESS;
1112 long _sion_file_get_opt_blksize_posix(
int fd ) {
1114 long opt_size=SION_SIZE_NOT_VALID;
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;
1143 sion_int64 _sion_file_set_position_posix(
int fd, sion_int64 startpointer) {
1144 sion_int64 newpos = SION_SIZE_NOT_VALID;
1146 DPRINTFP((32,
"_sion_set_position_posix", -1,
"enter (to %lld)\n", (
long long) startpointer));
1148 #if defined(_SION_LINUX) 1150 off_t offset = (off_t) startpointer;
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)));
1156 newpos = result = lseek(fd, offset, SEEK_SET);
1157 DPRINTFP((4096,
"_sion_set_position_posix", -1,
"set position=%lld (LINUX)\n", (
long long) result));
1159 #elif defined(_SION_DARWIN) 1161 off_t offset = (off_t) startpointer;
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)));
1167 newpos = result = lseek(fd, offset, SEEK_SET);
1168 DPRINTFP((4096,
"_sion_set_position_posix", -1,
"set position=%lld (LINUX)\n", (
long long) result));
1170 #elif defined(_SION_AIX) 1171 off64_t offset = (off_t) startpointer;
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)));
1177 newpos = result = lseek(fd, offset, SEEK_SET);
1178 #elif defined(_SION_BGL) 1179 off_t offset = (off_t) startpointer;
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)));
1185 newpos = result = lseek(fd, offset, SEEK_SET);
1186 #elif defined(_SION_BGP) 1187 off_t offset = (off_t) startpointer;
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)));
1193 newpos = result = lseek(fd, offset, SEEK_SET);
1194 #elif defined(_SION_BGQ) 1195 off_t offset = (off_t) startpointer;
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)));
1201 newpos = result = lseek(fd, offset, SEEK_SET);
1202 #elif defined(_SION_XT) 1204 off_t offset = (off_t) startpointer;
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)));
1210 newpos = result = lseek(fd, offset, SEEK_SET);
1213 DPRINTFP((32,
"_sion_set_position_posix", -1,
"leave (to %lld)\n",(
long long) startpointer));
1224 sion_int64 _sion_file_get_position_posix(
int fd) {
1226 sion_int64 result=SION_SIZE_NOT_VALID;
1228 #if defined(_SION_LINUX) 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));
1235 #elif defined(_SION_DARWIN) 1238 resulto = lseek(fd,0,SEEK_CUR);
1240 result = (sion_int64) resulto;
1241 DPRINTFP((4096,
"_sion_get_position", -1,
"get position=%ld (DARWIN)\n", (
long) result));
1243 #elif defined(_SION_AIX) 1246 resulto = lseek(fd,0,SEEK_CUR);
1248 result = (sion_int64) resulto;
1249 DPRINTFP((4096,
"_sion_get_position", -1,
"get position=%ld (AIX)\n", (
long) result));
1251 #elif defined(_SION_BGL) 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));
1259 #elif defined(_SION_BGP) 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));
1266 #elif defined(_SION_BGQ) 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));
1273 #elif defined(_SION_XT) 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));
1292 int _sion_file_flush_posix(
int fd) {
1294 int rc = SION_SUCCESS;
1296 #if defined(_SION_BGP) 1298 #elif defined(_SION_BGQ) 1305 if(frc) rc=SION_NOT_SUCCESS;
1317 int _sion_file_purge_posix(
int fd) {
1319 int rc = SION_SUCCESS;
1321 #if defined(_SION_BGP) 1323 #elif defined(_SION_BGQ) 1330 if(frc) rc=SION_NOT_SUCCESS;
1342 int _sion_file_set_buffer_posix(
int fd,
char *buffer, sion_int32 buffer_size) {
1344 int rc = SION_SUCCESS;
1346 DPRINTFP((32,
"_sion_file_set_buffer", -1,
"set buffer of fileptr\n"));
1347 #if defined(_SION_BGP) 1348 #elif defined(_SION_AIX) 1351 if(frc) rc=SION_NOT_SUCCESS;
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;
1370 dataptr = (
char*) data;
1374 bwrote = write(fd, dataptr, bwrite);
1377 bsumwrote += bwrote;
1390 sion_int64 _sion_file_read_posix(
void *data, sion_int64 bytes,
int fd ) {
1392 sion_int64 left,bsumread;
1393 size_t btoread, bread;
1398 dataptr = (
char*) data;
1403 bread = read(fd, dataptr, btoread);
1409 if(bread==0)
return(bsumread);
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",
1429 sion_fileptr->fileptr = NULL;
1430 sion_fileptr->second_fileptr = NULL;
1431 sion_fileptr->fd = -1;
1432 sion_fileptr->flags = 0;
1434 return (sion_fileptr);
1437 #define STR_PRT(X) case X: return # X 1438 char* _sion_fileptrflags_to_str (
unsigned int 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);
1452 if(!sion_fileptr)
return(
"<undefined>");
1453 flags = sion_fileptr->flags;
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>");
1460 return(
"<ANSI,WRITE>");
1463 return(
"<ANSI,READ>");
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>");
1471 return(
"<POSIX,WRITE>");
1474 return(
"<POSIX,READ>");
1478 return(
"<unknown>");
int _sion_file_stat_file(const char *fname)
Check if file exists (LARGE_FILE support on BlueGene)