Category : OS/2 Files
Archive   : OS2TOUCH.ZIP
Filename : TOUCH.C

 
Output of file : TOUCH.C contained in archive : OS2TOUCH.ZIP
/*
TOUCH.C Force time and date stamps on file(s)

Compile: C> cl touch.c

Usage: C> TOUCH pathname [ pathname... ]

Pathnames may include wildcard characters

Copyright (C) 1988 Ray Duncan
*/


#include
#include

#define API unsigned extern far pascal

API DosClose(unsigned); /* OS/2 function prototypes */

API DosFindClose(unsigned);

API DosFindFirst(char far *, unsigned far *, unsigned, char far *,
unsigned, int far *, unsigned long);

API DosFindNext(unsigned, char far *, unsigned, unsigned far *);

API DosGetDateTime(void far *);

API DosOpen(char far *, unsigned far *, unsigned far *, unsigned long,
unsigned, unsigned, unsigned, unsigned long);

API DosSetFileInfo(unsigned, int, void far *, int);


#define READ_ONLY 0x01 /* file attribute bits */
#define HIDDEN 0x02
#define SYSTEM 0x04
#define DIRECTORY 0x10
#define ARCHIVE 0x20

#define ATTR 0 /* attributes to use
during file search */

struct _finfo { /* used by DosSetFileInfo */
unsigned cdate;
unsigned ctime;
unsigned adate;
unsigned atime;
unsigned wdate;
unsigned wtime;
}
finfo;

struct _dinfo { /* used by DosGetDateTime */
char hour;
char min;
char sec;
char csec;
char day;
char mon;
int year;
int zone;
char dow;
}
dinfo;


main(int argc, char *argv[])
{
int i;

if(argc < 2)
{
printf("\ntouch: missing filename\n");
exit(1);
}

DosGetDateTime(&dinfo); /* get current date&time */

/* set up date & time of
last write in directory
format for DosSetFileInfo */

finfo.wdate = ((dinfo.year-1980)<<9) + (dinfo.mon<<5) + dinfo.day;

finfo.wtime = (dinfo.hour<<11) + (dinfo.min<<5);

/* file creation and last
access fields useless
in FAT file systems */

finfo.cdate = finfo.ctime = finfo.adate = finfo.atime = 0;

for(i = 1; i < argc; i++) /* process all pathnames */
{ /* in the command line */

findfiles(argv[i]); /* find & touch any matches */
} /* for this pathname */

puts(""); /* final blank line */
}


/*
Search for all files matching a command line argument
*/

findfiles(char *cname)
{
char resbuf[36]; /* receives search results */
unsigned status; /* receives function status */
unsigned handle = -1; /* directory search handle */
unsigned attr = 0; /* attribute for search */
int matches; /* number of matches found */

matches = 1; /* request max of 1 match */

/* is there any match? */
if(DosFindFirst(cname, &handle, ATTR, resbuf, 36, &matches, 0L) == 0)
{
stampfile(cname, &resbuf[23]); /* initial match found,
force file time & date */

/* any additional matches? */
while(DosFindNext(handle, resbuf, 36, &matches) == 0)
{
/* force file time & date */
stampfile(cname, &resbuf[23]);
}

DosFindClose(handle); /* release search handle */
}
else
printf("\nno matches: %s", strlwr(cname));

}


/*
Set the time and date stamp on a file
*/

stampfile(char *cname, char *sname)
{
unsigned status, handle, action;

char *p; /* scratch pointer */
char qbuff[80]; /* qualified filename */

memset(qbuff,0,80); /* initialize buffer */

p = strrchr(cname, '\\'); /* look for backslash
in original pathname */

if(p != NULL) /* any path present? */

memcpy(qbuff,cname,p-cname+1); /* yes, copy it */

else /* no, is drive present? */

if((strlen(cname) >= 2) && (cname[1] == ':'))
{
qbuff[0] = cname[0]; /* yes, copy drive */
qbuff[1] = cname[1];
}

strcat(qbuff,sname); /* add filename from search
to drive +/or path */

/* try to open the file */
status = DosOpen(qbuff, &handle, &action, 0L, 0, 1, 0x22, 0L);

if(status) /* open fails if read-only */
/* or already opened for write */
printf("\ncan't open: %s", strlwr(qbuff));

else /* if open succeeded, set */
{ /* new time & date stamp */
status = DosSetFileInfo(handle, 1, &finfo, sizeof(finfo));

if(status) /* should never fail, but... */

printf("\ncan't touch: %s", strlwr(qbuff));

else /* audit touched files */

printf("\ntouched: %s", strlwr(qbuff));

DosClose(handle); /* release file handle */
}
}



  3 Responses to “Category : OS/2 Files
Archive   : OS2TOUCH.ZIP
Filename : TOUCH.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/