/* Copyright (C) 2006-2014 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Jakub Jelinek <jakub@redhat.com>, 2006.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <rpc/rpc.h>
#include <sys/mman.h>
#include <unistd.h>

static int
do_test (void)
{
  XDR xdrs;
  void *buf;
  size_t ps = sysconf (_SC_PAGESIZE);
  uintptr_t half = -1;
  int v_int;
  u_short v_u_short;

  half = (half >> 1) & ~(uintptr_t) (ps - 1);
  buf = mmap ((void *) half, 2 * ps, PROT_READ | PROT_WRITE,
	      MAP_PRIVATE | MAP_ANON, -1, 0);
  if (buf == MAP_FAILED || buf != (void *) half)
    {
      puts ("Couldn't mmap 2 pages in the middle of address space");
      return 0;
    }

  xdrmem_create (&xdrs, (char *) buf, 2 * ps, XDR_ENCODE);

#define T(type, val) \
  v_##type = val;			\
  if (! xdr_##type (&xdrs, &v_##type))	\
    {					\
      puts ("encoding of " #type	\
	    " " #val " failed");	\
      return 1;				\
    }

  T(int, 127)

  u_int pos = xdr_getpos (&xdrs);

  T(u_short, 31)

  if (! xdr_setpos (&xdrs, pos))
    {
      puts ("xdr_setpos during encoding failed");
      return 1;
    }

  T(u_short, 36)

#undef T

  xdr_destroy (&xdrs);

  xdrmem_create (&xdrs, (char *) buf, 2 * ps, XDR_DECODE);

#define T(type, val) \
  v_##type = 0x15;			\
  if (! xdr_##type (&xdrs, &v_##type))	\
    {					\
      puts ("decoding of " #type	\
	    " " #val " failed");	\
      return 1;				\
    }					\
  if (v_##type != val)			\
    {					\
      puts ("decoded value differs, "	\
	    "type " #type " " #val);	\
      return 1;				\
    }

  T(int, 127)

  pos = xdr_getpos (&xdrs);

  T(u_short, 36)

  if (! xdr_setpos (&xdrs, pos))
    {
      puts ("xdr_setpos during encoding failed");
      return 1;
    }

  T(u_short, 36)

#undef T

  xdr_destroy (&xdrs);

  return 0;
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
