about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/alpha/adjtime.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/alpha/adjtime.c')
-rw-r--r--sysdeps/unix/sysv/linux/alpha/adjtime.c202
1 files changed, 202 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/alpha/adjtime.c b/sysdeps/unix/sysv/linux/alpha/adjtime.c
new file mode 100644
index 0000000000..f7df5fcc80
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/adjtime.c
@@ -0,0 +1,202 @@
+/* Copyright (C) 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+struct timeval32
+{
+    int tv_sec, tv_usec;
+};
+
+struct timex32 {
+	unsigned int modes;	/* mode selector */
+	long offset;		/* time offset (usec) */
+	long freq;		/* frequency offset (scaled ppm) */
+	long maxerror;		/* maximum error (usec) */
+	long esterror;		/* estimated error (usec) */
+	int status;		/* clock command/status */
+	long constant;		/* pll time constant */
+	long precision;		/* clock precision (usec) (read only) */
+	long tolerance;		/* clock frequency tolerance (ppm)
+				 * (read only)
+				 */
+	struct timeval32 time;	/* (read only) */
+	long tick;		/* (modified) usecs between clock ticks */
+
+	long ppsfreq;           /* pps frequency (scaled ppm) (ro) */
+	long jitter;            /* pps jitter (us) (ro) */
+	int shift;              /* interval duration (s) (shift) (ro) */
+	long stabil;            /* pps stability (scaled ppm) (ro) */
+	long jitcnt;            /* jitter limit exceeded (ro) */
+	long calcnt;            /* calibration intervals (ro) */
+	long errcnt;            /* calibration errors (ro) */
+	long stbcnt;            /* stability limit exceeded (ro) */
+
+	int  :32; int  :32; int  :32; int  :32;
+	int  :32; int  :32; int  :32; int  :32;
+	int  :32; int  :32; int  :32; int  :32;
+};
+
+#define TIMEVAL		timeval32
+#define TIMEX		timex32
+#define ADJTIME		__adjtime_tv32
+#define ADJTIMEX(x)	__adjtimex_tv32 (x)
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+#define LINKAGE
+#else
+#define LINKAGE		static
+#endif
+
+LINKAGE int ADJTIME (const struct TIMEVAL *itv, struct TIMEVAL *otv);
+extern int ADJTIMEX (struct TIMEX *);
+
+#include <sysdeps/unix/sysv/linux/adjtime.c>
+
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+symbol_version (__adjtime_tv32, adjtime, GLIBC_2.0);
+#endif
+
+#undef TIMEVAL
+#define TIMEVAL		timeval
+#undef TIMEX
+#define TIMEX		timex
+#undef ADJTIME
+#define ADJTIME		__adjtime_tv64
+#undef ADJTIMEX
+#define ADJTIMEX(x)	__syscall_adjtimex_tv64 (x)
+#undef LINKAGE
+#define LINKAGE		static
+
+LINKAGE int ADJTIME (const struct TIMEVAL *itv, struct TIMEVAL *otv);
+extern int ADJTIMEX (struct TIMEX *);
+
+#include <sysdeps/unix/sysv/linux/adjtime.c>
+static int missing_adjtimex = 0;
+
+int
+__adjtime (itv, otv)
+     const struct timeval *itv;
+     struct timeval *otv;
+{
+  int ret;
+
+  if (!missing_adjtimex)
+    {
+      ret = __adjtime_tv64 (itv, otv);
+      if (ret && errno == ENOSYS)
+	missing_adjtimex = 1;
+    }
+
+  if (missing_adjtimex)
+    {
+      struct timeval32 itv32, otv32;
+
+      itv32.tv_sec = itv->tv_sec;
+      itv32.tv_usec = itv->tv_usec;
+      ret = __adjtime_tv32 (&itv32, &otv32);
+      if (ret == 0)
+	{
+	  otv->tv_sec = otv32.tv_sec;
+	  otv->tv_usec = otv32.tv_usec;
+	}
+    }
+
+  return ret;
+}
+
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+default_symbol_version (__adjtime, adjtime, GLIBC_2.1);
+#else
+weak_alias (__adjtime, adjtime);
+#endif
+
+extern int __syscall_adjtimex_tv64 (struct timex *tx);
+
+int
+__adjtimex_tv64 (tx)
+     struct timex *tx;
+{
+  int ret;
+
+  if (!missing_adjtimex)
+   {
+     ret = __syscall_adjtimex_tv64 (tx);
+     if (ret && errno == ENOSYS)
+	missing_adjtimex = 1;
+   }
+
+  if (missing_adjtimex)
+    {
+      struct timex32 tx32;
+
+      tx32.modes = tx->modes;
+      tx32.offset = tx->offset;
+      tx32.freq = tx->freq;
+      tx32.maxerror = tx->maxerror;
+      tx32.esterror = tx->esterror;
+      tx32.status = tx->status;
+      tx32.constant = tx->constant;
+      tx32.precision = tx->precision;
+      tx32.tolerance = tx->tolerance;
+      tx32.time.tv_sec = tx->time.tv_sec;
+      tx32.time.tv_sec = tx->time.tv_usec;
+      tx32.tick = tx->tick;
+      tx32.ppsfreq = tx->ppsfreq;
+      tx32.jitter = tx->jitter;
+      tx32.shift = tx->shift;
+      tx32.stabil = tx->stabil;
+      tx32.jitcnt = tx->jitcnt;
+      tx32.calcnt = tx->calcnt;
+      tx32.errcnt = tx->errcnt;
+      tx32.stbcnt = tx->stbcnt;
+
+      ret = __adjtimex_tv32 (&tx32);
+      if (ret == 0)
+	{
+	  tx->modes = tx32.modes;
+	  tx->offset = tx32.offset;
+	  tx->freq = tx32.freq;
+	  tx->maxerror = tx32.maxerror;
+	  tx->esterror = tx32.esterror;
+	  tx->status = tx32.status;
+	  tx->constant = tx32.constant;
+	  tx->precision = tx32.precision;
+	  tx->tolerance = tx32.tolerance;
+	  tx->time.tv_sec = tx32.time.tv_sec;
+	  tx->time.tv_usec = tx32.time.tv_sec;
+	  tx->tick = tx32.tick;
+	  tx->ppsfreq = tx32.ppsfreq;
+	  tx->jitter = tx32.jitter;
+	  tx->shift = tx32.shift;
+	  tx->stabil = tx32.stabil;
+	  tx->jitcnt = tx32.jitcnt;
+	  tx->calcnt = tx32.calcnt;
+	  tx->errcnt = tx32.errcnt;
+	  tx->stbcnt = tx32.stbcnt;
+	}
+    }
+
+  return ret;
+}
+
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+strong_alias (__adjtimex_tv64, __adjtimex_tv64p);
+default_symbol_version (__adjtimex_tv64, __adjtimex, GLIBC_2.1);
+default_symbol_version (__adjtimex_tv64p, adjtimex, GLIBC_2.1);
+#else
+weak_alias (__adjtimex_tv64, __adjtimex);
+weak_alias (__adjtimex_tv64, adjtimex);
+#endif