12498Sdlw /* 2*19962Slibs char id_open[] = "@(#)open.c 1.11"; 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) 1612104Sdlw #define FROM_OPEN "\2" /* for use in f_clos() */ 17*19962Slibs #define BUF_LEN 256 182498Sdlw 192498Sdlw extern char *tmplate; 202498Sdlw extern char *fortfile; 212498Sdlw 22*19962Slibs char *getenv(); 23*19962Slibs 242498Sdlw f_open(a) olist *a; 252498Sdlw { unit *b; 262498Sdlw int n,exists; 27*19962Slibs char buf[BUF_LEN], env_name[BUF_LEN]; 28*19962Slibs char *env_val, *p1, *p2, ch, st; 292498Sdlw cllist x; 302498Sdlw 312498Sdlw lfname = NULL; 322498Sdlw elist = NO; 332498Sdlw external = YES; /* for err */ 342498Sdlw errflag = a->oerr; 352498Sdlw lunit = a->ounit; 362597Sdlw if(not_legal(lunit)) err(errflag,F_ERUNIT,"open") 372498Sdlw b= &units[lunit]; 382498Sdlw if(a->osta) st = lcase(*a->osta); 392498Sdlw else st = 'u'; 402498Sdlw if(SCRATCH) 412498Sdlw { strcpy(buf,tmplate); 422498Sdlw mktemp(buf); 432498Sdlw } 44*19962Slibs else 45*19962Slibs { 46*19962Slibs if(a->ofnm) g_char(a->ofnm,a->ofnmlen,buf); 47*19962Slibs else sprintf(buf,fortfile,lunit); 48*19962Slibs /* check if overriding file name via environment variable 49*19962Slibs * first copy tail of name - delete periods as Bourne Shell 50*19962Slibs * croaks if any periods in name 51*19962Slibs */ 52*19962Slibs p1 = buf; 53*19962Slibs p2 = env_name; 54*19962Slibs while ((ch = *p1++) != '\0') { 55*19962Slibs if(ch == '/') p2 = env_name; 56*19962Slibs else if(ch != '.') *p2++ = ch; 57*19962Slibs } 58*19962Slibs if(p2 != env_name) { 59*19962Slibs *p2 = '\0'; 60*19962Slibs if( (env_val = getenv( env_name )) != NULL ) { 61*19962Slibs if(strlen(env_val) >= BUF_LEN-1 ) 62*19962Slibs err(errflag,F_ERSTAT,"open: file name too long"); 63*19962Slibs strcpy(buf, env_val); 64*19962Slibs } 65*19962Slibs } 66*19962Slibs } 672498Sdlw lfname = &buf[0]; 682498Sdlw if(OPEN) 692498Sdlw { 702498Sdlw if(!a->ofnm || inode(buf)==b->uinode) 712498Sdlw { 722498Sdlw if(a->oblnk) b->ublnk= (lcase(*a->oblnk)== 'z'); 732498Sdlw #ifndef KOSHER 742498Sdlw if(a->ofm && b->ufmt) b->uprnt = (lcase(*a->ofm)== 'p'); 752498Sdlw #endif 762498Sdlw return(OK); 772498Sdlw } 782498Sdlw x.cunit=lunit; 792498Sdlw x.csta=FROM_OPEN; 802498Sdlw x.cerr=errflag; 812498Sdlw if(n=f_clos(&x)) return(n); 822498Sdlw } 832498Sdlw exists = (access(buf,0)==NULL); 842597Sdlw if(!exists && OLD) err(errflag,F_EROLDF,"open"); 852597Sdlw if( exists && NEW) err(errflag,F_ERNEWF,"open"); 86*19962Slibs errno = F_ERSYS; 872498Sdlw if(isdev(buf)) 882498Sdlw { if((b->ufd = fopen(buf,"r")) != NULL) b->uwrt = NO; 892498Sdlw else err(errflag,errno,buf) 902498Sdlw } 912498Sdlw else 92*19962Slibs { 93*19962Slibs errno = F_ERSYS; 94*19962Slibs if((b->ufd = fopen(buf, "a")) != NULL) 9512036Sdlw { if(!opneof) 9612010Sdlw { if(freopen(buf, "r", b->ufd) != NULL) 9712010Sdlw b->uwrt = NO; 9812010Sdlw else 9912010Sdlw err(errflag, errno, buf) 10012010Sdlw } 10112010Sdlw else 10212010Sdlw b->uwrt = YES; 10312010Sdlw } 1042498Sdlw else if((b->ufd = fopen(buf, "r")) != NULL) 10512036Sdlw { if (opneof) 10611907Sdlw fseek(b->ufd, 0L, 2); 1072498Sdlw b->uwrt = NO; 1082498Sdlw } 1092498Sdlw else err(errflag, errno, buf) 1102498Sdlw } 1112597Sdlw if((b->uinode=finode(b->ufd))==-1) err(errflag,F_ERSTAT,"open") 1122498Sdlw b->ufnm = (char *) calloc(strlen(buf)+1,sizeof(char)); 1132597Sdlw if(b->ufnm==NULL) err(errflag,F_ERSPACE,"open") 1142498Sdlw strcpy(b->ufnm,buf); 1152498Sdlw b->uscrtch = SCRATCH; 1162498Sdlw b->uend = NO; 1172498Sdlw b->useek = canseek(b->ufd); 1188943Sdlw if (a->oacc == NULL) 1198943Sdlw a->oacc = "seq"; 1208943Sdlw if (lcase(*a->oacc)=='s' && a->orl > 0) 1218943Sdlw { 1226604Sdlw fputs("Warning: open: record length ignored on sequential access\n", units[0].ufd); 1238943Sdlw b->url = 0; 1248943Sdlw } 1258943Sdlw else if (a->orl < 0 || (lcase(*a->oacc)=='d' && a->orl == 0)) 1266604Sdlw err(errflag,F_ERARG,"recl on open") 1276604Sdlw else 1286604Sdlw b->url = a->orl; 12912008Sdlw if (a->oblnk) 13012008Sdlw b->ublnk = (lcase(*a->oblnk)=='z'); 13112008Sdlw else if (lunit == STDERR) 13212008Sdlw b->ublnk = NO; 13312008Sdlw else 13412024Sdlw b->ublnk = blzero; 1352498Sdlw if (a->ofm) 1362498Sdlw { 1372498Sdlw switch(lcase(*a->ofm)) 1382498Sdlw { 1392498Sdlw case 'f': 1402498Sdlw b->ufmt = YES; 1412498Sdlw b->uprnt = NO; 1422498Sdlw break; 1432498Sdlw #ifndef KOSHER 1442498Sdlw case 'p': /* print file *** NOT STANDARD FORTRAN ***/ 1452498Sdlw b->ufmt = YES; 1462498Sdlw b->uprnt = YES; 1472498Sdlw break; 1482498Sdlw #endif 1492498Sdlw case 'u': 1502498Sdlw b->ufmt = NO; 1512498Sdlw b->uprnt = NO; 1522498Sdlw break; 1532498Sdlw default: 1542597Sdlw err(errflag,F_ERARG,"open form=") 1552498Sdlw } 1562498Sdlw } 1572498Sdlw else /* not specified */ 1582498Sdlw { b->ufmt = (b->url==0); 15912008Sdlw if (lunit == STDERR) 16012008Sdlw b->uprnt = NO; 16112008Sdlw else 16212024Sdlw b->uprnt = ccntrl; 1632498Sdlw } 1642498Sdlw if(b->url && b->useek) rewind(b->ufd); 1652498Sdlw return(OK); 1662498Sdlw } 1672498Sdlw 1682498Sdlw fk_open(rd,seq,fmt,n) ftnint n; 1692498Sdlw { char nbuf[10]; 1702498Sdlw olist a; 1712498Sdlw sprintf(nbuf, fortfile, (int)n); 1722498Sdlw a.oerr=errflag; 1732498Sdlw a.ounit=n; 1742498Sdlw a.ofnm=nbuf; 1752498Sdlw a.ofnmlen=strlen(nbuf); 1762498Sdlw a.osta=NULL; 1772498Sdlw a.oacc= seq==SEQ?"s":"d"; 1782498Sdlw a.ofm = fmt==FMT?"f":"u"; 1792498Sdlw a.orl = seq==DIR?1:0; 1802498Sdlw a.oblnk=NULL; 1812498Sdlw return(f_open(&a)); 1822498Sdlw } 1832498Sdlw 1842498Sdlw isdev(s) char *s; 1852498Sdlw { struct stat x; 1862498Sdlw int j; 1872498Sdlw if(stat(s, &x) == -1) return(NO); 1882498Sdlw if((j = (x.st_mode&S_IFMT)) == S_IFREG || j == S_IFDIR) return(NO); 1892498Sdlw else return(YES); 1902498Sdlw } 1912498Sdlw 192