?? vms.c
字號:
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)) {
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -