SIONlib  1.7.6
Scalable I/O library for parallel access to task-local files
sion_file.c
Go to the documentation of this file.
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2019 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
14 #define _XOPEN_SOURCE 700
15 
16 #include <stdlib.h>
17 #include <stdio.h>
18 #include <string.h>
19 #include <time.h>
20 #include <assert.h>
21 
22 #include <sys/types.h>
23 #include <sys/stat.h>
24 #include <fcntl.h>
25 #include <unistd.h>
26 #include <errno.h>
27 
28 #if defined(_SION_SIONFWD)
29 #include <sionfwd/client.h>
30 #endif
31 
32 #include "sion.h"
33 #include "sion_debug.h"
34 #include "sion_error_handler.h"
35 #include "sion_internal.h"
36 #include "sion_file.h"
37 
46 _sion_fileptr *_sion_file_open(const char *fname, unsigned int flags, unsigned int addflags) {
47 
48  if(flags & SION_FILE_FLAG_ANSI) {
50  sion_fileptr->flags |= SION_FILE_FLAG_ANSI;
51 
52  if(flags & SION_FILE_FLAG_WRITE) {
53  sion_fileptr->flags |= SION_FILE_FLAG_WRITE;
54 
55  if(flags & SION_FILE_FLAG_CREATE) {
56  sion_fileptr->flags |= SION_FILE_FLAG_CREATE;
57  sion_fileptr->fileptr=_sion_file_open_ansi_write_create(fname,addflags);
58  } else {
59  sion_fileptr->fileptr=_sion_file_open_ansi_write_existing(fname,addflags);
60  }
61  } else {
62  sion_fileptr->flags |= SION_FILE_FLAG_READ;
63  sion_fileptr->fileptr=_sion_file_open_ansi_read(fname,addflags);
64  }
65 
66  /* could not open ANSI file */
67  if(!sion_fileptr->fileptr) {
68  free(sion_fileptr);
69  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_WARN,"error: could not open file (ANSI), %s %d %d, aborting ...\n", fname, flags, addflags);
70  return(NULL);
71  }
72 
73  return(sion_fileptr);
74  } else if (flags & SION_FILE_FLAG_POSIX) {
76  sion_fileptr->flags |= SION_FILE_FLAG_POSIX;
77 
78  if(flags & SION_FILE_FLAG_WRITE) {
79  sion_fileptr->flags |= SION_FILE_FLAG_WRITE;
80  if(flags & SION_FILE_FLAG_CREATE) {
81  sion_fileptr->flags |= SION_FILE_FLAG_CREATE;
82  sion_fileptr->fd=_sion_file_open_posix_write_create(fname,addflags);
83  } else {
84  sion_fileptr->fd=_sion_file_open_posix_write_existing(fname,addflags);
85  }
86  } else {
87  sion_fileptr->flags |= SION_FILE_FLAG_READ;
88  sion_fileptr->fd=_sion_file_open_posix_read(fname,addflags);
89  }
90 
91  /* could not open POSIX file */
92  if(sion_fileptr->fd<0) {
93  free(sion_fileptr);
94  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_WARN,"error: could not open file (POSIX), %s %d %d, aborting ...\n", fname, flags, addflags);
95  return(NULL);
96  }
97 
98  return(sion_fileptr);
99 #if defined(_SION_SIONFWD)
100  } else if (flags & SION_FILE_FLAG_SIONFWD) {
102  sion_fileptr->flags |= SION_FILE_FLAG_SIONFWD;
103 
104  if(flags & SION_FILE_FLAG_WRITE) {
105  sion_fileptr->flags |= SION_FILE_FLAG_WRITE;
106  if(flags & SION_FILE_FLAG_CREATE) {
107  sion_fileptr->flags |= SION_FILE_FLAG_CREATE;
108  sion_fileptr->fd=_sion_file_open_sionfwd_write_create(fname,addflags);
109  } else {
110  sion_fileptr->fd=_sion_file_open_sionfwd_write_existing(fname,addflags);
111  }
112  } else {
113  sion_fileptr->flags |= SION_FILE_FLAG_READ;
114  sion_fileptr->fd=_sion_file_open_sionfwd_read(fname,addflags);
115  }
116 
117  /* could not open SIONFWD file */
118  if(sion_fileptr->fd == -1) {
119  free(sion_fileptr);
120  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_WARN,"error: could not open file (SIONFWD), %s %d %d, aborting ...\n", fname, flags, addflags);
121  return(NULL);
122  }
123 
124  return(sion_fileptr);
125 #endif
126  } else {
127  /* unknown mode? */
128  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_WARN,"internal error: unknown open type, %s %d %d, aborting ...\n", fname, flags, addflags);
129  return(NULL);
130  }
131 }
132 
133 #define DFUNCTION "_sion_file_close"
134 
140 int _sion_file_close( _sion_fileptr *sion_fileptr ) {
141  if (NULL == sion_fileptr) return SION_NOT_SUCCESS;
142 
143  int rc;
144  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
145  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
146  _sion_file_close_ansi(sion_fileptr->second_fileptr);
147  sion_fileptr->second_fileptr=NULL;
148  }
149  rc=_sion_file_close_ansi(sion_fileptr->fileptr);
150  sion_fileptr->fileptr=NULL;
151  } else if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
152  rc=_sion_file_close_posix(sion_fileptr->fd);
153 #if defined(_SION_SIONFWD)
154  } else if(sion_fileptr->flags & SION_FILE_FLAG_SIONFWD) {
155  rc=_sion_file_close_sionfwd(sion_fileptr->fd);
156 #endif
157  } else {
158  rc = SION_NOT_SUCCESS;
159  }
160 
161  DPRINTFP((32, DFUNCTION, -1, "free now fileptr=%x %d rc=%d\n",sion_fileptr,sion_fileptr->flags,rc));
162  free(sion_fileptr);
163 
164  return (rc);
165 }
166 #undef DFUNCTION
167 
176 sion_int64 _sion_file_write(const void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr ) {
177  if (NULL == sion_fileptr) return SION_SIZE_NOT_VALID;
178 
179  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
180  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI)
181  return _sion_file_write_ansi(data,bytes,sion_fileptr->second_fileptr);
182  else
183  return _sion_file_write_ansi(data,bytes,sion_fileptr->fileptr);
184  } else if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
185  return _sion_file_write_posix(data,bytes,sion_fileptr->fd);
186 #if defined(_SION_SIONFWD)
187  } else if(sion_fileptr->flags & SION_FILE_FLAG_SIONFWD) {
188  return _sion_file_write_sionfwd(data,bytes,sion_fileptr->fd,&sion_fileptr->position);
189 #endif
190  } else {
191  return _sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"_sion_file_write: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
192  }
193 }
194 
205 sion_int64 _sion_file_read(void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr ) {
206  if (NULL == sion_fileptr) return SION_SIZE_NOT_VALID;
207 
208  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
209  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI)
210  return _sion_file_read_ansi(data,bytes,sion_fileptr->second_fileptr);
211  else
212  return _sion_file_read_ansi(data,bytes,sion_fileptr->fileptr);
213  } else if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
214  return _sion_file_read_posix(data,bytes,sion_fileptr->fd);
215 #if defined(_SION_SIONFWD)
216  } else if(sion_fileptr->flags & SION_FILE_FLAG_SIONFWD) {
217  return _sion_file_read_sionfwd(data,bytes,sion_fileptr->fd,&sion_fileptr->position);
218 #endif
219  } else {
220  return _sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"_sion_file_read: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
221  }
222 }
223 
230 long _sion_file_get_opt_blksize( _sion_fileptr *sion_fileptr ) {
231  if (NULL == sion_fileptr) return SION_SIZE_NOT_VALID;
232 
233  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
234  return _sion_file_get_opt_blksize_ansi(sion_fileptr->fileptr);
235  } else if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
236  return _sion_file_get_opt_blksize_posix(sion_fileptr->fd);
237 #if defined(_SION_SIONFWD)
238  } else if(sion_fileptr->flags & SION_FILE_FLAG_SIONFWD) {
239  return _sion_file_get_opt_blksize_sionfwd(sion_fileptr->fd);
240 #endif
241  } else {
242  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);
243  }
244 }
245 
252 int _sion_file_stat_file(const char *fname) {
254 }
255 
263 int _sion_file_stat_file2(const char *fname, unsigned int apiflag) {
264  // _sion_file_stat_file above is incomplete, because it does not
265  // allow selecting an appropriate low-level API like all other functions
266  // in this file.
267  // Unfortunately its signature is declared in the public sion_common.h
268  // and thus cannot be changed without breaking backward compatibility.
269  // Thus, this new function is introduced and used internally in its place.
270  if ((apiflag & SION_FILE_FLAG_ANSI) || (apiflag & SION_FILE_FLAG_POSIX)) {
271 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ)
272  struct stat sbuf;
273  return 0 == stat(fname, &sbuf);
274 #else
275 #error "No platform selected."
276 #endif
277 #if defined(_SION_SIONFWD)
278  } else if(apiflag & SION_FILE_FLAG_SIONFWD) {
279  return sionfwd_stat_file(fname);
280 #endif
281  } else {
282  return _sion_errorprint(0,_SION_ERROR_RETURN,"_sion_file_stat_file2: cannot find valid api flag (flags=%d)\n",apiflag);
283  }
284 }
285 
293 sion_int64 _sion_file_set_position( _sion_fileptr *sion_fileptr, sion_int64 startpointer ) {
294  if (NULL == sion_fileptr) return SION_SIZE_NOT_VALID;
295 
296  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
297  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
298  return _sion_file_set_position_ansi(sion_fileptr->second_fileptr, startpointer);
299  } else {
300  return _sion_file_set_position_ansi(sion_fileptr->fileptr, startpointer);
301  }
302  } else if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
303  return _sion_file_set_position_posix(sion_fileptr->fd, startpointer);
304 #if defined(_SION_SIONFWD)
305  } else if(sion_fileptr->flags & SION_FILE_FLAG_SIONFWD) {
306  sion_fileptr->position = startpointer;
307  return sion_fileptr->position;
308 #endif
309  } else {
310  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);
311  }
312 }
313 
320 sion_int64 _sion_file_get_position( _sion_fileptr *sion_fileptr ) {
321  if (NULL == sion_fileptr) return SION_SIZE_NOT_VALID;
322 
323  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
324  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
325  return _sion_file_get_position_ansi(sion_fileptr->second_fileptr);
326  } else {
327  return _sion_file_get_position_ansi(sion_fileptr->fileptr);
328  }
329  } else if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
330  return _sion_file_get_position_posix(sion_fileptr->fd);
331 #if defined(_SION_SIONFWD)
332  } else if(sion_fileptr->flags & SION_FILE_FLAG_SIONFWD) {
333  return sion_fileptr->position;
334 #endif
335  } else {
336  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);
337  }
338 }
339 
346 int _sion_file_flush( _sion_fileptr *sion_fileptr ) {
347  if (NULL == sion_fileptr) return SION_NOT_SUCCESS;
348 
349  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
350  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
351  return _sion_file_flush_ansi(sion_fileptr->second_fileptr);
352  } else {
353  return _sion_file_flush_ansi(sion_fileptr->fileptr);
354  }
355  } else if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
356  return _sion_file_flush_posix(sion_fileptr->fd);
357 #if defined(_SION_SIONFWD)
358  } else if(sion_fileptr->flags & SION_FILE_FLAG_SIONFWD) {
359  return _sion_file_flush_sionfwd(sion_fileptr->fd);
360 #endif
361  } else {
362  return _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_file_flush: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
363  }
364 }
365 
372 int _sion_file_purge( _sion_fileptr *sion_fileptr ) {
373  if( sion_fileptr == NULL ) return SION_NOT_SUCCESS;
374 
375  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
376  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
377  return _sion_file_purge_ansi(sion_fileptr->second_fileptr);
378  } else {
379  return _sion_file_purge_ansi(sion_fileptr->fileptr);
380  }
381  } else if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
382  return _sion_file_purge_posix(sion_fileptr->fd);
383 #if defined(_SION_SIONFWD)
384  } else if(sion_fileptr->flags & SION_FILE_FLAG_SIONFWD) {
385  return _sion_file_purge_sionfwd(sion_fileptr->fd);
386 #endif
387  } else {
388  return _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_file_purge: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
389  }
390 }
391 
400 int _sion_file_set_buffer(_sion_fileptr *sion_fileptr, char *buffer, sion_int32 buffer_size) {
401  if( sion_fileptr == NULL ) return SION_NOT_SUCCESS;
402 
403  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
404  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
405  return _sion_file_set_buffer_ansi(sion_fileptr->second_fileptr, buffer, buffer_size);
406  } else {
407  return _sion_file_set_buffer_ansi(sion_fileptr->fileptr, buffer, buffer_size);
408  }
409  } else if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
410  return _sion_file_set_buffer_posix(sion_fileptr->fd, buffer, buffer_size);
411 #if defined(_SION_SIONFWD)
412  } else if(sion_fileptr->flags & SION_FILE_FLAG_SIONFWD) {
413  return _sion_file_set_buffer_sionfwd(sion_fileptr->fd, buffer, buffer_size);
414 #endif
415  } else {
416  return _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_file_set_buffer: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
417  }
418 }
419 
427 int _sion_file_set_second_fileptr( _sion_fileptr *sion_fileptr, FILE* fileptr) {
428  if( sion_fileptr == NULL ) return SION_NOT_SUCCESS;
429 
430  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
431  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
432  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"internal error: second fileptr already set, aborting ...\n"));
433  } else {
434  sion_fileptr->flags |= SION_FILE_FLAG_SCNDANSI;
435  sion_fileptr->second_fileptr=fileptr;
436  return SION_SUCCESS;
437  }
438  } else {
439  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"internal error: second fileptr could not be set for non-ANSI file, aborting ...\n"));
440  }
441 }
442 
450  if( sion_fileptr == NULL ) return SION_NOT_SUCCESS;
451 
452  if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
453  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
454  sion_fileptr->flags &= ~SION_FILE_FLAG_SCNDANSI;
455  sion_fileptr->second_fileptr=NULL;
456  return SION_SUCCESS;
457  } else {
458  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"internal error: second fileptr was not set, aborting ...\n"));
459  }
460  } else {
461  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"internal error: second fileptr could not be unset for non-ANSI file, aborting ...\n"));
462  }
463 }
464 
471 int _sion_file_get_fd( _sion_fileptr *sion_fileptr) {
472  if( sion_fileptr == NULL ) return SION_ID_UNDEF;
473 
474  if(sion_fileptr->flags & SION_FILE_FLAG_POSIX) {
475  return sion_fileptr->fd;
476  } else if(sion_fileptr->flags & SION_FILE_FLAG_ANSI) {
477  if(sion_fileptr->flags & SION_FILE_FLAG_SCNDANSI) {
478  return fileno(sion_fileptr->second_fileptr);
479  } else {
480  return fileno(sion_fileptr->fileptr);
481  }
482 #if defined(_SION_SIONFWD)
483  } else if(sion_fileptr->flags & SION_FILE_FLAG_SIONFWD) {
484  return SION_ID_UNDEF;
485 #endif
486  } else {
487  return _sion_errorprint(SION_ID_UNDEF,_SION_ERROR_RETURN,"_sion_file_get_fd: cannot find valid file flag (flags=%d)\n",sion_fileptr->flags);
488  }
489 }
490 
491 /* ********************************************************************************************** */
492 /* *** INTERFACE Functions */
493 /* ********************************************************************************************** */
494 
502 FILE *_sion_file_open_ansi_write_create(const char *fname, unsigned int addflags) {
503 #if defined(_SION_LINUX) || defined(_SION_DARWIN)
504  return fopen(fname, "w");
505 #elif defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ)
506  int fd = open64(fname, O_CREAT | O_RDWR, 0664);
507  return fdopen(fd, "w");
508 #else
509 #error "No platform selected."
510  return NULL;
511 #endif
512 }
513 
521 FILE *_sion_file_open_ansi_write_existing(const char *fname, unsigned int addflags) {
522 #if defined(_SION_LINUX) || defined(_SION_DARWIN)
523  /* changed from w to r+ to prevent time truncation of empty existing file */
524  return fopen(fname, "r+");
525 #elif defined(_SION_AIX)
526  int fd = open64(fname, O_CREAT | O_RDWR, 0664);
527  return fdopen(fd, "r+");
528 #elif defined(_SION_BGP) || defined(_SION_BGQ)
529  int fd = open64(fname, O_RDWR, 0664);
530  return fdopen(fd, "r+");
531 #else
532 #error "No platform selected."
533  return NULL;
534 #endif
535 }
536 
544 FILE *_sion_file_open_ansi_read(const char *fname, unsigned int addflags) {
545 #if defined(_SION_LINUX) || defined(_SION_DARWIN)
546  return fopen(fname, "r");
547 #elif defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ)
548  int fd = open64(fname, O_RDONLY, 0664);
549  return fdopen(fd, "r");
550 #else
551 #error "No platform selected."
552  return NULL;
553 #endif
554 }
555 
562 int _sion_file_close_ansi(FILE *fileptr) {
563 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ)
564  return (0 == fclose(fileptr)) ? SION_SUCCESS : SION_NOT_SUCCESS;
565 #else
566 #error "No platform selected."
567  return SION_NOT_SUCCESS;
568 #endif
569 }
570 
577 long _sion_file_get_opt_blksize_ansi( FILE *fileptr ) {
578 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ)
579  int fd = fileno(fileptr);
580  struct stat sbuf;
581  if (fstat(fd, &sbuf) == 0) {
582  return sbuf.st_blksize;
583  } else {
584  return SION_SIZE_NOT_VALID;
585  }
586 #else
587 #error "No platform selected."
588  return SION_SIZE_NOT_VALID;
589 #endif
590 }
591 
599 sion_int64 _sion_file_set_position_ansi(FILE *fileptr, sion_int64 startpointer) {
600  sion_int64 newpos;
601 
602  DPRINTFP((32, "_sion_set_position_ansi", -1, "enter (to %lld) (to %ld)\n", (long long) startpointer, (long) startpointer));
603 
604 #if defined(_SION_LINUX) || defined(_SION_BGP) || defined(_SION_BGQ)
605  off_t offset = (off_t) startpointer;
606  if (offset != startpointer) {
607  DPRINTFP((32, "_sion_set_position_ansi", -1, "_sion_set_position_ansi: cannot set position to %ld (%zu),%lld (%zu) offset conversion error\n",
608  offset, sizeof(offset), startpointer, sizeof(startpointer)));
609  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",
610  offset, sizeof(offset), startpointer, sizeof(startpointer)));
611  }
612  int fd = fileno(fileptr);
613  off_t result;
614  newpos = result = lseek(fd, offset, SEEK_SET);
615 #if defined(_SION_LINUX)
616  DPRINTFP((1024, "_sion_set_position_ansi", -1, "set position=%lld (LINUX)\n", (long long) result));
617 #endif
618 #elif defined(_SION_DARWIN)
619  long offset = (long) startpointer;
620  if (offset != startpointer) {
621  DPRINTFP((32, "_sion_set_position_ansi", -1, "_sion_set_position_ansi: cannot set position to %ld (%zu),%lld (%zu) offset conversion error\n",
622  offset, sizeof(offset), startpointer, sizeof(startpointer)));
623  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",
624  offset, sizeof(offset), startpointer, sizeof(startpointer)));
625  }
626  off_t result;
627  newpos = result = fseek(fileptr, offset, SEEK_SET);
628  DPRINTFP((1024, "_sion_set_position_ansi", -1, "set position=%lld (LINUX)\n", (long long) result));
629 #elif defined(_SION_AIX)
630  off64_t offset = (off_t) startpointer;
631  off64_t result;
632  if (offset != startpointer) {
633  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",
634  offset, sizeof(offset), startpointer, sizeof(startpointer)));
635  }
636  result = fseeko64(fileptr, offset, SEEK_SET);
637  newpos = result = ftello64(fileptr);
638 #else
639 #error "No platform selected."
640  newpos = SION_SIZE_NOT_VALID;
641 #endif
642  DPRINTFP((32, "_sion_set_position_ansi", -1, "leave (%lld --> %lld)\n",(long long) startpointer, (long long) newpos));
643 
644  return newpos;
645 }
646 
653 sion_int64 _sion_file_get_position_ansi(FILE *fileptr) {
654  sion_int64 result;
655 
656 #if defined(_SION_LINUX)
657  off_t resulto;
658  int fd = fileno(fileptr);
659  resulto = lseek(fd,0,SEEK_CUR);
660  result = (sion_int64) resulto;
661  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (LINUX)\n", (long) result));
662 #elif defined(_SION_DARWIN)
663  off_t resulto;
664  resulto = ftello(fileptr);
665  result = (sion_int64) resulto;
666  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (DARWIN)\n", (long) result));
667 #elif defined(_SION_AIX)
668  result = ftell(fileptr);
669  DPRINTFP((4096, "_sion_get_position", -1, "got position=%lld (AIX)\n", result));
670 #elif defined(_SION_BGP)
671  off_t resulto;
672  int fd = fileno(fileptr);
673  resulto = lseek(fd, 0, SEEK_CUR);
674  result = (sion_int64) resulto;
675  DPRINTFP((4096, "_sion_get_position", -1, "got position=%lld (BGP)\n", result));
676 #elif defined(_SION_BGQ)
677  off_t resulto;
678  int fd = fileno(fileptr);
679  resulto = lseek(fd, 0, SEEK_CUR);
680  result = (sion_int64) resulto;
681  DPRINTFP((4096, "_sion_get_position", -1, "got position=%lld (BGQ)\n", result));
682 #else
683 #error "No platform selected."
684  result = SION_SIZE_NOT_VALID;
685 #endif
686 
687  return (result);
688 }
689 
696 int _sion_file_flush_ansi(FILE *fileptr) {
697  return (0 == fflush(fileptr)) ? SION_SUCCESS : SION_NOT_SUCCESS;
698 }
699 
706 int _sion_file_purge_ansi(FILE *fileptr) {
707  return _sion_file_flush_ansi(fileptr);
708 }
709 
718 int _sion_file_set_buffer_ansi(FILE *fileptr, char *buffer, sion_int32 buffer_size) {
719  DPRINTFP((32, "_sion_file_set_buffer", -1, "set buffer of fileptr\n"));
720  return (0 == setvbuf(fileptr, buffer, _IOFBF, (size_t) buffer_size)) ? SION_SUCCESS : SION_NOT_SUCCESS;
721 }
722 
731 sion_int64 _sion_file_write_ansi(const void *data, sion_int64 bytes, FILE *fileptr ) {
732  return (bytes == fwrite(data, 1, bytes, fileptr)) ? bytes : -1;
733 }
734 
745 sion_int64 _sion_file_read_ansi(void *data, sion_int64 bytes, FILE *fileptr ) {
746  if (fread(data, 1, bytes, fileptr) < bytes) {
747  if (feof(fileptr)) {
748  return bytes;
749  } else {
750  return -1;
751  }
752  } else {
753  return bytes;
754  }
755 }
756 
764 int _sion_file_open_posix_write_create(const char *fname, unsigned int addflags) {
765  int fd;
766 
767 #if defined(_SION_LINUX) || defined(_SION_DARWIN)
768  do {
769  fd = open(fname, O_CREAT | O_RDWR, 0664);
770  } while (-1 == fd && EINTR == errno);
771 #elif defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ)
772  do {
773  fd = open64(fname, O_CREAT | O_RDWR, 0664);
774  } while (-1 == fd && EINTR == errno);
775 #else
776 #error "No platform selected."
777  fd = -1;
778 #endif
779 
780  return fd;
781 }
782 
790 int _sion_file_open_posix_write_existing(const char *fname, unsigned int addflags) {
791  int fd;
792 
793 #if defined(_SION_LINUX) || defined(_SION_DARWIN)
794  do {
795  fd = open(fname, O_RDWR, 0664);
796  } while (-1 == fd && EINTR == errno);
797 #elif defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ)
798  do {
799  fd = open64(fname, O_RDWR, 0664);
800  } while (-1 == fd && EINTR == errno);
801 #else
802 #error "No platform selected."
803  fd = -1;
804 #endif
805 
806  return fd;
807 }
808 
816 int _sion_file_open_posix_read(const char *fname, unsigned int addflags) {
817  int fd;
818 
819 #if defined(_SION_LINUX) || defined(_SION_DARWIN)
820  do {
821  fd = open(fname, O_RDONLY, 0664);
822  } while (-1 == fd && EINTR == errno);
823 #elif defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ)
824  do {
825  fd = open64(fname, O_RDONLY, 0664);
826  } while (-1 == fd && EINTR == errno);
827 #else
828 #error "No platform selected."
829  fd = -1;
830 #endif
831 
832  return (fd);
833 }
834 
841 int _sion_file_close_posix(int fd) {
842 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ)
843  return (0 == close(fd)) ? SION_SUCCESS : SION_NOT_SUCCESS;
844 #else
845 #error "No platform selected."
846  return SION_NOT_SUCCESS;
847 #endif
848 }
849 
856 long _sion_file_get_opt_blksize_posix( int fd ) {
857 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_AIX) || defined(_SION_BGP) || defined(_SION_BGQ)
858  struct stat sbuf;
859  if (fstat(fd, &sbuf) == 0) {
860  return sbuf.st_blksize;
861  } else {
862  return SION_SIZE_NOT_VALID;
863  }
864 #else
865 #error "No platform selected."
866  return SION_SIZE_NOT_VALID;
867 #endif
868 }
869 
877 sion_int64 _sion_file_set_position_posix(int fd, sion_int64 startpointer) {
878  sion_int64 newpos = SION_SIZE_NOT_VALID;
879 
880  DPRINTFP((32, "_sion_set_position_posix", -1, "enter (to %lld)\n", (long long) startpointer));
881 
882 #if defined(_SION_LINUX) || defined(_SION_DARWIN) || defined(_SION_BGP) || defined(_SION_BGQ)
883  off_t offset = (off_t) startpointer;
884  if (offset != startpointer) {
885  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",
886  offset, sizeof(offset), startpointer, sizeof(startpointer)));
887  }
888  off_t result;
889  newpos = result = lseek(fd, offset, SEEK_SET);
890 #if defined(_SION_LINUX) || defined(_SION_DARWIN)
891  DPRINTFP((4096, "_sion_set_position_posix", -1, "set position=%lld (LINUX)\n", (long long) result));
892 #endif
893 #elif defined(_SION_AIX)
894  off64_t offset = (off_t) startpointer;
895  off64_t result;
896  if (offset != startpointer) {
897  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",
898  offset, sizeof(offset), startpointer, sizeof(startpointer)));
899  }
900  newpos = result = lseek(fd, offset, SEEK_SET);
901 #else
902 #error "No platform selected."
903  newpos = SION_SIZE_NOT_VALID;
904 #endif
905  DPRINTFP((32, "_sion_set_position_posix", -1, "leave (to %lld)\n",(long long) startpointer));
906 
907  return newpos;
908 }
909 
916 sion_int64 _sion_file_get_position_posix(int fd) {
917  sion_int64 result=SION_SIZE_NOT_VALID;
918 
919  off_t resulto;
920  resulto = lseek(fd,0,SEEK_CUR);
921  result = (sion_int64) resulto;
922 
923 #if defined(_SION_LINUX)
924  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (LINUX)\n", (long) result));
925 #elif defined(_SION_DARWIN)
926  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (DARWIN)\n", (long) result));
927 #elif defined(_SION_AIX)
928  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (AIX)\n", (long) result));
929 #elif defined(_SION_BGP)
930  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (BGP)\n", (long) result));
931 #elif defined(_SION_BGQ)
932  DPRINTFP((4096, "_sion_get_position", -1, "get position=%ld (BGQ)\n", (long) result));
933 #endif
934 
935  return (result);
936 }
937 
944 int _sion_file_flush_posix(int fd) {
945  int frc;
946 
947 #if defined(_SION_BGQ)
948  /* BGQ 20.09.13: bad fsync performance since V1R2M1, try without */
949  frc = 0;
950 #else
951  do {
952  frc = fsync(fd);
953  } while (frc != 0 && EINTR == errno);
954 #endif
955 
956  return (0 == frc) ? SION_SUCCESS : SION_NOT_SUCCESS;
957 }
958 
967 int _sion_file_purge_posix(int fd) {
968  int frc;
969 
970 #if defined(_SION_BGQ)
971  /* BGQ 20.09.13: bad fsync performance since V1R2M1, try without */
972  frc = 1
973 #else
974  do {
975  frc = fsync(fd);
976  } while (frc != 0 && EINTR == errno);
977 #endif
978 
979  return (0 == frc) ? SION_SUCCESS : SION_NOT_SUCCESS;
980 }
981 
990 int _sion_file_set_buffer_posix(int fd, char *buffer, sion_int32 buffer_size) {
991  DPRINTFP((32, "_sion_file_set_buffer", -1, "set buffer of fileptr\n"));
992  return SION_SUCCESS;
993 }
994 
1003 sion_int64 _sion_file_write_posix(const void *data, sion_int64 bytes, int fd ) {
1004  ssize_t n = 0, k;
1005  while (1) {
1006  k = write(fd, data, bytes);
1007  if (k == -1) {
1008  if (errno != EINTR) {
1009  // I/O error, return -1
1010  return -1;
1011  } // else, interrupted before starting, retry
1012  } else if (k == bytes) {
1013  // requested amount has been written
1014  return n + k;
1015  } else {
1016  // k < bytes, presumably interrupted or no space left, retry
1017  // - retry after interruption should continue
1018  // - retry with no space left should lead to error
1019  bytes -= k;
1020  n += k;
1021  data = (char*)data + k;
1022  }
1023  }
1024 }
1025 
1036 sion_int64 _sion_file_read_posix(void *data, sion_int64 bytes, int fd ) {
1037  ssize_t n = 0, k;
1038  while (1) {
1039  k = read(fd, data, bytes);
1040  if (k == -1) {
1041  if (errno != EINTR) {
1042  // I/O error, return -1
1043  return -1;
1044  } // else, interrupted before starting, retry
1045  } else if (k == 0) {
1046  // presumably EOF, return number of bytes read up to here
1047  return n;
1048  } else if (k == bytes) {
1049  // requested amount has been read
1050  return n + k;
1051  } else {
1052  // k < bytes, presumably interrupted or EOF, retry
1053  // - retry after interruption should continue
1054  // - retry at EOF should lead to k == 0 next
1055  bytes -= k;
1056  n += k;
1057  data = (char*)data + k;
1058  }
1059  }
1060 }
1061 
1062 #if defined(_SION_SIONFWD)
1063 
1070 int _sion_file_open_sionfwd_write_create(const char *fname, unsigned int addflags) {
1071  return sionfwd_open(fname, SIONFWD_WRITE | SIONFWD_CREATE);
1072 }
1073 
1081 int _sion_file_open_sionfwd_write_existing(const char *fname, unsigned int addflags) {
1082  return sionfwd_open(fname, SIONFWD_WRITE);
1083 }
1084 
1092 int _sion_file_open_sionfwd_read(const char *fname, unsigned int addflags) {
1093  return sionfwd_open(fname, SIONFWD_READ);
1094 }
1095 
1102 int _sion_file_close_sionfwd(int fd) {
1103  return (0 == sionfwd_close(fd)) ? SION_SUCCESS : SION_NOT_SUCCESS;
1104 }
1105 
1112 long _sion_file_get_opt_blksize_sionfwd(int fd) {
1113  return sionfwd_stat_blksize(fd);
1114 }
1115 
1122 int _sion_file_flush_sionfwd(int fd) {
1123  return (sionfwd_flush(fd) == 0) ? SION_SUCCESS : SION_NOT_SUCCESS;
1124 }
1125 
1134 int _sion_file_purge_sionfwd(int fd) {
1135  return (sionfwd_flush(fd) == 0) ? SION_SUCCESS : SION_NOT_SUCCESS;
1136 }
1137 
1146 int _sion_file_set_buffer_sionfwd(int fd, char *buffer, sion_int32 buffer_size) {
1147  DPRINTFP((32, "_sion_file_set_buffer", -1, "set buffer of fileptr\n"));
1148  return SION_SUCCESS;
1149 }
1150 
1160 sion_int64 _sion_file_write_sionfwd(const void *data, sion_int64 bytes, int fd, sion_int64 *position) {
1161  sion_int64 written = sionfwd_pwrite(fd, data, bytes, *position);
1162  if (written != -1) { *position += written; }
1163  return written;
1164 }
1165 
1177 sion_int64 _sion_file_read_sionfwd(void *data, sion_int64 bytes, int fd, sion_int64 *position) {
1178  sion_int64 bread = sionfwd_pread(fd, data, bytes, *position);
1179  if (bread != -1) { *position += bread; }
1180  return bread;
1181 }
1182 #endif
1183 
1189  _sion_fileptr *sion_fileptr;
1190 
1191  sion_fileptr = (_sion_fileptr *) malloc(sizeof(_sion_fileptr));
1192  if (sion_fileptr == NULL) {
1193  _sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"cannot allocate _sion_fileptr structure of size %lu (_sion_fileptr), aborting ...\n",
1194  (unsigned long) sizeof(_sion_fileptr));
1195  return(NULL);
1196  }
1197  sion_fileptr->fileptr = NULL;
1198  sion_fileptr->second_fileptr = NULL;
1199  sion_fileptr->fd = -1;
1200  sion_fileptr->flags = 0;
1201  sion_fileptr->position = 0;
1202 
1203  return (sion_fileptr);
1204 }
1205 
1206 #define STR_PRT(X) case X: return # X
1207 
1210 char* _sion_fileptrflags_to_str (unsigned int flag) {
1211  switch (flag) {
1212  STR_PRT(SION_FILE_FLAG_ANSI);
1213  STR_PRT(SION_FILE_FLAG_SCNDANSI);
1214  STR_PRT(SION_FILE_FLAG_POSIX);
1215  STR_PRT(SION_FILE_FLAG_CREATE);
1216  STR_PRT(SION_FILE_FLAG_WRITE);
1217  STR_PRT(SION_FILE_FLAG_READ);
1218  STR_PRT(SION_FILE_FLAG_SIONFWD);
1219  }
1220  return "";
1221 }
1222 
1226 char* _sion_get_fileptr_desc(_sion_fileptr *sion_fileptr) {
1227  int flags;
1228  if(!sion_fileptr) return("<undefined>");
1229  flags = sion_fileptr->flags;
1230 
1231  if(flags & SION_FILE_FLAG_ANSI) {
1232  if(flags & SION_FILE_FLAG_WRITE) {
1233  if(flags & SION_FILE_FLAG_CREATE) {
1234  return("<ANSI,WRITE,CREATE>");
1235  } else {
1236  return("<ANSI,WRITE>");
1237  }
1238  } else {
1239  return("<ANSI,READ>");
1240  }
1241  } else {
1242  if (flags & SION_FILE_FLAG_POSIX) {
1243  if(flags & SION_FILE_FLAG_WRITE) {
1244  if(flags & SION_FILE_FLAG_CREATE) {
1245  return("<POSIX,WRITE,CREATE>");
1246  } else {
1247  return("<POSIX,WRITE>");
1248  }
1249  } else {
1250  return("<POSIX,READ>");
1251  }
1252  } else {
1253  if (flags & SION_FILE_FLAG_SIONFWD) {
1254  if(flags & SION_FILE_FLAG_WRITE) {
1255  if(flags & SION_FILE_FLAG_CREATE) {
1256  return("<SIONFWD,WRITE,CREATE>");
1257  } else {
1258  return("<SIONFWD,WRITE>");
1259  }
1260  } else {
1261  return("<SIONFWD,READ>");
1262  }
1263  }
1264  }
1265  }
1266  return("<unknown>");
1267 }
SION_FILE_FLAG_ANSI
#define SION_FILE_FLAG_ANSI
Definition: sion_file.h:21
_sion_file_get_position_ansi
sion_int64 _sion_file_get_position_ansi(FILE *fileptr)
ANSI: Get the current position in file.
Definition: sion_file.c:652
_sion_file_open_posix_write_existing
int _sion_file_open_posix_write_existing(const char *fname, unsigned int addflags)
POSIX: Open a new file for writing.
Definition: sion_file.c:789
_sion_file_close
int _sion_file_close(_sion_fileptr *sion_fileptr)
Close file and destroys fileptr structure.
Definition: sion_file.c:139
_sion_file_read_posix
sion_int64 _sion_file_read_posix(void *data, sion_int64 bytes, int fd)
POSIX: Read data from file.
Definition: sion_file.c:1035
_sion_file_stat_file
int _sion_file_stat_file(const char *fname)
Check if file exists (LARGE_FILE support on BlueGene)
Definition: sion_file.c:251
_sion_file_get_position_posix
sion_int64 _sion_file_get_position_posix(int fd)
POSIX: Get the current position in file.
Definition: sion_file.c:915
sion_internal.h
_sion_get_fileptr_desc
char * _sion_get_fileptr_desc(_sion_fileptr *sion_fileptr)
Definition: sion_file.c:1225
_sion_file_set_position
sion_int64 _sion_file_set_position(_sion_fileptr *sion_fileptr, sion_int64 startpointer)
Set new position in file.
Definition: sion_file.c:292
_sion_file_flush_posix
int _sion_file_flush_posix(int fd)
POSIX: Flush the data to the disk.
Definition: sion_file.c:943
SION_FILE_FLAG_SIONFWD
#define SION_FILE_FLAG_SIONFWD
Definition: sion_file.h:27
_sion_file_open_posix_write_create
int _sion_file_open_posix_write_create(const char *fname, unsigned int addflags)
POSIX: Create and open a new file for writing.
Definition: sion_file.c:763
_sion_file_purge_posix
int _sion_file_purge_posix(int fd)
POSIX: Purge the data to the disk.
Definition: sion_file.c:966
_sion_file_open_ansi_write_create
FILE * _sion_file_open_ansi_write_create(const char *fname, unsigned int addflags)
ANSI: Create and open a new file for writing.
Definition: sion_file.c:501
_sion_file_set_buffer_posix
int _sion_file_set_buffer_posix(int fd, char *buffer, sion_int32 buffer_size)
POSIX: set buffer of fd.
Definition: sion_file.c:989
_sion_file_write_ansi
sion_int64 _sion_file_write_ansi(const void *data, sion_int64 bytes, FILE *fileptr)
ANSI: Write data to file.
Definition: sion_file.c:730
_sion_file_purge_ansi
int _sion_file_purge_ansi(FILE *fileptr)
ANSI: Purge the data to the disk.
Definition: sion_file.c:705
_sion_file_close_ansi
int _sion_file_close_ansi(FILE *fileptr)
ANSI: Close a file.
Definition: sion_file.c:561
sion.h
_sion_file_open_ansi_write_existing
FILE * _sion_file_open_ansi_write_existing(const char *fname, unsigned int addflags)
ANSI: Open a new file for writing.
Definition: sion_file.c:520
sion_debug.h
_sion_file_purge
int _sion_file_purge(_sion_fileptr *sion_fileptr)
Purge data to file.
Definition: sion_file.c:371
_sion_file_flush_ansi
int _sion_file_flush_ansi(FILE *fileptr)
ANSI: Flush the data to the disk.
Definition: sion_file.c:695
_sion_file_set_position_ansi
sion_int64 _sion_file_set_position_ansi(FILE *fileptr, sion_int64 startpointer)
ANSI: Set the start position for the current task.
Definition: sion_file.c:598
_sion_file_open_posix_read
int _sion_file_open_posix_read(const char *fname, unsigned int addflags)
POSIX: Open a file for reading.
Definition: sion_file.c:815
_sion_file_stat_file2
int _sion_file_stat_file2(const char *fname, unsigned int apiflag)
Check if file exists with appropriate low-level API.
Definition: sion_file.c:262
_sion_file_write
sion_int64 _sion_file_write(const void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Write data to file.
Definition: sion_file.c:175
_sion_file_set_buffer_ansi
int _sion_file_set_buffer_ansi(FILE *fileptr, char *buffer, sion_int32 buffer_size)
ANSI: set buffer of fp.
Definition: sion_file.c:717
_sion_file_get_opt_blksize
long _sion_file_get_opt_blksize(_sion_fileptr *sion_fileptr)
Get optional file system block size for a file.
Definition: sion_file.c:229
_sion_file_get_position
sion_int64 _sion_file_get_position(_sion_fileptr *sion_fileptr)
Get new position in file.
Definition: sion_file.c:319
_sion_file_read_ansi
sion_int64 _sion_file_read_ansi(void *data, sion_int64 bytes, FILE *fileptr)
ANSI: Read data from file.
Definition: sion_file.c:744
_sion_file_open
_sion_fileptr * _sion_file_open(const char *fname, unsigned int flags, unsigned int addflags)
Create and open a new file for writing.
Definition: sion_file.c:45
_sion_file_alloc_and_init_sion_fileptr
_sion_fileptr * _sion_file_alloc_and_init_sion_fileptr(void)
Create and return _sion_fileptr.
Definition: sion_file.c:1187
SION_FILE_FLAG_CREATE
#define SION_FILE_FLAG_CREATE
Definition: sion_file.h:24
_sion_file_flush
int _sion_file_flush(_sion_fileptr *sion_fileptr)
Flush data to file.
Definition: sion_file.c:345
sion_file.h
_sion_file_set_buffer
int _sion_file_set_buffer(_sion_fileptr *sion_fileptr, char *buffer, sion_int32 buffer_size)
Set buffer of fp.
Definition: sion_file.c:399
_sion_file_read
sion_int64 _sion_file_read(void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Read data from file.
Definition: sion_file.c:204
_sion_file_close_posix
int _sion_file_close_posix(int fd)
POSIX: Close a file.
Definition: sion_file.c:840
SION_FILE_FLAG_POSIX
#define SION_FILE_FLAG_POSIX
Definition: sion_file.h:23
_sion_file_get_opt_blksize_ansi
long _sion_file_get_opt_blksize_ansi(FILE *fileptr)
ANSI: Get optional file system block size for a file.
Definition: sion_file.c:576
_sion_file_open_ansi_read
FILE * _sion_file_open_ansi_read(const char *fname, unsigned int addflags)
ANSI: Open a file for reading.
Definition: sion_file.c:543
_sion_fileptrflags_to_str
char * _sion_fileptrflags_to_str(unsigned int flag)
Definition: sion_file.c:1209
_sion_file_unset_second_fileptr
int _sion_file_unset_second_fileptr(_sion_fileptr *sion_fileptr)
Unset second fileptr for file if opened with ANSI.
Definition: sion_file.c:448
_sion_file_set_position_posix
sion_int64 _sion_file_set_position_posix(int fd, sion_int64 startpointer)
POSIX: Set the start position for the current task.
Definition: sion_file.c:876
SION_FILE_FLAG_SCNDANSI
#define SION_FILE_FLAG_SCNDANSI
Definition: sion_file.h:22
_sion_file_write_posix
sion_int64 _sion_file_write_posix(const void *data, sion_int64 bytes, int fd)
POSIX: Write data to file.
Definition: sion_file.c:1002
_sion_file_get_fd
int _sion_file_get_fd(_sion_fileptr *sion_fileptr)
Utility function: Get POSIX fp.
Definition: sion_file.c:470
SION_FILE_FLAG_WRITE
#define SION_FILE_FLAG_WRITE
Definition: sion_file.h:25
SION_FILE_FLAG_READ
#define SION_FILE_FLAG_READ
Definition: sion_file.h:26
_sion_file_get_opt_blksize_posix
long _sion_file_get_opt_blksize_posix(int fd)
POSIX: Get optional file system block size for a file.
Definition: sion_file.c:855
_sion_fileptr_s
Definition: sion_file.h:29
_sion_file_set_second_fileptr
int _sion_file_set_second_fileptr(_sion_fileptr *sion_fileptr, FILE *fileptr)
Set second fileptr for file if opened with ANSI.
Definition: sion_file.c:426