Minix1.5/commands/date.c
/* date - print or set time and date Author: Jan Looyen */
#include <sys/types.h>
#include <stddef.h>
#include <time.h>
#include <stdio.h>
#define MIN 60L /* # seconds in a minute */
#define HOUR (60 * MIN) /* # seconds in an hour */
#define DAY (24 * HOUR) /* # seconds in a day */
#define YEAR (365 * DAY) /* # seconds in a year */
main(argc, argv)
int argc;
char **argv;
{
int qflag;
long t;
char time_buf[15];
if (argc > 2) usage();
if (argc == 2) {
if (*argv[1] == '-' && (argv[1][1] | 0x60) == 'q') {
freopen("/dev/tty0", "r", stdin);
printf("\nPlease enter date: MMDDYYhhmmss. Then hit the RETURN key.\n");
gets(time_buf);
set_time(time_buf);
} else
set_time(argv[1]);
}
time(&t);
printf("%s", ctime(&t));
exit(0);
}
set_time(t)
char *t;
{
char *tp;
long ct;
int len;
static int days_per_month[] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
struct tm *p;
time(&ct);
p = localtime(&ct);
p->tm_year -= 70;
p->tm_mon++;
len = strlen(t);
if (len != 12 && len != 10 && len != 6 && len != 4) usage();
tp = t;
while (*tp)
if (!isdigit(*tp++)) bad();
if (len == 6 || len == 12) p->tm_sec = conv(&tp, 59);
p->tm_min = conv(&tp, 59);
p->tm_hour = conv(&tp, 23);
if (len == 12 || len == 10) {
p->tm_year = conv(&tp, 99);
p->tm_mday = conv(&tp, 31);
p->tm_mon = conv(&tp, 12);
p->tm_year -= 70;
if (p->tm_year < 0) p->tm_year += 100;
}
ct = p->tm_year * YEAR;
ct += ((p->tm_year + 1) / 4) * DAY;
days_per_month[1] = 28;
if (((p->tm_year + 2) % 4) == 0) days_per_month[1]++;
len = 0;
p->tm_mon--;
while (len < p->tm_mon) ct += days_per_month[len++] * DAY;
ct += --p->tm_mday * DAY;
ct += p->tm_hour * HOUR;
ct += p->tm_min * MIN;
ct += p->tm_sec;
if (stime(&ct)) fprintf(stderr, "Set date not allowed\n");
}
conv(ptr, max)
char **ptr;
int max;
{
int buf;
*ptr -= 2;
buf = atoi(*ptr);
**ptr = 0;
if (buf < 0 || buf > max) bad();
return(buf);
}
bad()
{
fprintf(stderr, "Date: bad conversion\n");
exit(1);
}
usage()
{
fprintf(stderr, "Usage: date [-q] [[MMDDYY]hhmm[ss]]\n");
exit(1);
}
isdigit(c)
char c;
{
if (c >= '0' && c <= '9')
return(1);
else
return(0);
}