/* * SETFILEDATE.C * * BOOL = setfiledate(filename, date) */ #define BTOC(bptr) ((long)(bptr) << 2) #define CTOB(cptr) ((long)(cptr) >> 2) #ifndef ACTION_SET_DATE #define ACTION_SET_DATE 34 #endif typedef struct Task TASK; typedef struct Process PROC; typedef struct StandardPacket STDPKT; typedef struct MsgPort MSGPORT; typedef struct FileLock LOCK; typedef struct DateStamp DATESTAMP; extern TASK *FindTask(); extern void *AllocMem(); setfiledate(file, date) char *file; DATESTAMP *date; { register STDPKT *packet; register char *buf; register PROC *proc; long result; long lock; { register long flock = Lock(file, SHARED_LOCK); register short i; register char *ptr = file; if (flock == NULL) return(NULL); lock = ParentDir(flock); UnLock(flock); if (!lock) return(NULL); for (i = strlen(ptr) - 1; i >= 0; --i) { if (ptr[i] == '/' || ptr[i] == ':') break; } file += i + 1; } proc = (PROC *)FindTask(NULL); packet = (STDPKT *)AllocMem(sizeof(STDPKT), MEMF_CLEAR|MEMF_PUBLIC); buf = AllocMem(strlen(file)+2, MEMF_PUBLIC); strcpy(buf+1,file); buf[0] = strlen(file); packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt); packet->sp_Pkt.dp_Link = &packet->sp_Msg; packet->sp_Pkt.dp_Port = &proc->pr_MsgPort; packet->sp_Pkt.dp_Type = ACTION_SET_DATE; packet->sp_Pkt.dp_Arg1 = NULL; packet->sp_Pkt.dp_Arg2 = (long)lock; /* lock on parent dir of file */ packet->sp_Pkt.dp_Arg3 = (long)CTOB(buf); /* BPTR to BSTR of file name */ packet->sp_Pkt.dp_Arg4 = (long)date; /* APTR to datestamp structure */ PutMsg(((LOCK *)BTOC(lock))->fl_Task, packet); WaitPort(&proc->pr_MsgPort); GetMsg(&proc->pr_MsgPort); result = packet->sp_Pkt.dp_Res1; FreeMem(packet, sizeof(STDPKT)); FreeMem(buf, strlen(file)+2); UnLock(lock); return(result); }