/* utime.c */ #include #include #include #include #include #include #include #include #include extern LONG sendpkt(struct MsgPort *,LONG,LONG[],LONG); extern int _OSERR; #ifndef SUCCESS #define SUCCESS (-1L) #define FAILURE 0L #endif int utime(char *file, time_t timep[]); int utime(file,timep) char *file; time_t timep[]; { struct DateStamp date; struct MsgPort *taskport; struct FileLock *dirlock, *lock; struct FileInfoBlock *fib; LONG argv[4]; UBYTE *ptr; long ret; /* timep[1] -= timezone; */ date.ds_Days = timep[1] / 86400; date.ds_Minute = (timep[1] - (date.ds_Days * 86400))/60; date.ds_Tick = ( timep[1] - (date.ds_Days * 86400) - (date.ds_Minute * 60) ) * TICKS_PER_SECOND; date.ds_Days -= ((8*365+2)); if( !(taskport = (struct MsgPort *)DeviceProc(file)) ) { errno = ESRCH; /* no such process */ _OSERR = IoErr(); return(-1); } if( !(lock = (struct FileLock *)Lock(file,SHARED_LOCK)) ) { errno = ENOENT; /* no such file */ _OSERR = IoErr(); return(-1); } if( !(fib = (struct FileInfoBlock *)AllocMem( (long)sizeof(struct FileInfoBlock),MEMF_PUBLIC|MEMF_CLEAR)) ) { errno = ENOMEM; /* insufficient memory */ UnLock((BPTR)lock); return(-1); } if( Examine((BPTR)lock,fib)==FAILURE ) { errno = EOSERR; /* operating system error */ _OSERR = IoErr(); UnLock((BPTR)lock); FreeMem((char *)fib,(long)sizeof(*fib)); return(-1); } dirlock = (struct FileLock *)ParentDir((BPTR)lock); ptr = (UBYTE *)AllocMem(64L,MEMF_PUBLIC); strcpy((ptr+1),fib->fib_FileName); *ptr = strlen(fib->fib_FileName); FreeMem((char *)fib,(long)sizeof(*fib)); UnLock((BPTR)lock); /* now fill in argument array */ argv[0] = NULL; argv[1] = (LONG)dirlock; argv[2] = (LONG)&ptr[0] >> 2; argv[3] = (LONG)&date; errno = ret = sendpkt(taskport,34L,argv,4L); FreeMem(ptr,64L); UnLock((BPTR)dirlock); return(0); } /* utime() */ /* sendpkt.c * by A. Finkel, P. Lindsay, C. Sheppner * returns Res1 of the reply packet */ /* #include #include #include #include #include #include */ LONG sendpkt(pid,action,args,nargs) struct MsgPort *pid; /* process identifier (handler message port) */ LONG action, /* packet type (desired action) */ *args, /* a pointer to argument list */ nargs; /* number of arguments in list */ { struct MsgPort *replyport; struct StandardPacket *packet; LONG count, *pargs, res1; replyport = (struct MsgPort *)CreatePort(0L,0L); if( !replyport ) return(NULL); packet = (struct StandardPacket *)AllocMem( (long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR); if( !packet ) { DeletePort(replyport); return(NULL); } packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt); packet->sp_Pkt.dp_Link = &(packet->sp_Msg); packet->sp_Pkt.dp_Port = replyport; packet->sp_Pkt.dp_Type = action; /* copy the args into the packet */ pargs = &(packet->sp_Pkt.dp_Arg1); /* address of 1st argument */ for( count=0; countsp_Pkt.dp_Res1; FreeMem((char *)packet,(long)sizeof(*packet)); DeletePort(replyport); return(res1); } /* sendpkt() */