home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / zip22.zip / cmsmvs / cmsmvs.c < prev    next >
C/C++ Source or Header  |  1997-08-23  |  9KB  |  389 lines

  1. /*
  2.  
  3.  Copyright (C) 1990-1996 Mark Adler, Richard B. Wales, Jean-loup Gailly,
  4.  Kai Uwe Rommel, Onno van der Linden, George Petrov and Igor Mandrichenko.
  5.  Permission is granted to any individual or institution to use, copy, or
  6.  redistribute this software so long as all of the original files are included,
  7.  that it is not sold for profit, and that this copyright notice is retained.
  8.  
  9. */
  10.  
  11. /*
  12.  * routines common to VM/CMS and MVS
  13.  */
  14.  
  15. #include "zip.h"
  16.  
  17. #include <time.h>
  18. #include <errno.h>
  19.  
  20. int stat(const char *path, struct stat *buf)
  21. {
  22.    if ((buf->fp = fopen(path, "r")) != NULL) {
  23.       fldata_t fdata;
  24.       if (fldata( buf->fp, buf->fname, &fdata ) == 0) {
  25.          buf->st_dev  = fdata.__device;
  26.          buf->st_mode = *(short *)(&fdata);
  27.       }
  28.       strcpy( buf->fname, path );
  29.       fclose(buf->fp);
  30.    }
  31.    return (buf->fp != NULL ? 0 : 1);
  32. }
  33.  
  34.  
  35. #ifndef UTIL    /* the companion #endif is a bit of ways down ... */
  36.  
  37. #define PAD 0
  38. #define PATH_END '/'
  39.  
  40. /* Library functions not in (most) header files */
  41.  
  42. #ifdef USE_ZIPMAIN
  43. int main OF((void));
  44. #endif
  45.  
  46. int utime OF((char *, ztimbuf *));
  47.  
  48. extern char *label;
  49. local ulg label_time = 0;
  50. local ulg label_mode = 0;
  51. local time_t label_utim = 0;
  52.  
  53. int fstat(int fd, struct stat *buf)
  54. {
  55.    fldata_t fdata;
  56.  
  57.    if ((fd != -1) && (fldata( (FILE *)fd, buf->fname, &fdata ) == 0)) {
  58.       buf->st_dev  = fdata.__device;
  59.       buf->st_mode = *(short *)(&fdata);
  60.       buf->fp      = (FILE *)fd;
  61.       return 0;
  62.    }
  63.    return -1;
  64. }
  65.  
  66.  
  67. char *ex2in(x, isdir, pdosflag)
  68. char *x;                /* external file name */
  69. int isdir;              /* input: x is a directory */
  70. int *pdosflag;          /* output: force MSDOS file attributes? */
  71. /* Convert the external file name to a zip file name, returning the malloc'ed
  72.    string or NULL if not enough memory. */
  73. {
  74.   char *n;              /* internal file name (malloc'ed) */
  75.   char *t;              /* shortened name */
  76.   int dosflag;
  77.   char mem[10] = "";    /* member name */
  78.   char ext[10] = "";     /* extension name */
  79.  
  80.   dosflag = dosify;  /* default for non-DOS non-OS/2 */
  81.  
  82.   /* Find starting point in name before doing malloc */
  83.   for (t = x; *t == '/'; t++)
  84.     ;
  85.  
  86.   /* Make changes, if any, to the copied name (leave original intact) */
  87.   if (!pathput)
  88.     t = last(t, PATH_END);
  89.  
  90.   /* Malloc space for internal name and copy it */
  91.   if ((n = malloc(strlen(t) + 1)) == NULL)
  92.     return NULL;
  93.   strcpy(n, t);
  94.  
  95. #ifdef MVS
  96.   /* Change member names to fn.ext */
  97.   if (t = strrchr(n, '(')) {
  98.      *t = '\0';
  99.      strcpy(mem,t+1);        /* Save member name */
  100.      if (t = strchr(mem, ')')) *t = '\0';         /* Set end of mbr */
  101.      /* Save extension */
  102.      if (t = strrchr(n, '.')) t++;
  103.      else t = n;
  104.      strcpy(ext,t);
  105.      /* Build name as "member.ext" */
  106.      strcpy(t,mem);
  107.      strcat(t,".");
  108.      strcat(t,ext);
  109.   }
  110.  
  111.   /* Change all but the last '.' to '/' */
  112.   if (t = strrchr(n, '.')) {
  113.      while (--t > n)
  114.         if (*t == '.')
  115.           *t = '/';
  116.   }
  117. #else
  118.   /* On CMS, remove the filemode (all past 2nd '.') */
  119.   if (t = strchr(n, '.'))
  120.      if (t = strchr(t+1, '.'))
  121.         *t = '\0';
  122.   t = n;
  123. #endif
  124.  
  125.   n = strtoasc(n,t);
  126.  
  127.   if (isdir == 42) return n;      /* avoid warning on unused variable */
  128.  
  129.   if (dosify)
  130.     msname(n);
  131.  
  132.   /* Returned malloc'ed name */
  133.   if (pdosflag)
  134.     *pdosflag = dosflag;
  135.   return n;
  136. }
  137.  
  138.  
  139. char *in2ex(n)
  140. char *n;                /* internal file name */
  141. /* Convert the zip file name to an external file name, returning the malloc'ed
  142.    string or NULL if not enough memory. */
  143. {
  144.   char *x;              /* external file name */
  145.  
  146.   if ((x = malloc(strlen(n) + 1 + PAD)) == NULL)
  147.     return NULL;
  148.   strtoebc(x, n);
  149.   return x;
  150. }
  151.  
  152.  
  153. void stamp(f, d)
  154. char *f;                /* name of file to change */
  155. ulg d;                  /* dos-style time to change it to */
  156. /* Set last updated and accessed time of file f to the DOS time d. */
  157. {
  158.   ztimbuf u;            /* argument for utime() */
  159.  
  160.   /* Convert DOS time to time_t format in u.actime and u.modtime */
  161.   u.actime = u.modtime = dos2unixtime(d);
  162.  
  163.   utime(f, &u);
  164. }
  165.  
  166.  
  167. ulg filetime(f, a, n, t)
  168. char *f;                /* name of file to get info on */
  169. ulg *a;                 /* return value: file attributes */
  170. long *n;                /* return value: file size */
  171. iztimes *t;             /* return value: access, modific. and creation times */
  172. {
  173.   FILE *stream;
  174.   time_t ltime;
  175.  
  176.   if (strcmp(f, "-") != 0) {    /* if not compressing stdin */
  177.      if ((stream = fopen(f, "rb")) == (FILE *)NULL) {
  178.         return 0;
  179.      } else {
  180.         if (n != NULL) {
  181. /**        *n = -1L;  **/
  182.            /* Input file is now RECFM F LRECL 1, so this will work */
  183.            fseek(stream,0L,SEEK_END);
  184.            *n = ftell(stream);
  185.         }
  186.         fclose(stream);
  187.      }
  188.   }
  189.   else {
  190.      if (n != NULL) {
  191.         *n = -1L;
  192.      }
  193.   }
  194.  
  195.   /* Return current time for all the times -- for now */
  196.   time(<ime);
  197.   if (t != NULL)
  198.      t->atime = t->mtime = t->ctime = ltime;
  199.  
  200.   return unix2dostime(<ime);
  201. }
  202.  
  203.  
  204.  
  205. int set_extra_field(z, z_utim)
  206. struct zlist far *z;
  207. iztimes *z_utim;
  208. /* create extra field and change z->att if desired */
  209. {
  210.    fldata_t fdata;
  211.    FILE *stream;
  212.    char *eb_ptr;
  213. #ifdef USE_EF_UT_TIME
  214.    extent ef_l_len = (EB_HEADSIZE+EB_UT_LEN(1));
  215. #else /* !USE_EF_UT_TIME */
  216.    extent ef_l_len = 0;
  217. #endif /* ?USE_EF_UT_TIME */
  218.    int set_cmsmvs_eb = 0;
  219.  
  220. /*translate_eol = 0;*/
  221.   if (aflag == ASCII) {
  222.      z->att = ASCII;
  223.   } else {
  224.     if (bflag)
  225.       z->att = BINARY;
  226.     else
  227.       z->att = __EBCDIC;
  228.     ef_l_len += sizeof(fdata)+EB_HEADSIZE;
  229.     set_cmsmvs_eb = 1;
  230.   }
  231.  
  232.   if (ef_l_len > 0) {
  233.     z->extra = (char *)malloc(ef_l_len);
  234.     if (z->extra == NULL) {
  235.        printf("\nFLDATA : Unable to allocate memory !\n");
  236.        return ZE_MEM;
  237.     }
  238.     z->cext = z->ext = ef_l_len;
  239.     eb_ptr = z->cextra = z->extra;
  240.  
  241.     if (set_cmsmvs_eb) {
  242.       if (bflag)
  243. /***    stream = fopen(z->zname,"rb,type=record");   $RGH$ ***/
  244.         stream = fopen(z->zname,"rb");
  245.       else
  246.         stream = fopen(z->zname,"r");
  247.       if (stream == NULL) {
  248.         printf("\nFLDATA : Could not open file : %s !\n",z->zname);
  249.         printf("Error %d: '%s'\n", errno, strerror(errno));
  250.         return ZE_NONE;
  251.       }
  252.  
  253.       fldata(stream,z->zname,&fdata);
  254.       /*put the system ID */
  255. #ifdef VM_CMS
  256.       *(eb_ptr) = EF_VMCMS & 0xFF;
  257.       *(eb_ptr+1) = EF_VMCMS >> 8;
  258. #else
  259.       *(eb_ptr) = EF_MVS & 0xFF;
  260.       *(eb_ptr+1) = EF_MVS >> 8;
  261. #endif
  262.       *(eb_ptr+2) = sizeof(fdata) & 0xFF;
  263.       *(eb_ptr+3) = sizeof(fdata) >> 8;
  264.  
  265.       memcpy(eb_ptr+EB_HEADSIZE,&fdata,sizeof(fdata));
  266.       fclose(stream);
  267. #ifdef USE_EF_UT_TIME
  268.       eb_ptr += (sizeof(fdata)+EB_HEADSIZE);
  269. #endif /* USE_EF_UT_TIME */
  270.     }
  271. #ifdef USE_EF_UT_TIME
  272.     eb_ptr[0]  = 'U';
  273.     eb_ptr[1]  = 'T';
  274.     eb_ptr[2]  = EB_UT_LEN(1);          /* length of data part of e.f. */
  275.     eb_ptr[3]  = 0;
  276.     eb_ptr[4]  = EB_UT_FL_MTIME;
  277.     eb_ptr[5]  = (char)(z_utim->mtime);
  278.     eb_ptr[6]  = (char)(z_utim->mtime >> 8);
  279.     eb_ptr[7]  = (char)(z_utim->mtime >> 16);
  280.     eb_ptr[8]  = (char)(z_utim->mtime >> 24);
  281. #endif /* USE_EF_UT_TIME */
  282.   }
  283.  
  284.   return ZE_OK;
  285. }
  286.  
  287. int deletedir(d)
  288. char *d;                /* directory to delete */
  289. /* Delete the directory *d if it is empty, do nothing otherwise.
  290.    Return the result of rmdir(), delete(), or system().
  291.    For VMS, d must be in format [x.y]z.dir;1  (not [x.y.z]).
  292.  */
  293. {
  294.     return 0;
  295. }
  296.  
  297. #ifdef USE_ZIPMAIN
  298. /* This function is called as main() to parse arguments                */
  299. /* into argc and argv.  This is required for stand-alone               */
  300. /* execution.  This calls the "real" main() when done.                 */
  301.  
  302. int main(void)
  303.    {
  304.     int  argc=0;
  305.     char *argv[50];
  306.  
  307.     int  iArgLen;
  308.     char argstr[256];
  309.     char **pEPLIST, *pCmdStart, *pArgStart, *pArgEnd;
  310.  
  311.    /* Get address of extended parameter list from S/370 Register 0 */
  312.    pEPLIST = (char **)__xregs(0);
  313.  
  314.    /* Null-terminate the argument string */
  315.    pCmdStart = *(pEPLIST+0);
  316.    pArgStart = *(pEPLIST+1);
  317.    pArgEnd   = *(pEPLIST+2);
  318.    iArgLen   = pArgEnd - pCmdStart + 1;
  319.  
  320.    /* Make a copy of the command string */
  321.    memcpy(argstr, pCmdStart, iArgLen);
  322.    argstr[iArgLen] = '\0';  /* Null-terminate */
  323.  
  324.    /* Store first token (cmd) */
  325.    argv[argc++] = strtok(argstr, " ");
  326.  
  327.    /* Store the rest (args) */
  328.    while (argv[argc-1])
  329.       argv[argc++] = strtok(NULL, " ");
  330.    argc--;  /* Back off last NULL entry */
  331.  
  332.    /* Call "real" main() function */
  333.    return zipmain(argc, argv);
  334.  
  335. }
  336. #endif /* USE_ZIPMAIN */
  337.  
  338. #endif /* !UTIL */
  339.  
  340.  
  341. /******************************/
  342. /*  Function version_local()  */
  343. /******************************/
  344.  
  345. void version_local()
  346. {
  347.     int len;
  348.     char liblvlmsg [50+1];
  349.  
  350.     union {
  351.        unsigned int iVRM;
  352.        struct {
  353.           unsigned int v:8;
  354.           unsigned int r:8;
  355.           unsigned int m:8;
  356.        } xVRM;
  357.     } VRM;
  358.  
  359.     /* Break down the runtime library level */
  360.     VRM.iVRM = __librel();
  361.     sprintf(liblvlmsg, "Using runtime library level V%dR%dM%d.\n",
  362.             VRM.xVRM.v, VRM.xVRM.r, VRM.xVRM.m);
  363.  
  364.  
  365.     printf("Compiled with %s%s for %s%s%s\n",
  366.     /* Add compiler name and level */
  367.       "C/370", "",         /* Assumed.  Can't get compiler name/lvl(?) */
  368.  
  369. #ifdef VM_CMS
  370.       "VM/CMS",
  371. #else
  372.       "MVS",
  373. #endif
  374.  
  375.     /* Add timestamp */
  376. #ifdef __DATE__
  377.       " on " __DATE__
  378. #ifdef __TIME__
  379.      " at " __TIME__
  380. #endif
  381.      ".\n",
  382. #else
  383.       "",
  384. #endif
  385.  
  386.     liblvlmsg
  387.     );
  388. } /* end function version_local() */
  389.