linux/tools/testing/selftests/rtc/setdate.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* Real Time Clock Driver Test
   3 *      by: Benjamin Gaignard (benjamin.gaignard@linaro.org)
   4 *
   5 * To build
   6 *      gcc rtctest_setdate.c -o rtctest_setdate
   7 */
   8
   9#include <stdio.h>
  10#include <linux/rtc.h>
  11#include <sys/ioctl.h>
  12#include <sys/time.h>
  13#include <sys/types.h>
  14#include <fcntl.h>
  15#include <unistd.h>
  16#include <stdlib.h>
  17#include <errno.h>
  18
  19static const char default_time[] = "00:00:00";
  20
  21int main(int argc, char **argv)
  22{
  23        int fd, retval;
  24        struct rtc_time new, current;
  25        const char *rtc, *date;
  26        const char *time = default_time;
  27
  28        switch (argc) {
  29        case 4:
  30                time = argv[3];
  31                /* FALLTHROUGH */
  32        case 3:
  33                date = argv[2];
  34                rtc = argv[1];
  35                break;
  36        default:
  37                fprintf(stderr, "usage: rtctest_setdate <rtcdev> <DD-MM-YYYY> [HH:MM:SS]\n");
  38                return 1;
  39        }
  40
  41        fd = open(rtc, O_RDONLY);
  42        if (fd == -1) {
  43                perror(rtc);
  44                exit(errno);
  45        }
  46
  47        sscanf(date, "%d-%d-%d", &new.tm_mday, &new.tm_mon, &new.tm_year);
  48        new.tm_mon -= 1;
  49        new.tm_year -= 1900;
  50        sscanf(time, "%d:%d:%d", &new.tm_hour, &new.tm_min, &new.tm_sec);
  51
  52        fprintf(stderr, "Test will set RTC date/time to %d-%d-%d, %02d:%02d:%02d.\n",
  53                new.tm_mday, new.tm_mon + 1, new.tm_year + 1900,
  54                new.tm_hour, new.tm_min, new.tm_sec);
  55
  56        /* Write the new date in RTC */
  57        retval = ioctl(fd, RTC_SET_TIME, &new);
  58        if (retval == -1) {
  59                perror("RTC_SET_TIME ioctl");
  60                close(fd);
  61                exit(errno);
  62        }
  63
  64        /* Read back */
  65        retval = ioctl(fd, RTC_RD_TIME, &current);
  66        if (retval == -1) {
  67                perror("RTC_RD_TIME ioctl");
  68                exit(errno);
  69        }
  70
  71        fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n",
  72                current.tm_mday, current.tm_mon + 1, current.tm_year + 1900,
  73                current.tm_hour, current.tm_min, current.tm_sec);
  74
  75        close(fd);
  76        return 0;
  77}
  78