home *** CD-ROM | disk | FTP | other *** search
- /*title touch -- change modification dates on files */
-
- /* 3 October 1987 -- M. Armbrust */
- /* 21 October 1988 -- M. Armbrust -- added "-f" option */
-
- /*noinclude*/
- #include <stdio.h>
- #include <process.h>
- #include <dos.h>
- /*include*/
-
- void main(int ,char * *);
- void Usage(void);
- int GetNum(char * *);
- void SetFileTime(char *);
- void GetTime(void);
- void GetFileTime(char *);
-
- int status = 0;
- int create = 0;
- int readonly = 0;
- int gotDate = 0;
- int gotTime = 0;
- struct {
- int year;
- int month;
- int day;
- int hour;
- int minute;
- int second;
- } dt;
- int days[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
-
- void main (argc, argv)
- int argc;
- char *argv[];
- {
-
- GetTime ();
-
- if (argc == 1) Usage();
-
- while (--argc) {
- if ((**++argv == '-' || **argv == '/')
- && (*argv)[1] != 0 && (*argv)[2] == 0)
- switch ((*argv)[1]) {
-
- case 'c':
- case 'C':
- create = 1;
- break;
-
- case 'r':
- case 'R':
- readonly =1;
- break;
-
- case 'd':
- case 'D':
- if (!--argc)
- Usage();
- ++argv;
-
- gotDate = 1;
- if (!gotTime)
- dt.hour = dt.minute = dt.second = 0;
-
- dt.month = GetNum (argv);
- if (dt.month < 1 || dt.month > 12)
- Usage();
-
- if (**argv != '/' && **argv != '-')
- Usage();
-
- ++*argv;
-
- dt.day = GetNum (argv);
- if (dt.day < 1 || dt.day > days[dt.month-1])
- Usage();
-
- if (!**argv)
- break;
-
- if (**argv != '/' && **argv != '-')
- Usage();
-
- ++*argv;
-
- dt.year = GetNum (argv);
- if (dt.year < 80)
- dt.year += 2000;
- if (dt.year <= 99)
- dt.year += 1900;
- if (dt.year < 1980)
- Usage();
-
- if (**argv)
- Usage();
-
- break;
-
- case 't':
- case 'T':
- if (!--argc)
- Usage();
- ++argv;
-
- gotTime = 1;
-
- dt.hour = GetNum (argv);
- if (dt.hour < 0 || dt.hour > 23)
- Usage();
-
- if (**argv != ':')
- Usage();
-
- ++*argv;
-
- dt.minute = GetNum (argv);
- if (dt.minute < 0 || dt.minute > 59)
- Usage();
-
- if (!**argv)
- break;
-
- if (**argv != ':')
- Usage();
-
- ++*argv;
-
- dt.second = GetNum (argv);
- if (dt.second < 0 || dt.second > 59)
- Usage();
-
- if (**argv)
- Usage();
-
- break;
-
- case 'f':
- case 'F':
-
- ++argv;
- --argc;
-
- if (argc == 0 || **argv == '-' || **argv == '/') {
- fprintf (stderr, "touch: -f requires filename\n");
- exit(4);
- }
-
- GetFileTime (*argv);
- break;
-
- default:
- Usage();
- }
-
- else
- SetFileTime (*argv);
-
- }
-
- exit (status);
- }
-
-
- void Usage ()
- {
- fprintf (stderr, "usage: touch [-c] [-r] [-d mm/dd[/yy]] [-t hh:mm[:ss]] [-f file] files\n");
- fprintf (stderr, " -c create file if does not exist\n");
- fprintf (stderr, " -r force access to read-only files\n");
- fprintf (stderr, " -d date to set; defaults to current date if time specified\n");
- fprintf (stderr, " -t time to set; defaults to 00:00:00 if date specified\n");
- fprintf (stderr, " -f copy file's time stamp to other files\n");
- exit (1);
- }
-
-
- int GetNum (argv)
- char **argv;
- {
- register int num = 0;
- register int c;
-
- while ( (c = **argv) >= '0' && c <= '9') {
- num = num * 10 + c - '0';
- ++*argv;
- }
- return num;
- }
-
-
- void SetFileTime (file)
- char *file;
- {
- union REGS r;
- int handle;
-
- r.h.ah = 0x3D; /* open handle for write */
- r.h.al = (unsigned char) (readonly ? 0 : 1);
- r.x.dx = (int) file;
- intdos (&r, &r);
- if (r.x.cflag && r.x.ax <= 3 && create) {
- r.h.ah = 0x3C; /* create/open handle */
- r.x.cx = 0;
- r.x.dx = (int) file;
- intdos (&r, &r);
- }
- if (r.x.cflag) {
- fprintf (stderr, "touch: could not access \"%s\"; ", file);
- switch (r.x.ax) {
- case 2: fprintf (stderr, "file not found.\n");
- break;
- case 3: fprintf (stderr, "path not found.\n");
- break;
- case 4: fprintf (stderr, "too many open files.\n");
- break;
- case 5: fprintf (stderr, "access denied.\n");
- break;
- default:fprintf (stderr, "unknown error.\n");
- }
- status = 2;
- return;
- }
- handle = r.x.ax;
-
- r.x.ax = 0x5701; /* set file date/time */
- r.x.bx = handle;
- r.x.cx = (dt.hour << 11) + (dt.minute << 5) + ((dt.second + 1) >> 1);
- r.x.dx = ((dt.year - 1980) << 9) + (dt.month << 5) + dt.day;
- intdos (&r, &r);
-
- r.h.ah = 0x3E; /* close handle */
- r.x.bx = handle;
- intdos (&r, &r);
- }
-
-
- void GetTime ()
- {
- union REGS r;
-
- r.h.ah = 0x2A; /* Get Date */
- intdos (&r, &r);
- dt.year = r.x.cx;
- dt.month = r.h.dh;
- dt.day = r.h.dl;
-
- r.h.ah = 0x2C; /* Get Time */
- intdos (&r, &r);
- dt.hour = r.h.ch;
- dt.minute = r.h.cl;
- dt.second = r.h.dh;
- }
-
-
- void GetFileTime (file)
- char *file;
- {
- union REGS r;
- int handle;
-
- r.x.ax = 0x3D00; /* open handle for read */
- r.x.dx = (int) file;
- intdos (&r, &r);
- if (r.x.cflag) {
- fprintf (stderr, "touch: -f could not access \"%s\"; ", file);
- switch (r.x.ax) {
- case 2: fprintf (stderr, "file not found.\n");
- break;
- case 3: fprintf (stderr, "path not found.\n");
- break;
- case 4: fprintf (stderr, "too many open files.\n");
- break;
- case 5: fprintf (stderr, "access denied.\n");
- break;
- default:fprintf (stderr, "unknown error.\n");
- }
- exit (4);
- }
- handle = r.x.ax;
-
- r.x.ax = 0x5700; /* get file date/time */
- r.x.bx = handle;
- intdos (&r, &r);
-
- dt.year = ((r.x.dx >> 9) & 0x7F) + 1980;
- dt.month = (r.x.dx >> 5) & 0x0F;
- dt.day = r.x.dx & 0x1F;
- dt.hour = (r.x.cx >> 11) & 0x1F;
- dt.minute = (r.x.cx >> 5) & 0x3F;
- dt.second = (r.x.cx << 1) & 0x3F;
-
- r.h.ah = 0x3E; /* close handle */
- r.x.bx = handle;
- intdos (&r, &r);
- }
-
-
-