home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume21 / coda / part01.Z / part01.bin / vmsutime.inc < prev   
Encoding:
Text File  |  1990-04-08  |  2.2 KB  |  79 lines

  1. /*
  2. **  This file is in the public domain.
  3. **
  4. **  This is a hacked-over and reformatted version of the public domain
  5. **  utime routine written by Larry Jones <scjones@sdrc.uu.net> for which
  6. **  I am very grateful.
  7. */
  8. /*#include <iodef.h>*/
  9. #include <unixio.h>
  10. #include <descrip.h>
  11. #include <fibdef.h>
  12. #include <atrdef.h>
  13. #include <stsdef.h>
  14.  
  15. /*
  16. **  Change the modification time (VMS doesn't keep access time); to
  17. **  change the creation time, use ATR$C_CREDATE in the Attributes
  18. **  definition, below.
  19. */
  20. int
  21. utime(file, time)
  22.     char                *file;
  23.     time_t                time[2];
  24. {
  25.     static struct fibdef        Fib;
  26.     static unsigned long        TheTime[2];
  27.     static const long            TicksPerSeck = 10000000;
  28.     static const long            Zero = 0;
  29.     static const unsigned long        Epoch[2] = {
  30.     0x4beb4000, 0x007c9567
  31.     };
  32.     static struct dsc$descriptor    D = {
  33.     0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL
  34.     };
  35.     static const struct dsc$descriptor    F = {
  36.     sizeof Fib, DSC$K_DTYPE_T, DSC$K_CLASS_S, (char *)&Fib
  37.     };
  38.     static const struct atrdef        Attributes[] = {
  39.     { sizeof TheTime, ATR$C_REVDATE, (unsigned long)TheTime },
  40.     { 0, 0, 0 }
  41.     };
  42.     struct stat                Sbuf;
  43.     unsigned short            Channel;
  44.     unsigned short            IOBlock[4];
  45.     unsigned long            status;
  46.  
  47.     /* Get the current statistics on the file. */
  48.     if (stat(file, &Sbuf) < 0)
  49.     return -1;
  50.  
  51.     /* Convert to clock ticks, and add in base ignoring overflow. */
  52.     LIB$EMUL(&time[1], &TicksPerSeck, &Zero, TheTime);
  53.     LIB$ADDX(Epoch, TheTime, TheTime);
  54.  
  55.     /* Build up a channel pointing to that file. */
  56.     D.dsc$w_length = strlen(Sbuf.st_dev);
  57.     D.dsc$a_pointer = Sbuf.st_dev;
  58.     status = SYS$ASSIGN(&D, &Channel, 0, 0);
  59.     if ((status & STS$M_SUCCESS) == 0)
  60.     return -1;
  61.     Fib.fib$r_fid_overlay.fib$w_fid[0] = Sbuf.st_ino[0];
  62.     Fib.fib$r_fid_overlay.fib$w_fid[1] = Sbuf.st_ino[1];
  63.     Fib.fib$r_fid_overlay.fib$w_fid[2] = Sbuf.st_ino[2];
  64.  
  65.     /* Modify the attributes to have the new timestamp. */
  66.     status = SYS$QIOW(0, Channel, IO$_MODIFY, IOBlock, 0, 0,
  67.         &F, 0, 0, 0, Attributes, 0);
  68.     if ((status & STS$M_SUCCESS) == 0)
  69.     return -1;
  70.     if ((IOBlock[0] & STS$M_SUCCESS) == 0)
  71.     return -1;
  72.  
  73.     /* Close the channel. */
  74.     status = SYS$DASSGN(Channel);
  75.     if ((status & STS$M_SUCCESS) == 0)
  76.     return -1;
  77.     return 0;
  78. }
  79.