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

📄 tandem.c

📁 完整的解压zip文件的源码。包含密码功能
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * routines common to TANDEM */#define UNZIP_INTERNAL#include "unzip.h"#include <tal.h>#include "$system.zsysdefs.zsysc" nolist#include <cextdecs(FILE_GETINFOLISTBYNAME_, \                   FILENAME_SCAN_,          \                   INTERPRETTIMESTAMP,      \                   CONVERTTIMESTAMP         \                  )>#include <cextdecs(FILENAME_FINDSTART_, \                   FILENAME_FINDNEXT_,  \                   FILENAME_FINDFINISH_ \                  )>#include <cextdecs(SETMODE)>#ifdef LICENSED#include <cextdecs(COMPUTETIMESTAMP,     \                   PROCESS_GETINFO_,     \                   PROCESS_GETINFOLIST_, \                   PROCESSHANDLE_NULLIT_ \                  )>#endif /* LICENSED */char *in2ex OF((char *));void zexit(status)  int status;{  terminate_program (0,0,status,,,);   /* Exit(>0) creates saveabend files */}#ifdef fopen#  undef fopen#endifFILE *zipopen(fname, opt)  const char *fname;  const char *opt;{  int fdesc, fnum, err;  if (strcmp(opt,FOPW) == 0)    if ((fdesc = creat(fname,,100,500)) != -1) {      fnum = fdtogfn(fdesc);      err = SETMODE(fnum, SET_FILE_BUFFERSIZE, TANDEM_BLOCKSIZE);      err = SETMODE(fnum, SET_FILE_BUFFERED, 0, 0);      err = SETMODE(fnum, SET_FILE_BUFFERED, 0, 1);      err = close(fdesc);    }  return fopen(fname,opt);}#define fopen zipopen#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 */ 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 OF((void));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 OF((const char *, const ztimbuf *));int utime(file, time)  const char *file;  const ztimbuf *time;{#ifdef LICENSED  int fdesc, 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], fnum;  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);    fdesc = open(file, O_WRONLY);    fnum = fdtogfn(fdesc);    result = changelabel(fnum,lasttime.wordtime,opentime.wordtime);    err = close(fdesc);    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, fdes, err, nsk_sec_int;  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;  if ((fdes = open(file, (O_EXCLUSIVE | O_RDONLY))) == -1)    return -1;  fnum = fdtogfn(fdes);  err = SETMODE(fnum, SET_FILE_SECURITY, nsk_sec_int);  close(fdes);  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, fdes, err, nsk_own_int;  nsk_own.bit_ov.group = gid;  nsk_own.bit_ov.user  = uid;  nsk_own_int = nsk_own.int_ov;  if ((fdes = open(file, (O_EXCLUSIVE | O_RDONLY))) == -1)    return -1;  fnum = fdtogfn(fdes);  err = SETMODE(fnum, SET_FILE_OWNER, nsk_own_int);  close(fdes);  return (err != 0 ? -1 : 0);}/* TANDEM version of stat() function */time_t gmt_to_time_t (long long *);time_t gmt_to_time_t (gmt)  long long *gmt;{  #define GMT_TO_LCT 0;  #define GMT_TO_LST 1;  struct tm temp_tm;  short  date_time[8];  long   julian_dayno;  long long lct, lst, itime;  short  err[1], type;  type = GMT_TO_LCT;  lct = CONVERTTIMESTAMP(*gmt, type,, err);  if (!err[0]) {    type = GMT_TO_LST;    lst = CONVERTTIMESTAMP(*gmt, type,, err);  }  itime = (err[0] ? *gmt : lct);  temp_tm.tm_isdst = (err[0] ? -1 : ((lct == lst) ? 0 : 1));  julian_dayno = INTERPRETTIMESTAMP (itime, date_time);  temp_tm.tm_sec   = date_time[5];  temp_tm.tm_min   = date_time[4];  temp_tm.tm_hour  = date_time[3];  temp_tm.tm_mday  = date_time[2];  temp_tm.tm_mon   = date_time[1] - 1;     /* C's so sad */  temp_tm.tm_year  = date_time[0] - 1900;  /* it's almost funny */  return (mktime(&temp_tm));}short parsename( const char *, char *, char * );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;  char *fptr;  short extension = 0;  *fname = *ext = '\0';  /* set to null string */  fstart = (char *) srce;  if ((fptr = strrchr(fstart, TANDEM_EXTENSION)) != NULL) {    extension = 1;    fptr++;    strncat(ext, fptr, _min(EXTENSION_MAX, strlen(fptr)));    fptr = strchr(fstart, TANDEM_EXTENSION);  /* End of filename */    strncat(fname, fstart, _min(FILENAME_MAX, (fptr - fstart)));  }  else {    /* just copy string */    strncat(fname, srce, _min(FILENAME_MAX, strlen(srce)));  }  return extension;}int stat(n, s)const char *n;struct stat *s;{  #define flist_items 14  #define flist_size 200  short err, i, extension;  char fname[FILENAME_MAX + 1];  short fnamelen;  char ext[EXTENSION_MAX + 1];                         /* #0  #1  #2  #3 #4 #5 #6 #7 #8 #9 #10 #11 #12 #13 *//*short ilist[flist_items]={62,117,145,142,58,41,42,30,31,75, 78, 79, 60,119}*/  short ilist[flist_items]={62, 56,144,142,58,41,42,30,31,75, 78, 79, 60, 54};  short ilen[flist_items] ={ 2,  4,  4,  2, 1, 1, 1, 1, 1, 1,  1,  1,  1,  4};  short ioff[flist_items];  short flist[flist_size];  short extra[2];  short *rlen=&extra[0];  short *err_item=&extra[1];  unsigned short *fowner;  unsigned short *fprogid;  char *fsec;  short end, count, kind, level, options, searchid;  short info[5];  /* Initialise stat structure */  s->st_dev = _S_GUARDIANOBJECT;  s->st_ino = 0;  s->st_nlink = 0;  s->st_rdev = 0;  s->st_uid = s->st_gid = 0;  s->st_size = 0;  s->st_atime = s->st_ctime = s->st_mtime = 0;  s->st_reserved[0] = 0;  /* Check to see if name contains a (pseudo) file extension */  extension = parsename (n,fname,ext);  fnamelen = strlen(fname);  options = 3; /* Allow Subvols and Templates */  err = FILENAME_SCAN_( fname,                        fnamelen,                        &count,                        &kind,                        &level,                        options                      );  /* allow kind == 2 (DEFINE names) */  if (err != 0) return -1;  if (kind == 1 || (kind == 0 && level < 2)) {    /* Pattern, Subvol Name or One part Filename - lets see if it exists */    err = FILENAME_FINDSTART_ ( &searchid,                                fname,                                fnamelen,                                ,                                DISK_DEVICE                              );    if (err != 0) {      end = FILENAME_FINDFINISH_ ( searchid );      return -1;    }    err = FILENAME_FINDNEXT_ ( searchid,                               fname,                               FILENAME_MAX,                               &fnamelen,                               info                              );    end = FILENAME_FINDFINISH_ ( searchid );    if (err != 0)      return -1;  /* Non existing template, subvol or file */    if (kind == 1 || info[2] == -1) {      s->st_mode = S_IFDIR;    /* Its an existing template or directory */      return 0;    }    /* Must be a real file so drop to code below to get info on it */  }  err = FILE_GETINFOLISTBYNAME_( fname,                                 fnamelen,                                 ilist,                                 flist_items,                                 flist,                                 flist_size,                                 rlen,                                 err_item                               );  if (err != 0) return -1;  ioff[0] = 0;  /*  Build up table of offets into result list */  for (i=1; i < flist_items; i++)    ioff[i] = ioff[i-1] + ilen[i-1];

⌨️ 快捷键说明

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