#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <unistd.h>
#ifndef NO_ANDROID_HEADERS
#include <linux/android_alarm.h>
#endif

static void settime(char *s) {
    struct tm tm;
    int day = atoi(s);
    int hour;
    time_t t;
    int fd;
    struct timespec ts;
    struct timeval tv;

    while (*s && *s != '.')
        s++;

    if (*s)
        s++;

    hour = atoi(s);

    tm.tm_year = day / 10000 - 1900;
    tm.tm_mon = (day % 10000) / 100 - 1;
    tm.tm_mday = (day % 100);
    tm.tm_hour = hour / 10000;
    tm.tm_min = (hour % 10000) / 100;
    tm.tm_sec = (hour % 100);
    tm.tm_isdst = -1;

    t = mktime(&tm);
    
#ifdef ANDROID_ALARM_SET_RTC
    fd = open("/dev/alarm", O_RDWR);
    ts.tv_sec = t;
    ts.tv_nsec = 0;
    ioctl(fd, ANDROID_ALARM_SET_RTC, &ts);
#else
    tv.tv_sec = t;
    tv.tv_usec = 0;
    (void) settimeofday(&tv, NULL);
#endif
}

static void settime_fmt(char *s, const char *fmt) {
     struct tm tm;
     struct timeval tv;

     memset(&tm, 0, sizeof(tm));
     if (strptime(s, fmt, &tm) == NULL) {
       fprintf(stderr, "Unable to parse date '%s' as format '%s'\n", s, fmt);
       exit(1);
     }

     tv.tv_sec = mktime(&tm);
     tv.tv_usec = 0;
     if (settimeofday(&tv, NULL)) {
       char buf[80];
       snprintf(buf, sizeof(buf), "settimeofday(%ld)", tv.tv_sec);
       perror(buf);
       exit(1);
     }
}

int date_main(int argc, char *argv[])
{
    int c;
    int res;
    struct tm tm;
    time_t t;
    struct timeval tv;
    struct timespec ts;
    char strbuf[260];
    int fd;

    int useutc = 0;
    void *settime_arg = NULL;

    tzset();

    do {
        c = getopt(argc, argv, "us:");
        if (c == EOF)
            break;
        switch (c) {
        case 'u':
            useutc = 1;
            break;
        case 's':
            settime_arg = optarg;
            break;
        case '?':
            fprintf(stderr, "%s: invalid option -%c\n",
                argv[0], optopt);
            exit(1);
        }
    } while (1);
    if(optind + 2 < argc) {
        fprintf(stderr,"%s [-u] [date]\n", argv[0]);
        return 1;
    }

    int hasfmt = argc == optind + 1 && argv[optind][0] == '+';
    if (settime_arg) {
        if (hasfmt) {
          settime_fmt(settime_arg, argv[optind] + 1);
        } else{
          settime(settime_arg);
        }
    } else if(optind == argc || hasfmt) {
        char buf[2000];
        time(&t);
        if (useutc) {
            gmtime_r(&t, &tm);
            strftime(strbuf, sizeof(strbuf),
                     (hasfmt ? argv[optind] + 1 : "%a %b %e %H:%M:%S GMT %Y"),
                     &tm);
        } else {
            localtime_r(&t, &tm);
            strftime(strbuf, sizeof(strbuf),
                     (hasfmt ? argv[optind] + 1 : "%a %b %e %H:%M:%S %Z %Y"),
                     &tm);
        }
        printf("%s\n", strbuf);
    }
    else if(optind + 1 == argc) {
#if 0
        struct tm *tmptr;
        tmptr = getdate(argv[optind]);
        if(tmptr == NULL) {
            fprintf(stderr,"getdate_r failed\n");
            return 1;
        }
        tm = *tmptr;
#if 0
        if(getdate_r(argv[optind], &tm) < 0) {
            fprintf(stderr,"getdate_r failed %s\n", strerror(errno));
            return 1;
        }
#endif
#endif
        strptime(argv[optind], NULL, &tm);
        tv.tv_sec = mktime(&tm);
        tv.tv_usec = 0;
        //strtotimeval(argv[optind], &tv);
        printf("time %s -> %d.%d\n", argv[optind], tv.tv_sec, tv.tv_usec);
#ifdef ANDROID_ALARM_SET_RTC
        fd = open("/dev/alarm", O_RDWR);
        ts.tv_sec = tv.tv_sec;
        ts.tv_nsec = tv.tv_usec * 1000;
        res = ioctl(fd, ANDROID_ALARM_SET_RTC, &ts);
#else
        res = settimeofday(&tv, NULL);
#endif
        if(res < 0) {
            fprintf(stderr,"settimeofday failed %s\n", strerror(errno));
            return 1;
        }
    }
    else {
        fprintf(stderr,"%s [-s 20070325.123456] [-u] [date]\n", argv[0]);
        return 1;
    }

    return 0;
}
