github.hscsec.cn/u-root/u-root@v7.0.0+incompatible/pkg/rtc/rtc_linux.go (about)

     1  // Copyright 2019 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package rtc
     6  
     7  import (
     8  	"errors"
     9  	"os"
    10  	"time"
    11  
    12  	"golang.org/x/sys/unix"
    13  )
    14  
    15  type RTC struct {
    16  	file *os.File
    17  }
    18  
    19  func OpenRTC() (*RTC, error) {
    20  	devs := []string{
    21  		"/dev/rtc",
    22  		"/dev/rtc0",
    23  		"/dev/misc/rtc0",
    24  	}
    25  
    26  	for _, dev := range devs {
    27  		f, err := os.Open(dev)
    28  		if err == nil {
    29  			return &RTC{f}, err
    30  		} else if !os.IsNotExist(err) {
    31  			return nil, err
    32  		}
    33  	}
    34  
    35  	return nil, errors.New("no RTC device found")
    36  }
    37  
    38  func (r *RTC) Read() (time.Time, error) {
    39  	rt, err := unix.IoctlGetRTCTime(int(r.file.Fd()))
    40  	if err != nil {
    41  		return time.Time{}, err
    42  	}
    43  
    44  	return time.Date(int(rt.Year)+1900,
    45  		time.Month(rt.Mon+1),
    46  		int(rt.Mday),
    47  		int(rt.Hour),
    48  		int(rt.Min),
    49  		int(rt.Sec),
    50  		0,
    51  		time.UTC), nil
    52  }
    53  
    54  func (r *RTC) Set(tu time.Time) error {
    55  	rt := unix.RTCTime{Sec: int32(tu.Second()),
    56  		Min:   int32(tu.Minute()),
    57  		Hour:  int32(tu.Hour()),
    58  		Mday:  int32(tu.Day()),
    59  		Mon:   int32(tu.Month() - 1),
    60  		Year:  int32(tu.Year() - 1900),
    61  		Wday:  int32(0),
    62  		Yday:  int32(0),
    63  		Isdst: int32(0)}
    64  
    65  	return unix.IoctlSetRTCTime(int(r.file.Fd()), &rt)
    66  }