⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utime.c

📁 汇编大全 中国矿业大学计算机学院 汇编实验5
💻 C
字号:
/* utime.c */#include <string.h>#include <time.h>#include <errno.h>#include <exec/types.h>#include <exec/memory.h>#include <libraries/dos.h>#include <libraries/dosextens.h>#include <proto/exec.h>#include <proto/dos.h>extern LONG sendpkt(struct MsgPort *,LONG,LONG[],LONG);extern int _OSERR;#ifndef SUCCESS#define SUCCESS (-1L)#define FAILURE 0L#endifint 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 <exec/types.h>#include <exec/memory.h>#include <libraries/dos.h>#include <libraries/dosextens.h>#include <proto/exec.h>#include <proto/dos.h>*/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; count<nargs; count++ )        pargs[count] = args[count];    PutMsg(pid,(struct Message *)packet);   /* send packet */    WaitPort(replyport);    GetMsg(replyport);    res1 = packet->sp_Pkt.dp_Res1;    FreeMem((char *)packet,(long)sizeof(*packet));    DeletePort(replyport);    return(res1);} /* sendpkt() */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -