114 lines
2.2 KiB
C
114 lines
2.2 KiB
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);
|
|
}
|