[comp.sys.amiga.tech] compress 4.0 for the amiga

oliphant@telepro.UUCP (Mike Oliphant) (11/14/90)

In article <27dc02lWe25G01@amdahl.uts.amdahl.com>
kim@uts.amdahl.com (Kim DeVaughn) writes:

>Sorry to drag this out across three followups, but I just noticed another VERY
>annoying problem in the version that Phil put up on abcfd20 ... it does NOT
>preserve the file's date and time stamp!

This sparks a question.  How do you modify the datestamp of a file?

--
Mike Oliphant		    UUCP: alberta!herald!telepro!oliphant
			Internet: oliphant@telepro.uucp
			 FidoNet: (1:140/91) - ZMH only
*
* Call TelePro, the development system for DIALOG Professional
*
*   Phone: +1 306 249 2352	2400/9600/14400 bps HST
*	   +1 306 652 2084	300/1200/2400 bps
* FidoNet: (1:140/90)
*

thad@cup.portal.com (Thad P Floryan) (11/17/90)

oliphant@telepro.UUCP (Mike Oliphant) in <oliphant.4412@telepro.UUCP> asks:

	This sparks a question.  How do you modify the datestamp of a file?

The operative phrase is "ACTION_SETDATE" as documented in an AmigaMAIL circa
1987.

For a working example:

	File: 5007.comp-sys-amiga
	Path: ...!sri-unix!sri-spam!rutgers!mit-eddie!uw-beaver!ubc-vision!\
	      van-bc!jlydiatt
	From: jlydiatt@van-bc.UUCP (Jeff Lydiatt)
	Newsgroups: comp.sys.amiga
	Subject: Cp: A replacement for AmigaDos Copy
	Message-ID: <741@van-bc.UUCP>
	Date: 23 May 87 00:54:59 GMT
	Date-Received: 24 May 87 00:47:44 GMT
	Organization: Public Access Network, Vancouver, BC.
	Lines: 1217
	Keywords: AmigaDos Copy Regular Expressions

	Here is a replacement for AmigaDog "copy" program that I have
	been working on for quite a while.  It implements the AmigaDos
	pattern matching algorithm, the "all" command, and has the
	added bonus that it retains the date of copied file.

	It's my first posting to the net, and I have my fingers crossed
	that all goes well...

	Contents:
	cp.doc     - documentation
	cp.c       - the main program
	PatMatch.c - supporting routines to implement the pattern matching.
	setDate.c  - gets and sets the file date.
	wb_parse.c - Aztec allows you to skip the workbench parms parse.
	makefile   - to compile and link the whole thing.
	cp.uue     - uuencoded cp

The "setDate.c" file is enclosed below.  BTW, Jeff's "cp" program permits the
UNIX-like syntax:  ``cp path/filename .''  (where "." means current directory)

Thad Floryan [ thad@cup.portal.com (OR) ..!sun!portal!cup.portal.com!thad ]

==================== begin enclosed material ====================

---- Cut Here and unpack ----
#!/bin/sh
# This is a shell archive (shar 3.32)
# made 11/17/1990 07:22 UTC by thad@thadlabs
# Source directory /u/thad/tmp5
#
# existing files WILL be overwritten
#
# This shar contains:
# length  mode       name
# ------ ---------- ------------------------------------------
#   4628 -rw-r--r-- setDate.c
#
if touch 2>&1 | fgrep 'amc' > /dev/null
 then TOUCH=touch
 else TOUCH=true
