tanzip.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. /*
  2. Copyright (c) 1990-2002 Info-ZIP. All rights reserved.
  3. See the accompanying file LICENSE, version 2000-Apr-09 or later
  4. (the contents of which are also included in zip.h) for terms of use.
  5. If, for some reason, all these files are missing, the Info-ZIP license
  6. also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
  7. */
  8. /*
  9. * routines only used by TANDEM ZIP
  10. */
  11. #include "zip.h"
  12. #include "crypt.h"
  13. #include <tal.h>
  14. #include "$system.zsysdefs.zsysc" nolist
  15. #include <cextdecs> nolist
  16. #include "tannsk.h"
  17. /******************************/
  18. /* Function version_local() */
  19. /******************************/
  20. void version_local()
  21. {
  22. static ZCONST char CompiledWith[] = "Compiled with %s%s for %s%s%s%s.\n\n";
  23. #if 0
  24. char buf[40];
  25. #endif
  26. printf(CompiledWith,
  27. #ifdef __GNUC__
  28. "gcc ", __VERSION__,
  29. #else
  30. "C ", "T9255D44 - (16OCT98)",
  31. #endif
  32. "NonStop ", "(Tandem/NSK)",
  33. #ifdef __DATE__
  34. " on ", __DATE__
  35. #else
  36. "", ""
  37. #endif
  38. );
  39. } /* end function version_local() */
  40. /************************/
  41. /* Function nskopen() */
  42. /************************/
  43. #ifdef fopen
  44. # undef fopen
  45. #endif
  46. FILE *nskopen(fname, opt)
  47. const char *fname;
  48. const char *opt;
  49. {
  50. int fdesc;
  51. short fnum, err, len;
  52. int priext, secext;
  53. short maxext, filecode, blocksize;
  54. #define alist_items 1
  55. #define vlist_bytes 2
  56. short alist[alist_items]={42};
  57. unsigned short vlist[alist_items];
  58. short extra, *err_item=&extra;
  59. char nsk_work[FILENAME_MAX + 1], *nsk_fname=&nsk_work[0];
  60. /* See if we want to create a new file */
  61. if ((strcmp(opt,FOPW) == 0) || (strcmp(opt,FOPWT) == 0)) {
  62. blocksize = TANDEM_BLOCKSIZE;
  63. priext = 100;
  64. secext = 500;
  65. maxext = 978;
  66. filecode = NSK_ZIPFILECODE;
  67. if ((fdesc = creat(fname,,priext,secext)) != -1){
  68. fnum = fdtogfn ((short)fdesc);
  69. err = (SETMODE (fnum, SET_FILE_BUFFERSIZE, blocksize) != CCE);
  70. err = (SETMODE (fnum, SET_FILE_BUFFERED, 0, 0) != CCE);
  71. err = (SETMODE (fnum, SET_FILE_BUFFERED, 0, 1) != CCE);
  72. err = (SETMODE (fnum, SET_FILE_MAXEXTENTS, maxext) != CCE);
  73. err = close(fdesc);
  74. vlist[0] = filecode;
  75. /* Note that FILE_ALTERLIST_ expects uppercase names */
  76. /* Need to call strlen and upshift */
  77. len = strlen(fname);
  78. err = STRING_UPSHIFT_((char *)fname,
  79. len,
  80. nsk_fname,
  81. len);
  82. err = FILE_ALTERLIST_(nsk_fname,
  83. len,
  84. alist,
  85. alist_items,
  86. vlist,
  87. vlist_bytes,
  88. ,
  89. err_item);
  90. };
  91. };
  92. return fopen(fname,opt);
  93. }
  94. #define fopen nskopen
  95. int Bflag = 0; /* Special formatting options for Tandem */
  96. /* Bit 0 = Add delimiter (0 = Yes, 1 = No) */
  97. /* Bit 1 = Delimiter Type (0 = CR/LF, 1 = LF) */
  98. /* Bit 2 = Space Fill records (0 = No, 1 = Yes) */
  99. /* Bit 3 = Trim trailing space(0 = No, 1 = Yes) */
  100. /* Thus, default is to add CR/LF, no padding */
  101. /* Bit 8 = Use 'safe' large read size (Expand) */
  102. char nsk_delim[2] = {'\r', '\n'}; /* CR/LF */
  103. int nsk_delim_len = 2;
  104. int nsk_space_fill = 0; /* 0 = No, 1 = Yes */
  105. int nsk_trim_space = 0; /* 0 = No, 1 = Yes */
  106. unsigned short nsk_large_read = MAX_LARGE_READ;
  107. /* Following holds details of file currently used by zopen & zread */
  108. struct stat znsk_stat;
  109. nsk_stat_ov *znsk_ov = (nsk_stat_ov *)&znsk_stat.st_reserved[0];
  110. nsk_file_attrs *znsk_attr = (nsk_file_attrs *)
  111. ( (char *)(&znsk_stat.st_reserved[0]) +
  112. offsetof (struct nsk_stat_overlay, nsk_ef_region) );
  113. /* Following items used by zread to avoid overwriting window */
  114. char zreadbuf[MAX_LARGE_READ]; /* Buffer as large as biggest read */
  115. char *zreadptr = (char *) zreadbuf; /* pointer to start of buffer */
  116. char *zread_ovptr = NULL; /* pointer to left overs */
  117. long zread_ovlen = 0; /* size of remaining left overs */
  118. int zopen (filename, opt)
  119. const char *filename;
  120. int opt;
  121. {
  122. /* Currently ignore opt. Choose method of I/O based on NSK file type */
  123. short err, len, fnum, access, exclus, bufferlen, options;
  124. long recnum;
  125. char fname[FILENAME_MAX + 1];
  126. short extension;
  127. char ext[EXTENSION_MAX + 1];
  128. /* Remove any (pseudo) file extension */
  129. extension = parsename (filename,fname,ext);
  130. len = strlen(fname);
  131. fnum = 0;
  132. access = NSK_RDONLY;
  133. exclus = NSK_SHARED;
  134. err = stat(fname, &znsk_stat); /* Setup global struct, used by zread */
  135. if (znsk_attr->filetype == NSK_UNSTRUCTURED)
  136. if (znsk_attr->filecode == NSK_EDITFILECODE) {
  137. /* Edit File */
  138. fnum = -1; /* Ask OPENEDIT_ to open the file for us */
  139. err = OPENEDIT_ ((char *)fname, len, &fnum, access, exclus);
  140. if (!err) {
  141. recnum = -1; /* Position to first line */
  142. err = POSITIONEDIT (fnum, recnum);
  143. }
  144. }
  145. else {
  146. /* Unstructured File */
  147. options = NSK_UNSTRUCTUREDACCESS;
  148. err = FILE_OPEN_((char *)fname, len, &fnum, access, exclus,
  149. ,,options,,,);
  150. if (!err)
  151. /* Ask for large transfer mode */
  152. err = (SETMODE (fnum, SET_LARGE_TRANSFERS, 1) != CCE);
  153. }
  154. else {
  155. /* Structured File */
  156. bufferlen = 4096; /* request SBB */
  157. err = FILE_OPEN_((char *)fname, len, &fnum, access, exclus,
  158. ,,,, bufferlen ,);
  159. if (err == 4)
  160. err = 0; /* Allow saving of files that have missing altkeys */
  161. }
  162. return (err == 0 ? (int)fnum : -1);
  163. }
  164. unsigned zread (fnum, buf, len)
  165. int fnum;
  166. char *buf;
  167. unsigned len;
  168. {
  169. short err, trail;
  170. long total, movelen;
  171. unsigned short countread;
  172. unsigned readlen; /* typed to match incoming arg */
  173. char *bufptr, *readptr;
  174. total = err = 0;
  175. bufptr = buf;
  176. /* We use a separate buffer to read in data as it can be larger than
  177. WSIZE, and hence would overwrite memory */
  178. /* We always attempt to give the user the exact requested size
  179. Hence we make use of an overfow buffer for previously truncated data */
  180. /* see if we have some left over characters from last time */
  181. if (zread_ovlen) {
  182. movelen = _min(len,zread_ovlen);
  183. memcpy(bufptr, zread_ovptr, movelen);
  184. bufptr += movelen;
  185. total += movelen;
  186. zread_ovptr += movelen;
  187. zread_ovlen -= movelen;
  188. }
  189. while (!err && (total < len)) {
  190. readptr = zreadptr;
  191. if (znsk_attr->filetype == NSK_UNSTRUCTURED)
  192. if (znsk_attr->filecode == NSK_EDITFILECODE){
  193. /* Edit File */
  194. trail = 1;
  195. readlen = MAX_EDIT_READ; /* guarantee it fits in buffer */
  196. /* get line and preserve any trailing space characters */
  197. err = READEDIT (fnum,, zreadptr, (short) readlen,
  198. (short *) &countread,,, trail);
  199. /* if countread is ever negative then we will skip a line */
  200. if (!err) {
  201. readptr = zreadptr + countread;
  202. /* Note it is possible for Edit files to hold trailing space */
  203. if (nsk_trim_space)
  204. while (*(readptr-1) == ' ') {
  205. readptr--;
  206. countread--;
  207. }
  208. if (nsk_delim_len) {
  209. memcpy(readptr, nsk_delim, nsk_delim_len);
  210. readptr += nsk_delim_len;
  211. countread += nsk_delim_len;
  212. }
  213. }
  214. }
  215. else {
  216. /* Unstructured File */
  217. /* Using large transfer mode so we have to use 2K multiples
  218. Use largest size possible and put remains in overflow */
  219. readlen = nsk_large_read; /* use largest read, overflow into buffer*/
  220. err = (READX(fnum, zreadptr, readlen, (short *)&countread) != CCE);
  221. if (err && (errno == EINVAL)) {
  222. /* Read too big so scale back to smaller value */
  223. readlen = nsk_large_read = MAX_LARGE_READ_EXPAND;
  224. err = (READX(fnum, zreadptr, readlen, (short *)&countread) != CCE);
  225. }
  226. if (!err)
  227. readptr = zreadptr + countread;
  228. }
  229. else {
  230. /* Structured File */
  231. readlen = znsk_attr->reclen;
  232. err = (READX(fnum, zreadptr, readlen, (short *)&countread)!= CCE);
  233. if (!err) {
  234. readptr = zreadptr + countread;
  235. if (nsk_space_fill)
  236. while (countread < readlen) {
  237. *readptr++ = ' ';
  238. countread++;
  239. }
  240. else
  241. if (nsk_trim_space)
  242. while (*(readptr-1) == ' ') {
  243. readptr--;
  244. countread--;
  245. }
  246. if (nsk_delim_len) {
  247. memcpy(readptr, nsk_delim, nsk_delim_len);
  248. readptr += nsk_delim_len;
  249. countread += nsk_delim_len;
  250. }
  251. }
  252. }
  253. if (!err) {
  254. movelen = _min((len-total), countread);
  255. memcpy(bufptr, zreadptr, movelen);
  256. bufptr += movelen;
  257. total += movelen;
  258. if (movelen < countread) { /* still stuff in Read buffer */
  259. zread_ovptr = zreadptr + movelen; /* pointer to whats left */
  260. zread_ovlen = countread - movelen; /* how much is left */
  261. }
  262. }
  263. }
  264. return ((unsigned)total);
  265. }
  266. int zclose (fnum)
  267. int fnum;
  268. {
  269. short err;
  270. if ((znsk_attr->filetype == NSK_UNSTRUCTURED)
  271. && (znsk_attr->filecode == NSK_EDITFILECODE))
  272. err = CLOSEEDIT_(fnum);
  273. else
  274. err = FILE_CLOSE_(fnum);
  275. return (err != 0);
  276. }
  277. /* modified to work with get_option which returns
  278. a string with the number value without leading option */
  279. void nskformatopt(p)
  280. char *p;
  281. {
  282. /* set up formatting options for ZIP */
  283. Bflag = 0; /* default option */
  284. Bflag = strtoul(p, NULL, 10);
  285. if (Bflag & NSK_SPACE_FILL)
  286. nsk_space_fill = 1;
  287. else
  288. nsk_space_fill = 0;
  289. if (Bflag & NSK_TRIM_TRAILING_SPACE)
  290. nsk_trim_space = 1;
  291. else
  292. nsk_trim_space = 0;
  293. if (Bflag & NSK_NO_DELIMITER)
  294. nsk_delim_len = 0;
  295. else {
  296. if (Bflag & NSK_USE_FF_DELIMITER) {
  297. nsk_delim[0] = '\n';
  298. nsk_delim_len = 1;
  299. }
  300. else { /* CR/LF */
  301. nsk_delim[0] = '\r';
  302. nsk_delim[1] = '\n';
  303. nsk_delim_len = 2;
  304. }
  305. }
  306. if (Bflag & NSK_LARGE_READ_EXPAND)
  307. nsk_large_read = MAX_LARGE_READ_EXPAND;
  308. else
  309. nsk_large_read = MAX_LARGE_READ;
  310. }
  311. int deletedir(d)
  312. char *d; /* directory to delete */
  313. /* Delete the directory *d if it is empty, do nothing otherwise.
  314. Return the result of rmdir(), delete(), or system().
  315. For VMS, d must be in format [x.y]z.dir;1 (not [x.y.z]).
  316. */
  317. {
  318. return rmdir(d);
  319. }
  320. local char *readd(d)
  321. DIR *d; /* directory stream to read from */
  322. /* Return a pointer to the next name in the directory stream d, or NULL if
  323. no more entries or an error occurs. */
  324. {
  325. struct dirent *e;
  326. e = readdir(d);
  327. return e == NULL ? (char *) NULL : e->d_name;
  328. }
  329. int procname(n, caseflag)
  330. char *n; /* name to process */
  331. int caseflag; /* true to force case-sensitive match */
  332. /* Process a name or sh expression to operate on (or exclude). Return
  333. an error code in the ZE_ class. */
  334. {
  335. char *a; /* path and name for recursion */
  336. DIR *d; /* directory stream from opendir() */
  337. char *e; /* pointer to name from readd() */
  338. int m; /* matched flag */
  339. char *p; /* path for recursion */
  340. struct stat s; /* result of stat() */
  341. struct zlist far *z; /* steps through zfiles list */
  342. if (strcmp(n, "-") == 0) /* if compressing stdin */
  343. return newname(n, 0, caseflag);
  344. else if (stat(n, &s))
  345. {
  346. /* Not a file or directory--search for shell expression in zip file */
  347. p = ex2in(n, 0, (int *)NULL); /* shouldn't affect matching chars */
  348. m = 1;
  349. for (z = zfiles; z != NULL; z = z->nxt) {
  350. if (MATCH(p, z->zname, caseflag))
  351. {
  352. z->mark = pcount ? filter(z->zname, caseflag) : 1;
  353. if (verbose)
  354. fprintf(mesg, "zip diagnostic: %scluding %s\n",
  355. z->mark ? "in" : "ex", z->name);
  356. m = 0;
  357. }
  358. }
  359. free((zvoid *)p);
  360. return m ? ZE_MISS : ZE_OK;
  361. }
  362. /* Live name--use if file, recurse if directory */
  363. if ((s.st_mode & S_IFDIR) == 0)
  364. {
  365. /* add or remove name of file */
  366. if ((m = newname(n, 0, caseflag)) != ZE_OK)
  367. return m;
  368. } else {
  369. if ((p = malloc(strlen(n)+4)) == NULL)
  370. return ZE_MEM;
  371. strcpy(p, n);
  372. /* No concept of directories on Tandem - so do not store them ...*/
  373. /* code removed from which attempted to save dir name if dirnames set */
  374. /* Test for recurse being set removed, since Tandem has no dir concept*/
  375. /* recurse into template */
  376. if ((d = opendir(n)) != NULL)
  377. {
  378. while ((e = readd(d)) != NULL) {
  379. if ((m = procname(e, caseflag)) != ZE_OK) /* recurse on name */
  380. {
  381. if (m == ZE_MISS)
  382. zipwarn("name not matched: ", e);
  383. else
  384. ziperr(m, e);
  385. }
  386. }
  387. closedir(d);
  388. }
  389. free((zvoid *)p);
  390. } /* (s.st_mode & S_IFDIR) == 0) */
  391. return ZE_OK;
  392. }
  393. char *ex2in(x, isdir, pdosflag)
  394. char *x; /* external file name */
  395. int isdir; /* input: x is a directory */
  396. int *pdosflag; /* output: force MSDOS file attributes? */
  397. /* Convert the external file name to a zip file name, returning the malloc'ed
  398. string or NULL if not enough memory. */
  399. {
  400. char *n; /* internal file name (malloc'ed) */
  401. char *t; /* shortened name */
  402. int dosflag;
  403. char *p; /* pointer to temp area */
  404. char fname[FILENAME_MAX + 1]= ""; /* file name */
  405. char ext[EXTENSION_MAX + 1] = ""; /* extension name */
  406. short extension; /* does the filename contain an extension */
  407. dosflag = dosify; /* default for non-DOS non-OS/2 */
  408. /* Find starting point in name before doing malloc */
  409. if (*x == '=')
  410. t = x + 1; /* store DEFINE names without the '=' */
  411. else
  412. t = x;
  413. /* Make changes, if any, to the copied name (leave original intact) */
  414. if (!pathput)
  415. t = last(t, TANDEM_DELIMITER);
  416. /* Malloc space for internal name and copy it */
  417. if ((n = malloc(strlen(t) + 4)) == NULL) /* + 4 for safety */
  418. return NULL;
  419. extension = parsename(t,fname,ext);
  420. t = fname;
  421. *n= '\0';
  422. while (*t != '\0') { /* File part could be sys,vol,subvol or file */
  423. if (*t == TANDEM_NODE) { /* System Name */
  424. strcat(n, INTERNAL_NODE_STR);
  425. t++;
  426. }
  427. else if (*t == TANDEM_DELIMITER) { /* Volume or Subvol */
  428. strcat(n, INTERNAL_DELIMITER_STR);
  429. t++;
  430. };
  431. p = strchr(t,TANDEM_DELIMITER);
  432. if (p == NULL) break;
  433. strncat(n,t,(p - t));
  434. t = p;
  435. }
  436. strcat(n,t); /* mop up any left over characters */
  437. if (extension) {
  438. strcat(n,DOS_EXTENSION_STR);
  439. strcat(n,ext);
  440. };
  441. if (isdir == 42) return n; /* avoid warning on unused variable */
  442. if (dosify)
  443. msname(n);
  444. /* Returned malloc'ed name */
  445. if (pdosflag)
  446. *pdosflag = dosflag;
  447. return n;
  448. }
  449. void stamp(f, d)
  450. char *f; /* name of file to change */
  451. ulg d; /* dos-style time to change it to */
  452. /* Set last updated and accessed time of file f to the DOS time d. */
  453. {
  454. ztimbuf u; /* argument for utime() */
  455. /* Convert DOS time to time_t format in u.actime and u.modtime */
  456. u.actime = u.modtime = dos2unixtime(d);
  457. utime(f, &u);
  458. }
  459. ulg filetime(f, a, n, t)
  460. char *f; /* name of file to get info on */
  461. ulg *a; /* return value: file attributes */
  462. long *n; /* return value: file size */
  463. iztimes *t; /* return value: access and modification time */
  464. {
  465. struct stat s;
  466. nsk_stat_ov *nsk_ov;
  467. if (strcmp(f, "-") == 0) { /* if compressing stdin */
  468. if (n != NULL) {
  469. *n = -1L;
  470. }
  471. }
  472. if (stat(f, &s) != 0) return 0;
  473. if (a!= NULL) {
  474. *a = ((ulg)s.st_mode << 16) | !(s.st_mode & S_IWUSR);
  475. if ((s.st_mode & S_IFMT) == S_IFDIR) {
  476. *a |= MSDOS_DIR_ATTR;
  477. }
  478. }
  479. if (n!= NULL)
  480. *n = (s.st_mode & S_IFMT) == S_IFREG ? s.st_size : -1L;
  481. if (t != NULL) {
  482. t->atime = s.st_atime;
  483. t->mtime = s.st_mtime;
  484. nsk_ov = (nsk_stat_ov *)&s.st_reserved[0];
  485. t->ctime = nsk_ov->ov.creation_time;
  486. }
  487. return unix2dostime(&s.st_mtime);
  488. }
  489. int set_extra_field(z, z_utim)
  490. struct zlist far *z;
  491. iztimes *z_utim;
  492. /* create extra field and change z->att if desired */
  493. /* store full data in local header but just modification time stamp info
  494. in central header */
  495. {
  496. struct stat s;
  497. nsk_stat_ov *nsk_ov = (nsk_stat_ov *)&s.st_reserved[0];
  498. nsk_file_attrs *nsk_attr = (nsk_file_attrs *)&nsk_ov->ov.nsk_ef_region;
  499. char *ext, *cext;
  500. int lsize, csize;
  501. #ifdef USE_EF_UT_TIME
  502. char *UTptr, *Uxptr;
  503. #endif /* USE_EF_UT_TIME */
  504. /* For the Tandem and UT local field including the UID/GID fields, we
  505. have to stat the file again. */
  506. if (LSSTAT(z->name, &s))
  507. return ZE_OPEN;
  508. z->ext = z->cext = 0;
  509. #define EB_TANDEM_SIZE 20
  510. #define EF_TANDEM_SIZE (EB_HEADSIZE + EB_TANDEM_SIZE)
  511. /* allocate size of buffers to allow Tandem field */
  512. lsize = EF_TANDEM_SIZE;
  513. csize = EF_TANDEM_SIZE;
  514. #ifdef USE_EF_UT_TIME
  515. #define EB_L_UT_SIZE (EB_HEADSIZE + EB_UT_LEN(3))
  516. #define EB_C_UT_SIZE (EB_HEADSIZE + EB_UT_LEN(1))
  517. #define EB_L_UX2_SIZE (EB_HEADSIZE + EB_UX2_MINLEN)
  518. #define EB_C_UX2_SIZE EB_HEADSIZE
  519. #define EF_L_UNIX_SIZE (EB_L_UT_SIZE + EB_L_UX2_SIZE)
  520. #define EF_C_UNIX_SIZE (EB_C_UT_SIZE + EB_C_UX2_SIZE)
  521. /* resize to allow for UT fields */
  522. lsize += EF_L_UNIX_SIZE;
  523. csize += EF_C_UNIX_SIZE;
  524. #endif /* USE_EF_UT_TIME */
  525. if ((z->extra = (char *)malloc(lsize)) == NULL)
  526. return ZE_MEM;
  527. ext = z->extra;
  528. if ((z->cextra = (char *)malloc(csize)) == NULL)
  529. return ZE_MEM;
  530. cext = z->cextra;
  531. /* Place Tandem field first so its on an even boundary */
  532. *ext++ = *cext++ = 'T';
  533. *ext++ = *cext++ = 'A';
  534. *ext++ = *cext++ = (char)EB_TANDEM_SIZE; /*length of data part of e.f.*/
  535. *ext++ = *cext++ = 0;
  536. /* Copy Tandem specific file information */
  537. memcpy(ext, (char *)nsk_attr, EB_TANDEM_SIZE);
  538. ext += EB_TANDEM_SIZE;
  539. z->ext += EF_TANDEM_SIZE;
  540. /* Copy same data to central field */
  541. memcpy(cext, (char *)nsk_attr, EB_TANDEM_SIZE);
  542. cext += EB_TANDEM_SIZE;
  543. z->cext += EF_TANDEM_SIZE;
  544. #ifdef USE_EF_UT_TIME
  545. UTptr = ext;
  546. *ext++ = 'U';
  547. *ext++ = 'T';
  548. *ext++ = (char)EB_UT_LEN(3); /* length of data part of local e.f. */
  549. *ext++ = 0;
  550. *ext++ = EB_UT_FL_MTIME | EB_UT_FL_ATIME | EB_UT_FL_CTIME;
  551. *ext++ = (char)(s.st_mtime);
  552. *ext++ = (char)(s.st_mtime >> 8);
  553. *ext++ = (char)(s.st_mtime >> 16);
  554. *ext++ = (char)(s.st_mtime >> 24);
  555. *ext++ = (char)(s.st_atime);
  556. *ext++ = (char)(s.st_atime >> 8);
  557. *ext++ = (char)(s.st_atime >> 16);
  558. *ext++ = (char)(s.st_atime >> 24);
  559. *ext++ = (char)(nsk_ov->ov.creation_time);
  560. *ext++ = (char)(nsk_ov->ov.creation_time >> 8);
  561. *ext++ = (char)(nsk_ov->ov.creation_time >> 16);
  562. *ext++ = (char)(nsk_ov->ov.creation_time >> 24);
  563. Uxptr = ext;
  564. *ext++ = 'U';
  565. *ext++ = 'x';
  566. *ext++ = (char)EB_UX2_MINLEN; /* length of data part of local e.f. */
  567. *ext++ = 0;
  568. *ext++ = (char)(s.st_uid);
  569. *ext++ = (char)(s.st_uid >> 8);
  570. *ext++ = (char)(s.st_gid);
  571. *ext++ = (char)(s.st_gid >> 8);
  572. z->ext += EF_L_UNIX_SIZE;
  573. memcpy(cext, UTptr, EB_C_UT_SIZE);
  574. cext[EB_LEN] = (char)EB_UT_LEN(1);
  575. memcpy(cext+EB_C_UT_SIZE, Uxptr, EB_C_UX2_SIZE);
  576. cext[EB_LEN+EB_C_UT_SIZE] = 0;
  577. z->cext += EF_C_UNIX_SIZE;
  578. cext += EF_C_UNIX_SIZE;
  579. #endif /* USE_EF_UT_TIME */
  580. return ZE_OK;
  581. }
  582. #if CRYPT
  583. /* getpid() only available on OSS so make up dummy version using NSK PID */
  584. unsigned zgetpid (void)
  585. {
  586. short myphandle[ZSYS_VAL_PHANDLE_WLEN];
  587. short err;
  588. unsigned retval;
  589. err = PROCESSHANDLE_NULLIT_(myphandle);
  590. if (!err)
  591. err = PROCESS_GETINFO_(myphandle);
  592. if (!err)
  593. retval = (unsigned) myphandle[ZSYS_VAL_PHANDLE_WLEN - 3];
  594. else
  595. #ifndef __INT32
  596. retval = (unsigned) 31415;
  597. #else
  598. retval = (unsigned) 3141592654L;
  599. #endif /* __INT32 */
  600. return retval;
  601. }
  602. #endif /* CRYPT */