📄 tandem.c
字号:
/* * 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 + -