]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (c) 1997 | |
3 | * The Regents of the University of California. All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms, with or without | |
6 | * modification, are permitted provided that: (1) source code distributions | |
7 | * retain the above copyright notice and this paragraph in its entirety, (2) | |
8 | * distributions including binary code include the above copyright notice and | |
9 | * this paragraph in its entirety in the documentation or other materials | |
10 | * provided with the distribution, and (3) all advertising materials mentioning | |
11 | * features or use of this software display the following acknowledgement: | |
12 | * ``This product includes software developed by the University of California, | |
13 | * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of | |
14 | * the University nor the names of its contributors may be used to endorse | |
15 | * or promote products derived from this software without specific prior | |
16 | * written permission. | |
17 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED | |
18 | * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF | |
19 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | |
20 | */ | |
21 | ||
22 | #include <sys/types.h> | |
23 | #include <sys/time.h> | |
24 | ||
25 | #include <stdio.h> | |
26 | #ifdef TIME_WITH_SYS_TIME | |
27 | #include <time.h> | |
28 | #endif | |
29 | ||
30 | #ifdef HAVE_OS_PROTO_H | |
31 | #include "os-proto.h" | |
32 | #endif | |
33 | ||
34 | #include "gmt2local.h" | |
35 | ||
36 | /* | |
37 | * Returns the difference between gmt and local time in seconds. | |
38 | * Use gmtime() and localtime() to keep things simple. | |
39 | */ | |
40 | int32_t | |
41 | gmt2local(time_t t) | |
42 | { | |
43 | register int dt, dir; | |
44 | register struct tm *gmt, *loc; | |
45 | struct tm sgmt; | |
46 | ||
47 | if (t == 0) | |
48 | t = time(NULL); | |
49 | gmt = &sgmt; | |
50 | *gmt = *gmtime(&t); | |
51 | loc = localtime(&t); | |
52 | dt = (loc->tm_hour - gmt->tm_hour) * 60 * 60 + | |
53 | (loc->tm_min - gmt->tm_min) * 60; | |
54 | ||
55 | /* | |
56 | * If the year or julian day is different, we span 00:00 GMT | |
57 | * and must add or subtract a day. Check the year first to | |
58 | * avoid problems when the julian day wraps. | |
59 | */ | |
60 | dir = loc->tm_year - gmt->tm_year; | |
61 | if (dir == 0) | |
62 | dir = loc->tm_yday - gmt->tm_yday; | |
63 | dt += dir * 24 * 60 * 60; | |
64 | ||
65 | return (dt); | |
66 | } |