14 #define _XOPEN_SOURCE 700 22 #include <sys/types.h> 30 #include "sion_error_handler.h" 63 if(!sion_fileptr->fileptr) {
65 _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_WARN,
"error: could not open file (ANSI), %s %d %d, aborting ...\n", fname, flags, addflags);
88 if(sion_fileptr->fd<0) {
90 _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_WARN,
"error: could not open file (POSIX), %s %d %d, aborting ...\n", fname, flags, addflags);
97 _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_WARN,
"internal error: unknown open type, %s %d %d, aborting ...\n", fname, flags, addflags);
102 #define DFUNCTION "_sion_file_close" 110 if (NULL == sion_fileptr)
return SION_NOT_SUCCESS;
116 sion_fileptr->second_fileptr=NULL;
119 sion_fileptr->fileptr=NULL;
123 rc = SION_NOT_SUCCESS;
126 DPRINTFP((32, DFUNCTION, -1,
"free now fileptr=%x %d rc=%d\n",sion_fileptr,sion_fileptr->flags,rc));
142 if (NULL == sion_fileptr)
return SION_SIZE_NOT_VALID;
152 return _sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"_sion_file_write: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
167 if (NULL == sion_fileptr)
return SION_SIZE_NOT_VALID;
177 return _sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"_sion_file_read: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
188 if (NULL == sion_fileptr)
return SION_SIZE_NOT_VALID;
195 return _sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"_sion_file_get_opt_blksize: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
206 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ) 208 return 0 == stat(fname, &sbuf);
220 if (NULL == sion_fileptr)
return SION_SIZE_NOT_VALID;
231 return _sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"_sion_file_set_position: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
242 if (NULL == sion_fileptr)
return SION_SIZE_NOT_VALID;
253 return _sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"_sion_file_get_position: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
264 if (NULL == sion_fileptr)
return SION_NOT_SUCCESS;
275 return _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_file_flush: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
286 if( sion_fileptr == NULL )
return SION_NOT_SUCCESS;
297 return _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_file_purge: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
310 if( sion_fileptr == NULL )
return SION_NOT_SUCCESS;
321 return _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_file_set_buffer: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
333 if( sion_fileptr == NULL )
return SION_NOT_SUCCESS;
337 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: second fileptr already set, aborting ...\n"));
340 sion_fileptr->second_fileptr=fileptr;
344 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: second fileptr could not be set for non-ANSI file, aborting ...\n"));
355 if( sion_fileptr == NULL )
return SION_NOT_SUCCESS;
360 sion_fileptr->second_fileptr=NULL;
363 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: second fileptr was not set, aborting ...\n"));
366 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"internal error: second fileptr could not be unset for non-ANSI file, aborting ...\n"));
377 if( sion_fileptr == NULL )
return SION_ID_UNDEF;
380 return sion_fileptr->fd;
383 return fileno(sion_fileptr->second_fileptr);
385 return fileno(sion_fileptr->fileptr);
388 return _sion_errorprint(SION_ID_UNDEF,_SION_ERROR_RETURN,
"_sion_file_get_fd: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
404 #if defined(_SION_LINUX) || defined(_SION_DARWIN) 405 return fopen(fname,
"w");
406 #elif defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ) 407 int fd = open64(fname, O_CREAT | O_RDWR, 0664);
408 return fdopen(fd,
"w");
410 #error "No platform selected." 423 #if defined(_SION_LINUX) || defined(_SION_DARWIN) 425 return fopen(fname,
"r+");
426 #elif defined(_SION_AIX) 427 int fd = open64(fname, O_CREAT | O_RDWR, 0664);
428 return fdopen(fd,
"r+");
429 #elif defined(_SION_BGP) || defined(_SION_BGQ) 430 int fd = open64(fname, O_RDWR, 0664);
431 return fdopen(fd,
"r+");
433 #error "No platform selected." 446 #if defined(_SION_LINUX) || defined(_SION_DARWIN) 447 return fopen(fname,
"r");
448 #elif defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ) 449 int fd = open64(fname, O_RDONLY, 0664);
450 return fdopen(fd,
"r");
452 #error "No platform selected." 464 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ) 465 return (0 == fclose(fileptr)) ? SION_SUCCESS : SION_NOT_SUCCESS;
467 #error "No platform selected." 468 return SION_NOT_SUCCESS;
479 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ) 480 int fd = fileno(fileptr);
482 if (fstat(fd, &sbuf) == 0) {
483 return sbuf.st_blksize;
485 return SION_SIZE_NOT_VALID;
488 #error "No platform selected." 489 return SION_SIZE_NOT_VALID;
503 DPRINTFP((32,
"_sion_set_position_ansi", -1,
"enter (to %lld) (to %ld)\n", (
long long) startpointer, (
long) startpointer));
505 #if defined(_SION_LINUX) || defined(_SION_BGP) || defined(_SION_BGQ) 506 off_t offset = (off_t) startpointer;
507 if (offset != startpointer) {
508 DPRINTFP((32,
"_sion_set_position_ansi", -1,
"_sion_set_position_ansi: cannot set position to %ld (%zu),%lld (%zu) offset conversion error\n",
509 offset,
sizeof(offset), startpointer,
sizeof(startpointer)));
510 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"_sion_set_position_ansi: cannot set position to %ld (%zu),%lld (%zu) offset conversion error\n",
511 offset,
sizeof(offset), startpointer,
sizeof(startpointer)));
513 int fd = fileno(fileptr);
515 newpos = result = lseek(fd, offset, SEEK_SET);
516 #if defined(_SION_LINUX) 517 DPRINTFP((1024,
"_sion_set_position_ansi", -1,
"set position=%lld (LINUX)\n", (
long long) result));
519 #elif defined(_SION_DARWIN) 520 long offset = (long) startpointer;
521 if (offset != startpointer) {
522 DPRINTFP((32,
"_sion_set_position_ansi", -1,
"_sion_set_position_ansi: cannot set position to %ld (%zu),%lld (%zu) offset conversion error\n",
523 offset,
sizeof(offset), startpointer,
sizeof(startpointer)));
524 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"_sion_set_position_ansi: cannot set position to %ld (%zu),%lld (%zu) offset conversion error\n",
525 offset,
sizeof(offset), startpointer,
sizeof(startpointer)));
528 newpos = result = fseek(fileptr, offset, SEEK_SET);
529 DPRINTFP((1024,
"_sion_set_position_ansi", -1,
"set position=%lld (LINUX)\n", (
long long) result));
530 #elif defined(_SION_AIX) 531 off64_t offset = (off_t) startpointer;
533 if (offset != startpointer) {
534 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"_sion_set_position_ansi: cannot set position to %ld (%zu),%lld (%zu) offset conversion error\n",
535 offset,
sizeof(offset), startpointer,
sizeof(startpointer)));
537 result = fseeko64(fileptr, offset, SEEK_SET);
538 newpos = result = ftello64(fileptr);
540 #error "No platform selected." 541 newpos = SION_SIZE_NOT_VALID;
543 DPRINTFP((32,
"_sion_set_position_ansi", -1,
"leave (%lld --> %lld)\n",(
long long) startpointer, (
long long) newpos));
557 #if defined(_SION_LINUX) 559 int fd = fileno(fileptr);
560 resulto = lseek(fd,0,SEEK_CUR);
561 result = (sion_int64) resulto;
562 DPRINTFP((4096,
"_sion_get_position", -1,
"get position=%ld (LINUX)\n", (
long) result));
563 #elif defined(_SION_DARWIN) 565 resulto = ftello(fileptr);
566 result = (sion_int64) resulto;
567 DPRINTFP((4096,
"_sion_get_position", -1,
"get position=%ld (DARWIN)\n", (
long) result));
568 #elif defined(_SION_AIX) 569 result = ftell(fileptr);
570 DPRINTFP((4096,
"_sion_get_position", -1,
"got position=%lld (AIX)\n", result));
571 #elif defined(_SION_BGP) 573 int fd = fileno(fileptr);
574 resulto = lseek(fd, 0, SEEK_CUR);
575 result = (sion_int64) resulto;
576 DPRINTFP((4096,
"_sion_get_position", -1,
"got position=%lld (BGP)\n", result));
577 #elif defined(_SION_BGQ) 579 int fd = fileno(fileptr);
580 resulto = lseek(fd, 0, SEEK_CUR);
581 result = (sion_int64) resulto;
582 DPRINTFP((4096,
"_sion_get_position", -1,
"got position=%lld (BGQ)\n", result));
584 #error "No platform selected." 585 result = SION_SIZE_NOT_VALID;
598 return (0 == fflush(fileptr)) ? SION_SUCCESS : SION_NOT_SUCCESS;
620 DPRINTFP((32,
"_sion_file_set_buffer", -1,
"set buffer of fileptr\n"));
621 return (0 == setvbuf(fileptr, buffer, _IOFBF, (
size_t) buffer_size)) ? SION_SUCCESS : SION_NOT_SUCCESS;
633 return (bytes == fwrite(data, 1, bytes, fileptr)) ? bytes : -1;
647 if (fread(data, 1, bytes, fileptr) < bytes) {
668 #if defined(_SION_LINUX) || defined(_SION_DARWIN) 670 fd = open(fname, O_CREAT | O_RDWR, 0664);
671 }
while (-1 == fd && EINTR == errno);
672 #elif defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ) 674 fd = open64(fname, O_CREAT | O_RDWR, 0664);
675 }
while (-1 == fd && EINTR == errno);
677 #error "No platform selected." 694 #if defined(_SION_LINUX) || defined(_SION_DARWIN) 696 fd = open(fname, O_RDWR, 0664);
697 }
while (-1 == fd && EINTR == errno);
698 #elif defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ) 700 fd = open64(fname, O_RDWR, 0664);
701 }
while (-1 == fd && EINTR == errno);
703 #error "No platform selected." 720 #if defined(_SION_LINUX) || defined(_SION_DARWIN) 722 fd = open(fname, O_RDONLY, 0664);
723 }
while (-1 == fd && EINTR == errno);
724 #elif defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ) 726 fd = open64(fname, O_RDONLY, 0664);
727 }
while (-1 == fd && EINTR == errno);
729 #error "No platform selected." 743 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ) 744 return (0 == close(fd)) ? SION_SUCCESS : SION_NOT_SUCCESS;
746 #error "No platform selected." 747 return SION_NOT_SUCCESS;
758 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ) 760 if (fstat(fd, &sbuf) == 0) {
761 return sbuf.st_blksize;
763 return SION_SIZE_NOT_VALID;
766 #error "No platform selected." 767 return SION_SIZE_NOT_VALID;
779 sion_int64 newpos = SION_SIZE_NOT_VALID;
781 DPRINTFP((32,
"_sion_set_position_posix", -1,
"enter (to %lld)\n", (
long long) startpointer));
783 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_BGP) || defined(_SION_BGQ) 784 off_t offset = (off_t) startpointer;
785 if (offset != startpointer) {
786 return (_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"_sion_set_position_posix: cannot set position to %ld (%zu),%lld (%zu) offset conversion error\n",
787 offset,
sizeof(offset), startpointer,
sizeof(startpointer)));
790 newpos = result = lseek(fd, offset, SEEK_SET);
791 #if defined(_SION_LINUX) || defined(_SION_DARWIN) 792 DPRINTFP((4096,
"_sion_set_position_posix", -1,
"set position=%lld (LINUX)\n", (
long long) result));
794 #elif defined(_SION_AIX) 795 off64_t offset = (off_t) startpointer;
797 if (offset != startpointer) {
798 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"_sion_set_position_posix: cannot set position to %ld (%zu),%lld (%zu) offset conversion error\n",
799 offset,
sizeof(offset), startpointer,
sizeof(startpointer)));
801 newpos = result = lseek(fd, offset, SEEK_SET);
803 #error "No platform selected." 804 newpos = SION_SIZE_NOT_VALID;
806 DPRINTFP((32,
"_sion_set_position_posix", -1,
"leave (to %lld)\n",(
long long) startpointer));
818 sion_int64 result=SION_SIZE_NOT_VALID;
821 resulto = lseek(fd,0,SEEK_CUR);
822 result = (sion_int64) resulto;
824 #if defined(_SION_LINUX) 825 DPRINTFP((4096,
"_sion_get_position", -1,
"get position=%ld (LINUX)\n", (
long) result));
826 #elif defined(_SION_DARWIN) 827 DPRINTFP((4096,
"_sion_get_position", -1,
"get position=%ld (DARWIN)\n", (
long) result));
828 #elif defined(_SION_AIX) 829 DPRINTFP((4096,
"_sion_get_position", -1,
"get position=%ld (AIX)\n", (
long) result));
830 #elif defined(_SION_BGP) 831 DPRINTFP((4096,
"_sion_get_position", -1,
"get position=%ld (BGP)\n", (
long) result));
832 #elif defined(_SION_BGQ) 833 DPRINTFP((4096,
"_sion_get_position", -1,
"get position=%ld (BGQ)\n", (
long) result));
848 #if defined(_SION_BGQ) 854 }
while (frc != 0 && EINTR == errno);
857 return (0 == frc) ? SION_SUCCESS : SION_NOT_SUCCESS;
871 #if defined(_SION_BGQ) 877 }
while (frc != 0 && EINTR == errno);
880 return (0 == frc) ? SION_SUCCESS : SION_NOT_SUCCESS;
892 DPRINTFP((32,
"_sion_file_set_buffer", -1,
"set buffer of fileptr\n"));
907 k = write(fd, data, bytes);
909 if (errno != EINTR) {
913 }
else if (k == bytes) {
922 data = (
char*)data + k;
940 k = read(fd, data, bytes);
942 if (errno != EINTR) {
949 }
else if (k == bytes) {
958 data = (
char*)data + k;
971 if (sion_fileptr == NULL) {
972 _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"cannot allocate _sion_fileptr structure of size %lu (_sion_fileptr), aborting ...\n",
976 sion_fileptr->fileptr = NULL;
977 sion_fileptr->second_fileptr = NULL;
978 sion_fileptr->fd = -1;
979 sion_fileptr->flags = 0;
981 return (sion_fileptr);
984 #define STR_PRT(X) case X: return # X 1005 if(!sion_fileptr)
return(
"<undefined>");
1006 flags = sion_fileptr->flags;
1011 return(
"<ANSI,WRITE,CREATE>");
1013 return(
"<ANSI,WRITE>");
1016 return(
"<ANSI,READ>");
1022 return(
"<POSIX,WRITE,CREATE>");
1024 return(
"<POSIX,WRITE>");
1027 return(
"<POSIX,READ>");
1031 return(
"<unknown>");
sion_int64 _sion_file_write(const void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Write data to file.
long _sion_file_get_opt_blksize(_sion_fileptr *sion_fileptr)
Get optional file system block size for a file.
sion_int64 _sion_file_get_position(_sion_fileptr *sion_fileptr)
Get new position in file.
sion_int64 _sion_file_set_position(_sion_fileptr *sion_fileptr, sion_int64 startpointer)
Set new position in file.
_sion_fileptr * _sion_file_alloc_and_init_sion_fileptr(void)
Create and return _sion_fileptr.
_sion_fileptr * _sion_file_open(const char *fname, unsigned int flags, unsigned int addflags)
Create and open a new file for writing.
char * _sion_fileptrflags_to_str(unsigned int flag)
long _sion_file_get_opt_blksize_ansi(FILE *fileptr)
ANSI: Get optional file system block size for a file.
#define SION_FILE_FLAG_WRITE
int _sion_file_purge(_sion_fileptr *sion_fileptr)
Purge data to file.
sion_int64 _sion_file_read(void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Read data from file.
int _sion_file_set_buffer(_sion_fileptr *sion_fileptr, char *buffer, sion_int32 buffer_size)
Set buffer of fp.
sion_int64 _sion_file_set_position_posix(int fd, sion_int64 startpointer)
POSIX: Set the start position for the current task.
int _sion_file_get_fd(_sion_fileptr *sion_fileptr)
Utility function: Get POSIX fp.
#define SION_FILE_FLAG_READ
sion_int64 _sion_file_set_position_ansi(FILE *fileptr, sion_int64 startpointer)
ANSI: Set the start position for the current task.
sion_int64 _sion_file_get_position_posix(int fd)
POSIX: Get the current position in file.
long _sion_file_get_opt_blksize_posix(int fd)
POSIX: Get optional file system block size for a file.
sion_int64 _sion_file_read_ansi(void *data, sion_int64 bytes, FILE *fileptr)
ANSI: Read data from file.
#define SION_FILE_FLAG_POSIX
sion_int64 _sion_file_get_position_ansi(FILE *fileptr)
ANSI: Get the current position in file.
int _sion_file_set_buffer_ansi(FILE *fileptr, char *buffer, sion_int32 buffer_size)
ANSI: set buffer of fp.
int _sion_file_stat_file(const char *fname)
Check if file exists (LARGE_FILE support on BlueGene)
#define SION_FILE_FLAG_ANSI
#define SION_FILE_FLAG_CREATE
char * _sion_get_fileptr_desc(_sion_fileptr *sion_fileptr)
int _sion_file_close(_sion_fileptr *sion_fileptr)
Close file and destroys fileptr structure.
FILE * _sion_file_open_ansi_read(const char *fname, unsigned int addflags)
ANSI: Open a file for reading.
sion_int64 _sion_file_write_ansi(const void *data, sion_int64 bytes, FILE *fileptr)
ANSI: Write data to file.
int _sion_file_flush_posix(int fd)
POSIX: Flush the data to the disk.
int _sion_file_set_second_fileptr(_sion_fileptr *sion_fileptr, FILE *fileptr)
Set second fileptr for file if opened with ANSI.
int _sion_file_unset_second_fileptr(_sion_fileptr *sion_fileptr)
Unset second fileptr for file if opened with ANSI.
sion_int64 _sion_file_read_posix(void *data, sion_int64 bytes, int fd)
POSIX: Read data from file.
sion_int64 _sion_file_write_posix(const void *data, sion_int64 bytes, int fd)
POSIX: Write data to file.
int _sion_file_flush_ansi(FILE *fileptr)
ANSI: Flush the data to the disk.
FILE * _sion_file_open_ansi_write_create(const char *fname, unsigned int addflags)
ANSI: Create and open a new file for writing.
int _sion_file_open_posix_write_create(const char *fname, unsigned int addflags)
POSIX: Create and open a new file for writing.
int _sion_file_open_posix_write_existing(const char *fname, unsigned int addflags)
POSIX: Open a new file for writing.
int _sion_file_purge_ansi(FILE *fileptr)
ANSI: Purge the data to the disk.
int _sion_file_open_posix_read(const char *fname, unsigned int addflags)
POSIX: Open a file for reading.
int _sion_file_flush(_sion_fileptr *sion_fileptr)
Flush data to file.
FILE * _sion_file_open_ansi_write_existing(const char *fname, unsigned int addflags)
ANSI: Open a new file for writing.
int _sion_file_purge_posix(int fd)
POSIX: Purge the data to the disk.
int _sion_file_close_posix(int fd)
POSIX: Close a file.
int _sion_file_set_buffer_posix(int fd, char *buffer, sion_int32 buffer_size)
POSIX: set buffer of fd.
int _sion_file_close_ansi(FILE *fileptr)
ANSI: Close a file.
#define SION_FILE_FLAG_SCNDANSI