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

📄 filedate.c

📁 《汇编源代码大全》
💻 C
字号:
/***********************//* Function filedate() *//***********************//*  FileDate() (originally utime.c), by Paul Wells.  Modified by John Bush *  and others (see also sendpkt() comments, below); NewtWare SetFileDate() *  clone cheaply ripped off from utime(). *//* HISTORY/CHANGES *  2 Sep 92, Greg Roelofs, Original coding. *  6 Sep 92, John Bush, Incorporated into UnZip 5.1 *  6 Sep 92, John Bush, Interlude "FileDate()" defined, which calls or *            redefines SetFileDate() depending upon AMIGADOS2 definition. * 11 Oct 92, John Bush, Eliminated AMIGADOS2 switch by determining *            revision via OpenLibrary() call.  Now only one version of *            the program runs on both platforms (1.3.x vs. 2.x) * 11 Oct 92, John Bush, Merged with Zip version and changed arg passing *            to take time_t input instead of struct DateStamp. *            Arg passing made to conform with utime(). * 22 Nov 92, Paul Kienitz, fixed includes for Aztec and cleaned up some *            lint-ish errors; simplified test for AmigaDOS version. *//* DESCRIPTION * This routine chooses between 2 methods to set the file date on AMIGA. * Since AmigaDOS 2.x came out, SetFileDate() was available in ROM (v.36 * and higher).  Under AmigaDOS 1.3.x (less than v.36 ROM), SetFileDate() * must be accomplished by constructing a message packet and sending it * to the file system handler of the file to be stamped. * * The system's ROM version is extracted from the external system Library * base. * * NOTE:  although argument passing conforms with utime(), note the *        following differences:   *          - Return value is boolean success/failure. *          - If a structure or array is passed, only the first value *            is used, which *may* correspond to date accessed and not *            date modified. */#include <string.h>#include <time.h>#include <errno.h>#include <stdio.h>#include <exec/types.h>#include <exec/memory.h>#include <exec/libraries.h>#include <libraries/dos.h>#include <libraries/dosextens.h>#ifdef AZTEC_C   extern int timezone;   void tzset(void);#  include <clib/exec_protos.h>#  include <clib/dos_protos.h>#  include <pragmas/exec_lib.h>#  include <pragmas/dos_lib.h>#  define ESRCH ENOENT#  define EOSERR EIO#endif#if defined(LATTICE) || defined(__SASC)#  include <proto/exec.h>#  include <proto/dos.h>#endifextern int _OSERR;#ifndef SUCCESS#  define SUCCESS (-1L)#  define FAILURE 0L#endif#define ReqVers 36L  /* required library version for SetFileDate() */extern struct Library *SysBase;LONG FileDate (char *filename, time_t u[]);/* =============================================================== */LONG FileDate(filename, u)  char *filename;  time_t u[];{  LONG SetFileDate(UBYTE *filename, struct DateStamp *pDate);  LONG sendpkt(struct MsgPort *pid, LONG action, LONG *args, LONG nargs);  struct MsgPort *taskport;  struct FileLock *dirlock, *lock;  struct FileInfoBlock *fib;  LONG pktargs[4];  UBYTE *ptr;  long ret;  struct DateStamp pDate;  time_t mtime;  tzset();  mtime=u[0]-timezone;#ifdef DEBUG  fprintf (stderr,"Entry to FileDate(): mtime=%s\n",ctime(&mtime));#endif    /*  magic number = 2922 = 8 years + 2 leaps between 1970 - 1978 */  pDate.ds_Days = (mtime / 86400L) - 2922L;  mtime = mtime % 86400L;  pDate.ds_Minute = mtime / 60L;  mtime = mtime % 60L;  pDate.ds_Tick = mtime * TICKS_PER_SECOND;#ifdef DEBUG  fprintf (stderr,"In FileDate(): Days=%ld Minutes=%ld Ticks=%ld\n",           pDate.ds_Days,pDate.ds_Minute,pDate.ds_Tick);#endif  if (SysBase->lib_Version >= ReqVers) {      return (SetFileDate(filename,&pDate));  /* native routine at 2.0+ */    }    else  /* !(SysBase->lib_Version >=ReqVers) */    {       if( !(taskport = (struct MsgPort *)DeviceProc(filename)) )      {          errno = ESRCH;          /* no such process */          _OSERR = IoErr();          return FAILURE;      }      if( !(lock = (struct FileLock *)Lock(filename,SHARED_LOCK)) )      {          errno = ENOENT;         /* no such file */          _OSERR = IoErr();          return FAILURE;      }      if( !(fib = (struct FileInfoBlock *)AllocMem(          (long)sizeof(struct FileInfoBlock),MEMF_PUBLIC|MEMF_CLEAR)) )      {          errno = ENOMEM;         /* insufficient memory */          UnLock((BPTR)lock);          return FAILURE;      }      if( Examine((BPTR)lock,fib)==FAILURE )      {          errno = EOSERR;         /* operating system error */          _OSERR = IoErr();          UnLock((BPTR)lock);          FreeMem((char *)fib,(long)sizeof(*fib));          return FAILURE;      }      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 */      pktargs[0] = 0;      pktargs[1] = (LONG)dirlock;      pktargs[2] = (LONG)&ptr[0] >> 2;      pktargs[3] = (LONG)&pDate;      errno = ret = sendpkt(taskport,ACTION_SET_DATE,pktargs,4L);      FreeMem(ptr,64L);      UnLock((BPTR)dirlock);      return SUCCESS;    }  /* ?(SysBase->lib_Version >= ReqVers) */} /* FileDate() *//* LOW LEVEL SUPPORT ROUTINES *//*  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, *CreatePort(UBYTE *, long);    struct StandardPacket *packet;    LONG count, *pargs, res1;    replyport = CreatePort(NULL,0L);    if( !replyport ) return(0);    packet = (struct StandardPacket *)AllocMem(            (long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR);    if( !packet )    {        DeletePort(replyport);        return(0);    }    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 + -