fi
# ============= setDate.c ==============
echo "x - extracting setDate.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > setDate.c &&
X/*   <setDate.c>
X */
X
X#include "exec/types.h"
X#include "exec/ports.h"
X#include "exec/io.h"
X#include "exec/memory.h"
X#include "libraries/dos.h"
X#include "libraries/dosextens.h"
X#include <stdio.h>
X#define AZTEC 1
X#ifdef AZTEC
X#include "functions.h"         /* aztec C include */
X#endif
X
X#define ACTION_SETDATE_MODE 34L  /* The packet type we will be playing with */
X#define DOSTRUE 	    -1L  /* AmigaDos TRUE */
X#define MAXARGS              7L  /* limit in packet structure (dosextens.h) */
X#define NARGS		     4L  /* Number of args for setdate */
X
X/*---------------------------------------------------------------------*/
X/*  sendpkt: generalized send a dos packet.			       */
X/*---------------------------------------------------------------------*/
X
Xstatic long sendpkt(pid,action,args,nargs)
X
Xstruct MsgPort *pid;	/* process indentifier ... (handlers message port ) */
Xlong  action,	       /* number of arguments in list */
X      nargs;           /* number of arguments in list  */
XULONG args[];          /* a pointer to a argument list */
X{
X 
X   struct MsgPort        *replyport;
X   struct StandardPacket *packet;
X 
X   long   count, res1; 
X   ULONG  *pargs;
X
X   if(nargs > MAXARGS) return NULL; 
X 
X   replyport = (struct MsgPort *) CreatePort(NULL,NULL); /* make reply port */
X   if(!replyport) return NULL;
X
X   packet = (struct StandardPacket *) 
X      AllocMem((long)sizeof(struct StandardPacket),MEMF_PUBLIC | MEMF_CLEAR);
X   if(!packet) 
X     {
X       FreeMem((void *)packet,(long)sizeof(struct StandardPacket));
X       return(NULL);
X     }
X
X   packet->sp_Msg.mn_Node.ln_Name = (char *) &(packet->sp_Pkt); /* link packet
- */
X   packet->sp_Pkt.dp_Link         = &(packet->sp_Msg);  /* to message    */
X   packet->sp_Pkt.dp_Port         = replyport;         /* set-up reply port */
X   packet->sp_Pkt.dp_Type         = action;           /* what to do... */
X
X   /* move all the arguments to the packet */
X   pargs = (ULONG *)&(packet->sp_Pkt.dp_Arg1);   /* address of first argument 
*/
X   for(count=NULL;count < nargs && count < MAXARGS; ++count) 
X     pargs[count]=args[count];
X
X   PutMsg(pid,packet); /* send packet */
X   (void)WaitPort(replyport); /* wait for packet to come back */
X   (void)GetMsg(replyport);   /* pull message */
X
X   res1 = packet->sp_Pkt.dp_Res1; /* get result */
X
X   /* all done clean up */
X   FreeMem((void *)packet,(long)sizeof(*packet)); 
X   DeletePort(replyport); 
X
X   return(res1); 
X 
X}
X
X/*---------------------------------------------------------------------*/
X/*  setDate: datestamp the given file with the given date.	       */
X/*---------------------------------------------------------------------*/
X
XBOOL setDate( name, date )
Xchar 		 *name;
Xstruct DateStamp *date;
X{
X   struct MsgPort *task;            /* for process id handler */
X   ULONG arg[4];                    /* array of arguments     */
X   char *bstr, strcpy();            /* of file to be set      */
X   long rc;
X   char *strchr();
X   int strlen();
X
X   rc = 0;
X
X   if ( !(bstr = (char *)AllocMem(68L, (long)(MEMF_PUBLIC)))) goto exit2;
X   if ( !(task = (struct MsgPort *)DeviceProc( name )))       goto exit1;
X
X   /* Dos Packet needs the filename in Bstring format */
X 
X   (void)strcpy( bstr+1, name );
X   *bstr = strlen( name );
X
X   arg[0] = (ULONG)NULL;
X   arg[1] = (ULONG)IoErr(); /* lock on parent director set by DeviceProc() */
X   arg[2] = (ULONG) bstr >> 2;
X   arg[3] = (ULONG) date;
X   rc = sendpkt( task, ACTION_SETDATE_MODE, arg, 4L );
X
Xexit1: if ( bstr ) FreeMem( (void *)bstr, 68L );
Xexit2: if ( rc == DOSTRUE )
X          return TRUE;
X       else
X          return FALSE;
X}
X
X/*---------------------------------------------------------------------*/
X/*  getDate: get the datestamp the given file.			       */
X/*---------------------------------------------------------------------*/
X
XBOOL getDate(name, date )
Xchar *name;
Xregister struct DateStamp *date;
X{
X
X   struct FileInfoBlock *Fib;
X   ULONG		FLock;
X   int			result;
X   register struct DateStamp	*d;
X
X   if ( (FLock = (ULONG) Lock(name, (long)(ACCESS_READ) )) == NULL)
X      return FALSE;
X
X   Fib = (struct FileInfoBlock * )
X	AllocMem( (long)sizeof(struct FileInfoBlock), (long)(MEMF_CHIP));
X
X   if (Fib == NULL )
X     result = FALSE;
X   else
X     {
X	if ( !Examine( FLock, Fib ))
X	   result = FALSE;
X	else if ( Fib->fib_DirEntryType > 0 )
X	   result = FALSE;  /* It's a directory */
X        else
X	   {
X		d = &Fib->fib_Date;
X		date->ds_Days   = d->ds_Days;
X		date->ds_Minute = d->ds_Minute;
X		date->ds_Tick   = d->ds_Tick;        
X		result = TRUE;
X	   }
X	FreeMem( (void *)Fib, (long)sizeof(struct FileInfoBlock) );
X     }
X
X   UnLock( FLock );
X   return result;
X}
SHAR_EOF
$TOUCH -am 1116232190 setDate.c &&
chmod 0644 setDate.c ||
echo "restore of setDate.c failed"
set `wc -c setDate.c`;Wc_c=$1
if test "$Wc_c" != "4628"; then
	echo original size 4628, current size $Wc_c
