
/*
 *  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);
}

