?? tandem.c
字號:
/* Copyright (c) 1990-2002 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html*//* * routines common to TANDEM (ZIP and UNZIP) */#include "zip.h" /* This sets up ZIP / UNZIP define */#include <tal.h>#include "$system.zsysdefs.zsysc" nolist#include <cextdecs> nolist#include "tannsk.h"static time_t gmt_to_time_t (long long *);int isatty (fnum)int fnum;{ return 1;}/********************//* Function in2ex() *//********************/#ifdef UNZIPchar *in2ex(__G__ n) __GDEF#elsechar *in2ex(n)#endif char *n; /* internal file name *//* Convert the zip file name to an external file name, returning the malloc'ed string or NULL if not enough memory. */{ char *x; /* external file name buffer */ char *y; /* pointer to external buffer */ char *max; /* pointer to max end of next file part */ char *t; /* pointer to internal - start of substring */ char *p; /* pointer to internal - TANDEM delimiter */ char *e; /* pointer to internal - DOS extension delimiter */ char *z; /* pointer to internal - end of substring */ int len; /* length of substring to copy to external name */ int allow_dollar; /* $ symbol allowed as next character */ if ((x = malloc(strlen(n) + 4)) == NULL) /* + 4 for safety */ return NULL; *x = '\0'; /* Junk pathname as requested */#ifdef UNZIP if (uO.jflag && (t = strrchr(n, INTERNAL_DELIMITER)) != NULL) ++t; else t = n;#endif /* UNZIP */#ifdef ZIP if (!pathput) t = last(n, INTERNAL_DELIMITER); else t = n;#endif /* ZIP */ allow_dollar = TRUE; while (*t != '\0') { /* File part could be sys, vol, subvol or file */ if (*t == INTERNAL_DELIMITER) { /* System, Volume or Subvol Name */ t++; if (*t == INTERNAL_DELIMITER) { /* System */ strcat(x, TANDEM_NODE_STR); t++; } else { strcat(x, TANDEM_DELIMITER_STR); allow_dollar = FALSE; } } /* Work out where end of current external string is */ y = x + strlen(x); /* Work out substring to copy and externalise */ p = strchr(t, INTERNAL_DELIMITER); e = strchr(t, DOS_EXTENSION); if (p != NULL) { if (e > p) e = NULL; } z = e; if (z == NULL) z = p; if (z == NULL) z = t + strlen(t); /* can't have Tandem name longer than 8 characters */ max = y + MAXFILEPARTLEN; /* Allow $ symbol as first character in some cases */ if (*t == '$') { if (allow_dollar) *y++ = *t++; else; *t++; } /* Make sure first real character is alpha */ if (! isalpha(*t) ) *y++ = 'A'; /* Characters left to process */ len = z - t; while ( len > 0 ) { if ( isalnum(*t) ) { *y++ = toupper(*t++); if (y >= max) break; } else t++; len--; } *y = '\0'; t = p; if (p == NULL) { /* Last part of filename, store pseudo extension if available */ if (e != NULL) { strcat(x, TANDEM_EXTENSION_STR); y = x + strlen(x); /* no restriction on extension length as its virtual */ z = e + 1; while ( *z != '\0' ) { *y++ = toupper(*z++); } *y = '\0'; } break; } } return x;}void zexit(status) int status;{ /* Exit(>0) creates saveabend files */ terminate_program (0,0,(short)status,,,);}/************************//* Function zputc() *//************************/#ifdef putc# undef putc#endifint zputc(ch, fptr) int ch; FILE *fptr;{ int err; err = putc(ch,fptr); fflush(fptr); return err;}#define putc zputc#ifdef LICENSED_tal _priv short FILE_CHANGELABEL_ ( short, /* IN */ short, /* IN */ const short _far * /* IN */ );_c _callable int changelabel OF((short, const short *, const short *));_c _callable int changelabel(fnum, modtime, actime) short fnum; const short *modtime; const short *actime;{ int err; err = FILE_CHANGELABEL_(fnum, 16, modtime); if (!err) err = FILE_CHANGELABEL_(fnum, 17, actime); return err;}int islicensed(void){ #define plist_items 1 #define plist_size 10 short myphandle[ZSYS_VAL_PHANDLE_WLEN]; short licensetag[plist_items] = {37}; short licensed[plist_size]; short maxlen = plist_size; short items = plist_items; short resultlen[1], err; err = PROCESSHANDLE_NULLIT_(myphandle); if (!err) err = PROCESS_GETINFO_(myphandle); if (!err) err = PROCESS_GETINFOLIST_(/*cpu*/, /*pin*/, /*nodename*/, /*nodenamelen*/, myphandle, licensetag, items, licensed, maxlen, resultlen ); if (err != 0) return 0; else return licensed[0];}#endif /* LICENSED */int utime(file, time) const char *file; const ztimbuf *time;{#ifdef LICENSED int result, err; union timestamp_ov { long long fulltime; short wordtime[4]; }; union timestamp_ov lasttime, opentime; struct tm *modt, *opent; short datetime[8], errormask[1]; short len, fnum, access, exclus, options; char fname[FILENAME_MAX + 1]; short extension; char ext[EXTENSION_MAX + 1]; if (islicensed() ) { /* Attempt to update file label */ modt = gmtime( &time->modtime ); datetime[0] = modt->tm_year + 1900; datetime[1] = modt->tm_mon + 1; datetime[2] = modt->tm_mday; datetime[3] = modt->tm_hour; datetime[4] = modt->tm_min; datetime[5] = modt->tm_sec; datetime[6] = datetime[7] = 0; errormask[0] = 0; lasttime.fulltime = COMPUTETIMESTAMP (datetime, errormask); opent = gmtime( &time->actime ); datetime[0] = opent->tm_year + 1900; datetime[1] = opent->tm_mon + 1; datetime[2] = opent->tm_mday; datetime[3] = opent->tm_hour; datetime[4] = opent->tm_min; datetime[5] = opent->tm_sec; datetime[6] = datetime[7] = 0; errormask[0] = 0; opentime.fulltime = COMPUTETIMESTAMP (datetime, errormask); /* Remove any (pseudo) file extension */ extension = parsename (file,fname,ext); len = strlen(fname); access = NSK_WRONLY; exclus = NSK_SHARED; options = NSK_NOUPDATEOPENTIME; extension = parsename (file,fname,ext); len = strlen(fname); err = FILE_OPEN_((char *)fname, len, &fnum, access, exclus,,,options,,,); result = changelabel(fnum,lasttime.wordtime,opentime.wordtime); err = FILE_CLOSE_(fnum); return result; } return -1;#else /* !LICENSED */ return 0; /* "no error", to suppress annoying failure messages */#endif /* ?LICENSED */}/* TANDEM version of chmod() function */int chmod(file, unix_sec) const char *file; mode_t unix_sec;{ FILE *stream; struct nsk_sec_type { unsigned progid : 1; unsigned clear : 1; unsigned null : 2; unsigned read : 3; unsigned write : 3; unsigned execute: 3; unsigned purge : 3; }; union nsk_sec_ov { struct nsk_sec_type bit_ov; short int_ov; }; union nsk_sec_ov nsk_sec; short fnum, err, nsk_sec_int; short len, access, exclus, extension, options; char fname[FILENAME_MAX + 1]; char ext[EXTENSION_MAX + 1]; nsk_sec.bit_ov.progid = 0; nsk_sec.bit_ov.clear = 0; nsk_sec.bit_ov.null = 0; /* 4="N", 5="C", 6="U", 7="-" */ if (unix_sec & S_IROTH) nsk_sec.bit_ov.read = 4; else if (unix_sec & S_IRGRP) nsk_sec.bit_ov.read = 5; else if (unix_sec & S_IRUSR) nsk_sec.bit_ov.read = 6; else nsk_sec.bit_ov.read = 7; if (unix_sec & S_IWOTH) nsk_sec.bit_ov.write = 4; else if (unix_sec & S_IWGRP) nsk_sec.bit_ov.write = 5; else if (unix_sec & S_IWUSR) nsk_sec.bit_ov.write = 6; else nsk_sec.bit_ov.write = 7; if (unix_sec & S_IXOTH) nsk_sec.bit_ov.execute = 4; else if (unix_sec & S_IXGRP) nsk_sec.bit_ov.execute = 5; else if (unix_sec & S_IXUSR) nsk_sec.bit_ov.execute = 6; else nsk_sec.bit_ov.execute = 7; nsk_sec.bit_ov.purge = nsk_sec.bit_ov.write; nsk_sec_int = nsk_sec.int_ov; access = NSK_RDONLY; exclus = NSK_SHARED; options = NSK_NOUPDATEOPENTIME; extension = parsename (file,fname,ext); len = strlen(fname); err = FILE_OPEN_((char *)fname, len, &fnum, access, exclus,,,options,,,); err = (SETMODE(fnum, SET_FILE_SECURITY, nsk_sec_int) != CCE); err = FILE_CLOSE_(fnum); return (err != 0 ? -1 : 0);}/* TANDEM version of chown() function */int chown(file, uid, gid) const char *file; uid_t uid; gid_t gid;{ FILE *stream; struct nsk_own_type { unsigned group : 8; unsigned user : 8; }; union nsk_own_ov { struct nsk_own_type bit_ov; short int_ov; }; union nsk_own_ov nsk_own; short fnum, err, nsk_own_int; short len, access, exclus, extension, options; char fname[FILENAME_MAX + 1]; char ext[EXTENSION_MAX + 1]; nsk_own.bit_ov.group = gid; nsk_own.bit_ov.user = uid; nsk_own_int = nsk_own.int_ov; access = NSK_RDONLY; exclus = NSK_SHARED; options = NSK_NOUPDATEOPENTIME; extension = parsename (file,fname,ext); len = strlen(fname); err = FILE_OPEN_((char *)fname, len, &fnum, access, exclus,,,options,,,); err = (SETMODE(fnum, SET_FILE_OWNER, nsk_own_int) != CCE); err = FILE_CLOSE_(fnum); return (err != 0 ? -1 : 0);}/* TANDEM version of getch() - non-echo character reading */int zgetch(void){ char ch; short f, err, count, fnum, rlen; rlen = 1; f = (short)fileno(stdin); fnum = fdtogfn (f); #define ECHO_MODE 20 err = (SETMODE(fnum, ECHO_MODE, 0) != CCE); err = (READX(fnum, &ch, rlen, (short *) &count) != CCE); err = (SETMODE(fnum, ECHO_MODE, 1) != CCE); if (err) if (err != 1) return EOF; else ch = 'q'; else if (count == 0) ch = '\r'; return (int)ch;}short parsename(srce, fname, ext) const char *srce; char *fname; char *ext;{ /* As a way of supporting DOS extensions from Tandem we look for a space separated extension string after the Guardian filename e.g. ZIP ZIPFILE "$DATA4.TESTING.INVOICE TXT" */ char *fstart;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -