12498Sdlw /* 2*2597Sdlw char id_open[] = "@(#)open.c 1.2"; 32498Sdlw * 42498Sdlw * open.c - f77 file open routines 52498Sdlw */ 62498Sdlw 72498Sdlw #include <sys/types.h> 82498Sdlw #include <sys/stat.h> 92498Sdlw #include <errno.h> 102498Sdlw #include "fio.h" 112498Sdlw 122498Sdlw #define SCRATCH (st=='s') 132498Sdlw #define NEW (st=='n') 142498Sdlw #define OLD (st=='o') 152498Sdlw #define OPEN (b->ufd) 162498Sdlw #define FROM_OPEN "\1" /* for use in f_clos() */ 172498Sdlw 182498Sdlw extern char *tmplate; 192498Sdlw extern char *fortfile; 202498Sdlw 212498Sdlw f_open(a) olist *a; 222498Sdlw { unit *b; 232498Sdlw int n,exists; 242498Sdlw char buf[256],st; 252498Sdlw cllist x; 262498Sdlw 272498Sdlw lfname = NULL; 282498Sdlw elist = NO; 292498Sdlw external = YES; /* for err */ 302498Sdlw errflag = a->oerr; 312498Sdlw lunit = a->ounit; 32*2597Sdlw if(not_legal(lunit)) err(errflag,F_ERUNIT,"open") 332498Sdlw b= &units[lunit]; 342498Sdlw if(a->osta) st = lcase(*a->osta); 352498Sdlw else st = 'u'; 362498Sdlw if(SCRATCH) 372498Sdlw { strcpy(buf,tmplate); 382498Sdlw mktemp(buf); 392498Sdlw } 402498Sdlw else if(a->ofnm) g_char(a->ofnm,a->ofnmlen,buf); 412498Sdlw else sprintf(buf,fortfile,lunit); 422498Sdlw lfname = &buf[0]; 432498Sdlw if(OPEN) 442498Sdlw { 452498Sdlw if(!a->ofnm || inode(buf)==b->uinode) 462498Sdlw { 472498Sdlw if(a->oblnk) b->ublnk= (lcase(*a->oblnk)== 'z'); 482498Sdlw #ifndef KOSHER 492498Sdlw if(a->ofm && b->ufmt) b->uprnt = (lcase(*a->ofm)== 'p'); 502498Sdlw #endif 512498Sdlw return(OK); 522498Sdlw } 532498Sdlw x.cunit=lunit; 542498Sdlw x.csta=FROM_OPEN; 552498Sdlw x.cerr=errflag; 562498Sdlw if(n=f_clos(&x)) return(n); 572498Sdlw } 582498Sdlw exists = (access(buf,0)==NULL); 59*2597Sdlw if(!exists && OLD) err(errflag,F_EROLDF,"open"); 60*2597Sdlw if( exists && NEW) err(errflag,F_ERNEWF,"open"); 612498Sdlw if(isdev(buf)) 622498Sdlw { if((b->ufd = fopen(buf,"r")) != NULL) b->uwrt = NO; 632498Sdlw else err(errflag,errno,buf) 642498Sdlw } 652498Sdlw else 662498Sdlw { if((b->ufd = fopen(buf, "a")) != NULL) b->uwrt = YES; 672498Sdlw else if((b->ufd = fopen(buf, "r")) != NULL) 682498Sdlw { fseek(b->ufd, 0L, 2); 692498Sdlw b->uwrt = NO; 702498Sdlw } 712498Sdlw else err(errflag, errno, buf) 722498Sdlw } 73*2597Sdlw if((b->uinode=finode(b->ufd))==-1) err(errflag,F_ERSTAT,"open") 742498Sdlw b->ufnm = (char *) calloc(strlen(buf)+1,sizeof(char)); 75*2597Sdlw if(b->ufnm==NULL) err(errflag,F_ERSPACE,"open") 762498Sdlw strcpy(b->ufnm,buf); 772498Sdlw b->uscrtch = SCRATCH; 782498Sdlw b->uend = NO; 792498Sdlw b->useek = canseek(b->ufd); 802498Sdlw b->url = a->orl; 812498Sdlw b->ublnk = (a->oblnk && (lcase(*a->oblnk)=='z')); 822498Sdlw if (a->ofm) 832498Sdlw { 842498Sdlw switch(lcase(*a->ofm)) 852498Sdlw { 862498Sdlw case 'f': 872498Sdlw b->ufmt = YES; 882498Sdlw b->uprnt = NO; 892498Sdlw break; 902498Sdlw #ifndef KOSHER 912498Sdlw case 'p': /* print file *** NOT STANDARD FORTRAN ***/ 922498Sdlw b->ufmt = YES; 932498Sdlw b->uprnt = YES; 942498Sdlw break; 952498Sdlw #endif 962498Sdlw case 'u': 972498Sdlw b->ufmt = NO; 982498Sdlw b->uprnt = NO; 992498Sdlw break; 1002498Sdlw default: 101*2597Sdlw err(errflag,F_ERARG,"open form=") 1022498Sdlw } 1032498Sdlw } 1042498Sdlw else /* not specified */ 1052498Sdlw { b->ufmt = (b->url==0); 1062498Sdlw b->uprnt = NO; 1072498Sdlw } 1082498Sdlw if(b->url && b->useek) rewind(b->ufd); 1092498Sdlw return(OK); 1102498Sdlw } 1112498Sdlw 1122498Sdlw fk_open(rd,seq,fmt,n) ftnint n; 1132498Sdlw { char nbuf[10]; 1142498Sdlw olist a; 1152498Sdlw sprintf(nbuf, fortfile, (int)n); 1162498Sdlw a.oerr=errflag; 1172498Sdlw a.ounit=n; 1182498Sdlw a.ofnm=nbuf; 1192498Sdlw a.ofnmlen=strlen(nbuf); 1202498Sdlw a.osta=NULL; 1212498Sdlw a.oacc= seq==SEQ?"s":"d"; 1222498Sdlw a.ofm = fmt==FMT?"f":"u"; 1232498Sdlw a.orl = seq==DIR?1:0; 1242498Sdlw a.oblnk=NULL; 1252498Sdlw return(f_open(&a)); 1262498Sdlw } 1272498Sdlw 1282498Sdlw isdev(s) char *s; 1292498Sdlw { struct stat x; 1302498Sdlw int j; 1312498Sdlw if(stat(s, &x) == -1) return(NO); 1322498Sdlw if((j = (x.st_mode&S_IFMT)) == S_IFREG || j == S_IFDIR) return(NO); 1332498Sdlw else return(YES); 1342498Sdlw } 1352498Sdlw 136