⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vms.c

📁 zip压缩
💻 C
📖 第 1 页 / 共 5 页
字号:
            if (xabdat == NULL)            {                dattim.xab$l_nxt = outfab->fab$l_xab;                outfab->fab$l_xab = (void *) &dattim;            }        }        outfab->fab$w_ifi = 0;  /* Clear IFI. It may be nonzero after ZIP */        outfab->fab$b_fac = FAB$M_BIO | FAB$M_PUT;      /* block-mode output */        ierr = sys$create(outfab);        if (ierr == RMS$_FEX)            ierr = replace(__G);        if (ierr == 0)          /* Canceled */            return (free_up(), PK_WARN);        if (ERR(ierr))        {            char buf[256];            sprintf(buf, "[ Cannot create output file %s ]\n", G.filename);            vms_msg(__G__ buf, ierr);            vms_msg(__G__ "", outfab->fab$l_stv);            free_up();            return PK_WARN;        }        if (outfab->fab$b_org & (FAB$C_REL | FAB$C_IDX)) {            /* relative and indexed files require explicit allocation */            ierr = sys$extend(outfab);            if (ERR(ierr))            {                char buf[256];                sprintf(buf, "[ Cannot allocate space for %s ]\n", G.filename);                vms_msg(__G__ buf, ierr);                vms_msg(__G__ "", outfab->fab$l_stv);                free_up();                return PK_WARN;            }        }        outrab = &rab;        rab.rab$l_fab = outfab;        {            rab.rab$l_rop |= (RAB$M_BIO | RAB$M_ASY);        }        rab.rab$b_rac = RAB$C_SEQ;        if ((ierr = sys$connect(outrab)) != RMS$_NORMAL)        {#ifdef DEBUG            vms_msg(__G__ "create_rms_output: sys$connect failed.\n", ierr);            vms_msg(__G__ "", outfab->fab$l_stv);#endif            Info(slide, 1, ((char *)slide,                 "Can't create output file:  %s\n", FnFilter1(G.filename)));            free_up();            return PK_WARN;        }    }                   /* end if (!uO.cflag) */    init_buf_ring();    if ( text_output )        switch (rfm)        {            case FAB$C_VAR:                _flush_routine = _flush_varlen;                break;            case FAB$C_STM:            case FAB$C_STMCR:            case FAB$C_STMLF:                _flush_routine = _flush_stream;                got_eol = 0;                break;            default:                _flush_routine = _flush_blocks;                break;        }    else        _flush_routine = _flush_blocks;    _close_routine = _close_rms;    return PK_COOL;}static  int pka_devchn;static  int pka_io_pending;static  unsigned pka_vbn;#if defined(__DECC) || defined(__DECCXX)#pragma __member_alignment __save#pragma __nomember_alignment#endif /* __DECC || __DECCXX */static struct{    short   status;    long    count;    short   dummy;} pka_io_sb;#if defined(__DECC) || defined(__DECCXX)#pragma __member_alignment __restore#endif /* __DECC || __DECCXX */static struct{    short   status;    short   dummy;    void    *addr;} pka_acp_sb;static struct fibdef    pka_fib;static struct atrdef    pka_atr[VMS_MAX_ATRCNT];static int              pka_idx;static ulg              pka_uchar;static struct fatdef    pka_rattr;static struct dsc$descriptor    pka_fibdsc ={   sizeof(pka_fib), DSC$K_DTYPE_Z, DSC$K_CLASS_S, (void *) &pka_fib  };static struct dsc$descriptor_s  pka_devdsc ={   0, DSC$K_DTYPE_T, DSC$K_CLASS_S, &nam.nam$t_dvi[1]  };static struct dsc$descriptor_s  pka_fnam ={   0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL  };static char exp_nam[NAM$C_MAXRSS];static char res_nam[NAM$C_MAXRSS];#define PK_PRINTABLE_RECTYP(x)   ( (x) == FAT$C_VARIABLE \                                || (x) == FAT$C_STREAMLF \                                || (x) == FAT$C_STREAMCR \                                || (x) == FAT$C_STREAM   )static int create_qio_output(__GPRO)          /* return 1 (PK_WARN) if fail */{    int status;    int i;    int text_output;    /* extract the file in text (variable-length) format, when     * piping to SYS$OUTPUT, unless "binary" piping was requested     * by the user (through the -b option); the "-a" option is     * ignored when extracting zip entries with VMS attributes saved     */    text_output = uO.cflag &&                  (!uO.bflag || (!(uO.bflag - 1) && G.pInfo->textfile));    if ( uO.cflag )    {        int rtype;        if (text_output)        {            rtype = pka_rattr.fat$v_rtype;            if (!PK_PRINTABLE_RECTYP(rtype))            {                Info(slide, 1, ((char *)slide,                   "[ File %s has illegal record format to put to screen ]\n",                   FnFilter1(G.filename)));                return PK_WARN;            }        }        else            /* force "block I/O" for binary piping mode */            rtype = FAT$C_UNDEFINED;        init_buf_ring();        switch (rtype)        {            case FAT$C_VARIABLE:                _flush_routine = _flush_varlen;                break;            case FAT$C_STREAM:            case FAT$C_STREAMCR:            case FAT$C_STREAMLF:                _flush_routine = _flush_stream;                got_eol = 0;                break;            default:                _flush_routine = _flush_blocks;                break;        }        _close_routine = _close_rms;    }    else                        /* !(uO.cflag) : redirect output */    {        fileblk = cc$rms_fab;        fileblk.fab$l_fna = G.filename;        fileblk.fab$b_fns = strlen(G.filename);        nam = cc$rms_nam;        fileblk.fab$l_nam = &nam;        nam.nam$l_esa = exp_nam;        nam.nam$b_ess = sizeof(exp_nam);        nam.nam$l_rsa = res_nam;        nam.nam$b_rss = sizeof(res_nam);        if ( ERR(status = sys$parse(&fileblk)) )        {            vms_msg(__G__ "create_qio_output: sys$parse failed.\n", status);            return PK_WARN;        }        pka_devdsc.dsc$w_length = (unsigned short)nam.nam$t_dvi[0];        if ( ERR(status = sys$assign(&pka_devdsc,&pka_devchn,0,0)) )        {            vms_msg(__G__ "create_qio_output: sys$assign failed.\n", status);            return PK_WARN;        }        pka_fnam.dsc$a_pointer = nam.nam$l_name;        pka_fnam.dsc$w_length  = nam.nam$b_name + nam.nam$b_type;        if ( uO.V_flag /* keep versions */ )            pka_fnam.dsc$w_length += nam.nam$b_ver;        for (i=0;i<3;i++)        {            pka_fib.FIB$W_DID[i]=nam.nam$w_did[i];            pka_fib.FIB$W_FID[i]=0;        }        pka_fib.FIB$L_ACCTL = FIB$M_WRITE;        /* Allocate space for the file */        pka_fib.FIB$W_EXCTL = FIB$M_EXTEND;        if ( pka_uchar & FCH$M_CONTIG )            pka_fib.FIB$W_EXCTL |= FIB$M_ALCON | FIB$M_FILCON;        if ( pka_uchar & FCH$M_CONTIGB )            pka_fib.FIB$W_EXCTL |= FIB$M_ALCONB;#define SWAPW(x)        ( (((x)>>16)&0xFFFF) + ((x)<<16) )        pka_fib.fib$l_exsz = SWAPW(pka_rattr.fat$l_hiblk);        status = sys$qiow(0, pka_devchn, IO$_CREATE|IO$M_CREATE|IO$M_ACCESS,                          &pka_acp_sb, 0, 0,                          &pka_fibdsc, &pka_fnam, 0, 0, &pka_atr, 0);        if ( !ERR(status) )            status = pka_acp_sb.status;        if ( ERR(status) )        {            vms_msg(__G__ "[ Create file QIO failed. ]\n", status);            sys$dassgn(pka_devchn);            return PK_WARN;        }#ifdef ASYNCH_QIO        init_buf_ring();        pka_io_pending = FALSE;#else        locptr = locbuf;        loccnt = 0;#endif        pka_vbn = 1;        _flush_routine = _flush_qio;        _close_routine = _close_qio;    }                   /* end if (!uO.cflag) */    return PK_COOL;}static int replace(__GPRO){                       /*                         *      File exists. Inquire user about further action.                         */    char answ[10];    struct NAM nam;    int ierr;    if (query == '\0')    {        do        {            Info(slide, 0x81, ((char *)slide,                 "%s exists:  [o]verwrite, new [v]ersion or [n]o extract?\n\  (uppercase response [O,V,N] = do same for all files): ",                 FnFilter1(G.filename)));            fflush(stderr);        } while (fgets(answ, 9, stderr) == NULL && !isalpha(answ[0])                 && tolower(answ[0]) != 'o'                 && tolower(answ[0]) != 'v'                 && tolower(answ[0]) != 'n');        if (isupper(answ[0]))            query = answ[0] = tolower(answ[0]);    }    else        answ[0] = query;    switch (answ[0])    {        case 'n':            ierr = 0;            break;        case 'v':            nam = cc$rms_nam;            nam.nam$l_rsa = G.filename;            nam.nam$b_rss = FILNAMSIZ - 1;            outfab->fab$l_fop |= FAB$M_MXV;            outfab->fab$l_nam = &nam;            ierr = sys$create(outfab);            if (!ERR(ierr))            {                outfab->fab$l_nam = NULL;                G.filename[outfab->fab$b_fns = nam.nam$b_rsl] = '\0';            }            break;        case 'o':            outfab->fab$l_fop |= FAB$M_SUP;            ierr = sys$create(outfab);            break;    }    return ierr;}#define W(p)    (*(unsigned short*)(p))#define L(p)    (*(unsigned long*)(p))#define EQL_L(a,b)      ( L(a) == L(b) )#define EQL_W(a,b)      ( W(a) == W(b) )/**************************************************************** * Function find_vms_attrs scans ZIP entry extra field if any   * * and looks for VMS attribute records. Returns 0 if either no  * * attributes found or no fab given.                            * ****************************************************************/static int find_vms_attrs(__G)    __GDEF{    uch *scan = G.extra_field;    struct  EB_header *hdr;    int len;    int type=VAT_NONE;    outfab = NULL;    xabfhc = NULL;    xabdat = NULL;    xabrdt = NULL;    xabpro = NULL;    first_xab = last_xab = NULL;    if (scan == NULL)        return VAT_NONE;    len = G.lrec.extra_field_length;#define LINK(p) {/* Link xaballs and xabkeys into chain */      \                if ( first_xab == NULL )                \                        first_xab = (void *) p;         \                if ( last_xab != NULL )                 \                        last_xab->xab$l_nxt = (void *) p;       \                last_xab = (void *) p;                  \                p->xab$l_nxt = NULL;                    \        }    /* End of macro LINK */    while (len > 0)    {        hdr = (struct EB_header *)scan;        if (EQL_W(&hdr->tag, IZ_SIGNATURE))        {            /*             *  Info-ZIP style extra block decoding             */            uch *blk;            unsigned siz;            uch *block_id;            type = VAT_IZ;            siz = hdr->size;            blk = (uch *)(&hdr->data[0]);            block_id = (uch *)(&((struct IZ_block *)hdr)->bid);            if (EQL_L(block_id, FABSIG)) {                outfab = (struct FAB *)extract_izvms_block(__G__ blk, siz,                                        NULL, (uch *)&cc$rms_fab, FABL);            } else if (EQL_L(block_id, XALLSIG)) {                xaball = (struct XABALL *)extract_izvms_block(__G__ blk, siz,                                        NULL, (uch *)&cc$rms_xaball, XALLL);                LINK(xaball);            } else if (EQL_L(block_id, XKEYSIG)) {                xabkey = (struct XABKEY *)extract_izvms_block(__G__ blk, siz,                                        NULL, (uch *)&cc$rms_xabkey, XKEYL);                LINK(xabkey);            } else if (EQL_L(block_id, XFHCSIG)) {                xabfhc = (struct XABFHC *) extract_izvms_block(__G__ blk, siz,                                        NULL, (uch *)&cc$rms_xabfhc, XFHCL);            } else if (EQL_L(block_id, XDATSIG)) {                xabdat = (struct XABDAT *) extract_izvms_block(__G__ blk, siz,                                        NULL, (uch *)&cc$rms_xabdat, XDATL);            } else if (EQL_L(block_id, XRDTSIG)) {                xabrdt = (struct XABRDT *) extract_izvms_block(__G__ blk, siz,                                        NULL, (uch *)&cc$rms_xabrdt, XRDTL);            } else if (EQL_L(block_id, XPROSIG)) {                xabpro = (struct XABPRO *) extract_izvms_block(__G__ blk, siz,                                        NULL, (uch *)&cc$rms_xabpro, XPROL);            } else if (EQL_L(block_id, VERSIG)) {#ifdef CHECK_VERSIONS                char verbuf[80];                unsigned verlen = 0;                uch *vers;                char *m;                get_vms_version(verbuf, sizeof(verbuf));                vers = extract_izvms_block(__G__ blk, siz,                                           &verlen, NULL, 0);                if ((m = strrchr((char *) vers, '-')) != NULL)                    *m = '\0';  /* Cut out release number */                if (strcmp(verbuf, (char *) vers) && uO.qflag < 2)                {                    Info(slide, 0, ((char *)slide,                         "[ Warning: VMS version mismatch."));                    Info(slide, 0, ((char *)slide,                         "   This version %s --", verbuf));                    strncpy(verbuf, (char *) vers, verlen);                    verbuf[verlen] = '\0';                    Info(slide, 0, ((char *)slide,                         " version made by %s ]\n", verbuf));                }                free(vers);#endif /* CHECK_VERSIONS */            } else {                Info(slide, 1, ((char *)slide,                     "[ Warning: Unknown block signature %s ]\n",                     block_id));            }        }        else if (hdr->tag == PK_SIGNATURE)        {            /*             *  PKWARE-style extra block decoding             */            struct  PK_header   *blk;            register byte   *scn;            register int    len;            type = VAT_PK;            blk = (struct PK_header *)hdr;            len = blk->size - (PK_HEADER_SIZE - EB_HEADSIZE);            scn = (byte *)(&blk->data);            pka_idx = 0;            if (blk->crc32 != crc32(CRCVAL_INITIAL, scn, (extent)len))            {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -