2 Copyright © 1995-2012, The AROS Development Team. All rights reserved.
5 Query the current time and/or timezone.
8 #include "__arosc_privdata.h"
10 #include <proto/exec.h>
11 #include <proto/dos.h>
12 #include <proto/timer.h>
13 #include <proto/locale.h>
14 #include <exec/types.h>
15 #include <devices/timer.h>
16 #include <aros/symbolsets.h>
17 #include <aros/debug.h>
21 /*****************************************************************************
34 Return the current time and/or timezone.
37 tv - If this pointer is non-NULL, the current time will be
38 stored here. The structure looks like this:
42 long tv_sec; // seconds
43 long tv_usec; // microseconds
46 tz - If this pointer is non-NULL, the current timezone will be
47 stored here. The structure looks like this:
51 int tz_minuteswest; // minutes west of Greenwich
52 int tz_dsttime; // type of dst correction
55 With daylight savings times defined as follows :
57 DST_NONE // not on dst
58 DST_USA // USA style dst
59 DST_AUST // Australian style dst
60 DST_WET // Western European dst
61 DST_MET // Middle European dst
62 DST_EET // Eastern European dst
64 DST_GB // Great Britain and Eire
67 DST_AUSTALT // Australian style with shift in 1986
69 And the following macros are defined to operate on this :
71 timerisset(tv) - TRUE if tv contains a time
73 timercmp(tv1, tv2, cmp) - Return the result of the
74 comparison "tv1 cmp tv2"
76 timerclear(tv) - Clear the timeval struct
79 The number of seconds.
82 This function must not be used in a shared library or
83 in a threaded application.
88 // Get the current time and print it
89 gettimeofday (&tv, NULL);
91 printf ("Seconds = %ld, uSec = %ld\n", tv->tv_sec, tv->tv_usec);
96 ctime(), asctime(), localtime(), time()
100 ******************************************************************************/
102 struct aroscbase
*aroscbase
= __GM_GetBase();
108 /* Adjust with the current timezone, stored in minutes west of GMT */
109 tv
->tv_sec
+= (2922 * 1440 + aroscbase
->acb_gmtoffset
) * 60;
114 tz
->tz_minuteswest
= aroscbase
->acb_gmtoffset
;
115 /* FIXME: set tz->tz_dsttime */
116 tz
->tz_dsttime
= DST_NONE
;
123 struct Device
*TimerBase
;
125 static int __init_timerbase(struct aroscbase
*aroscbase
)
127 aroscbase
->acb_timeport
.mp_Node
.ln_Type
= NT_MSGPORT
;
128 aroscbase
->acb_timeport
.mp_Node
.ln_Pri
= 0;
129 aroscbase
->acb_timeport
.mp_Node
.ln_Name
= NULL
;
130 aroscbase
->acb_timeport
.mp_Flags
= PA_IGNORE
;
131 aroscbase
->acb_timeport
.mp_SigTask
= FindTask(NULL
);
132 aroscbase
->acb_timeport
.mp_SigBit
= 0;
133 NEWLIST(&aroscbase
->acb_timeport
.mp_MsgList
);
135 aroscbase
->acb_timereq
.tr_node
.io_Message
.mn_Node
.ln_Type
= NT_MESSAGE
;
136 aroscbase
->acb_timereq
.tr_node
.io_Message
.mn_Node
.ln_Pri
= 0;
137 aroscbase
->acb_timereq
.tr_node
.io_Message
.mn_Node
.ln_Name
= NULL
;
138 aroscbase
->acb_timereq
.tr_node
.io_Message
.mn_ReplyPort
= &aroscbase
->acb_timeport
;
139 aroscbase
->acb_timereq
.tr_node
.io_Message
.mn_Length
= sizeof (aroscbase
->acb_timereq
);
141 struct Locale
*locale
= OpenLocale(NULL
);
144 aroscbase
->acb_gmtoffset
= locale
->loc_GMTOffset
;
148 aroscbase
->acb_gmtoffset
= 0;
156 (struct IORequest
*)&aroscbase
->acb_timereq
,
163 TimerBase
= (struct Device
*)aroscbase
->acb_timereq
.tr_node
.io_Device
;
173 static void __exit_timerbase(struct aroscbase
*aroscbase
)
175 if (TimerBase
!= NULL
)
176 CloseDevice((struct IORequest
*)&aroscbase
->acb_timereq
);
179 ADD2OPENLIB(__init_timerbase
, 0);
180 ADD2CLOSELIB(__exit_timerbase
, 0);