home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 171.lha / SupLib / setfiled.c < prev    next >
C/C++ Source or Header  |  1988-04-28  |  2KB  |  76 lines

  1.  
  2. /*
  3.  *  SETFILEDATE.C
  4.  *
  5.  *  BOOL = setfiledate(filename, date)
  6.  */
  7.  
  8. #define BTOC(bptr)    ((long)(bptr) << 2)
  9. #define CTOB(cptr)    ((long)(cptr) >> 2)
  10.  
  11. #ifndef ACTION_SET_DATE
  12. #define ACTION_SET_DATE 34
  13. #endif
  14.  
  15. typedef struct Task          TASK;
  16. typedef struct Process          PROC;
  17. typedef struct StandardPacket STDPKT;
  18. typedef struct MsgPort          MSGPORT;
  19. typedef struct FileLock       LOCK;
  20. typedef struct DateStamp      DATESTAMP;
  21.  
  22. extern TASK *FindTask();
  23. extern void *AllocMem();
  24.  
  25. setfiledate(file, date)
  26. char *file;
  27. DATESTAMP *date;
  28. {
  29.     register STDPKT *packet;
  30.     register char   *buf;
  31.     register PROC   *proc;
  32.     long    result;
  33.     long    lock;
  34.  
  35.     {
  36.     register long flock = Lock(file, SHARED_LOCK);
  37.     register short i;
  38.     register char *ptr = file;
  39.  
  40.     if (flock == NULL)
  41.         return(NULL);
  42.     lock = ParentDir(flock);
  43.     UnLock(flock);
  44.     if (!lock)
  45.         return(NULL);
  46.     for (i = strlen(ptr) - 1; i >= 0; --i) {
  47.         if (ptr[i] == '/' || ptr[i] == ':')
  48.         break;
  49.     }
  50.     file += i + 1;
  51.     }
  52.     proc   = (PROC *)FindTask(NULL);
  53.     packet = (STDPKT   *)AllocMem(sizeof(STDPKT), MEMF_CLEAR|MEMF_PUBLIC);
  54.     buf = AllocMem(strlen(file)+2, MEMF_PUBLIC);
  55.     strcpy(buf+1,file);
  56.     buf[0] = strlen(file);
  57.  
  58.     packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
  59.     packet->sp_Pkt.dp_Link = &packet->sp_Msg;
  60.     packet->sp_Pkt.dp_Port = &proc->pr_MsgPort;
  61.     packet->sp_Pkt.dp_Type = ACTION_SET_DATE;
  62.     packet->sp_Pkt.dp_Arg1 = NULL;
  63.     packet->sp_Pkt.dp_Arg2 = (long)lock;        /*  lock on parent dir of file  */
  64.     packet->sp_Pkt.dp_Arg3 = (long)CTOB(buf);   /*  BPTR to BSTR of file name   */
  65.     packet->sp_Pkt.dp_Arg4 = (long)date;        /*  APTR to datestamp structure */
  66.     PutMsg(((LOCK *)BTOC(lock))->fl_Task, packet);
  67.     WaitPort(&proc->pr_MsgPort);
  68.     GetMsg(&proc->pr_MsgPort);
  69.     result = packet->sp_Pkt.dp_Res1;
  70.     FreeMem(packet, sizeof(STDPKT));
  71.     FreeMem(buf, strlen(file)+2);
  72.     UnLock(lock);
  73.     return(result);
  74. }
  75.  
  76.