Archive-Unzip-Burst
view release on metacpan or search on metacpan
unzip-6.0/tandem/tandem.c view on Meta::CPAN
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;
char *fptr;
short extension = 0;
*fname = *ext = '\0'; /* set to null string */
fstart = (char *) srce;
unzip-6.0/tandem/tandem.c view on Meta::CPAN
else mktime screws up if we set the isdst flag to -1 */
temp_tm.tm_isdst = (err[0] ? 0 : ((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));
}
/* TANDEM version of stat() function */
int stat(n, s)
const char *n;
struct stat *s;
{
#define ilist_items 26
#define klist_items 4
#define slist_items 3
#define ulist_items 1
#define flist_size 100
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 */
short ilist[ilist_items]={56,144, 54,142, 58, 62, 60, 41, 42, 44,
50, 51, 52, 61, 63, 66, 67, 70, 72, 73,
74, 75, 76, 77, 78, 79 };
short ilen[ilist_items] ={ 4, 4, 4, 2, 1, 2, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1 };
short ioff[ilist_items];
/* #0 #1 #2 #3 #4 #5 #6 #7 #8 #9 */
short klist[klist_items]={45, 46, 68, 69 };
short klen[klist_items] ={ 1, 1, 1, 1 };
short koff[klist_items];
/* #0 #1 #2 #3 #4 #5 #6 #7 #8 #9 */
short slist[slist_items]={43, 80, 90 };
short slen[slist_items] ={ 1, 1, 1 };
short soff[slist_items];
/* #0 #1 #2 #3 #4 #5 #6 #7 #8 #9 */
short ulist[ulist_items]={65 };
short ulen[ulist_items] ={ 1 };
short uoff[ulist_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;
nsk_stat_ov *nsk_ov;
nsk_file_attrs *nsk_attr;
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;
s->st_reserved[1] = 0;
s->st_reserved[2] = 0;
nsk_ov = (nsk_stat_ov *)&s->st_reserved[0];
nsk_attr = (nsk_file_attrs *)&nsk_ov->ov.nsk_ef_region;
/* 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,
ilist_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 < ilist_items; i++)
ioff[i] = ioff[i-1] + ilen[i-1];
/* Set up main stat fields */
/* Setup timestamps */
s->st_atime = gmt_to_time_t ((long long *)&flist[ioff[0]]);
s->st_mtime = s->st_ctime = gmt_to_time_t ((long long *)&flist[ioff[1]]);
nsk_ov->ov.creation_time = gmt_to_time_t ((long long *)&flist[ioff[2]]);
s->st_size = *(off_t *)&flist[ioff[3]];
fowner = (unsigned short *)&flist[ioff[4]];
s->st_uid = *fowner & 0x00ff;
s->st_gid = *fowner >> 8;
/* Note that Purge security (fsec[3]) in NSK has no relevance to stat() */
fsec = (char *)&flist[ioff[5]];
fprogid = (unsigned short *)&flist[ioff[6]];
s->st_mode = S_IFREG | /* Regular File */
/* Parse Read Flag */
((fsec[0] & 0x03) == 0x00 ? S_IROTH : 0) |
((fsec[0] & 0x02) == 0x00 ? S_IRGRP : 0) |
((fsec[0] & 0x03) != 0x03 ? S_IRUSR : 0) |
/* Parse Write Flag */
((fsec[1] & 0x03) == 0x00 ? S_IWOTH : 0) |
((fsec[1] & 0x02) == 0x00 ? S_IWGRP : 0) |
((fsec[1] & 0x03) != 0x03 ? S_IWUSR : 0) |
/* Parse Execute Flag */
((fsec[2] & 0x03) == 0x00 ? S_IXOTH : 0) |
((fsec[2] & 0x02) == 0x00 ? S_IXGRP : 0) |
((fsec[2] & 0x03) != 0x03 ? S_IXUSR : 0) |
/* Parse Progid */
(*fprogid == 1 ? (S_ISUID | S_ISGID) : 0) ;
/* Set up NSK additional stat fields */
nsk_attr->progid = (unsigned) flist[ioff[6]];
nsk_attr->filetype = (unsigned) flist[ioff[7]];
nsk_attr->filecode = (unsigned) flist[ioff[8]];
nsk_attr->block = (unsigned short) flist[ioff[9]];
nsk_attr->priext = (unsigned short) flist[ioff[10]];
nsk_attr->secext = (unsigned short) flist[ioff[11]];
nsk_attr->maxext = (unsigned short) flist[ioff[12]];
nsk_attr->flags.clearonpurge = (unsigned) flist[ioff[13]];
nsk_attr->licensed = (unsigned) flist[ioff[14]];
nsk_attr->flags.audited = (unsigned) flist[ioff[15]];
nsk_attr->flags.acompress = (unsigned) flist[ioff[16]];
nsk_attr->flags.refresheof = (unsigned) flist[ioff[17]];
nsk_attr->flags.buffered = (unsigned) (flist[ioff[18]] == 0 ? 1 : 0);
nsk_attr->flags.verified = (unsigned) flist[ioff[19]];
nsk_attr->flags.serial = (unsigned) flist[ioff[20]];
nsk_attr->flags.crashopen = (unsigned) flist[ioff[22]];
nsk_attr->flags.rollforward = (unsigned) flist[ioff[23]];
nsk_attr->flags.broken = (unsigned) flist[ioff[24]];
nsk_attr->flags.corrupt = (unsigned) flist[ioff[25]];
nsk_attr->fileopen = (unsigned) flist[ioff[21]];
if (nsk_attr->filetype == NSK_UNSTRUCTURED) {
/* extra info for Unstructured files */
err = FILE_GETINFOLISTBYNAME_( fname,
fnamelen,
ulist,
ulist_items,
flist,
flist_size,
rlen,
err_item
);
if (err != 0) return -1;
uoff[0] = 0;
/* Build up table of offets into result list */
for (i=1; i < ulist_items; i++)
uoff[i] = uoff[i-1] + ulen[i-1];
}
else {
/* extra info for Structured files */
err = FILE_GETINFOLISTBYNAME_( fname,
fnamelen,
slist,
slist_items,
flist,
flist_size,
rlen,
err_item
);
if (err != 0) return -1;
soff[0] = 0;
/* Build up table of offets into result list */
for (i=1; i < slist_items; i++)
soff[i] = soff[i-1] + slen[i-1];
nsk_attr->reclen = (unsigned) flist[soff[0]];
( run in 2.477 seconds using v1.01-cache-2.11-cpan-364913b4093 )