fi
exit 0

==================== end enclosed material ====================

ked01@ccc.amdahl.com (Kim DeVaughn) (11/18/90)

In article <36020@cup.portal.com> thad@cup.portal.com (Thad P Floryan) writes:
> oliphant@telepro.UUCP (Mike Oliphant) in <oliphant.4412@telepro.UUCP> asks:
> 
> 	This sparks a question.  How do you modify the datestamp of a file?
> 
> The operative phrase is "ACTION_SETDATE" as documented in an AmigaMAIL circa
> 1987.
> 
> The "setDate.c" file is enclosed below.  BTW, Jeff's "cp" program permits the
>
> X#define ACTION_SETDATE_MODE 34L  /* The packet type we will be playing with */

Though I wouldn't expect it to change, one should really use ACTION_SET_DATE,
as defined in "libraries/dosextens.h".

I hear tell that there is a regular ol' fn() call to do this under 2.0, BTW.

/kim

-- 
UUCP:  kim@uts.amdahl.com   -OR-   ked01@juts.ccc.amdahl.com
  or:  {sun,decwrl,hplabs,pyramid,uunet,oliveb,ames}!amdahl!kim
DDD:   408-746-8462
USPS:  Amdahl Corp.  M/S 249,  1250 E. Arques Av,  Sunnyvale, CA 94086
BIX:   kdevaughn     GEnie:   K.DEVAUGHN     CIS:   76535,25

thad@cup.portal.com (Thad P Floryan) (11/18/90)

ked01@ccc.amdahl.com (Kim DeVaughn) in <86XJ025203c601@JUTS.ccc.amdahl.com>
writes:

	Though I wouldn't expect it to change, one should really use
	ACTION_SET_DATE, as defined in "libraries/dosextens.h".

True.  But ``ACTION_SET_DATE'' simply did NOT exist in the CBM-supplied header
file back then.  It's easy to forget that when a system was evolving rapidly
as the Amiga, we had to alter the headers ourselves or "#define" the stuff
explicitly to avail oneself of "new" CBM-supplied information (as Jeff did with
his "cp" program).

Such a "problem" is common in the computer industry, and I'm not being critical
,
although I will say I was quite disappointed with DEC when they changed a lot
of the headers during the transition from VMS 4.7 to 5.0 which caused numerous
files to cease being compilable (luckily I anticipated that and retained copies
of the original headers :-)

Thad Floryan [ thad@cup.portal.com (OR) ..!sun!portal!cup.portal.com!thad ]