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

📄 tandem.c

📁 压缩解压,是unzip540的升级,这个外国网站摘来的源码,是evb编写.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  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;

⌨️ 快捷键说明

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