]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/unix/sysv/linux/adjtime.c
Update.
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / adjtime.c
CommitLineData
ef030f7f 1/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
478b92f0 2 This file is part of the GNU C Library.
d2f5be2a 3
478b92f0
UD
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
d2f5be2a 8
478b92f0
UD
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
d2f5be2a 13
478b92f0
UD
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB. If not,
16 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA. */
d2f5be2a
UD
18
19#include <errno.h>
20#include <limits.h>
21#include <sys/time.h>
22#include <sys/timex.h>
23
b20e47cb
RM
24#define MAX_SEC (INT_MAX / 1000000L - 2)
25#define MIN_SEC (INT_MIN / 1000000L + 2)
d2f5be2a 26
a6e3a56a
UD
27#ifndef MOD_OFFSET
28#define modes mode
29#endif
30
31#ifndef TIMEVAL
32#define TIMEVAL timeval
33#endif
34
35#ifndef TIMEX
36#define TIMEX timex
37#endif
38
39#ifndef ADJTIME
40#define ADJTIME __adjtime
41#endif
42
43#ifndef ADJTIMEX
44#define NO_LOCAL_ADJTIME
45#define ADJTIMEX(x) __adjtimex (x)
46#endif
47
48#ifndef LINKAGE
49#define LINKAGE
50#endif
51
52LINKAGE int
53ADJTIME (itv, otv)
54 const struct TIMEVAL *itv;
55 struct TIMEVAL *otv;
d2f5be2a 56{
a6e3a56a 57 struct TIMEX tntx;
d2f5be2a
UD
58
59 if (itv)
60 {
a6e3a56a 61 struct TIMEVAL tmp;
d2f5be2a
UD
62
63 /* We will do some check here. */
64 tmp.tv_sec = itv->tv_sec + itv->tv_usec / 1000000L;
65 tmp.tv_usec = itv->tv_usec % 1000000L;
66 if (tmp.tv_sec > MAX_SEC || tmp.tv_sec < MIN_SEC)
67 {
c4029823 68 __set_errno (EINVAL);
d2f5be2a
UD
69 return -1;
70 }
71 tntx.offset = tmp.tv_usec + tmp.tv_sec * 1000000L;
41cfadd6 72 tntx.modes = ADJ_OFFSET_SINGLESHOT;
d2f5be2a
UD
73 }
74 else
41cfadd6 75 tntx.modes = 0;
d2f5be2a 76
a6e3a56a
UD
77 if (ADJTIMEX (&tntx) < 0)
78 return -1;
d2f5be2a
UD
79
80 if (otv)
81 {
82 if (tntx.offset < 0)
83 {
84 otv->tv_usec = -(-tntx.offset % 1000000);
85 otv->tv_sec = -(-tntx.offset / 1000000);
86 }
87 else
88 {
89 otv->tv_usec = tntx.offset % 1000000;
90 otv->tv_sec = tntx.offset / 1000000;
91 }
92 }
93 return 0;
94}
95
a6e3a56a 96#ifdef NO_LOCAL_ADJTIME
d2f5be2a 97weak_alias (__adjtime, adjtime)
a6e3a56a 98#endif