#include <time.h>
#include <sys/time.h>
#include <unistd.h>

typedef int bool;
#define TRUE 1
#define FALSE 0

#define MYNAME "hwclock"
#define VERSION "2.7"


enum clock_access_method {ISA, RTC_IOCTL, KD, DEV_PORT, NOCLOCK};
  /* A method for accessing (reading, writing) the hardware clock:
     
     ISA: 
       via direct CPU I/O instructions that work on an ISA family
       machine (IBM PC compatible) or most DEC Alphas, which implement
       enough of ISA to get by.

     RTC_IOCTL: 
       via the rtc device driver, using device special file /dev/rtc.

     KD:
       via the console driver, using device special file /dev/tty1.
       This is the m68k ioctl interface, known as KDGHWCLK.

     DEV_PORT:
       via the /dev/port device, which is almost the same thing as 
       direct I/O instructions via the ISA method, but works on a Jensen 
       model of Alpha, whereas ISA does not.  Also, use I/O addresses
       0x170 and 0x171 instead of the ISA 0x70 and 0x71.

     NO_CLOCK:
       Unable to determine a usable access method for the system clock.
   */
       



/* hwclock.c */
extern int debug;
extern const bool alpha_machine;
extern const bool isa_machine;

/* directio.c */

extern void
assume_interrupts_enabled(void);

extern void
synchronize_to_clock_tick_ISA(int *retcode_p, const int dev_port,
                              const bool use_uf_bit);

extern void
read_hardware_clock_isa(struct tm *tm, const int dev_port,
                        int hc_zero_year);

extern void
set_hardware_clock_isa(const struct tm new_tm, 
                       const int hc_zero_year,
                       const int dev_port,
                       const bool testing);

extern void
get_inb_outb_privilege(const enum clock_access_method clock_access, 
                       bool * const no_auth_p);

extern void
get_dev_port_access(const enum clock_access_method clock_access,
                    int * dev_port_p);

extern bool
uf_bit_needed(const bool user_wants_uf);

extern int
zero_year(const bool arc_opt, const bool srm_opt);


/* rtc.c */
extern void
synchronize_to_clock_tick_RTC(int *retcode_p);

extern void
read_hardware_clock_rtc_ioctl(struct tm *tm);

extern void
set_hardware_clock_rtc_ioctl(const struct tm new_broken_time, 
                             const bool testing);
extern void
see_if_rtc_works(bool * const rtc_works_p);

extern void
get_epoch(unsigned long *epoch_p, char **reason_p);

extern void
set_epoch(unsigned long epoch, const bool testing, int *retcode_p);


/* kd.c */

extern void
synchronize_to_clock_tick_KD(int *retcode_p);

extern void
read_hardware_clock_kd(struct tm *tm);

extern void
set_hardware_clock_kd(const struct tm new_broken_time, 
                      const bool testing);

extern void
see_if_kdghwclk_works(bool * const kdghwclk_works_p);

/* util.c */
extern bool
is_in_cpuinfo(const char * const fmt, const char * const str);

extern char *
ctime2(const time_t time);

extern struct timeval
t2tv(time_t argument);

extern struct timeval
t2tv(time_t argument);

extern float 
time_diff(struct timeval subtrahend, struct timeval subtractor);

extern struct timeval
time_inc(struct timeval addend, float increment);





