da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Open a file/string for IO.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** If f is not nil, it is taken as an existing stream that should be
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** closed and its structure reused for the new stream.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Written by Kiem-Phong Vo.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define extern __EXPORT__
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinSfio_t* _sfopen(Sfio_t* f, const char* file, const char* mode)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* get the control flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* changing the control flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(f->mode&SF_INIT ) /* stream uninitialized, ok to set flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((sflags &= SF_RDWR) != 0) /* reset read/write modes */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else /* make sure there is no buffered data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { if(sfsync(f) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(f->file >= 0 && (oflags &= (O_TEXT|O_BINARY|O_APPEND)) != 0 )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* set file access control */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin file ? (size_t)strlen((char*)file) : (size_t)SF_UNBOUND,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((fd = sysopenf((char*)file,oflags,SF_CREATMODE)) < 0 && errno == EINTR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((fd = sysopenf(file,oflags&O_ACCMODE)) < 0 && errno == EINTR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { while((fd = syscreatf(file,SF_CREATMODE)) < 0 && errno == EINTR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* the file now exists, reopen it for read/write */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* we may have to reset the file descriptor to its old value */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((f = sfnew(f,NIL(char*),(size_t)SF_UNBOUND,fd,sflags)) && oldfd >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint _sftype(reg const char* mode, int* oflagsp, int* uflagp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* construct the open flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'a' :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'r' :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 's' :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 't' :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'u' :
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz /* stdio compatibility -- fd >= FOPEN_MAX (or other magic number) ok */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'W' :