Annotation of researchv10dc/libI77/old/open.c, revision 1.1

1.1     ! root        1: /*     @(#)open.c      1.4     */
        !             2: 
        !             3: #include       "sys/types.h"
        !             4: #include       "sys/stat.h"
        !             5: #include "fio.h"
        !             6: extern char *mktemp(), *malloc(), *strcpy();
        !             7: f_open(a) olist *a;
        !             8: {      unit *b;
        !             9:        int n;
        !            10:        char buf[256];
        !            11:        cllist x;
        !            12:        if(a->ounit>=MXUNIT || a->ounit<0)
        !            13:                err(a->oerr,101,"open")
        !            14:        b= &units[a->ounit];
        !            15:        if(b->ufd!=0) goto connected;
        !            16: unconnected:
        !            17:        b->url=a->orl;
        !            18:        if(a->oblnk && (*a->oblnk=='z' || *a->oblnk == 'Z')) b->ublnk=1;
        !            19:        else b->ublnk=0;
        !            20:        if(a->ofm==0)
        !            21:        {       if(b->url>0) b->ufmt=0;
        !            22:                else b->ufmt=1;
        !            23:        }
        !            24:        else if(*a->ofm=='f' || *a->ofm == 'F') b->ufmt=1;
        !            25:        else b->ufmt=0;
        !            26:        if(a->osta==0) {
        !            27:                if(a->ofnm)
        !            28:                        goto unknown;
        !            29:                else
        !            30:                        goto scratch;
        !            31:        }
        !            32:        switch(*a->osta)
        !            33:        {
        !            34:        unknown:
        !            35:        default:
        !            36:        case 'o':
        !            37:        case 'O':
        !            38:                if(a->ofnm==0) err(a->oerr,107,"open")
        !            39:                g_char(a->ofnm,a->ofnmlen,buf);
        !            40:                b->uscrtch=0;
        !            41:                if(a->osta == 0)
        !            42:                        goto done;
        !            43:                if((*a->osta=='o' || *a->osta == 'O') && access(buf,0))
        !            44:                        err(a->oerr,errno,"open")
        !            45:        done:
        !            46:                b->ufnm=(char *) malloc((unsigned int)(strlen(buf)+1));
        !            47:                if(b->ufnm==NULL) err(a->oerr,113,"no space");
        !            48:                (void) strcpy(b->ufnm,buf);
        !            49:                b->uend=0;
        !            50:                if(isdev(buf))
        !            51:                {       b->ufd = fopen(buf,"r");
        !            52:                        if(b->ufd==NULL) err(a->oerr,errno,buf)
        !            53:                        else    b->uwrt = 0;
        !            54:                }
        !            55:                else {
        !            56:                        if((b->ufd = fopen(buf, "r")) == NULL) {
        !            57:                                (void) creat(buf, 0666);
        !            58:                                if((b->ufd = fopen(buf, "r")) == NULL)
        !            59:                                        err(a->oerr, errno, buf);
        !            60:                        }
        !            61:                        b->uwrt = 0;
        !            62:                        if(b->url > 0)  /* one can more easily find the end */
        !            63:                                (void) fseek(b->ufd, 0L, 0);
        !            64:                }
        !            65:                b->useek=canseek(b->ufd);
        !            66:                if((b->uinode=inode(buf))==-1)
        !            67:                        err(a->oerr,108,"open")
        !            68:                if(a->orl && b->useek) rewind(b->ufd);
        !            69:                return(0);
        !            70:         case 's':
        !            71:         case 'S':
        !            72:         scratch:
        !            73:                b->uscrtch=1;
        !            74:                (void) strcpy(buf,"tmp.FXXXXXX");
        !            75:                (void) mktemp(buf);
        !            76:                (void) close(creat(buf, 0666));
        !            77:                goto done;
        !            78:        case 'n':
        !            79:        case 'N':
        !            80:                b->uscrtch=0;
        !            81:                if(a->ofnm==0) err(a->oerr,107,"open")
        !            82:                g_char(a->ofnm,a->ofnmlen,buf);
        !            83:                (void) close(creat(buf, 0666));
        !            84:                goto done;
        !            85:        }
        !            86: connected:
        !            87:        if(a->ofnm==0)
        !            88:        {
        !            89:        same:   if(a->oblnk!= 0) b->ublnk= *a->oblnk== 'z'?1:0;
        !            90:                return(0);
        !            91:        }
        !            92:        g_char(a->ofnm,a->ofnmlen,buf);
        !            93:        if(inode(buf)==b->uinode) goto same;
        !            94:        x.cunit=a->ounit;
        !            95:        x.csta=0;
        !            96:        x.cerr=a->oerr;
        !            97:        if((n=f_clos(&x))!=0) return(n);
        !            98:        goto unconnected;
        !            99: }
        !           100: fk_open(seq,fmt,n) ftnint n;
        !           101: {      char nbuf[10];
        !           102:        olist a;
        !           103:        (void) sprintf(nbuf,"fort.%ld",n);
        !           104:        a.oerr=1;
        !           105:        a.ounit=n;
        !           106:        a.ofnm=nbuf;
        !           107:        a.ofnmlen=strlen(nbuf);
        !           108:        a.osta=NULL;
        !           109:        a.oacc= seq==SEQ?"s":"d";
        !           110:        a.ofm = fmt==FMT?"f":"u";
        !           111:        a.orl = seq==DIR?1:0;
        !           112:        a.oblnk=NULL;
        !           113:        return(f_open(&a));
        !           114: }
        !           115: isdev(s) char *s;
        !           116: {      struct stat x;
        !           117:        int j;
        !           118:        if(stat(s, &x) == -1) return(0);
        !           119:        if((j = (x.st_mode&S_IFMT)) == S_IFREG || j == S_IFDIR) return(0);
        !           120:        else    return(1);
        !           121: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.